mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
- Move interlocked functions from winddk.h to wdm.h
- Fix some typos - Define ExGetCurrentResourceThread for _WIN64, too - Fix ExReleaseResource and move it to wdm.h svn path=/trunk/; revision=39534
This commit is contained in:
parent
5c3adeea08
commit
c727314ae8
3 changed files with 158 additions and 149 deletions
|
@ -224,11 +224,140 @@ InterlockedBitTestAndReset(IN LONG volatile *Base,
|
||||||
#define BitScanForward _BitScanForward
|
#define BitScanForward _BitScanForward
|
||||||
#define BitScanReverse _BitScanReverse
|
#define BitScanReverse _BitScanReverse
|
||||||
|
|
||||||
#ifdef _M_AMD64
|
#define BitTest _bittest
|
||||||
|
#define BitTestAndComplement _bittestandcomplement
|
||||||
|
#define BitTestAndSet _bittestandset
|
||||||
|
#define BitTestAndReset _bittestandreset
|
||||||
|
#define InterlockedBitTestAndSet _interlockedbittestandset
|
||||||
|
#define InterlockedBitTestAndReset _interlockedbittestandreset
|
||||||
|
|
||||||
|
|
||||||
|
/** INTERLOCKED FUNCTIONS *****************************************************/
|
||||||
|
|
||||||
|
#if !defined(__INTERLOCKED_DECLARED)
|
||||||
|
#define __INTERLOCKED_DECLARED
|
||||||
|
|
||||||
|
#if defined (_X86_)
|
||||||
|
#if defined(NO_INTERLOCKED_INTRINSICS)
|
||||||
|
NTKERNELAPI
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedIncrement(
|
||||||
|
IN OUT LONG volatile *Addend);
|
||||||
|
|
||||||
|
NTKERNELAPI
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedDecrement(
|
||||||
|
IN OUT LONG volatile *Addend);
|
||||||
|
|
||||||
|
NTKERNELAPI
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedCompareExchange(
|
||||||
|
IN OUT LONG volatile *Destination,
|
||||||
|
IN LONG Exchange,
|
||||||
|
IN LONG Comparand);
|
||||||
|
|
||||||
|
NTKERNELAPI
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedExchange(
|
||||||
|
IN OUT LONG volatile *Destination,
|
||||||
|
IN LONG Value);
|
||||||
|
|
||||||
|
NTKERNELAPI
|
||||||
|
LONG
|
||||||
|
FASTCALL
|
||||||
|
InterlockedExchangeAdd(
|
||||||
|
IN OUT LONG volatile *Addend,
|
||||||
|
IN LONG Value);
|
||||||
|
|
||||||
|
#else // !defined(NO_INTERLOCKED_INTRINSICS)
|
||||||
|
|
||||||
|
#define InterlockedExchange _InterlockedExchange
|
||||||
|
#define InterlockedIncrement _InterlockedIncrement
|
||||||
|
#define InterlockedDecrement _InterlockedDecrement
|
||||||
|
#define InterlockedExchangeAdd _InterlockedExchangeAdd
|
||||||
|
#define InterlockedCompareExchange _InterlockedCompareExchange
|
||||||
|
#define InterlockedOr _InterlockedOr
|
||||||
|
#define InterlockedAnd _InterlockedAnd
|
||||||
|
#define InterlockedXor _InterlockedXor
|
||||||
|
|
||||||
|
#endif // !defined(NO_INTERLOCKED_INTRINSICS)
|
||||||
|
|
||||||
|
#endif // defined (_X86_)
|
||||||
|
|
||||||
|
#if !defined (_WIN64)
|
||||||
|
/*
|
||||||
|
* PVOID
|
||||||
|
* InterlockedExchangePointer(
|
||||||
|
* IN OUT PVOID VOLATILE *Target,
|
||||||
|
* IN PVOID Value)
|
||||||
|
*/
|
||||||
|
#define InterlockedExchangePointer(Target, Value) \
|
||||||
|
((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PVOID
|
||||||
|
* InterlockedCompareExchangePointer(
|
||||||
|
* IN OUT PVOID *Destination,
|
||||||
|
* IN PVOID Exchange,
|
||||||
|
* IN PVOID Comparand)
|
||||||
|
*/
|
||||||
|
#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
|
||||||
|
((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
|
||||||
|
|
||||||
|
#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
|
||||||
|
#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
|
||||||
|
#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
|
||||||
|
|
||||||
|
#endif // !defined (_WIN64)
|
||||||
|
|
||||||
|
#if defined (_M_AMD64)
|
||||||
|
|
||||||
|
#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
|
||||||
|
#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
|
||||||
|
#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
|
||||||
|
#define InterlockedAnd _InterlockedAnd
|
||||||
|
#define InterlockedOr _InterlockedOr
|
||||||
|
#define InterlockedXor _InterlockedXor
|
||||||
|
#define InterlockedIncrement _InterlockedIncrement
|
||||||
|
#define InterlockedDecrement _InterlockedDecrement
|
||||||
|
#define InterlockedAdd _InterlockedAdd
|
||||||
|
#define InterlockedExchange _InterlockedExchange
|
||||||
|
#define InterlockedExchangeAdd _InterlockedExchangeAdd
|
||||||
|
#define InterlockedCompareExchange _InterlockedCompareExchange
|
||||||
|
#define InterlockedAnd64 _InterlockedAnd64
|
||||||
|
#define InterlockedOr64 _InterlockedOr64
|
||||||
|
#define InterlockedXor64 _InterlockedXor64
|
||||||
|
#define InterlockedIncrement64 _InterlockedIncrement64
|
||||||
|
#define InterlockedDecrement64 _InterlockedDecrement64
|
||||||
|
#define InterlockedAdd64 _InterlockedAdd64
|
||||||
|
#define InterlockedExchange64 _InterlockedExchange64
|
||||||
|
#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
|
||||||
|
#define InterlockedCompareExchange64 _InterlockedCompareExchange64
|
||||||
|
#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
|
||||||
|
#define InterlockedExchangePointer _InterlockedExchangePointer
|
||||||
#define InterlockedBitTestAndSet64 _interlockedbittestandset64
|
#define InterlockedBitTestAndSet64 _interlockedbittestandset64
|
||||||
#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
|
#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
|
||||||
|
|
||||||
|
#endif // _M_AMD64
|
||||||
|
|
||||||
|
#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
|
||||||
|
//#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
|
||||||
|
FORCEINLINE
|
||||||
|
LONG64
|
||||||
|
InterlockedAdd64(
|
||||||
|
IN OUT LONG64 volatile *Addend,
|
||||||
|
IN LONG64 Value)
|
||||||
|
{
|
||||||
|
return InterlockedExchangeAdd64(Addend, Value) + Value;
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* !__INTERLOCKED_DECLARED */
|
||||||
|
|
||||||
#if defined(_M_IX86)
|
#if defined(_M_IX86)
|
||||||
#define YieldProcessor _mm_pause
|
#define YieldProcessor _mm_pause
|
||||||
|
@ -1629,7 +1758,7 @@ RtlSecureZeroMemory(
|
||||||
{
|
{
|
||||||
volatile char* vptr = (volatile char*)Pointer;
|
volatile char* vptr = (volatile char*)Pointer;
|
||||||
#if defined(_M_AMD64)
|
#if defined(_M_AMD64)
|
||||||
_stosb((PUCHAR)vptr, 0, Size);
|
__stosb((PUCHAR)vptr, 0, Size);
|
||||||
#else
|
#else
|
||||||
char * endptr = (char *)vptr + Size;
|
char * endptr = (char *)vptr + Size;
|
||||||
while (vptr < endptr)
|
while (vptr < endptr)
|
||||||
|
@ -1645,7 +1774,7 @@ FORCEINLINE
|
||||||
ULONG
|
ULONG
|
||||||
RtlCheckBit(
|
RtlCheckBit(
|
||||||
IN PRTL_BITMAP BitMapHeader,
|
IN PRTL_BITMAP BitMapHeader,
|
||||||
IN ULONG BitPosition);
|
IN ULONG BitPosition)
|
||||||
{
|
{
|
||||||
return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
|
return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
|
||||||
}
|
}
|
||||||
|
@ -1773,7 +1902,7 @@ typedef struct _ERESOURCE
|
||||||
#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
|
#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
|
||||||
#define LOOKASIDE_ALIGN
|
#define LOOKASIDE_ALIGN
|
||||||
#else
|
#else
|
||||||
#define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN
|
#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
|
typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
|
||||||
|
@ -1873,25 +2002,35 @@ typedef struct _EX_RUNDOWN_REF {
|
||||||
* Executive Functions *
|
* Executive Functions *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#if defined (_WIN64)
|
#if defined(_X86_)
|
||||||
#if defined(_NTDRIVER_) || defined(_NTDDK) || defined(_NTIFS_) || \
|
#if defined(_NTHAL_)
|
||||||
|
#define ExAcquireFastMutex ExiAcquireFastMutex
|
||||||
|
#define ExReleaseFastMutex ExiReleaseFastMutex
|
||||||
|
#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
|
||||||
|
#endif
|
||||||
|
#define ExInterlockedAddUlong ExfInterlockedAddUlong
|
||||||
|
#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
|
||||||
|
#define ExInterlockedInsertTailList ExfInterlockedInsertTailList
|
||||||
|
#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
|
||||||
|
#define ExInterlockedPopEntryList ExfInterlockedPopEntryList
|
||||||
|
#define ExInterlockedPushEntryList ExfInterlockedPushEntryList
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN64)
|
||||||
|
|
||||||
|
#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
|
||||||
defined(_NTHAL_) || defined(_NTOSP_)
|
defined(_NTHAL_) || defined(_NTOSP_)
|
||||||
NTKRNLAPI
|
NTKERNELAPI
|
||||||
USHORT
|
USHORT
|
||||||
ExQueryDepthSList(IN PSLIST_HEADER Listhead);
|
ExQueryDepthSList(IN PSLIST_HEADER ListHead);
|
||||||
#else
|
#else
|
||||||
FORCEINLINE
|
FORCEINLINE
|
||||||
USHORT
|
USHORT
|
||||||
ExQueryDepthSList(IN PSLIST_HEADER Listhead)
|
ExQueryDepthSList(IN PSLIST_HEADER ListHead)
|
||||||
{
|
{
|
||||||
return (USHORT)(ListHead->Alignment & 0xffff);
|
return (USHORT)(ListHead->Alignment & 0xffff);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
#define ExQueryDepthSList(listhead) (listhead)->Depth
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_WIN64)
|
|
||||||
|
|
||||||
NTKERNELAPI
|
NTKERNELAPI
|
||||||
PSLIST_ENTRY
|
PSLIST_ENTRY
|
||||||
|
@ -1918,6 +2057,8 @@ ExpInterlockedPushEntrySList(
|
||||||
|
|
||||||
#else // !defined(_WIN64)
|
#else // !defined(_WIN64)
|
||||||
|
|
||||||
|
#define ExQueryDepthSList(listhead) (listhead)->Depth
|
||||||
|
|
||||||
NTKERNELAPI
|
NTKERNELAPI
|
||||||
PSINGLE_LIST_ENTRY
|
PSINGLE_LIST_ENTRY
|
||||||
FASTCALL
|
FASTCALL
|
||||||
|
@ -1946,31 +2087,18 @@ ExInterlockedPushEntrySList(
|
||||||
InterlockedPushEntrySList(_ListHead, _ListEntry)
|
InterlockedPushEntrySList(_ListHead, _ListEntry)
|
||||||
#endif // _WIN2K_COMPAT_SLIST_USAGE
|
#endif // _WIN2K_COMPAT_SLIST_USAGE
|
||||||
|
|
||||||
|
#endif // !defined(_WIN64)
|
||||||
|
|
||||||
/* ERESOURCE_THREAD
|
/* ERESOURCE_THREAD
|
||||||
* ExGetCurrentResourceThread(
|
* ExGetCurrentResourceThread(
|
||||||
* VOID);
|
* VOID);
|
||||||
*/
|
*/
|
||||||
#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
|
#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
|
||||||
|
|
||||||
#endif // !defined(_WIN64)
|
#define ExReleaseResource(R) (ExReleaseResourceLite(R))
|
||||||
|
|
||||||
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
||||||
|
|
||||||
#if defined(_NTHAL_) && defined(_X86_)
|
|
||||||
#define ExAcquireFastMutex ExiAcquireFastMutex
|
|
||||||
#define ExReleaseFastMutex ExiReleaseFastMutex
|
|
||||||
#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_X86_)
|
|
||||||
#define ExInterlockedAddUlong ExfInterlockedAddUlong
|
|
||||||
#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
|
|
||||||
#define ExInterlockedInsertTailList ExfInterlockedInsertTailList
|
|
||||||
#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
|
|
||||||
#define ExInterlockedPopEntryList ExfInterlockedPopEntryList
|
|
||||||
#define ExInterlockedPushEntryList ExfInterlockedPushEntryList
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NTKERNELAPI
|
NTKERNELAPI
|
||||||
VOID
|
VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
|
|
|
@ -5786,119 +5786,6 @@ typedef struct _PCIBUSDATA
|
||||||
} PCIBUSDATA, *PPCIBUSDATA;
|
} PCIBUSDATA, *PPCIBUSDATA;
|
||||||
|
|
||||||
|
|
||||||
/** INTERLOCKED FUNCTIONS *****************************************************/
|
|
||||||
|
|
||||||
#if !defined(__INTERLOCKED_DECLARED)
|
|
||||||
#define __INTERLOCKED_DECLARED
|
|
||||||
|
|
||||||
#if defined (_X86_)
|
|
||||||
#if defined(NO_INTERLOCKED_INTRINSICS)
|
|
||||||
NTKERNELAPI
|
|
||||||
LONG
|
|
||||||
FASTCALL
|
|
||||||
InterlockedIncrement(
|
|
||||||
IN OUT LONG volatile *Addend);
|
|
||||||
|
|
||||||
NTKERNELAPI
|
|
||||||
LONG
|
|
||||||
FASTCALL
|
|
||||||
InterlockedDecrement(
|
|
||||||
IN OUT LONG volatile *Addend);
|
|
||||||
|
|
||||||
NTKERNELAPI
|
|
||||||
LONG
|
|
||||||
FASTCALL
|
|
||||||
InterlockedCompareExchange(
|
|
||||||
IN OUT LONG volatile *Destination,
|
|
||||||
IN LONG Exchange,
|
|
||||||
IN LONG Comparand);
|
|
||||||
|
|
||||||
NTKERNELAPI
|
|
||||||
LONG
|
|
||||||
FASTCALL
|
|
||||||
InterlockedExchange(
|
|
||||||
IN OUT LONG volatile *Destination,
|
|
||||||
IN LONG Value);
|
|
||||||
|
|
||||||
NTKERNELAPI
|
|
||||||
LONG
|
|
||||||
FASTCALL
|
|
||||||
InterlockedExchangeAdd(
|
|
||||||
IN OUT LONG volatile *Addend,
|
|
||||||
IN LONG Value);
|
|
||||||
|
|
||||||
#else // !defined(NO_INTERLOCKED_INTRINSICS)
|
|
||||||
|
|
||||||
#define InterlockedExchange _InterlockedExchange
|
|
||||||
#define InterlockedIncrement _InterlockedIncrement
|
|
||||||
#define InterlockedDecrement _InterlockedDecrement
|
|
||||||
#define InterlockedExchangeAdd _InterlockedExchangeAdd
|
|
||||||
#define InterlockedCompareExchange _InterlockedCompareExchange
|
|
||||||
#define InterlockedOr _InterlockedOr
|
|
||||||
#define InterlockedAnd _InterlockedAnd
|
|
||||||
#define InterlockedXor _InterlockedXor
|
|
||||||
|
|
||||||
#endif // !defined(NO_INTERLOCKED_INTRINSICS)
|
|
||||||
|
|
||||||
#endif // defined (_X86_)
|
|
||||||
|
|
||||||
#if !defined (_WIN64)
|
|
||||||
/*
|
|
||||||
* PVOID
|
|
||||||
* InterlockedExchangePointer(
|
|
||||||
* IN OUT PVOID VOLATILE *Target,
|
|
||||||
* IN PVOID Value)
|
|
||||||
*/
|
|
||||||
#define InterlockedExchangePointer(Target, Value) \
|
|
||||||
((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PVOID
|
|
||||||
* InterlockedCompareExchangePointer(
|
|
||||||
* IN OUT PVOID *Destination,
|
|
||||||
* IN PVOID Exchange,
|
|
||||||
* IN PVOID Comparand)
|
|
||||||
*/
|
|
||||||
#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
|
|
||||||
((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
|
|
||||||
|
|
||||||
#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
|
|
||||||
#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
|
|
||||||
#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
|
|
||||||
|
|
||||||
#endif // !defined (_WIN64)
|
|
||||||
|
|
||||||
#if defined (_M_AMD64)
|
|
||||||
|
|
||||||
#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
|
|
||||||
#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
|
|
||||||
#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
|
|
||||||
#define InterlockedAnd _InterlockedAnd
|
|
||||||
#define InterlockedOr _InterlockedOr
|
|
||||||
#define InterlockedXor _InterlockedXor
|
|
||||||
#define InterlockedIncrement _InterlockedIncrement
|
|
||||||
#define InterlockedDecrement _InterlockedDecrement
|
|
||||||
#define InterlockedAdd _InterlockedAdd
|
|
||||||
#define InterlockedExchange _InterlockedExchange
|
|
||||||
#define InterlockedExchangeAdd _InterlockedExchangeAdd
|
|
||||||
#define InterlockedCompareExchange _InterlockedCompareExchange
|
|
||||||
#define InterlockedAnd64 _InterlockedAnd64
|
|
||||||
#define InterlockedOr64 _InterlockedOr64
|
|
||||||
#define InterlockedXor64 _InterlockedXor64
|
|
||||||
#define InterlockedIncrement64 _InterlockedIncrement64
|
|
||||||
#define InterlockedDecrement64 _InterlockedDecrement64
|
|
||||||
#define InterlockedAdd64 _InterlockedAdd64
|
|
||||||
#define InterlockedExchange64 _InterlockedExchange64
|
|
||||||
#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
|
|
||||||
#define InterlockedCompareExchange64 _InterlockedCompareExchange64
|
|
||||||
#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
|
|
||||||
#define InterlockedExchangePointer _InterlockedExchangePointer
|
|
||||||
|
|
||||||
#endif // _M_AMD64
|
|
||||||
|
|
||||||
#endif /* !__INTERLOCKED_DECLARED */
|
|
||||||
|
|
||||||
|
|
||||||
/** SPINLOCK FUNCTIONS ********************************************************/
|
/** SPINLOCK FUNCTIONS ********************************************************/
|
||||||
|
|
||||||
NTKERNELAPI
|
NTKERNELAPI
|
||||||
|
|
|
@ -140,12 +140,6 @@ ExIsObjectInFirstZoneSegment(
|
||||||
IN PZONE_HEADER Zone,
|
IN PZONE_HEADER Zone,
|
||||||
IN PVOID Object);
|
IN PVOID Object);
|
||||||
|
|
||||||
NTKERNELAPI
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
ExReleaseResource(
|
|
||||||
IN PERESOURCE Resource);
|
|
||||||
|
|
||||||
#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
|
#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
|
||||||
#define ExAcquireResourceShared ExAcquireResourceSharedLite
|
#define ExAcquireResourceShared ExAcquireResourceSharedLite
|
||||||
#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
|
#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
|
||||||
|
|
Loading…
Reference in a new issue