#include <ntdef.h>\r
#include <ntstatus.h>\r
\r
+#ifndef GUID_DEFINED\r
+#include <guiddef.h>\r
+#endif /* GUID_DEFINED */\r
+\r
#ifdef __GNUC__\r
#include "intrin.h"\r
#endif\r
\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifdef _NTOSKRNL_\r
+/* HACKHACKHACK!!! We shouldn't include this header from ntoskrnl! */\r
+#define NTKERNELAPI\r
+#else\r
+#define NTKERNELAPI DECLSPEC_IMPORT\r
+#endif\r
+\r
+#ifdef _WIN64\r
+#define PORT_MAXIMUM_MESSAGE_LENGTH 512\r
+#else\r
+#define PORT_MAXIMUM_MESSAGE_LENGTH 256\r
+#endif\r
+\r
+\r
+/* Simple types */\r
+typedef UCHAR KPROCESSOR_MODE;\r
+typedef LONG KPRIORITY;\r
+typedef PVOID PSECURITY_DESCRIPTOR;\r
+typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;\r
+\r
+/* Structures not exposed to drivers */\r
+typedef struct _OBJECT_TYPE *POBJECT_TYPE;\r
+typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;\r
+typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;\r
+typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;\r
+typedef struct _BUS_HANDLER *PBUS_HANDLER;\r
+\r
+typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; \r
+typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;\r
+typedef struct _ETHREAD *PETHREAD;\r
+typedef struct _EPROCESS *PEPROCESS;\r
+typedef struct _IO_TIMER *PIO_TIMER;\r
+typedef struct _KINTERRUPT *PKINTERRUPT;\r
+typedef struct _KPROCESS *PKPROCESS;\r
+typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;\r
+\r
+\r
typedef struct _CONTEXT *PCONTEXT;\r
\r
//\r
#define CmResourceTypePcCardConfig 130\r
#define CmResourceTypeMfCardConfig 131\r
\r
-\r
+typedef enum _INTERFACE_TYPE {\r
+ InterfaceTypeUndefined = -1,\r
+ Internal,\r
+ Isa,\r
+ Eisa,\r
+ MicroChannel,\r
+ TurboChannel,\r
+ PCIBus,\r
+ VMEBus,\r
+ NuBus,\r
+ PCMCIABus,\r
+ CBus,\r
+ MPIBus,\r
+ MPSABus,\r
+ ProcessorInternal,\r
+ InternalPowerBus,\r
+ PNPISABus,\r
+ PNPBus,\r
+ MaximumInterfaceType\r
+} INTERFACE_TYPE, *PINTERFACE_TYPE;\r
+\r
+/* IO_RESOURCE_DESCRIPTOR.Option */\r
+\r
+#define IO_RESOURCE_PREFERRED 0x01\r
+#define IO_RESOURCE_DEFAULT 0x02\r
+#define IO_RESOURCE_ALTERNATIVE 0x08\r
+\r
+typedef struct _IO_RESOURCE_DESCRIPTOR {\r
+ UCHAR Option;\r
+ UCHAR Type;\r
+ UCHAR ShareDisposition;\r
+ UCHAR Spare1;\r
+ USHORT Flags;\r
+ USHORT Spare2;\r
+ union {\r
+ struct {\r
+ ULONG Length;\r
+ ULONG Alignment;\r
+ PHYSICAL_ADDRESS MinimumAddress;\r
+ PHYSICAL_ADDRESS MaximumAddress;\r
+ } Port;\r
+ struct {\r
+ ULONG Length;\r
+ ULONG Alignment;\r
+ PHYSICAL_ADDRESS MinimumAddress;\r
+ PHYSICAL_ADDRESS MaximumAddress;\r
+ } Memory;\r
+ struct {\r
+ ULONG MinimumVector;\r
+ ULONG MaximumVector;\r
+ } Interrupt;\r
+ struct {\r
+ ULONG MinimumChannel;\r
+ ULONG MaximumChannel;\r
+ } Dma;\r
+ struct {\r
+ ULONG Length;\r
+ ULONG Alignment;\r
+ PHYSICAL_ADDRESS MinimumAddress;\r
+ PHYSICAL_ADDRESS MaximumAddress;\r
+ } Generic;\r
+ struct {\r
+ ULONG Data[3];\r
+ } DevicePrivate;\r
+ struct {\r
+ ULONG Length;\r
+ ULONG MinBusNumber;\r
+ ULONG MaxBusNumber;\r
+ ULONG Reserved;\r
+ } BusNumber;\r
+ struct {\r
+ ULONG Priority;\r
+ ULONG Reserved1;\r
+ ULONG Reserved2;\r
+ } ConfigData;\r
+ } u;\r
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;\r
+\r
+typedef struct _IO_RESOURCE_LIST {\r
+ USHORT Version;\r
+ USHORT Revision;\r
+ ULONG Count;\r
+ IO_RESOURCE_DESCRIPTOR Descriptors[1];\r
+} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;\r
+\r
+typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {\r
+ ULONG ListSize;\r
+ INTERFACE_TYPE InterfaceType;\r
+ ULONG BusNumber;\r
+ ULONG SlotNumber;\r
+ ULONG Reserved[3];\r
+ ULONG AlternativeLists;\r
+ IO_RESOURCE_LIST List[1];\r
+} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;\r
\r
//\r
// Global debug flag\r
extern ULONG NtGlobalFlag;\r
\r
\r
+#include <pshpack4.h>\r
+typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {\r
+ UCHAR Type;\r
+ UCHAR ShareDisposition;\r
+ USHORT Flags;\r
+ union {\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length;\r
+ } Generic;\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length;\r
+ } Port;\r
+ struct {\r
+ ULONG Level;\r
+ ULONG Vector;\r
+ KAFFINITY Affinity;\r
+ } Interrupt;\r
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+ struct {\r
+ union {\r
+ struct {\r
+ USHORT Reserved;\r
+ USHORT MessageCount;\r
+ ULONG Vector;\r
+ KAFFINITY Affinity;\r
+ } Raw;\r
+ struct {\r
+ ULONG Level;\r
+ ULONG Vector;\r
+ KAFFINITY Affinity;\r
+ } Translated;\r
+ };\r
+ } MessageInterrupt;\r
+#endif\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length;\r
+ } Memory;\r
+ struct {\r
+ ULONG Channel;\r
+ ULONG Port;\r
+ ULONG Reserved1;\r
+ } Dma;\r
+ struct {\r
+ ULONG Data[3];\r
+ } DevicePrivate;\r
+ struct {\r
+ ULONG Start;\r
+ ULONG Length;\r
+ ULONG Reserved;\r
+ } BusNumber;\r
+ struct {\r
+ ULONG DataSize;\r
+ ULONG Reserved1;\r
+ ULONG Reserved2;\r
+ } DeviceSpecificData;\r
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length40;\r
+ } Memory40;\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length48;\r
+ } Memory48;\r
+ struct {\r
+ PHYSICAL_ADDRESS Start;\r
+ ULONG Length64;\r
+ } Memory64;\r
+#endif\r
+ } u;\r
+} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;\r
+#include <poppack.h>\r
\r
//\r
// Section map options\r
#define BitScanForward _BitScanForward\r
#define BitScanReverse _BitScanReverse\r
\r
+#define BitTest _bittest\r
+#define BitTestAndComplement _bittestandcomplement\r
+#define BitTestAndSet _bittestandset\r
+#define BitTestAndReset _bittestandreset\r
+#define InterlockedBitTestAndSet _interlockedbittestandset\r
+#define InterlockedBitTestAndReset _interlockedbittestandreset\r
+\r
+\r
+/** INTERLOCKED FUNCTIONS *****************************************************/\r
+\r
+#if !defined(__INTERLOCKED_DECLARED)\r
+#define __INTERLOCKED_DECLARED\r
+\r
+#if defined (_X86_)\r
+#if defined(NO_INTERLOCKED_INTRINSICS)\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedIncrement(\r
+ IN OUT LONG volatile *Addend);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedDecrement(\r
+ IN OUT LONG volatile *Addend);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedCompareExchange(\r
+ IN OUT LONG volatile *Destination,\r
+ IN LONG Exchange,\r
+ IN LONG Comparand);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedExchange(\r
+ IN OUT LONG volatile *Destination,\r
+ IN LONG Value);\r
+\r
+NTKERNELAPI\r
+LONG\r
+FASTCALL\r
+InterlockedExchangeAdd(\r
+ IN OUT LONG volatile *Addend,\r
+ IN LONG Value);\r
+\r
+#else // !defined(NO_INTERLOCKED_INTRINSICS)\r
+\r
+#define InterlockedExchange _InterlockedExchange\r
+#define InterlockedIncrement _InterlockedIncrement\r
+#define InterlockedDecrement _InterlockedDecrement\r
+#define InterlockedExchangeAdd _InterlockedExchangeAdd\r
+#define InterlockedCompareExchange _InterlockedCompareExchange\r
+#define InterlockedOr _InterlockedOr\r
+#define InterlockedAnd _InterlockedAnd\r
+#define InterlockedXor _InterlockedXor\r
+\r
+#endif // !defined(NO_INTERLOCKED_INTRINSICS)\r
+\r
+#endif // defined (_X86_)\r
+\r
+#if !defined (_WIN64)\r
+/*\r
+ * PVOID\r
+ * InterlockedExchangePointer(\r
+ * IN OUT PVOID volatile *Target,\r
+ * IN PVOID Value)\r
+ */\r
+#define InterlockedExchangePointer(Target, Value) \\r
+ ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))\r
+\r
+/*\r
+ * PVOID\r
+ * InterlockedCompareExchangePointer(\r
+ * IN OUT PVOID *Destination,\r
+ * IN PVOID Exchange,\r
+ * IN PVOID Comparand)\r
+ */\r
+#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \\r
+ ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))\r
+\r
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)\r
+#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)\r
+#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)\r
+\r
+#endif // !defined (_WIN64)\r
+\r
+#if defined (_M_AMD64)\r
+\r
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)\r
+#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)\r
+#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)\r
+#define InterlockedAnd _InterlockedAnd\r
+#define InterlockedOr _InterlockedOr\r
+#define InterlockedXor _InterlockedXor\r
+#define InterlockedIncrement _InterlockedIncrement\r
+#define InterlockedDecrement _InterlockedDecrement\r
+#define InterlockedAdd _InterlockedAdd\r
+#define InterlockedExchange _InterlockedExchange\r
+#define InterlockedExchangeAdd _InterlockedExchangeAdd\r
+#define InterlockedCompareExchange _InterlockedCompareExchange\r
+#define InterlockedAnd64 _InterlockedAnd64\r
+#define InterlockedOr64 _InterlockedOr64\r
+#define InterlockedXor64 _InterlockedXor64\r
+#define InterlockedIncrement64 _InterlockedIncrement64\r
+#define InterlockedDecrement64 _InterlockedDecrement64\r
+#define InterlockedAdd64 _InterlockedAdd64\r
+#define InterlockedExchange64 _InterlockedExchange64\r
+#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64\r
+#define InterlockedCompareExchange64 _InterlockedCompareExchange64\r
+#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer\r
+#define InterlockedExchangePointer _InterlockedExchangePointer\r
+#define InterlockedBitTestAndSet64 _interlockedbittestandset64\r
+#define InterlockedBitTestAndReset64 _interlockedbittestandreset64\r
+\r
+#endif // _M_AMD64\r
+\r
+#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)\r
+//#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?\r
+FORCEINLINE\r
+LONG64\r
+InterlockedAdd64(\r
+ IN OUT LONG64 volatile *Addend,\r
+ IN LONG64 Value)\r
+{\r
+ return InterlockedExchangeAdd64(Addend, Value) + Value;\r
+}\r
+//#endif\r
+#define BitScanForward _BitScanForward\r
+#define BitScanReverse _BitScanReverse\r
+#endif\r
+\r
#ifdef _M_AMD64\r
#define InterlockedBitTestAndSet64 _interlockedbittestandset64\r
#define InterlockedBitTestAndReset64 _interlockedbittestandreset64\r
#endif\r
\r
+#endif /* !__INTERLOCKED_DECLARED */\r
\r
#if defined(_M_IX86)\r
-#define YieldProcessor() __asm__ __volatile__("pause");\r
+#define YieldProcessor _mm_pause\r
#elif defined (_M_AMD64)\r
-#define YieldProcessor() __asm__ __volatile__("pause");\r
+#define YieldProcessor _mm_pause\r
#elif defined(_M_PPC)\r
#define YieldProcessor() __asm__ __volatile__("nop");\r
#elif defined(_M_MIPS)\r
#define _SLIST_ENTRY _SINGLE_LIST_ENTRY\r
#define PSLIST_ENTRY PSINGLE_LIST_ENTRY\r
\r
+#if defined(_WIN64)\r
+typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {\r
+ struct {\r
+ ULONGLONG Alignment;\r
+ ULONGLONG Region;\r
+ } DUMMYSTRUCTNAME;\r
+ struct {\r
+ ULONGLONG Depth:16;\r
+ ULONGLONG Sequence:9;\r
+ ULONGLONG NextEntry:39;\r
+ ULONGLONG HeaderType:1;\r
+ ULONGLONG Init:1;\r
+ ULONGLONG Reserved:59;\r
+ ULONGLONG Region:3;\r
+ } Header8;\r
+ struct {\r
+ ULONGLONG Depth:16;\r
+ ULONGLONG Sequence:48;\r
+ ULONGLONG HeaderType:1;\r
+ ULONGLONG Init:1;\r
+ ULONGLONG Reserved:2;\r
+ ULONGLONG NextEntry:60;\r
+ } Header16;\r
+} SLIST_HEADER, *PSLIST_HEADER;\r
+#else\r
typedef union _SLIST_HEADER {\r
ULONGLONG Alignment;\r
struct {\r
USHORT Sequence;\r
} DUMMYSTRUCTNAME;\r
} SLIST_HEADER, *PSLIST_HEADER;\r
+#endif\r
\r
#endif /* _SLIST_HEADER_ */\r
\r
#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010\r
\r
\r
+/******************************************************************************\r
+ * WINBASE Functions *\r
+ ******************************************************************************/\r
+#if !defined(_WINBASE_)\r
+\r
+#if defined(_WIN64)\r
+\r
+#define InterlockedPopEntrySList(Head) \\r
+ ExpInterlockedPopEntrySList(Head)\r
+\r
+#define InterlockedPushEntrySList(Head, Entry) \\r
+ ExpInterlockedPushEntrySList(Head, Entry)\r
+\r
+#define InterlockedFlushSList(Head) \\r
+ ExpInterlockedFlushSList(Head)\r
+\r
+#define QueryDepthSList(Head) \\r
+ ExQueryDepthSList(Head)\r
+\r
+#else // !defined(_WIN64)\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+FASTCALL\r
+InterlockedPopEntrySList(\r
+ IN PSLIST_HEADER ListHead);\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+FASTCALL\r
+InterlockedPushEntrySList(\r
+ IN PSLIST_HEADER ListHead,\r
+ IN PSLIST_ENTRY ListEntry);\r
+\r
+#define InterlockedFlushSList(ListHead) \\r
+ ExInterlockedFlushSList(ListHead)\r
+\r
+#define QueryDepthSList(Head) \\r
+ ExQueryDepthSList(Head)\r
+\r
+#endif // !defined(_WIN64)\r
+\r
+#endif // !defined(_WINBASE_)\r
+\r
+\r
+/******************************************************************************\r
+ * Kernel Types *\r
+ ******************************************************************************/\r
+\r
+typedef struct _DISPATCHER_HEADER\r
+{\r
+ union\r
+ {\r
+ struct\r
+ {\r
+ UCHAR Type;\r
+ union\r
+ {\r
+ UCHAR Absolute;\r
+ UCHAR NpxIrql;\r
+ };\r
+ union\r
+ {\r
+ UCHAR Size;\r
+ UCHAR Hand;\r
+ };\r
+ union\r
+ {\r
+ UCHAR Inserted;\r
+ BOOLEAN DebugActive;\r
+ };\r
+ };\r
+ volatile LONG Lock;\r
+ };\r
+ LONG SignalState;\r
+ LIST_ENTRY WaitListHead;\r
+} DISPATCHER_HEADER, *PDISPATCHER_HEADER;\r
+\r
+typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;\r
+\r
+typedef struct _KEVENT {\r
+ DISPATCHER_HEADER Header;\r
+} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;\r
+\r
+typedef struct _KSEMAPHORE {\r
+ DISPATCHER_HEADER Header;\r
+ LONG Limit;\r
+} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;\r
+\r
+/******************************************************************************\r
+ * RTL Types *\r
+ ******************************************************************************/\r
+\r
+#define RTL_REGISTRY_ABSOLUTE 0\r
+#define RTL_REGISTRY_SERVICES 1\r
+#define RTL_REGISTRY_CONTROL 2\r
+#define RTL_REGISTRY_WINDOWS_NT 3\r
+#define RTL_REGISTRY_DEVICEMAP 4\r
+#define RTL_REGISTRY_USER 5\r
+#define RTL_REGISTRY_MAXIMUM 6\r
+#define RTL_REGISTRY_HANDLE 0x40000000\r
+#define RTL_REGISTRY_OPTIONAL 0x80000000\r
+\r
+/* RTL_QUERY_REGISTRY_TABLE.Flags */\r
+#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001\r
+#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002\r
+#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004\r
+#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008\r
+#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010\r
+#define RTL_QUERY_REGISTRY_DIRECT 0x00000020\r
+#define RTL_QUERY_REGISTRY_DELETE 0x00000040\r
+\r
+typedef struct _RTL_BITMAP {\r
+ ULONG SizeOfBitMap;\r
+ PULONG Buffer;\r
+} RTL_BITMAP, *PRTL_BITMAP;\r
+\r
+typedef struct _RTL_BITMAP_RUN {\r
+ ULONG StartingIndex;\r
+ ULONG NumberOfBits;\r
+} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;\r
+\r
+typedef NTSTATUS\r
+(DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(\r
+ IN PWSTR ValueName,\r
+ IN ULONG ValueType,\r
+ IN PVOID ValueData,\r
+ IN ULONG ValueLength,\r
+ IN PVOID Context,\r
+ IN PVOID EntryContext);\r
+\r
+typedef struct _RTL_QUERY_REGISTRY_TABLE {\r
+ PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;\r
+ ULONG Flags;\r
+ PCWSTR Name;\r
+ PVOID EntryContext;\r
+ ULONG DefaultType;\r
+ PVOID DefaultData;\r
+ ULONG DefaultLength;\r
+} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;\r
+\r
+typedef struct _TIME_FIELDS {\r
+ CSHORT Year;\r
+ CSHORT Month;\r
+ CSHORT Day;\r
+ CSHORT Hour;\r
+ CSHORT Minute;\r
+ CSHORT Second;\r
+ CSHORT Milliseconds;\r
+ CSHORT Weekday;\r
+} TIME_FIELDS, *PTIME_FIELDS;\r
+\r
+\r
+/******************************************************************************\r
+ * RTL Functions *\r
+ ******************************************************************************/\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlAssert(\r
+ IN PVOID FailedAssertion,\r
+ IN PVOID FileName,\r
+ IN ULONG LineNumber,\r
+ IN PCHAR Message);\r
+\r
+/* VOID\r
+ * RtlCopyMemory(\r
+ * IN VOID UNALIGNED *Destination,\r
+ * IN CONST VOID UNALIGNED *Source,\r
+ * IN SIZE_T Length)\r
+ */\r
+#define RtlCopyMemory(Destination, Source, Length) \\r
+ memcpy(Destination, Source, Length)\r
+\r
+#define RtlCopyBytes RtlCopyMemory\r
+\r
+#if defined(_M_AMD64)\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlCopyMemoryNonTemporal(\r
+ VOID UNALIGNED *Destination,\r
+ CONST VOID UNALIGNED *Source,\r
+ SIZE_T Length);\r
+#else\r
+#define RtlCopyMemoryNonTemporal RtlCopyMemory\r
+#endif\r
+\r
+/* BOOLEAN\r
+ * RtlEqualLuid(\r
+ * IN PLUID Luid1,\r
+ * IN PLUID Luid2)\r
+ */\r
+#define RtlEqualLuid(Luid1, Luid2) \\r
+ (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))\r
+\r
+/* ULONG\r
+ * RtlEqualMemory(\r
+ * IN VOID UNALIGNED *Destination,\r
+ * IN CONST VOID UNALIGNED *Source,\r
+ * IN SIZE_T Length)\r
+ */\r
+#define RtlEqualMemory(Destination, Source, Length) \\r
+ (!memcmp(Destination, Source, Length))\r
+\r
+/* VOID\r
+ * RtlFillMemory(\r
+ * IN VOID UNALIGNED *Destination,\r
+ * IN SIZE_T Length,\r
+ * IN UCHAR Fill)\r
+ */\r
+#define RtlFillMemory(Destination, Length, Fill) \\r
+ memset(Destination, Fill, Length)\r
+\r
+#define RtlFillBytes RtlFillMemory\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlFreeUnicodeString(\r
+ IN PUNICODE_STRING UnicodeString);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlGUIDFromString(\r
+ IN PUNICODE_STRING GuidString,\r
+ OUT GUID *Guid);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlInitUnicodeString(\r
+ IN OUT PUNICODE_STRING DestinationString,\r
+ IN PCWSTR SourceString);\r
+\r
+/* VOID\r
+ * RtlMoveMemory(\r
+ * IN VOID UNALIGNED *Destination,\r
+ * IN CONST VOID UNALIGNED *Source,\r
+ * IN SIZE_T Length)\r
+ */\r
+#define RtlMoveMemory(Destination, Source, Length) \\r
+ memmove(Destination, Source, Length)\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlStringFromGUID(\r
+ IN REFGUID Guid,\r
+ OUT PUNICODE_STRING GuidString);\r
+\r
+/* VOID\r
+ * RtlZeroMemory(\r
+ * IN VOID UNALIGNED *Destination,\r
+ * IN SIZE_T Length)\r
+ */\r
+#define RtlZeroMemory(Destination, Length) \\r
+ memset(Destination, 0, Length)\r
+\r
+#define RtlZeroBytes RtlZeroMemory\r
+\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
+NTSYSAPI\r
+BOOLEAN\r
+NTAPI\r
+RtlAreBitsClear(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG StartingIndex,\r
+ IN ULONG Length);\r
+\r
+NTSYSAPI\r
+BOOLEAN\r
+NTAPI\r
+RtlAreBitsSet(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG StartingIndex,\r
+ IN ULONG Length);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlAnsiStringToUnicodeString(\r
+ IN OUT PUNICODE_STRING DestinationString,\r
+ IN PANSI_STRING SourceString,\r
+ IN BOOLEAN AllocateDestinationString);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlxAnsiStringToUnicodeSize(\r
+ IN PCANSI_STRING AnsiString);\r
+\r
+#define RtlAnsiStringToUnicodeSize(String) ( \\r
+ NLS_MB_CODE_PAGE_TAG ? \\r
+ RtlxAnsiStringToUnicodeSize(String) : \\r
+ ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \\r
+)\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlAppendUnicodeStringToString(\r
+ IN OUT PUNICODE_STRING Destination,\r
+ IN PCUNICODE_STRING Source);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlAppendUnicodeToString(\r
+ IN OUT PUNICODE_STRING Destination,\r
+ IN PCWSTR Source);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlCheckRegistryKey(\r
+ IN ULONG RelativeTo,\r
+ IN PWSTR Path);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlClearAllBits(\r
+ IN PRTL_BITMAP BitMapHeader);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlClearBits(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG StartingIndex,\r
+ IN ULONG NumberToClear);\r
+\r
+NTSYSAPI\r
+SIZE_T\r
+NTAPI\r
+RtlCompareMemory(\r
+ IN CONST VOID *Source1,\r
+ IN CONST VOID *Source2,\r
+ IN SIZE_T Length);\r
+\r
+NTSYSAPI\r
+LONG\r
+NTAPI\r
+RtlCompareUnicodeString(\r
+ IN PCUNICODE_STRING String1,\r
+ IN PCUNICODE_STRING String2,\r
+ IN BOOLEAN CaseInSensitive);\r
+\r
+NTSYSAPI\r
+LONG\r
+NTAPI\r
+RtlCompareUnicodeStrings(\r
+ IN PCWCH String1,\r
+ IN SIZE_T String1Length,\r
+ IN PCWCH String2,\r
+ IN SIZE_T String2Length,\r
+ IN BOOLEAN CaseInSensitive);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlCopyUnicodeString(\r
+ IN OUT PUNICODE_STRING DestinationString,\r
+ IN PCUNICODE_STRING SourceString);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlCreateRegistryKey(\r
+ IN ULONG RelativeTo,\r
+ IN PWSTR Path);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlCreateSecurityDescriptor(\r
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,\r
+ IN ULONG Revision);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlDeleteRegistryValue(\r
+ IN ULONG RelativeTo,\r
+ IN PCWSTR Path,\r
+ IN PCWSTR ValueName);\r
+\r
+NTSYSAPI\r
+BOOLEAN\r
+NTAPI\r
+RtlEqualUnicodeString(\r
+ IN CONST UNICODE_STRING *String1,\r
+ IN CONST UNICODE_STRING *String2,\r
+ IN BOOLEAN CaseInSensitive);\r
+\r
+#if !defined(_AMD64_) && !defined(_IA64_)\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedIntegerMultiply(\r
+ IN LARGE_INTEGER Multiplicand,\r
+ IN LONG Multiplier);\r
+\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedLargeIntegerDivide(\r
+ IN LARGE_INTEGER Dividend,\r
+ IN ULONG Divisor,\r
+ IN OUT PULONG Remainder);\r
+#endif\r
+\r
+#if defined(_X86_) || defined(_IA64_)\r
+NTSYSAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+RtlExtendedMagicDivide(\r
+ IN LARGE_INTEGER Dividend,\r
+ IN LARGE_INTEGER MagicDivisor,\r
+ IN CCHAR ShiftCount);\r
+#endif\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlFreeAnsiString(\r
+ IN PANSI_STRING AnsiString);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindClearBits(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG NumberToFind,\r
+ IN ULONG HintIndex);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindClearBitsAndSet(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG NumberToFind,\r
+ IN ULONG HintIndex);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindFirstRunClear(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ OUT PULONG StartingIndex);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindClearRuns(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ OUT PRTL_BITMAP_RUN RunArray,\r
+ IN ULONG SizeOfRunArray,\r
+ IN BOOLEAN LocateLongestRuns);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindLastBackwardRunClear(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG FromIndex,\r
+ OUT PULONG StartingRunIndex);\r
+\r
+NTSYSAPI\r
+CCHAR\r
+NTAPI\r
+RtlFindLeastSignificantBit(\r
+ IN ULONGLONG Set);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindLongestRunClear(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ OUT PULONG StartingIndex);\r
+\r
+NTSYSAPI\r
+CCHAR\r
+NTAPI\r
+RtlFindMostSignificantBit(\r
+ IN ULONGLONG Set);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindNextForwardRunClear(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG FromIndex,\r
+ OUT PULONG StartingRunIndex);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindSetBits(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG NumberToFind,\r
+ IN ULONG HintIndex);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlFindSetBitsAndClear(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG NumberToFind,\r
+ IN ULONG HintIndex);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlHashUnicodeString(\r
+ IN CONST UNICODE_STRING *String,\r
+ IN BOOLEAN CaseInSensitive,\r
+ IN ULONG HashAlgorithm,\r
+ OUT PULONG HashValue);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlInitAnsiString(\r
+ IN OUT PANSI_STRING DestinationString,\r
+ IN PCSZ SourceString);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlInitializeBitMap(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN PULONG BitMapBuffer,\r
+ IN ULONG SizeOfBitMap);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlInitString(\r
+ IN OUT PSTRING DestinationString,\r
+ IN PCSZ SourceString);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlIntegerToUnicodeString(\r
+ IN ULONG Value,\r
+ IN ULONG Base OPTIONAL,\r
+ IN OUT PUNICODE_STRING String);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlInt64ToUnicodeString(\r
+ IN ULONGLONG Value,\r
+ IN ULONG Base OPTIONAL,\r
+ IN OUT PUNICODE_STRING String);\r
+\r
+#ifdef _WIN64\r
+#define RtlIntPtrToUnicodeString(Value, Base, String) \\r
+ RtlInt64ToUnicodeString(Value, Base, String)\r
+#else\r
+#define RtlIntPtrToUnicodeString(Value, Base, String) \\r
+ RtlIntegerToUnicodeString(Value, Base, String)\r
+#endif\r
+\r
+/* BOOLEAN\r
+ * RtlIsZeroLuid(\r
+ * IN PLUID L1);\r
+ */\r
+#define RtlIsZeroLuid(_L1) \\r
+ ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlLengthSecurityDescriptor(\r
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlNumberOfClearBits(\r
+ IN PRTL_BITMAP BitMapHeader);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlNumberOfSetBits(\r
+ IN PRTL_BITMAP BitMapHeader);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlQueryRegistryValues(\r
+ IN ULONG RelativeTo,\r
+ IN PCWSTR Path,\r
+ IN PRTL_QUERY_REGISTRY_TABLE QueryTable,\r
+ IN PVOID Context,\r
+ IN PVOID Environment OPTIONAL);\r
+\r
+#define LONG_SIZE (sizeof(LONG))\r
+#define LONG_MASK (LONG_SIZE - 1)\r
+\r
+/* VOID\r
+ * RtlRetrieveUlong(\r
+ * PULONG DestinationAddress,\r
+ * PULONG SourceAddress);\r
+ */\r
+#if defined(_AMD64_)\r
+#define RtlRetrieveUlong(DestAddress,SrcAddress) \\r
+ *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)\r
+#else\r
+#define RtlRetrieveUlong(DestAddress,SrcAddress) \\r
+ if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \\r
+ { \\r
+ ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \\r
+ ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \\r
+ ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \\r
+ ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \\r
+ } \\r
+ else \\r
+ { \\r
+ *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \\r
+ }\r
+#endif\r
+\r
+/* VOID\r
+ * RtlRetrieveUshort(\r
+ * PUSHORT DestinationAddress,\r
+ * PUSHORT SourceAddress);\r
+ */\r
+#if defined(_AMD64_)\r
+#define RtlRetrieveUshort(DestAddress,SrcAddress) \\r
+ *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)\r
+#else\r
+#define RtlRetrieveUshort(DestAddress,SrcAddress) \\r
+ if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \\r
+ { \\r
+ ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \\r
+ ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \\r
+ } \\r
+ else \\r
+ { \\r
+ *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \\r
+ }\r
+#endif\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlSetAllBits(\r
+ IN PRTL_BITMAP BitMapHeader);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlSetBits(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG StartingIndex,\r
+ IN ULONG NumberToSet);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlSetDaclSecurityDescriptor(\r
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,\r
+ IN BOOLEAN DaclPresent,\r
+ IN PACL Dacl OPTIONAL,\r
+ IN BOOLEAN DaclDefaulted OPTIONAL);\r
+\r
+/* VOID\r
+ * RtlStoreUlong(\r
+ * IN PULONG Address,\r
+ * IN ULONG Value);\r
+ */\r
+#if defined(_AMD64_)\r
+#define RtlStoreUlong(Address,Value) \\r
+ *(ULONG UNALIGNED *)(Address) = (Value)\r
+#else\r
+#define RtlStoreUlong(Address,Value) \\r
+ if ((ULONG_PTR)(Address) & LONG_MASK) { \\r
+ ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \\r
+ ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \\r
+ ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \\r
+ ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \\r
+ } \\r
+ else { \\r
+ *((PULONG)(Address)) = (ULONG) (Value); \\r
+ }\r
+#endif\r
+\r
+/* VOID\r
+ * RtlStoreUlonglong(\r
+ * IN OUT PULONGLONG Address,\r
+ * ULONGLONG Value);\r
+ */\r
+#if defined(_AMD64_)\r
+#define RtlStoreUlonglong(Address,Value) \\r
+ *(ULONGLONG UNALIGNED *)(Address) = (Value)\r
+#else\r
+#define RtlStoreUlonglong(Address,Value) \\r
+ if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \\r
+ RtlStoreUlong((ULONG_PTR)(Address), \\r
+ (ULONGLONG)(Value) & 0xFFFFFFFF); \\r
+ RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \\r
+ (ULONGLONG)(Value) >> 32); \\r
+ } else { \\r
+ *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \\r
+ }\r
+#endif\r
+\r
+/* VOID\r
+ * RtlStoreUlongPtr(\r
+ * IN OUT PULONG_PTR Address,\r
+ * IN ULONG_PTR Value);\r
+ */\r
+#ifdef _WIN64\r
+#define RtlStoreUlongPtr(Address,Value) \\r
+ RtlStoreUlonglong(Address,Value)\r
+#else\r
+#define RtlStoreUlongPtr(Address,Value) \\r
+ RtlStoreUlong(Address,Value)\r
+#endif\r
+\r
+/* VOID\r
+ * RtlStoreUshort(\r
+ * IN PUSHORT Address,\r
+ * IN USHORT Value);\r
+ */\r
+#if defined(_AMD64_)\r
+#define RtlStoreUshort(Address,Value) \\r
+ *(USHORT UNALIGNED *)(Address) = (Value)\r
+#else\r
+#define RtlStoreUshort(Address,Value) \\r
+ if ((ULONG_PTR)(Address) & SHORT_MASK) { \\r
+ ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \\r
+ ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \\r
+ } \\r
+ else { \\r
+ *((PUSHORT) (Address)) = (USHORT)Value; \\r
+ }\r
+#endif\r
+\r
+NTSYSAPI\r
+BOOLEAN\r
+NTAPI\r
+RtlTimeFieldsToTime(\r
+ IN PTIME_FIELDS TimeFields,\r
+ IN PLARGE_INTEGER Time);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlTimeToTimeFields(\r
+ IN PLARGE_INTEGER Time,\r
+ IN PTIME_FIELDS TimeFields);\r
+\r
+NTSYSAPI\r
+ULONG\r
+FASTCALL\r
+RtlUlongByteSwap(\r
+ IN ULONG Source);\r
+\r
+NTSYSAPI\r
+ULONGLONG\r
+FASTCALL\r
+RtlUlonglongByteSwap(\r
+ IN ULONGLONG Source);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlUnicodeStringToAnsiString(\r
+ IN OUT PANSI_STRING DestinationString,\r
+ IN PCUNICODE_STRING SourceString,\r
+ IN BOOLEAN AllocateDestinationString);\r
+\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlxUnicodeStringToAnsiSize(\r
+ IN PCUNICODE_STRING UnicodeString);\r
+\r
+#define RtlUnicodeStringToAnsiSize(String) ( \\r
+ NLS_MB_CODE_PAGE_TAG ? \\r
+ RtlxUnicodeStringToAnsiSize(String) : \\r
+ ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \\r
+)\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlUnicodeStringToInteger(\r
+ IN PCUNICODE_STRING String,\r
+ IN ULONG Base OPTIONAL,\r
+ OUT PULONG Value);\r
+\r
+NTSYSAPI\r
+WCHAR\r
+NTAPI\r
+RtlUpcaseUnicodeChar(\r
+ IN WCHAR SourceCharacter);\r
+\r
+NTSYSAPI\r
+USHORT\r
+FASTCALL\r
+RtlUshortByteSwap(\r
+ IN USHORT Source);\r
+\r
+NTSYSAPI\r
+BOOLEAN\r
+NTAPI\r
+RtlValidRelativeSecurityDescriptor(\r
+ IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,\r
+ IN ULONG SecurityDescriptorLength,\r
+ IN SECURITY_INFORMATION RequiredInformation);\r
+\r
+NTSYSAPI\r
+BOOLEAN\r
+NTAPI\r
+RtlValidSecurityDescriptor(\r
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlWriteRegistryValue(\r
+ IN ULONG RelativeTo,\r
+ IN PCWSTR Path,\r
+ IN PCWSTR ValueName,\r
+ IN ULONG ValueType,\r
+ IN PVOID ValueData,\r
+ IN ULONG ValueLength);\r
+\r
+#endif // (NTDDI_VERSION >= NTDDI_WIN2K)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)\r
+NTSYSAPI\r
+VOID\r
+FASTCALL\r
+RtlPrefetchMemoryNonTemporal(\r
+ IN PVOID Source,\r
+ IN SIZE_T Length);\r
+#endif\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WINXP)\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlClearBit(\r
+ PRTL_BITMAP BitMapHeader,\r
+ ULONG BitNumber);\r
+\r
+NTSYSAPI\r
+WCHAR\r
+NTAPI\r
+RtlDowncaseUnicodeChar(\r
+ IN WCHAR SourceCharacter);\r
+\r
+NTSYSAPI\r
+VOID\r
+NTAPI\r
+RtlSetBit(\r
+ PRTL_BITMAP BitMapHeader,\r
+ ULONG BitNumber);\r
+\r
+NTSYSAPI\r
+BOOLEAN\r
+NTAPI\r
+RtlTestBit(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG BitNumber);\r
+\r
+#endif // (NTDDI_VERSION >= NTDDI_WINXP)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_VISTA)\r
+NTSYSAPI\r
+ULONG\r
+NTAPI\r
+RtlNumberOfSetBitsUlongPtr(\r
+ IN ULONG_PTR Target);\r
+\r
+NTSYSAPI\r
+ULONGLONG\r
+NTAPI\r
+RtlIoDecodeMemIoResource (\r
+ IN PIO_RESOURCE_DESCRIPTOR Descriptor,\r
+ OUT PULONGLONG Alignment OPTIONAL,\r
+ OUT PULONGLONG MinimumAddress OPTIONAL,\r
+ OUT PULONGLONG MaximumAddress OPTIONAL);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlIoEncodeMemIoResource(\r
+ IN PIO_RESOURCE_DESCRIPTOR Descriptor,\r
+ IN UCHAR Type,\r
+ IN ULONGLONG Length,\r
+ IN ULONGLONG Alignment,\r
+ IN ULONGLONG MinimumAddress,\r
+ IN ULONGLONG MaximumAddress);\r
+\r
+NTSYSAPI\r
+ULONGLONG\r
+NTAPI\r
+RtlCmDecodeMemIoResource(\r
+ IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,\r
+ OUT PULONGLONG Start OPTIONAL);\r
+\r
+NTSYSAPI\r
+NTSTATUS\r
+NTAPI\r
+RtlFindClosestEncodableLength(\r
+ IN ULONGLONG SourceLength,\r
+ OUT PULONGLONG TargetLength);\r
+\r
+#endif\r
+\r
+#if !defined(MIDL_PASS)\r
+/* inline funftions */\r
+//DECLSPEC_DEPRECATED_DDK_WINXP\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlConvertLongToLargeInteger(LONG SignedInteger)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = SignedInteger;\r
+ return ret;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK_WINXP\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlConvertUlongToLargeInteger(\r
+ ULONG UnsignedInteger)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = UnsignedInteger;\r
+ return ret;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+ULONG\r
+NTAPI_INLINE\r
+RtlEnlargedUnsignedDivide(\r
+ IN ULARGE_INTEGER Dividend,\r
+ IN ULONG Divisor,\r
+ IN OUT PULONG Remainder)\r
+{\r
+ if (Remainder)\r
+ *Remainder = Dividend.QuadPart % Divisor;\r
+ return Dividend.QuadPart / Divisor;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlEnlargedUnsignedMultiply(\r
+ IN ULONG Multiplicand,\r
+ IN ULONG Multiplier)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;\r
+ return ret;\r
+}\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlEnlargedIntegerMultiply(\r
+ IN LONG Multiplicand,\r
+ IN LONG Multiplier)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;\r
+ return ret;\r
+}\r
+\r
+FORCEINLINE\r
+VOID\r
+RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,\r
+ IN PCHAR Buffer,\r
+ IN USHORT BufferSize)\r
+{\r
+ AnsiString->Length = 0;\r
+ AnsiString->MaximumLength = BufferSize;\r
+ AnsiString->Buffer = Buffer;\r
+}\r
+\r
+FORCEINLINE\r
+VOID\r
+RtlInitEmptyUnicodeString(\r
+ OUT PUNICODE_STRING UnicodeString,\r
+ IN PWSTR Buffer,\r
+ IN USHORT BufferSize)\r
+{\r
+ UnicodeString->Length = 0;\r
+ UnicodeString->MaximumLength = BufferSize;\r
+ UnicodeString->Buffer = Buffer;\r
+}\r
+\r
+#if defined(_AMD64_) || defined(_IA64_)\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlExtendedIntegerMultiply(\r
+ LARGE_INTEGER Multiplicand,\r
+ LONG Multiplier)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = Multiplicand.QuadPart * Multiplier;\r
+ return ret;\r
+}\r
+\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlExtendedLargeIntegerDivide(\r
+ LARGE_INTEGER Dividend,\r
+ ULONG Divisor,\r
+ PULONG Remainder)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;\r
+ if (Remainder)\r
+ *Remainder = (ULONG)(Dividend.QuadPart % Divisor);\r
+ return ret;\r
+}\r
+#endif\r
+\r
+#if defined(_AMD64_)\r
+\r
+#define MultiplyHigh __mulh\r
+#define UnsignedMultiplyHigh __umulh\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlExtendedMagicDivide(\r
+ IN LARGE_INTEGER Dividend,\r
+ IN LARGE_INTEGER MagicDivisor,\r
+ IN CCHAR ShiftCount)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ULONG64 ret64;\r
+ BOOLEAN Pos;\r
+ Pos = (Dividend.QuadPart >= 0);\r
+ ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,\r
+ MagicDivisor.QuadPart);\r
+ ret64 >>= ShiftCount;\r
+ ret.QuadPart = Pos ? ret64 : -ret64;\r
+ return ret;\r
+}\r
+#endif\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlLargeIntegerAdd(\r
+ IN LARGE_INTEGER Addend1,\r
+ IN LARGE_INTEGER Addend2)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;\r
+ return ret;\r
+}\r
+\r
+/* VOID\r
+ * RtlLargeIntegerAnd(\r
+ * IN OUT LARGE_INTEGER Result,\r
+ * IN LARGE_INTEGER Source,\r
+ * IN LARGE_INTEGER Mask);\r
+ */\r
+#define RtlLargeIntegerAnd(Result, Source, Mask) \\r
+ Result.QuadPart = Source.QuadPart & Mask.QuadPart\r
+\r
+//DECLSPEC_DEPRECATED_DDK\r
+static __inline\r
+LARGE_INTEGER\r
+NTAPI_INLINE\r
+RtlLargeIntegerArithmeticShift(\r
+ IN LARGE_INTEGER LargeInteger,\r
+ IN CCHAR ShiftCount)\r
+{\r
+ LARGE_INTEGER ret;\r
+ ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;\r
+ return ret;\r
+}\r
+\r
+/* BOOLEAN\r
+ * RtlLargeIntegerEqualTo(\r
+ * IN LARGE_INTEGER Operand1,\r
+ * IN LARGE_INTEGER Operand2);\r
+ */\r
+#define RtlLargeIntegerEqualTo(X,Y) \\r
+ (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))\r
+\r
+FORCEINLINE\r
+PVOID\r
+RtlSecureZeroMemory(\r
+ OUT PVOID Pointer,\r
+ IN SIZE_T Size)\r
+{\r
+ volatile char* vptr = (volatile char*)Pointer;\r
+#if defined(_M_AMD64)\r
+ __stosb((PUCHAR)vptr, 0, Size);\r
+#else\r
+ char * endptr = (char *)vptr + Size;\r
+ while (vptr < endptr)\r
+ {\r
+ *vptr = 0; vptr++;\r
+ }\r
+#endif\r
+ return Pointer;\r
+}\r
+\r
+#if defined(_M_AMD64)\r
+FORCEINLINE\r
+ULONG\r
+RtlCheckBit(\r
+ IN PRTL_BITMAP BitMapHeader,\r
+ IN ULONG BitPosition)\r
+{\r
+ return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);\r
+}\r
+#else\r
+#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)\r
+#endif // defined(_M_AMD64)\r
+\r
+#endif // !defined(MIDL_PASS)\r
+\r
//\r
// Byte Swap Functions\r
//\r
-#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \\r
- ((defined(_M_AMD64) || \\r
- defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))\r
+#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \\r
+ ((defined(_M_AMD64) || defined(_M_IA64)) \\r
+ && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))\r
\r
-unsigned short __cdecl _byteswap_ushort(unsigned short);\r
-unsigned long __cdecl _byteswap_ulong (unsigned long);\r
-unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);\r
-#pragma intrinsic(_byteswap_ushort)\r
-#pragma intrinsic(_byteswap_ulong)\r
-#pragma intrinsic(_byteswap_uint64)\r
#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\r
#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\r
#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\r
\r
-#elif defined(__GNUC__)\r
+#endif\r
\r
-#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\r
-#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\r
-#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\r
+/******************************************************************************\r
+ * Memory manager Types *\r
+ ******************************************************************************/\r
+\r
+typedef struct _MDL {\r
+ struct _MDL *Next;\r
+ CSHORT Size;\r
+ CSHORT MdlFlags;\r
+ struct _EPROCESS *Process;\r
+ PVOID MappedSystemVa;\r
+ PVOID StartVa;\r
+ ULONG ByteCount;\r
+ ULONG ByteOffset;\r
+} MDL, *PMDL;\r
+\r
+\r
+/******************************************************************************\r
+ * Memory manager Functions *\r
+ ******************************************************************************/\r
+\r
+/* PVOID MmGetSystemAddressForMdl(\r
+ * IN PMDL Mdl);\r
+ */\r
+#define MmGetSystemAddressForMdl(Mdl) \\r
+ (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \\r
+ MDL_SOURCE_IS_NONPAGED_POOL)) ? \\r
+ ((Mdl)->MappedSystemVa) : \\r
+ (MmMapLockedPages((Mdl), KernelMode)))\r
+\r
+/* PVOID\r
+ * MmGetSystemAddressForMdlSafe(\r
+ * IN PMDL Mdl,\r
+ * IN MM_PAGE_PRIORITY Priority)\r
+ */\r
+#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \\r
+ (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \\r
+ | MDL_SOURCE_IS_NONPAGED_POOL)) ? \\r
+ (_Mdl)->MappedSystemVa : \\r
+ (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \\r
+ KernelMode, MmCached, NULL, FALSE, (_Priority)))\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
+NTKERNELAPI\r
+PMDL\r
+NTAPI\r
+MmCreateMdl(\r
+ IN PMDL MemoryDescriptorList OPTIONAL,\r
+ IN PVOID Base,\r
+ IN SIZE_T Length);\r
+\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * I/O Manager Functions *\r
+ ******************************************************************************/\r
+\r
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \\r
+ (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)\r
+\r
+#define DMA_MACROS_DEFINED\r
+\r
+FORCEINLINE\r
+NTSTATUS\r
+IoAllocateAdapterChannel(\r
+ IN PADAPTER_OBJECT AdapterObject,\r
+ IN PDEVICE_OBJECT DeviceObject,\r
+ IN ULONG NumberOfMapRegisters,\r
+ IN PDRIVER_CONTROL ExecutionRoutine,\r
+ IN PVOID Context)\r
+{\r
+ PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;\r
+ AllocateAdapterChannel =\r
+ *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;\r
+ ASSERT(AllocateAdapterChannel);\r
+ return AllocateAdapterChannel(DmaAdapter,\r
+ DeviceObject,\r
+ NumberOfMapRegisters,\r
+ ExecutionRoutine,\r
+ Context );\r
+}\r
+\r
+FORCEINLINE\r
+BOOLEAN\r
+IoFlushAdapterBuffers(\r
+ IN PADAPTER_OBJECT AdapterObject,\r
+ IN PMDL Mdl,\r
+ IN PVOID MapRegisterBase,\r
+ IN PVOID CurrentVa,\r
+ IN ULONG Length,\r
+ IN BOOLEAN WriteToDevice)\r
+{\r
+ PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;\r
+ FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;\r
+ ASSERT(FlushAdapterBuffers);\r
+ return FlushAdapterBuffers(DmaAdapter,\r
+ Mdl,\r
+ MapRegisterBase,\r
+ CurrentVa,\r
+ Length,\r
+ WriteToDevice );\r
+}\r
+\r
+FORCEINLINE\r
+VOID\r
+IoFreeAdapterChannel(\r
+ IN PADAPTER_OBJECT AdapterObject)\r
+{\r
+ PFREE_ADAPTER_CHANNEL FreeAdapterChannel;\r
+ FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;\r
+ ASSERT(FreeAdapterChannel);\r
+ FreeAdapterChannel(DmaAdapter);\r
+}\r
\r
+FORCEINLINE\r
+VOID\r
+IoFreeMapRegisters(\r
+ IN PADAPTER_OBJECT AdapterObject,\r
+ IN PVOID MapRegisterBase,\r
+ IN ULONG NumberOfMapRegisters)\r
+{\r
+ PFREE_MAP_REGISTERS FreeMapRegisters;\r
+ FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;\r
+ ASSERT(FreeMapRegisters);\r
+ FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);\r
+}\r
+\r
+FORCEINLINE\r
+PHYSICAL_ADDRESS\r
+IoMapTransfer(\r
+ IN PDMA_ADAPTER DmaAdapter,\r
+ IN PMDL Mdl,\r
+ IN PVOID MapRegisterBase,\r
+ IN PVOID CurrentVa,\r
+ IN OUT PULONG Length,\r
+ IN BOOLEAN WriteToDevice)\r
+{\r
+ PMAP_TRANSFER MapTransfer;\r
+\r
+ MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;\r
+ ASSERT(MapTransfer);\r
+ return MapTransfer(DmaAdapter,\r
+ Mdl,\r
+ MapRegisterBase,\r
+ CurrentVa,\r
+ Length,\r
+ WriteToDevice);\r
+}\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * Executive Types *\r
+ ******************************************************************************/\r
+\r
+typedef enum _POOL_TYPE {\r
+ NonPagedPool,\r
+ PagedPool,\r
+ NonPagedPoolMustSucceed,\r
+ DontUseThisType,\r
+ NonPagedPoolCacheAligned,\r
+ PagedPoolCacheAligned,\r
+ NonPagedPoolCacheAlignedMustS,\r
+ MaxPoolType,\r
+ NonPagedPoolSession = 32,\r
+ PagedPoolSession,\r
+ NonPagedPoolMustSucceedSession,\r
+ DontUseThisTypeSession,\r
+ NonPagedPoolCacheAlignedSession,\r
+ PagedPoolCacheAlignedSession,\r
+ NonPagedPoolCacheAlignedMustSSession\r
+} POOL_TYPE;\r
+\r
+typedef enum _SUITE_TYPE {\r
+ SmallBusiness,\r
+ Enterprise,\r
+ BackOffice,\r
+ CommunicationServer,\r
+ TerminalServer,\r
+ SmallBusinessRestricted,\r
+ EmbeddedNT,\r
+ DataCenter,\r
+ SingleUserTS,\r
+ Personal,\r
+ Blade,\r
+ MaxSuiteType\r
+} SUITE_TYPE;\r
+\r
+typedef enum _EX_POOL_PRIORITY {\r
+ LowPoolPriority,\r
+ LowPoolPrioritySpecialPoolOverrun = 8,\r
+ LowPoolPrioritySpecialPoolUnderrun = 9,\r
+ NormalPoolPriority = 16,\r
+ NormalPoolPrioritySpecialPoolOverrun = 24,\r
+ NormalPoolPrioritySpecialPoolUnderrun = 25,\r
+ HighPoolPriority = 32,\r
+ HighPoolPrioritySpecialPoolOverrun = 40,\r
+ HighPoolPrioritySpecialPoolUnderrun = 41\r
+} EX_POOL_PRIORITY;\r
+\r
+typedef struct _FAST_MUTEX\r
+{\r
+ LONG Count;\r
+ PKTHREAD Owner;\r
+ ULONG Contention;\r
+ KEVENT Gate;\r
+ ULONG OldIrql;\r
+} FAST_MUTEX, *PFAST_MUTEX;\r
+\r
+typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;\r
+\r
+typedef struct _OWNER_ENTRY {\r
+ ERESOURCE_THREAD OwnerThread;\r
+ _ANONYMOUS_UNION union {\r
+ LONG OwnerCount;\r
+ ULONG TableSize;\r
+ } DUMMYUNIONNAME;\r
+} OWNER_ENTRY, *POWNER_ENTRY;\r
+\r
+typedef struct _ERESOURCE\r
+{\r
+ LIST_ENTRY SystemResourcesList;\r
+ POWNER_ENTRY OwnerTable;\r
+ SHORT ActiveCount;\r
+ USHORT Flag;\r
+ volatile PKSEMAPHORE SharedWaiters;\r
+ volatile PKEVENT ExclusiveWaiters;\r
+ OWNER_ENTRY OwnerEntry;\r
+ ULONG ActiveEntries;\r
+ ULONG ContentionCount;\r
+ ULONG NumberOfSharedWaiters;\r
+ ULONG NumberOfExclusiveWaiters;\r
+ union\r
+ {\r
+ PVOID Address;\r
+ ULONG_PTR CreatorBackTraceIndex;\r
+ };\r
+ KSPIN_LOCK SpinLock;\r
+} ERESOURCE, *PERESOURCE;\r
+\r
+#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))\r
+#define LOOKASIDE_ALIGN\r
#else\r
+#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */\r
+#endif\r
\r
-#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
-NTSYSAPI\r
+typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;\r
+\r
+typedef PVOID\r
+(DDKAPI *PALLOCATE_FUNCTION)(\r
+ IN POOL_TYPE PoolType,\r
+ IN SIZE_T NumberOfBytes,\r
+ IN ULONG Tag);\r
+\r
+typedef PVOID\r
+(DDKAPI *PALLOCATE_FUNCTION_EX)(\r
+ IN POOL_TYPE PoolType,\r
+ IN SIZE_T NumberOfBytes,\r
+ IN ULONG Tag,\r
+ IN OUT PLOOKASIDE_LIST_EX Lookaside);\r
+\r
+typedef VOID\r
+(DDKAPI *PFREE_FUNCTION)(\r
+ IN PVOID Buffer);\r
+\r
+typedef VOID\r
+(DDKAPI *PFREE_FUNCTION_EX)(\r
+ IN PVOID Buffer,\r
+ IN OUT PLOOKASIDE_LIST_EX Lookaside);\r
+\r
+typedef VOID\r
+(DDKAPI *PCALLBACK_FUNCTION)(\r
+ IN PVOID CallbackContext,\r
+ IN PVOID Argument1,\r
+ IN PVOID Argument2);\r
+\r
+typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {\r
+ union {\r
+ SLIST_HEADER ListHead;\r
+ SINGLE_LIST_ENTRY SingleListHead;\r
+ } DUMMYUNIONNAME;\r
+ USHORT Depth;\r
+ USHORT MaximumDepth;\r
+ ULONG TotalAllocates;\r
+ union {\r
+ ULONG AllocateMisses;\r
+ ULONG AllocateHits;\r
+ } DUMMYUNIONNAME2;\r
+ ULONG TotalFrees;\r
+ union {\r
+ ULONG FreeMisses;\r
+ ULONG FreeHits;\r
+ } DUMMYUNIONNAME3;\r
+ POOL_TYPE Type;\r
+ ULONG Tag;\r
+ ULONG Size;\r
+ union {\r
+ PALLOCATE_FUNCTION_EX AllocateEx; \r
+ PALLOCATE_FUNCTION Allocate;\r
+ } DUMMYUNIONNAME4;\r
+ union {\r
+ PFREE_FUNCTION_EX FreeEx;\r
+ PFREE_FUNCTION Free;\r
+ } DUMMYUNIONNAME5;\r
+ LIST_ENTRY ListEntry;\r
+ ULONG LastTotalAllocates;\r
+ union {\r
+ ULONG LastAllocateMisses;\r
+ ULONG LastAllocateHits;\r
+ } DUMMYUNIONNAME6;\r
+ ULONG Future[2];\r
+} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;\r
+\r
+typedef struct _PAGED_LOOKASIDE_LIST {\r
+ GENERAL_LOOKASIDE L;\r
+#if !defined(_AMD64_) && !defined(_IA64_)\r
+ FAST_MUTEX Lock__ObsoleteButDoNotDelete;\r
+#endif\r
+} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;\r
+\r
+typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {\r
+ GENERAL_LOOKASIDE L;\r
+#if !defined(_AMD64_) && !defined(_IA64_)\r
+ KSPIN_LOCK Lock__ObsoleteButDoNotDelete;\r
+#endif\r
+} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;\r
+\r
+//typedef struct _LOOKASIDE_LIST_EX {\r
+// GENERAL_LOOKASIDE_POOL L;\r
+//} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;\r
+\r
+typedef struct _EX_RUNDOWN_REF {\r
+ union {\r
+ volatile ULONG_PTR Count;\r
+ volatile PVOID Ptr;\r
+ };\r
+} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;\r
+\r
+typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;\r
+\r
+typedef enum _WORK_QUEUE_TYPE {\r
+ CriticalWorkQueue,\r
+ DelayedWorkQueue,\r
+ HyperCriticalWorkQueue,\r
+ MaximumWorkQueue\r
+} WORK_QUEUE_TYPE;\r
+\r
+typedef VOID\r
+(DDKAPI *PWORKER_THREAD_ROUTINE)(\r
+ IN PVOID Parameter);\r
+\r
+typedef struct _WORK_QUEUE_ITEM {\r
+ LIST_ENTRY List;\r
+ PWORKER_THREAD_ROUTINE WorkerRoutine;\r
+ volatile PVOID Parameter;\r
+} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;\r
+\r
+\r
+/******************************************************************************\r
+ * Executive Functions *\r
+ ******************************************************************************/\r
+\r
+#if defined(_X86_)\r
+#if defined(_NTHAL_)\r
+#define ExAcquireFastMutex ExiAcquireFastMutex\r
+#define ExReleaseFastMutex ExiReleaseFastMutex\r
+#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex\r
+#endif\r
+#define ExInterlockedAddUlong ExfInterlockedAddUlong\r
+#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList\r
+#define ExInterlockedInsertTailList ExfInterlockedInsertTailList\r
+#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList\r
+#define ExInterlockedPopEntryList ExfInterlockedPopEntryList\r
+#define ExInterlockedPushEntryList ExfInterlockedPushEntryList\r
+#endif\r
+\r
+#if defined(_WIN64)\r
+\r
+#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \\r
+ defined(_NTHAL_) || defined(_NTOSP_)\r
+NTKERNELAPI\r
USHORT\r
+ExQueryDepthSList(IN PSLIST_HEADER ListHead);\r
+#else\r
+FORCEINLINE\r
+USHORT\r
+ExQueryDepthSList(IN PSLIST_HEADER ListHead)\r
+{\r
+ return (USHORT)(ListHead->Alignment & 0xffff);\r
+}\r
+#endif\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+ExpInterlockedFlushSList(\r
+ PSLIST_HEADER ListHead);\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+ExpInterlockedPopEntrySList(\r
+ PSLIST_HEADER ListHead);\r
+\r
+NTKERNELAPI\r
+PSLIST_ENTRY\r
+ExpInterlockedPushEntrySList(\r
+ PSLIST_HEADER ListHead,\r
+ PSLIST_ENTRY ListEntry);\r
+\r
+#define ExInterlockedFlushSList(Head) \\r
+ ExpInterlockedFlushSList(Head)\r
+#define ExInterlockedPopEntrySList(Head, Lock) \\r
+ ExpInterlockedPopEntrySList(Head)\r
+#define ExInterlockedPushEntrySList(Head, Entry, Lock) \\r
+ ExpInterlockedPushEntrySList(Head, Entry)\r
+\r
+#else // !defined(_WIN64)\r
+\r
+#define ExQueryDepthSList(listhead) (listhead)->Depth\r
+\r
+NTKERNELAPI\r
+PSINGLE_LIST_ENTRY\r
FASTCALL\r
-RtlUshortByteSwap(IN USHORT Source);\r
+ExInterlockedFlushSList(\r
+ IN PSLIST_HEADER ListHead);\r
\r
-NTSYSAPI\r
+#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)\r
+NTKERNELAPI\r
+PSINGLE_LIST_ENTRY \r
+FASTCALL\r
+ExInterlockedPopEntrySList(\r
+ IN PSLIST_HEADER ListHead,\r
+ IN PKSPIN_LOCK Lock);\r
+\r
+NTKERNELAPI\r
+PSINGLE_LIST_ENTRY \r
+FASTCALL\r
+ExInterlockedPushEntrySList(\r
+ IN PSLIST_HEADER ListHead,\r
+ IN PSINGLE_LIST_ENTRY ListEntry,\r
+ IN PKSPIN_LOCK Lock);\r
+#else\r
+#define ExInterlockedPopEntrySList(_ListHead, _Lock) \\r
+ InterlockedPopEntrySList(_ListHead)\r
+#define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \\r
+ InterlockedPushEntrySList(_ListHead, _ListEntry)\r
+#endif // _WIN2K_COMPAT_SLIST_USAGE\r
+\r
+#endif // !defined(_WIN64)\r
+\r
+/* ERESOURCE_THREAD\r
+ * ExGetCurrentResourceThread(\r
+ * VOID);\r
+ */\r
+#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())\r
+\r
+#define ExReleaseResource(R) (ExReleaseResourceLite(R))\r
+\r
+/* VOID\r
+ * ExInitializeWorkItem(\r
+ * IN PWORK_QUEUE_ITEM Item,\r
+ * IN PWORKER_THREAD_ROUTINE Routine,\r
+ * IN PVOID Context)\r
+ */\r
+#define ExInitializeWorkItem(Item, Routine, Context) \\r
+{ \\r
+ (Item)->WorkerRoutine = Routine; \\r
+ (Item)->Parameter = Context; \\r
+ (Item)->List.Flink = NULL; \\r
+}\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExAcquireFastMutex(\r
+ IN OUT PFAST_MUTEX FastMutex);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReleaseFastMutex(\r
+ IN OUT PFAST_MUTEX FastMutex);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+FASTCALL\r
+ExTryToAcquireFastMutex(\r
+ IN OUT PFAST_MUTEX FastMutex);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExAcquireFastMutexUnsafe(\r
+ IN OUT PFAST_MUTEX FastMutex);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReleaseFastMutexUnsafe(\r
+ IN OUT PFAST_MUTEX FastMutex);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+NTAPI\r
+ExAcquireResourceExclusiveLite(\r
+ IN PERESOURCE Resource,\r
+ IN BOOLEAN Wait);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+NTAPI\r
+ExAcquireResourceSharedLite(\r
+ IN PERESOURCE Resource,\r
+ IN BOOLEAN Wait);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+NTAPI\r
+ExAcquireSharedStarveExclusive(\r
+ IN PERESOURCE Resource,\r
+ IN BOOLEAN Wait);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+NTAPI\r
+ExAcquireSharedWaitForExclusive(\r
+ IN PERESOURCE Resource,\r
+ IN BOOLEAN Wait);\r
+\r
+NTKERNELAPI\r
+PVOID\r
+NTAPI\r
+ExAllocatePool(\r
+ IN POOL_TYPE PoolType,\r
+ IN SIZE_T NumberOfBytes);\r
+\r
+#ifdef POOL_TAGGING\r
+#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')\r
+#endif /* POOL_TAGGING */\r
+\r
+NTKERNELAPI\r
+PVOID\r
+NTAPI\r
+ExAllocatePoolWithQuota(\r
+ IN POOL_TYPE PoolType,\r
+ IN SIZE_T NumberOfBytes);\r
+\r
+#ifdef POOL_TAGGING\r
+#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')\r
+#endif /* POOL_TAGGING */\r
+\r
+NTKERNELAPI\r
+PVOID\r
+NTAPI\r
+ExAllocatePoolWithQuotaTag(\r
+ IN POOL_TYPE PoolType,\r
+ IN SIZE_T NumberOfBytes,\r
+ IN ULONG Tag);\r
+\r
+#ifndef POOL_TAGGING\r
+#define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)\r
+#endif /* POOL_TAGGING */\r
+\r
+NTKERNELAPI\r
+PVOID\r
+NTAPI\r
+ExAllocatePoolWithTag(\r
+ IN POOL_TYPE PoolType,\r
+ IN SIZE_T NumberOfBytes,\r
+ IN ULONG Tag);\r
+\r
+NTKERNELAPI\r
+PVOID\r
+NTAPI\r
+ExAllocatePoolWithTagPriority(\r
+ IN POOL_TYPE PoolType,\r
+ IN SIZE_T NumberOfBytes,\r
+ IN ULONG Tag,\r
+ IN EX_POOL_PRIORITY Priority);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExConvertExclusiveToSharedLite(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+NTSTATUS\r
+NTAPI\r
+ExCreateCallback(\r
+ OUT PCALLBACK_OBJECT *CallbackObject,\r
+ IN POBJECT_ATTRIBUTES ObjectAttributes,\r
+ IN BOOLEAN Create,\r
+ IN BOOLEAN AllowMultipleCallbacks);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExDeleteNPagedLookasideList(\r
+ IN PNPAGED_LOOKASIDE_LIST Lookaside);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExDeletePagedLookasideList(\r
+ IN PPAGED_LOOKASIDE_LIST Lookaside);\r
+\r
+NTKERNELAPI\r
+NTSTATUS\r
+NTAPI\r
+ExDeleteResourceLite(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExFreePool(\r
+ IN PVOID P);\r
+\r
+#ifdef POOL_TAGGING\r
+#define ExFreePool(P) ExFreePoolWithTag(P, 0)\r
+#endif\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExFreePoolWithTag(\r
+ IN PVOID P,\r
+ IN ULONG Tag);\r
+\r
+NTKERNELAPI\r
ULONG\r
+NTAPI\r
+ExGetExclusiveWaiterCount(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+KPROCESSOR_MODE\r
+NTAPI\r
+ExGetPreviousMode(\r
+ VOID);\r
+\r
+NTKERNELAPI\r
+ULONG\r
+NTAPI\r
+ExGetSharedWaiterCount(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExInitializeNPagedLookasideList(\r
+ IN PNPAGED_LOOKASIDE_LIST Lookaside,\r
+ IN PALLOCATE_FUNCTION Allocate OPTIONAL,\r
+ IN PFREE_FUNCTION Free OPTIONAL,\r
+ IN ULONG Flags,\r
+ IN SIZE_T Size,\r
+ IN ULONG Tag,\r
+ IN USHORT Depth);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExInitializePagedLookasideList(\r
+ IN PPAGED_LOOKASIDE_LIST Lookaside,\r
+ IN PALLOCATE_FUNCTION Allocate OPTIONAL,\r
+ IN PFREE_FUNCTION Free OPTIONAL,\r
+ IN ULONG Flags,\r
+ IN SIZE_T Size,\r
+ IN ULONG Tag,\r
+ IN USHORT Depth);\r
+\r
+NTKERNELAPI\r
+NTSTATUS\r
+NTAPI\r
+ExInitializeResourceLite(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+LARGE_INTEGER\r
+NTAPI\r
+ExInterlockedAddLargeInteger(\r
+ IN PLARGE_INTEGER Addend,\r
+ IN LARGE_INTEGER Increment,\r
+ IN PKSPIN_LOCK Lock);\r
+\r
+#if defined(_WIN64)\r
+#define ExInterlockedAddLargeStatistic(Addend, Increment) \\r
+ (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)\r
+#else\r
+#define ExInterlockedAddLargeStatistic(Addend, Increment) \\r
+ _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)\r
+#endif\r
+\r
+NTKERNELAPI\r
+ULONG\r
+FASTCALL\r
+ExInterlockedAddUlong(\r
+ IN PULONG Addend,\r
+ IN ULONG Increment,\r
+ PKSPIN_LOCK Lock);\r
+\r
+#if defined(_AMD64_) || defined(_IA64_)\r
+#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \\r
+ InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))\r
+#elif defined(_X86_)\r
+NTKERNELAPI\r
+LONGLONG\r
FASTCALL\r
-RtlUlongByteSwap(IN ULONG Source);\r
+ExfInterlockedCompareExchange64(\r
+ IN OUT LONGLONG volatile *Destination,\r
+ IN PLONGLONG Exchange,\r
+ IN PLONGLONG Comperand);\r
+#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \\r
+ ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)\r
+#else\r
+NTKERNELAPI\r
+LONGLONG\r
+FASTCALL\r
+ExInterlockedCompareExchange64(\r
+ IN OUT LONGLONG volatile *Destination,\r
+ IN PLONGLONG Exchange,\r
+ IN PLONGLONG Comparand,\r
+ IN PKSPIN_LOCK Lock);\r
+#endif\r
\r
-NTSYSAPI\r
-ULONGLONG\r
+NTKERNELAPI\r
+PLIST_ENTRY\r
+FASTCALL\r
+ExInterlockedInsertHeadList(\r
+ IN PLIST_ENTRY ListHead,\r
+ IN PLIST_ENTRY ListEntry,\r
+ IN PKSPIN_LOCK Lock);\r
+\r
+NTKERNELAPI\r
+PLIST_ENTRY\r
+FASTCALL\r
+ExInterlockedInsertTailList(\r
+ IN PLIST_ENTRY ListHead,\r
+ IN PLIST_ENTRY ListEntry,\r
+ IN PKSPIN_LOCK Lock);\r
+\r
+NTKERNELAPI\r
+PSINGLE_LIST_ENTRY\r
+FASTCALL\r
+ExInterlockedPopEntryList(\r
+ IN PSINGLE_LIST_ENTRY ListHead,\r
+ IN PKSPIN_LOCK Lock);\r
+\r
+NTKERNELAPI\r
+PSINGLE_LIST_ENTRY\r
+FASTCALL\r
+ExInterlockedPushEntryList(\r
+ IN PSINGLE_LIST_ENTRY ListHead,\r
+ IN PSINGLE_LIST_ENTRY ListEntry,\r
+ IN PKSPIN_LOCK Lock);\r
+\r
+NTKERNELAPI\r
+PLIST_ENTRY\r
+FASTCALL\r
+ExInterlockedRemoveHeadList(\r
+ IN PLIST_ENTRY ListHead,\r
+ IN PKSPIN_LOCK Lock);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+NTAPI\r
+ExIsProcessorFeaturePresent(\r
+ IN ULONG ProcessorFeature);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+NTAPI\r
+ExIsResourceAcquiredExclusiveLite(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+ULONG\r
+NTAPI\r
+ExIsResourceAcquiredSharedLite(\r
+ IN PERESOURCE Resource);\r
+\r
+#define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExLocalTimeToSystemTime(\r
+ IN PLARGE_INTEGER LocalTime,\r
+ OUT PLARGE_INTEGER SystemTime);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExNotifyCallback(\r
+ IN PCALLBACK_OBJECT CallbackObject,\r
+ IN PVOID Argument1,\r
+ IN PVOID Argument2);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExQueueWorkItem(\r
+ IN PWORK_QUEUE_ITEM WorkItem,\r
+ IN WORK_QUEUE_TYPE QueueType);\r
+\r
+NTKERNELAPI\r
+DECLSPEC_NORETURN\r
+VOID\r
+NTAPI\r
+ExRaiseStatus(\r
+ IN NTSTATUS Status);\r
+\r
+NTKERNELAPI\r
+PVOID\r
+NTAPI\r
+ExRegisterCallback(\r
+ IN PCALLBACK_OBJECT CallbackObject,\r
+ IN PCALLBACK_FUNCTION CallbackFunction,\r
+ IN PVOID CallbackContext);\r
+\r
+NTKERNELAPI\r
+NTSTATUS\r
+NTAPI\r
+ExReinitializeResourceLite(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExReleaseResourceForThreadLite(\r
+ IN PERESOURCE Resource,\r
+ IN ERESOURCE_THREAD ResourceThreadId);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReleaseResourceLite(\r
+ IN PERESOURCE Resource);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExSetResourceOwnerPointer(\r
+ IN PERESOURCE Resource,\r
+ IN PVOID OwnerPointer);\r
+\r
+NTKERNELAPI\r
+ULONG\r
+NTAPI\r
+ExSetTimerResolution(\r
+ IN ULONG DesiredTime,\r
+ IN BOOLEAN SetResolution);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExSystemTimeToLocalTime(\r
+ IN PLARGE_INTEGER SystemTime,\r
+ OUT PLARGE_INTEGER LocalTime);\r
+\r
+NTKERNELAPI\r
+VOID\r
+NTAPI\r
+ExUnregisterCallback(\r
+ IN PVOID CbRegistration);\r
+\r
+\r
+#endif // (NTDDI_VERSION >= NTDDI_WIN2K)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WINXP)\r
+NTKERNELAPI\r
+BOOLEAN\r
+FASTCALL\r
+ExAcquireRundownProtection(\r
+ IN OUT PEX_RUNDOWN_REF RunRef);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExInitializeRundownProtection(\r
+ OUT PEX_RUNDOWN_REF RunRef);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReInitializeRundownProtection(\r
+ OUT PEX_RUNDOWN_REF RunRef);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReleaseRundownProtection(\r
+ IN OUT PEX_RUNDOWN_REF RunRef);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExRundownCompleted(\r
+ OUT PEX_RUNDOWN_REF RunRef);\r
+\r
+NTKERNELAPI\r
+BOOLEAN\r
+NTAPI\r
+ExVerifySuite(\r
+ IN SUITE_TYPE SuiteType);\r
+\r
+NTKERNELAPI\r
+VOID\r
FASTCALL\r
-RtlUlonglongByteSwap(IN ULONGLONG Source);\r
+ExWaitForRundownProtectionRelease(\r
+ IN OUT PEX_RUNDOWN_REF RunRef);\r
+\r
+#endif // (NTDDI_VERSION >= NTDDI_WINXP)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)\r
+NTKERNELAPI\r
+BOOLEAN\r
+FASTCALL\r
+ExAcquireRundownProtectionEx(\r
+ IN OUT PEX_RUNDOWN_REF RunRef,\r
+ IN ULONG Count);\r
+\r
+NTKERNELAPI\r
+VOID\r
+FASTCALL\r
+ExReleaseRundownProtectionEx(\r
+ IN OUT PEX_RUNDOWN_REF RunRef,\r
+ IN ULONG Count);\r
+#endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WS03)\r
+\r
+#endif // (NTDDI_VERSION >= NTDDI_WS03)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)\r
+NTKERNELAPI\r
+PEX_RUNDOWN_REF_CACHE_AWARE\r
+ExAllocateCacheAwareRundownProtection(\r
+ IN POOL_TYPE PoolType,\r
+ IN ULONG PoolTag);\r
+\r
+NTKERNELAPI\r
+SIZE_T\r
+ExSizeOfRundownProtectionCacheAware(VOID);\r
+\r
+#endif // (NTDDI_VERSION >= NTDDI_WS03SP1)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_VISTA)\r
+NTKERNELAPI\r
+NTSTATUS\r
+ExInitializeLookasideListEx(\r
+ OUT PLOOKASIDE_LIST_EX Lookaside,\r
+ IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,\r
+ IN PFREE_FUNCTION_EX Free OPTIONAL,\r
+ IN POOL_TYPE PoolType,\r
+ IN ULONG Flags,\r
+ IN SIZE_T Size,\r
+ IN ULONG Tag,\r
+ IN USHORT Depth);\r
#endif\r
\r
+\r
+#if !defined(MIDL_PASS)\r
+\r
+static __inline PVOID\r
+ExAllocateFromNPagedLookasideList(\r
+ IN PNPAGED_LOOKASIDE_LIST Lookaside)\r
+{\r
+ PVOID Entry;\r
+\r
+ Lookaside->L.TotalAllocates++;\r
+ Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);\r
+ if (Entry == NULL) {\r
+ Lookaside->L.AllocateMisses++;\r
+ Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,\r
+ Lookaside->L.Size,\r
+ Lookaside->L.Tag);\r
+ }\r
+ return Entry;\r
+}\r
+\r
+static __inline PVOID\r
+ExAllocateFromPagedLookasideList(\r
+ IN PPAGED_LOOKASIDE_LIST Lookaside)\r
+{\r
+ PVOID Entry;\r
+\r
+ Lookaside->L.TotalAllocates++;\r
+ Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);\r
+ if (Entry == NULL) {\r
+ Lookaside->L.AllocateMisses++;\r
+ Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,\r
+ Lookaside->L.Size,\r
+ Lookaside->L.Tag);\r
+ }\r
+ return Entry;\r
+}\r
+\r
+static __inline VOID\r
+ExFreeToNPagedLookasideList(\r
+ IN PNPAGED_LOOKASIDE_LIST Lookaside,\r
+ IN PVOID Entry)\r
+{\r
+ Lookaside->L.TotalFrees++;\r
+ if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {\r
+ Lookaside->L.FreeMisses++;\r
+ (Lookaside->L.Free)(Entry);\r
+ } else {\r
+ InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);\r
+ }\r
+}\r
+\r
+static __inline VOID\r
+ExFreeToPagedLookasideList(\r
+ IN PPAGED_LOOKASIDE_LIST Lookaside,\r
+ IN PVOID Entry)\r
+{\r
+ Lookaside->L.TotalFrees++;\r
+ if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {\r
+ Lookaside->L.FreeMisses++;\r
+ (Lookaside->L.Free)(Entry);\r
+ } else {\r
+ InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);\r
+ }\r
+}\r
+\r
+\r
+#endif // !defined(MIDL_PASS)\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
#endif\r
\r
#endif // _WDMDDK_\r