- wdm.h: Define ALLOC_PRAGMA and ALLOC_DATA_PRAGMA for MSVC.
[reactos.git] / reactos / include / ddk / wdm.h
index c0c126e..8a590a5 100644 (file)
@@ -9,10 +9,67 @@
 #include <ntdef.h>\r
 #include <ntstatus.h>\r
 \r
-#ifdef __GNUC__\r
+#ifndef GUID_DEFINED\r
+#include <guiddef.h>\r
+#endif /* GUID_DEFINED */\r
+\r
 #include "intrin.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define NTKERNELAPI DECLSPEC_IMPORT\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
+#if defined(_MSC_VER)\r
+\r
+//\r
+// Indicate if #pragma alloc_text() is supported\r
+//\r
+#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)\r
+#define ALLOC_PRAGMA 1\r
+#endif\r
+\r
+//\r
+// Indicate if #pragma data_seg() is supported\r
+//\r
+#if defined(_M_IX86) || defined(_M_AMD64)\r
+#define ALLOC_DATA_PRAGMA 1\r
+#endif\r
+\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
@@ -33,7 +90,100 @@ typedef int CM_RESOURCE_TYPE;
 #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
@@ -41,6 +191,81 @@ typedef int CM_RESOURCE_TYPE;
 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
@@ -181,16 +406,150 @@ InterlockedBitTestAndReset(IN LONG volatile *Base,
 #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
 #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
@@ -213,6 +572,31 @@ InterlockedBitTestAndReset(IN LONG volatile *Base,
 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY\r
 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY\r
 \r
+#if defined(_WIN64)\r
+typedef union _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
@@ -221,6 +605,7 @@ typedef union _SLIST_HEADER {
         USHORT Sequence;\r
     } DUMMYSTRUCTNAME;\r
 } SLIST_HEADER, *PSLIST_HEADER;\r
+#endif\r
 \r
 #endif /* _SLIST_HEADER_ */\r
 \r
@@ -565,131 +950,6 @@ typedef struct _SE_IMPERSONATION_STATE {
 #define SERVICE_DEMAND_START           0x00000003\r
 #define SERVICE_DISABLED               0x00000004\r
 \r
-\r
-\r
-//\r
-// Architecture Defined Contexts\r
-//\r
-#if defined(_M_IX86)\r
-#define SIZE_OF_80387_REGISTERS        80\r
-#define CONTEXT_i386   0x10000\r
-#define CONTEXT_i486   0x10000\r
-#define CONTEXT_CONTROL        (CONTEXT_i386|0x00000001L)\r
-#define CONTEXT_INTEGER        (CONTEXT_i386|0x00000002L)\r
-#define CONTEXT_SEGMENTS       (CONTEXT_i386|0x00000004L)\r
-#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)\r
-#define CONTEXT_DEBUG_REGISTERS        (CONTEXT_i386|0x00000010L)\r
-#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)\r
-#define CONTEXT_FULL   (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)\r
-#define MAXIMUM_SUPPORTED_EXTENSION  512\r
-\r
-#define EXCEPTION_READ_FAULT    0\r
-#define EXCEPTION_WRITE_FAULT   1\r
-#define EXCEPTION_EXECUTE_FAULT 8\r
-\r
-typedef struct _FLOATING_SAVE_AREA {\r
-    ULONG ControlWord;\r
-    ULONG StatusWord;\r
-    ULONG TagWord;\r
-    ULONG ErrorOffset;\r
-    ULONG ErrorSelector;\r
-    ULONG DataOffset;\r
-    ULONG DataSelector;\r
-    UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];\r
-    ULONG Cr0NpxState;\r
-} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;\r
-\r
-typedef struct _CONTEXT {\r
-    ULONG ContextFlags;\r
-    ULONG Dr0;\r
-    ULONG Dr1;\r
-    ULONG Dr2;\r
-    ULONG Dr3;\r
-    ULONG Dr6;\r
-    ULONG Dr7;\r
-    FLOATING_SAVE_AREA FloatSave;\r
-    ULONG SegGs;\r
-    ULONG SegFs;\r
-    ULONG SegEs;\r
-    ULONG SegDs;\r
-    ULONG Edi;\r
-    ULONG Esi;\r
-    ULONG Ebx;\r
-    ULONG Edx;\r
-    ULONG Ecx;\r
-    ULONG Eax;\r
-    ULONG Ebp;\r
-    ULONG Eip;\r
-    ULONG SegCs;\r
-    ULONG EFlags;\r
-    ULONG Esp;\r
-    ULONG SegSs;\r
-    UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];\r
-} CONTEXT;\r
-\r
-#elif defined(_M_AMD64)\r
-//#error FIXME-TODO: 64-bit\r
-#elif defined(_M_ARM)\r
-\r
-//\r
-// FIXME: Move to armddk.h?\r
-//\r
-\r
-/* The following flags control the contents of the CONTEXT structure. */\r
-\r
-#define CONTEXT_ARM    0x0000040\r
-#define CONTEXT_CONTROL         (CONTEXT_ARM | 0x00000001L)\r
-#define CONTEXT_INTEGER         (CONTEXT_ARM | 0x00000002L)\r
-\r
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)\r
-\r
-typedef struct _CONTEXT {\r
-       /* The flags values within this flag control the contents of\r
-          a CONTEXT record.\r
-\r
-          If the context record is used as an input parameter, then\r
-          for each portion of the context record controlled by a flag\r
-          whose value is set, it is assumed that that portion of the\r
-          context record contains valid context. If the context record\r
-          is being used to modify a thread's context, then only that\r
-          portion of the threads context will be modified.\r
-\r
-          If the context record is used as an IN OUT parameter to capture\r
-          the context of a thread, then only those portions of the thread's\r
-          context corresponding to set flags will be returned.\r
-\r
-          The context record is never used as an OUT only parameter. */\r
-\r
-       ULONG ContextFlags;\r
-\r
-       /* This section is specified/returned if the ContextFlags word contains\r
-          the flag CONTEXT_INTEGER. */\r
-       ULONG R0;\r
-       ULONG R1;\r
-       ULONG R2;\r
-       ULONG R3;\r
-       ULONG R4;\r
-       ULONG R5;\r
-       ULONG R6;\r
-       ULONG R7;\r
-       ULONG R8;\r
-       ULONG R9;\r
-       ULONG R10;\r
-       ULONG R11;\r
-       ULONG R12;\r
-\r
-       ULONG Sp;\r
-       ULONG Lr;\r
-       ULONG Pc;\r
-       ULONG Psr;\r
-} CONTEXT;\r
-\r
-#else\r
-#error "Undefined processor architecture"\r
-#endif\r
-\r
-\r
-\r
 //\r
 // Exception Records\r
 //\r
@@ -750,5 +1010,2196 @@ typedef struct _QUOTA_LIMITS {
 #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 = (ULONG)(Dividend.QuadPart % Divisor);\r
+    return (ULONG)(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