-/*
- WDM (far from finished!)
-*/
-
-#ifndef WDM_H
-#define WDM_H
-
-typedef int CM_RESOURCE_TYPE;
-
-#define CmResourceTypeNull 0
-#define CmResourceTypePort 1
-#define CmResourceTypeInterrupt 2
-#define CmResourceTypeMemory 3
-#define CmResourceTypeDma 4
-#define CmResourceTypeDeviceSpecific 5
-#define CmResourceTypeBusNumber 6
-#define CmResourceTypeNonArbitrated 128
-#define CmResourceTypeConfigData 128
-#define CmResourceTypeDevicePrivate 129
-#define CmResourceTypePcCardConfig 130
-#define CmResourceTypeMfCardConfig 131
-
-#endif
-
+#ifndef _WDMDDK_\r
+#define _WDMDDK_\r
+\r
+//\r
+// Dependencies\r
+//\r
+#define NT_INCLUDED\r
+#include <excpt.h>\r
+#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
+// Resource list definitions\r
+//\r
+typedef int CM_RESOURCE_TYPE;\r
+\r
+#define CmResourceTypeNull 0\r
+#define CmResourceTypePort 1\r
+#define CmResourceTypeInterrupt 2\r
+#define CmResourceTypeMemory 3\r
+#define CmResourceTypeDma 4\r
+#define CmResourceTypeDeviceSpecific 5\r
+#define CmResourceTypeBusNumber 6\r
+#define CmResourceTypeNonArbitrated 128\r
+#define CmResourceTypeConfigData 128\r
+#define CmResourceTypeDevicePrivate 129\r
+#define CmResourceTypePcCardConfig 130\r
+#define CmResourceTypeMfCardConfig 131\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
+//\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
+//\r
+typedef enum _SECTION_INHERIT {\r
+ ViewShare = 1,\r
+ ViewUnmap = 2\r
+} SECTION_INHERIT;\r
+\r
+//\r
+// Section access rights\r
+//\r
+#define SECTION_QUERY 0x0001\r
+#define SECTION_MAP_WRITE 0x0002\r
+#define SECTION_MAP_READ 0x0004\r
+#define SECTION_MAP_EXECUTE 0x0008\r
+#define SECTION_EXTEND_SIZE 0x0010\r
+#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020\r
+\r
+#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\\r
+ SECTION_MAP_WRITE | \\r
+ SECTION_MAP_READ | \\r
+ SECTION_MAP_EXECUTE | \\r
+ SECTION_EXTEND_SIZE)\r
+\r
+#define SESSION_QUERY_ACCESS 0x0001\r
+#define SESSION_MODIFY_ACCESS 0x0002\r
+\r
+#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \\r
+ SESSION_QUERY_ACCESS | \\r
+ SESSION_MODIFY_ACCESS)\r
+\r
+\r
+\r
+#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS\r
+\r
+#define PAGE_NOACCESS 0x01\r
+#define PAGE_READONLY 0x02\r
+#define PAGE_READWRITE 0x04\r
+#define PAGE_WRITECOPY 0x08\r
+#define PAGE_EXECUTE 0x10\r
+#define PAGE_EXECUTE_READ 0x20\r
+#define PAGE_EXECUTE_READWRITE 0x40\r
+#define PAGE_EXECUTE_WRITECOPY 0x80\r
+#define PAGE_GUARD 0x100\r
+#define PAGE_NOCACHE 0x200\r
+#define PAGE_WRITECOMBINE 0x400\r
+\r
+#define MEM_COMMIT 0x1000\r
+#define MEM_RESERVE 0x2000\r
+#define MEM_DECOMMIT 0x4000\r
+#define MEM_RELEASE 0x8000\r
+#define MEM_FREE 0x10000\r
+#define MEM_PRIVATE 0x20000\r
+#define MEM_MAPPED 0x40000\r
+#define MEM_RESET 0x80000\r
+#define MEM_TOP_DOWN 0x100000\r
+#define MEM_LARGE_PAGES 0x20000000\r
+#define MEM_4MB_PAGES 0x80000000\r
+\r
+#define SEC_RESERVE 0x4000000 \r
+#define SEC_LARGE_PAGES 0x80000000\r
+\r
+#define PROCESS_DUP_HANDLE (0x0040)\r
+\r
+#if (NTDDI_VERSION >= NTDDI_VISTA)\r
+#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \\r
+ 0xFFFF)\r
+#else\r
+#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \\r
+ 0xFFF)\r
+#endif\r
+\r
+\r
+\r
+//\r
+// Processor features\r
+//\r
+#define PF_FLOATING_POINT_PRECISION_ERRATA 0 \r
+#define PF_FLOATING_POINT_EMULATED 1 \r
+#define PF_COMPARE_EXCHANGE_DOUBLE 2 \r
+#define PF_MMX_INSTRUCTIONS_AVAILABLE 3 \r
+#define PF_PPC_MOVEMEM_64BIT_OK 4 \r
+#define PF_ALPHA_BYTE_INSTRUCTIONS 5 \r
+#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 \r
+#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 \r
+#define PF_RDTSC_INSTRUCTION_AVAILABLE 8 \r
+#define PF_PAE_ENABLED 9 \r
+#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 \r
+#define PF_SSE_DAZ_MODE_AVAILABLE 11 \r
+#define PF_NX_ENABLED 12 \r
+#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13 \r
+#define PF_COMPARE_EXCHANGE128 14 \r
+#define PF_COMPARE64_EXCHANGE128 15 \r
+#define PF_CHANNELS_ENABLED 16 \r
+\r
+\r
+\r
+//\r
+// Intrinsics (note: taken from our winnt.h)\r
+// FIXME: 64-bit\r
+//\r
+#if defined(__GNUC__)\r
+\r
+static __inline__ BOOLEAN\r
+InterlockedBitTestAndSet(IN LONG volatile *Base,\r
+ IN LONG Bit)\r
+{\r
+#if defined(_M_IX86)\r
+ LONG OldBit;\r
+ __asm__ __volatile__("lock "\r
+ "btsl %2,%1\n\t"\r
+ "sbbl %0,%0\n\t"\r
+ :"=r" (OldBit),"+m" (*Base)\r
+ :"Ir" (Bit)\r
+ : "memory");\r
+ return OldBit;\r
+#else\r
+ return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;\r
+#endif\r
+}\r
+\r
+static __inline__ BOOLEAN\r
+InterlockedBitTestAndReset(IN LONG volatile *Base,\r
+ IN LONG Bit)\r
+{\r
+#if defined(_M_IX86)\r
+ LONG OldBit;\r
+ __asm__ __volatile__("lock "\r
+ "btrl %2,%1\n\t"\r
+ "sbbl %0,%0\n\t"\r
+ :"=r" (OldBit),"+m" (*Base)\r
+ :"Ir" (Bit)\r
+ : "memory");\r
+ return OldBit;\r
+#else\r
+ return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;\r
+#endif\r
+}\r
+\r
+#endif\r
+\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 _mm_pause\r
+#elif defined (_M_AMD64)\r
+#define YieldProcessor _mm_pause\r
+#elif defined(_M_PPC)\r
+#define YieldProcessor() __asm__ __volatile__("nop");\r
+#elif defined(_M_MIPS)\r
+#define YieldProcessor() __asm__ __volatile__("nop");\r
+#elif defined(_M_ARM)\r
+#define YieldProcessor()\r
+#else\r
+#error Unknown architecture\r
+#endif\r
+\r
+\r
+\r
+//\r
+// Slist Header\r
+//\r
+#ifndef _SLIST_HEADER_\r
+#define _SLIST_HEADER_\r
+\r
+#define SLIST_ENTRY SINGLE_LIST_ENTRY\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
+ SLIST_ENTRY Next;\r
+ USHORT Depth;\r
+ USHORT Sequence;\r
+ } DUMMYSTRUCTNAME;\r
+} SLIST_HEADER, *PSLIST_HEADER;\r
+#endif\r
+\r
+#endif /* _SLIST_HEADER_ */\r
+\r
+\r
+\r
+//\r
+// Power States/Levels\r
+//\r
+typedef enum _SYSTEM_POWER_STATE {\r
+ PowerSystemUnspecified,\r
+ PowerSystemWorking,\r
+ PowerSystemSleeping1,\r
+ PowerSystemSleeping2,\r
+ PowerSystemSleeping3,\r
+ PowerSystemHibernate,\r
+ PowerSystemShutdown,\r
+ PowerSystemMaximum\r
+} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;\r
+\r
+#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum\r
+\r
+typedef enum _POWER_INFORMATION_LEVEL {\r
+ SystemPowerPolicyAc,\r
+ SystemPowerPolicyDc,\r
+ VerifySystemPolicyAc,\r
+ VerifySystemPolicyDc,\r
+ SystemPowerCapabilities,\r
+ SystemBatteryState,\r
+ SystemPowerStateHandler,\r
+ ProcessorStateHandler,\r
+ SystemPowerPolicyCurrent,\r
+ AdministratorPowerPolicy,\r
+ SystemReserveHiberFile,\r
+ ProcessorInformation,\r
+ SystemPowerInformation,\r
+ ProcessorStateHandler2,\r
+ LastWakeTime,\r
+ LastSleepTime,\r
+ SystemExecutionState,\r
+ SystemPowerStateNotifyHandler,\r
+ ProcessorPowerPolicyAc,\r
+ ProcessorPowerPolicyDc,\r
+ VerifyProcessorPowerPolicyAc,\r
+ VerifyProcessorPowerPolicyDc,\r
+ ProcessorPowerPolicyCurrent\r
+} POWER_INFORMATION_LEVEL;\r
+\r
+typedef enum {\r
+ PowerActionNone,\r
+ PowerActionReserved,\r
+ PowerActionSleep,\r
+ PowerActionHibernate,\r
+ PowerActionShutdown,\r
+ PowerActionShutdownReset,\r
+ PowerActionShutdownOff,\r
+ PowerActionWarmEject\r
+} POWER_ACTION, *PPOWER_ACTION;\r
+\r
+typedef enum _DEVICE_POWER_STATE {\r
+ PowerDeviceUnspecified,\r
+ PowerDeviceD0,\r
+ PowerDeviceD1,\r
+ PowerDeviceD2,\r
+ PowerDeviceD3,\r
+ PowerDeviceMaximum\r
+} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;\r
+\r
+#define ES_SYSTEM_REQUIRED 0x00000001\r
+#define ES_DISPLAY_REQUIRED 0x00000002\r
+#define ES_USER_PRESENT 0x00000004\r
+#define ES_CONTINUOUS 0x80000000\r
+\r
+typedef ULONG EXECUTION_STATE;\r
+\r
+typedef enum {\r
+ LT_DONT_CARE,\r
+ LT_LOWEST_LATENCY\r
+} LATENCY_TIME;\r
+\r
+\r
+\r
+//\r
+// Access/Security Stuff\r
+//\r
+typedef ULONG ACCESS_MASK, *PACCESS_MASK;\r
+typedef PVOID PACCESS_TOKEN;\r
+\r
+#define DELETE 0x00010000L\r
+#define READ_CONTROL 0x00020000L\r
+#define WRITE_DAC 0x00040000L\r
+#define WRITE_OWNER 0x00080000L\r
+#define SYNCHRONIZE 0x00100000L\r
+#define STANDARD_RIGHTS_REQUIRED 0x000F0000L\r
+#define STANDARD_RIGHTS_READ READ_CONTROL\r
+#define STANDARD_RIGHTS_WRITE READ_CONTROL\r
+#define STANDARD_RIGHTS_EXECUTE READ_CONTROL\r
+#define STANDARD_RIGHTS_ALL 0x001F0000L\r
+#define SPECIFIC_RIGHTS_ALL 0x0000FFFFL\r
+#define ACCESS_SYSTEM_SECURITY 0x01000000L\r
+#define MAXIMUM_ALLOWED 0x02000000L\r
+#define GENERIC_READ 0x80000000L\r
+#define GENERIC_WRITE 0x40000000L\r
+#define GENERIC_EXECUTE 0x20000000L\r
+#define GENERIC_ALL 0x10000000L\r
+\r
+typedef struct _GENERIC_MAPPING {\r
+ ACCESS_MASK GenericRead;\r
+ ACCESS_MASK GenericWrite;\r
+ ACCESS_MASK GenericExecute;\r
+ ACCESS_MASK GenericAll;\r
+} GENERIC_MAPPING, *PGENERIC_MAPPING;\r
+\r
+#define ACL_REVISION 2\r
+#define ACL_REVISION_DS 4\r
+\r
+#define ACL_REVISION1 1\r
+#define ACL_REVISION2 2\r
+#define ACL_REVISION3 3\r
+#define ACL_REVISION4 4\r
+#define MIN_ACL_REVISION ACL_REVISION2\r
+#define MAX_ACL_REVISION ACL_REVISION4\r
+\r
+typedef struct _ACL {\r
+ UCHAR AclRevision;\r
+ UCHAR Sbz1;\r
+ USHORT AclSize;\r
+ USHORT AceCount;\r
+ USHORT Sbz2;\r
+} ACL, *PACL;\r
+\r
+\r
+\r
+//\r
+// Current security descriptor revision value\r
+//\r
+#define SECURITY_DESCRIPTOR_REVISION (1)\r
+#define SECURITY_DESCRIPTOR_REVISION1 (1)\r
+\r
+//\r
+// Privilege attributes\r
+//\r
+#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)\r
+#define SE_PRIVILEGE_ENABLED (0x00000002L)\r
+#define SE_PRIVILEGE_REMOVED (0X00000004L)\r
+#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)\r
+\r
+#define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \\r
+ SE_PRIVILEGE_ENABLED | \\r
+ SE_PRIVILEGE_REMOVED | \\r
+ SE_PRIVILEGE_USED_FOR_ACCESS)\r
+\r
+#include <pshpack4.h>\r
+typedef struct _LUID_AND_ATTRIBUTES {\r
+ LUID Luid;\r
+ ULONG Attributes;\r
+} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;\r
+#include <poppack.h>\r
+typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];\r
+typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;\r
+\r
+\r
+\r
+//\r
+// Privilege sets\r
+//\r
+#define PRIVILEGE_SET_ALL_NECESSARY (1)\r
+\r
+typedef struct _PRIVILEGE_SET {\r
+ ULONG PrivilegeCount;\r
+ ULONG Control;\r
+ LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];\r
+} PRIVILEGE_SET,*PPRIVILEGE_SET;\r
+\r
+typedef enum _SECURITY_IMPERSONATION_LEVEL {\r
+ SecurityAnonymous,\r
+ SecurityIdentification,\r
+ SecurityImpersonation,\r
+ SecurityDelegation\r
+} SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;\r
+\r
+#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation\r
+#define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous\r
+#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation\r
+#define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))\r
+\r
+#define SECURITY_DYNAMIC_TRACKING (TRUE)\r
+#define SECURITY_STATIC_TRACKING (FALSE)\r
+\r
+typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;\r
+\r
+typedef struct _SECURITY_QUALITY_OF_SERVICE {\r
+ ULONG Length;\r
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;\r
+ SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;\r
+ BOOLEAN EffectiveOnly;\r
+} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;\r
+\r
+typedef struct _SE_IMPERSONATION_STATE {\r
+ PACCESS_TOKEN Token;\r
+ BOOLEAN CopyOnOpen;\r
+ BOOLEAN EffectiveOnly;\r
+ SECURITY_IMPERSONATION_LEVEL Level;\r
+} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;\r
+\r
+#define OWNER_SECURITY_INFORMATION (0x00000001L)\r
+#define GROUP_SECURITY_INFORMATION (0x00000002L)\r
+#define DACL_SECURITY_INFORMATION (0x00000004L)\r
+#define SACL_SECURITY_INFORMATION (0x00000008L)\r
+#define LABEL_SECURITY_INFORMATION (0x00000010L)\r
+\r
+#define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)\r
+#define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)\r
+#define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)\r
+#define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)\r
+\r
+\r
+\r
+//\r
+// Registry Access Rights\r
+//\r
+#define KEY_QUERY_VALUE (0x0001)\r
+#define KEY_SET_VALUE (0x0002)\r
+#define KEY_CREATE_SUB_KEY (0x0004)\r
+#define KEY_ENUMERATE_SUB_KEYS (0x0008)\r
+#define KEY_NOTIFY (0x0010)\r
+#define KEY_CREATE_LINK (0x0020)\r
+#define KEY_WOW64_32KEY (0x0200)\r
+#define KEY_WOW64_64KEY (0x0100)\r
+#define KEY_WOW64_RES (0x0300)\r
+\r
+#define KEY_READ ((STANDARD_RIGHTS_READ |\\r
+ KEY_QUERY_VALUE |\\r
+ KEY_ENUMERATE_SUB_KEYS |\\r
+ KEY_NOTIFY) \\r
+ & \\r
+ (~SYNCHRONIZE))\r
+\r
+#define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\\r
+ KEY_SET_VALUE |\\r
+ KEY_CREATE_SUB_KEY) \\r
+ & \\r
+ (~SYNCHRONIZE))\r
+\r
+#define KEY_EXECUTE ((KEY_READ) \\r
+ & \\r
+ (~SYNCHRONIZE))\r
+\r
+#define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\\r
+ KEY_QUERY_VALUE |\\r
+ KEY_SET_VALUE |\\r
+ KEY_CREATE_SUB_KEY |\\r
+ KEY_ENUMERATE_SUB_KEYS |\\r
+ KEY_NOTIFY |\\r
+ KEY_CREATE_LINK) \\r
+ & \\r
+ (~SYNCHRONIZE))\r
+\r
+//\r
+// Registry Open/Create Options\r
+//\r
+#define REG_OPTION_RESERVED (0x00000000L)\r
+#define REG_OPTION_NON_VOLATILE (0x00000000L)\r
+#define REG_OPTION_VOLATILE (0x00000001L)\r
+#define REG_OPTION_CREATE_LINK (0x00000002L)\r
+#define REG_OPTION_BACKUP_RESTORE (0x00000004L)\r
+#define REG_OPTION_OPEN_LINK (0x00000008L)\r
+\r
+#define REG_LEGAL_OPTION \\r
+ (REG_OPTION_RESERVED |\\r
+ REG_OPTION_NON_VOLATILE |\\r
+ REG_OPTION_VOLATILE |\\r
+ REG_OPTION_CREATE_LINK |\\r
+ REG_OPTION_BACKUP_RESTORE |\\r
+ REG_OPTION_OPEN_LINK)\r
+\r
+//\r
+// Key creation/open disposition\r
+//\r
+#define REG_CREATED_NEW_KEY (0x00000001L)\r
+#define REG_OPENED_EXISTING_KEY (0x00000002L)\r
+\r
+//\r
+// Key restore & hive load flags\r
+//\r
+#define REG_WHOLE_HIVE_VOLATILE (0x00000001L)\r
+#define REG_REFRESH_HIVE (0x00000002L)\r
+#define REG_NO_LAZY_FLUSH (0x00000004L)\r
+#define REG_FORCE_RESTORE (0x00000008L)\r
+#define REG_APP_HIVE (0x00000010L)\r
+#define REG_PROCESS_PRIVATE (0x00000020L)\r
+#define REG_START_JOURNAL (0x00000040L)\r
+#define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)\r
+#define REG_HIVE_NO_RM (0x00000100L)\r
+#define REG_HIVE_SINGLE_LOG (0x00000200L)\r
+\r
+//\r
+// Unload Flags\r
+//\r
+#define REG_FORCE_UNLOAD 1\r
+\r
+//\r
+// Notify Filter Values\r
+//\r
+#define REG_NOTIFY_CHANGE_NAME (0x00000001L)\r
+#define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)\r
+#define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)\r
+#define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)\r
+\r
+#define REG_LEGAL_CHANGE_FILTER \\r
+ (REG_NOTIFY_CHANGE_NAME |\\r
+ REG_NOTIFY_CHANGE_ATTRIBUTES |\\r
+ REG_NOTIFY_CHANGE_LAST_SET |\\r
+ REG_NOTIFY_CHANGE_SECURITY)\r
+\r
+\r
+\r
+//\r
+// Thread Access Rights\r
+//\r
+#define THREAD_TERMINATE (0x0001) \r
+#define THREAD_SUSPEND_RESUME (0x0002) \r
+#define THREAD_ALERT (0x0004)\r
+#define THREAD_GET_CONTEXT (0x0008) \r
+#define THREAD_SET_CONTEXT (0x0010) \r
+#define THREAD_SET_INFORMATION (0x0020) \r
+#define THREAD_SET_LIMITED_INFORMATION (0x0400) \r
+#define THREAD_QUERY_LIMITED_INFORMATION (0x0800) \r
+#if (NTDDI_VERSION >= NTDDI_VISTA)\r
+#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \\r
+ 0xFFFF)\r
+#else\r
+#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \\r
+ 0x3FF)\r
+#endif\r
+\r
+//\r
+// Service Start Types\r
+//\r
+#define SERVICE_BOOT_START 0x00000000\r
+#define SERVICE_SYSTEM_START 0x00000001\r
+#define SERVICE_AUTO_START 0x00000002\r
+#define SERVICE_DEMAND_START 0x00000003\r
+#define SERVICE_DISABLED 0x00000004\r
+\r
+//\r
+// Exception Records\r
+//\r
+#define EXCEPTION_NONCONTINUABLE 1\r
+#define EXCEPTION_MAXIMUM_PARAMETERS 15\r
+\r
+typedef struct _EXCEPTION_RECORD {\r
+ NTSTATUS ExceptionCode;\r
+ ULONG ExceptionFlags;\r
+ struct _EXCEPTION_RECORD *ExceptionRecord;\r
+ PVOID ExceptionAddress;\r
+ ULONG NumberParameters;\r
+ ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];\r
+} EXCEPTION_RECORD, *PEXCEPTION_RECORD;\r
+\r
+typedef struct _EXCEPTION_RECORD32 {\r
+ NTSTATUS ExceptionCode;\r
+ ULONG ExceptionFlags;\r
+ ULONG ExceptionRecord;\r
+ ULONG ExceptionAddress;\r
+ ULONG NumberParameters;\r
+ ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];\r
+} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;\r
+\r
+typedef struct _EXCEPTION_RECORD64 {\r
+ NTSTATUS ExceptionCode;\r
+ ULONG ExceptionFlags;\r
+ ULONG64 ExceptionRecord;\r
+ ULONG64 ExceptionAddress;\r
+ ULONG NumberParameters;\r
+ ULONG __unusedAlignment;\r
+ ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];\r
+} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;\r
+\r
+typedef struct _EXCEPTION_POINTERS {\r
+ PEXCEPTION_RECORD ExceptionRecord;\r
+ PCONTEXT ContextRecord;\r
+} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;\r
+\r
+\r
+\r
+//\r
+// Process Qoutas\r
+//\r
+typedef struct _QUOTA_LIMITS {\r
+ SIZE_T PagedPoolLimit;\r
+ SIZE_T NonPagedPoolLimit;\r
+ SIZE_T MinimumWorkingSetSize;\r
+ SIZE_T MaximumWorkingSetSize;\r
+ SIZE_T PagefileLimit;\r
+ LARGE_INTEGER TimeLimit;\r
+} QUOTA_LIMITS, *PQUOTA_LIMITS;\r
+\r
+#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001\r
+#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002\r
+#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004\r
+#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008\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 || defined(__GNUC__))) || \\r
+ ((defined(_M_AMD64) || defined(_M_IA64)) \\r
+ && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))\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
+#endif\r
+\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
+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
+ExInterlockedFlushSList(\r
+ IN PSLIST_HEADER ListHead);\r
+\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
+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
+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
+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