[HEADERS]
[reactos.git] / reactos / include / ddk / wdm.h
index 2644e68..759cd44 100644 (file)
-#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
-/* 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
-\r
-\r
-//\r
-// Global debug flag\r
-//\r
-extern ULONG NtGlobalFlag;\r
-\r
-\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
-#ifdef _M_AMD64\r
-#define InterlockedBitTestAndSet64 _interlockedbittestandset64\r
-#define InterlockedBitTestAndReset64 _interlockedbittestandreset64\r
-#endif\r
-\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 _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
-        ULONGLONG Depth:16;\r
-        ULONGLONG Sequence:48;\r
-        ULONGLONG HeaderType:1;\r
-        ULONGLONG Init:1;\r
-        ULONGLONG Reserved:2;\r
-        ULONGLONG Region:60;\r
-    struct {\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
- *                              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
-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 Result;\r
-    Result.QuadPart = SignedInteger;\r
-    return Result;\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
-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
-#ifdef _M_AMD64\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
-FORCEINLINE\r
-PVOID\r
-RtlSecureZeroMemory(\r
-    OUT PVOID Pointer,\r
-    IN SIZE_T Size)\r
-{\r
-    volatile char* vptr = (volatile char*)Pointer;\r
-#if defined(_M_AMD64)\r
-    _stosb((PUCHAR)vptr, 0, Size);\r
-#else\r
-    char * endptr = (char *)vptr + Size;\r
-    while (vptr < endptr)\r
-    {\r
-        *vptr = 0; vptr++;\r
-    }\r
-#endif\r
-     return Pointer;\r
-}\r
-\r
-#if defined(_M_AMD64)\r
-FORCEINLINE\r
-ULONG\r
-RtlCheckBit(\r
-    IN PRTL_BITMAP BitMapHeader,\r
-    IN ULONG BitPosition);\r
-{\r
-    return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);\r
-}\r
-#else\r
-#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)\r
-#endif // defined(_M_AMD64)\r
-\r
-#endif // !defined(MIDL_PASS)\r
-\r
-//\r
-// Byte Swap Functions\r
-//\r
-#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \\r
-    ((defined(_M_AMD64) || \\r
-     defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))\r
-\r
-unsigned short __cdecl _byteswap_ushort(unsigned short);\r
-unsigned long  __cdecl _byteswap_ulong (unsigned long);\r
-unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);\r
-#pragma intrinsic(_byteswap_ushort)\r
-#pragma intrinsic(_byteswap_ulong)\r
-#pragma intrinsic(_byteswap_uint64)\r
-#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))\r
-#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))\r
-#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))\r
-\r
-#elif defined(__GNUC__) && (defined(_M_IX86) || defined(_M_AMD64))\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
-/******************************************************************************\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 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
-\r
-/******************************************************************************\r
- *                          Executive Functions                               *\r
- ******************************************************************************/\r
-\r
-#if defined (_WIN64)\r
-#if defined(_NTDRIVER_) || defined(_NTDDK) || defined(_NTIFS_) || \\r
-    defined(_NTHAL_) || defined(_NTOSP_)\r
-NTKRNLAPI\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
-#else\r
-#define ExQueryDepthSList(listhead) (listhead)->Depth\r
-#endif\r
-\r
-#if defined(_WIN64)\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
-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
-/* ERESOURCE_THREAD\r
- * ExGetCurrentResourceThread(\r
- *     VOID);\r
- */\r
-#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())\r
-\r
-#endif // !defined(_WIN64)\r
-\r
-#if (NTDDI_VERSION >= NTDDI_WIN2K)\r
-\r
-#if defined(_NTHAL_) && defined(_X86_)\r
-#define ExAcquireFastMutex ExiAcquireFastMutex\r
-#define ExReleaseFastMutex ExiReleaseFastMutex\r
-#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex\r
-#endif\r
-\r
-#if defined(_X86_)\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
-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
-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
-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
-/******************************************************************************\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
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif // _WDMDDK_\r
+/*
+ * wdm.h
+ *
+ * Windows NT WDM Driver Developer Kit
+ *
+ * This file is part of the ReactOS DDK package.
+ *
+ * Contributors:
+ *   Amine Khaldi
+ *   Timo Kreuzer (timo.kreuzer@reactos.org)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+#pragma once
+
+#ifndef _WDMDDK_
+#define _WDMDDK_
+
+/* Included via ntddk.h? */
+#ifndef _NTDDK_
+#define _NTDDK_
+#define _WDM_INCLUDED_
+#define _DDK_DRIVER_
+#define NO_INTERLOCKED_INTRINSICS
+#endif /* _NTDDK_ */
+
+/* Dependencies */
+#define NT_INCLUDED
+#include <excpt.h>
+#include <ntdef.h>
+#include <ntstatus.h>
+
+#ifndef GUID_DEFINED
+#include <guiddef.h>
+#endif /* GUID_DEFINED */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#include <dpfilter.h>
+#endif
+
+#include "intrin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(_NTHALDLL_) && !defined(_BLDR_)
+#define NTHALAPI DECLSPEC_IMPORT
+#else
+#define NTHALAPI
+#endif
+
+/* For ReactOS */
+#if !defined(_NTOSKRNL_) && !defined(_BLDR_)
+#define NTKERNELAPI DECLSPEC_IMPORT
+#else
+#define NTKERNELAPI
+#endif
+
+#if defined(_X86_) && !defined(_NTHAL_)
+#define _DECL_HAL_KE_IMPORT  DECLSPEC_IMPORT
+#elif defined(_X86_)
+#define _DECL_HAL_KE_IMPORT
+#else
+#define _DECL_HAL_KE_IMPORT NTKERNELAPI
+#endif
+
+#if defined(_WIN64)
+#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
+#else
+#define POINTER_ALIGNMENT
+#endif
+
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
+#if defined(_MSC_VER)
+
+/* Indicate if #pragma alloc_text() is supported */
+#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
+#define ALLOC_PRAGMA 1
+#endif
+
+/* Indicate if #pragma data_seg() is supported */
+#if defined(_M_IX86) || defined(_M_AMD64)
+#define ALLOC_DATA_PRAGMA 1
+#endif
+
+#endif
+
+/* Forward declarations */
+struct _IRP;
+struct _MDL;
+struct _KAPC;
+struct _KDPC;
+struct _FILE_OBJECT;
+struct _DMA_ADAPTER;
+struct _DEVICE_OBJECT;
+struct _DRIVER_OBJECT;
+struct _IO_STATUS_BLOCK;
+struct _DEVICE_DESCRIPTION;
+struct _SCATTER_GATHER_LIST;
+struct _DRIVE_LAYOUT_INFORMATION;
+struct _COMPRESSED_DATA_INFO;
+struct _IO_RESOURCE_DESCRIPTOR;
+
+/* Structures not exposed to drivers */
+typedef struct _OBJECT_TYPE *POBJECT_TYPE;
+typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
+typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
+typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
+typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; 
+typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
+typedef struct _ETHREAD *PETHREAD;
+typedef struct _EPROCESS *PEPROCESS;
+typedef struct _IO_TIMER *PIO_TIMER;
+typedef struct _KINTERRUPT *PKINTERRUPT;
+typedef struct _KPROCESS *PKPROCESS;
+typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
+typedef struct _CONTEXT *PCONTEXT;
+
+
+/******************************************************************************
+ *                           INTERLOCKED Functions                            *
+ ******************************************************************************/
+//
+// Intrinsics (note: taken from our winnt.h)
+// FIXME: 64-bit
+//
+#if defined(__GNUC__)
+
+static __inline__ BOOLEAN
+InterlockedBitTestAndSet(IN LONG volatile *Base,
+                         IN LONG Bit)
+{
+#if defined(_M_IX86)
+       LONG OldBit;
+       __asm__ __volatile__("lock "
+                            "btsl %2,%1\n\t"
+                            "sbbl %0,%0\n\t"
+                            :"=r" (OldBit),"+m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
+       return OldBit;
+#else
+       return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
+#endif
+}
+
+static __inline__ BOOLEAN
+InterlockedBitTestAndReset(IN LONG volatile *Base,
+                           IN LONG Bit)
+{
+#if defined(_M_IX86)
+       LONG OldBit;
+       __asm__ __volatile__("lock "
+                            "btrl %2,%1\n\t"
+                            "sbbl %0,%0\n\t"
+                            :"=r" (OldBit),"+m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
+       return OldBit;
+#else
+       return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
+#endif
+}
+
+#endif
+
+#define BitScanForward _BitScanForward
+#define BitScanReverse _BitScanReverse
+#define BitTest _bittest
+#define BitTestAndComplement _bittestandcomplement
+#define BitTestAndSet _bittestandset
+#define BitTestAndReset _bittestandreset
+#define InterlockedBitTestAndSet _interlockedbittestandset
+#define InterlockedBitTestAndReset _interlockedbittestandreset
+
+#ifdef _M_AMD64
+#define InterlockedBitTestAndSet64 _interlockedbittestandset64
+#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
+#endif
+
+#if !defined(__INTERLOCKED_DECLARED)
+#define __INTERLOCKED_DECLARED
+
+#if defined (_X86_)
+#if defined(NO_INTERLOCKED_INTRINSICS)
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedIncrement(
+  IN OUT LONG volatile *Addend);
+
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedDecrement(
+  IN OUT LONG volatile *Addend);
+
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedCompareExchange(
+  IN OUT LONG volatile *Destination,
+  IN LONG  Exchange,
+  IN LONG  Comparand);
+
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedExchange(
+  IN OUT LONG volatile *Destination,
+  IN LONG Value);
+
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedExchangeAdd(
+  IN OUT LONG volatile *Addend,
+  IN LONG  Value);
+
+#else // !defined(NO_INTERLOCKED_INTRINSICS)
+
+#define InterlockedExchange _InterlockedExchange
+#define InterlockedIncrement _InterlockedIncrement
+#define InterlockedDecrement _InterlockedDecrement
+#define InterlockedExchangeAdd _InterlockedExchangeAdd
+#define InterlockedCompareExchange _InterlockedCompareExchange
+#define InterlockedOr _InterlockedOr
+#define InterlockedAnd _InterlockedAnd
+#define InterlockedXor _InterlockedXor
+
+#endif // !defined(NO_INTERLOCKED_INTRINSICS)
+
+#endif // defined (_X86_)
+
+#if !defined (_WIN64)
+/*
+ * PVOID
+ * InterlockedExchangePointer(
+ *   IN OUT PVOID volatile  *Target,
+ *   IN PVOID  Value)
+ */
+#define InterlockedExchangePointer(Target, Value) \
+  ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
+
+/*
+ * PVOID
+ * InterlockedCompareExchangePointer(
+ *   IN OUT PVOID  *Destination,
+ *   IN PVOID  Exchange,
+ *   IN PVOID  Comparand)
+ */
+#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
+  ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
+
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
+#define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
+#define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
+
+#endif // !defined (_WIN64)
+
+#if defined (_M_AMD64)
+
+#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
+#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
+#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
+#define InterlockedAnd _InterlockedAnd
+#define InterlockedOr _InterlockedOr
+#define InterlockedXor _InterlockedXor
+#define InterlockedIncrement _InterlockedIncrement
+#define InterlockedDecrement _InterlockedDecrement
+#define InterlockedAdd _InterlockedAdd
+#define InterlockedExchange _InterlockedExchange
+#define InterlockedExchangeAdd _InterlockedExchangeAdd
+#define InterlockedCompareExchange _InterlockedCompareExchange
+#define InterlockedAnd64 _InterlockedAnd64
+#define InterlockedOr64 _InterlockedOr64
+#define InterlockedXor64 _InterlockedXor64
+#define InterlockedIncrement64 _InterlockedIncrement64
+#define InterlockedDecrement64 _InterlockedDecrement64
+#define InterlockedAdd64 _InterlockedAdd64
+#define InterlockedExchange64 _InterlockedExchange64
+#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
+#define InterlockedCompareExchange64 _InterlockedCompareExchange64
+#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
+#define InterlockedExchangePointer _InterlockedExchangePointer
+#define InterlockedBitTestAndSet64 _interlockedbittestandset64
+#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
+
+#endif // _M_AMD64
+
+#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
+//#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
+FORCEINLINE
+LONG64
+InterlockedAdd64(
+    IN OUT LONG64 volatile *Addend,
+    IN LONG64 Value)
+{
+    return InterlockedExchangeAdd64(Addend, Value) + Value;
+}
+//#endif
+#endif
+
+#endif /* !__INTERLOCKED_DECLARED */
+
+
+/******************************************************************************
+ *                           Runtime Library Types                            *
+ ******************************************************************************/
+
+#define RTL_REGISTRY_ABSOLUTE             0
+#define RTL_REGISTRY_SERVICES             1
+#define RTL_REGISTRY_CONTROL              2
+#define RTL_REGISTRY_WINDOWS_NT           3
+#define RTL_REGISTRY_DEVICEMAP            4
+#define RTL_REGISTRY_USER                 5
+#define RTL_REGISTRY_MAXIMUM              6
+#define RTL_REGISTRY_HANDLE               0x40000000
+#define RTL_REGISTRY_OPTIONAL             0x80000000
+
+/* RTL_QUERY_REGISTRY_TABLE.Flags */
+#define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
+#define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
+#define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
+#define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
+#define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
+#define RTL_QUERY_REGISTRY_DIRECT         0x00000020
+#define RTL_QUERY_REGISTRY_DELETE         0x00000040
+
+#define HASH_STRING_ALGORITHM_DEFAULT     0
+#define HASH_STRING_ALGORITHM_X65599      1
+#define HASH_STRING_ALGORITHM_INVALID     0xffffffff
+
+typedef struct _RTL_BITMAP {
+    ULONG SizeOfBitMap;
+    PULONG Buffer;
+} RTL_BITMAP, *PRTL_BITMAP;
+
+typedef struct _RTL_BITMAP_RUN {
+    ULONG StartingIndex;
+    ULONG NumberOfBits;
+} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
+
+typedef NTSTATUS
+(DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
+    IN PWSTR ValueName,
+    IN ULONG ValueType,
+    IN PVOID ValueData,
+    IN ULONG ValueLength,
+    IN PVOID Context,
+    IN PVOID EntryContext);
+
+typedef struct _RTL_QUERY_REGISTRY_TABLE {
+    PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
+    ULONG Flags;
+    PCWSTR Name;
+    PVOID EntryContext;
+    ULONG DefaultType;
+    PVOID DefaultData;
+    ULONG DefaultLength;
+} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
+
+typedef struct _TIME_FIELDS {
+    CSHORT Year;
+    CSHORT Month;
+    CSHORT Day;
+    CSHORT Hour;
+    CSHORT Minute;
+    CSHORT Second;
+    CSHORT Milliseconds;
+    CSHORT Weekday;
+} TIME_FIELDS, *PTIME_FIELDS;
+
+/* Slist Header */
+#ifndef _SLIST_HEADER_
+#define _SLIST_HEADER_
+
+#if defined(_WIN64)
+typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
+typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
+       PSLIST_ENTRY Next;
+} SLIST_ENTRY;
+typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
+    struct {
+        ULONGLONG Alignment;
+        ULONGLONG Region;
+    } DUMMYSTRUCTNAME;
+    struct {
+        ULONGLONG Depth:16;
+        ULONGLONG Sequence:9;
+        ULONGLONG NextEntry:39;
+        ULONGLONG HeaderType:1;
+        ULONGLONG Init:1;
+        ULONGLONG Reserved:59;
+        ULONGLONG Region:3;
+    } Header8;
+    struct {
+        ULONGLONG Depth:16;
+        ULONGLONG Sequence:48;
+        ULONGLONG HeaderType:1;
+        ULONGLONG Init:1;
+        ULONGLONG Reserved:2;
+        ULONGLONG NextEntry:60;
+    } Header16;
+} SLIST_HEADER, *PSLIST_HEADER;
+#else
+#define SLIST_ENTRY SINGLE_LIST_ENTRY
+#define _SLIST_ENTRY _SINGLE_LIST_ENTRY
+#define PSLIST_ENTRY PSINGLE_LIST_ENTRY
+typedef union _SLIST_HEADER {
+    ULONGLONG Alignment;
+    struct {
+        SLIST_ENTRY Next;
+        USHORT Depth;
+        USHORT Sequence;
+    } DUMMYSTRUCTNAME;
+} SLIST_HEADER, *PSLIST_HEADER;
+#endif
+
+#endif /* _SLIST_HEADER_ */
+
+
+/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
+#if defined(_NTSYSTEM_) || defined(__GNUC__)
+#define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
+#define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
+#else
+#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
+#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
+#endif /* _NT_SYSTEM */
+extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
+extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
+
+
+/******************************************************************************
+ *                              Kernel Types                                  *
+ ******************************************************************************/
+
+typedef UCHAR KIRQL, *PKIRQL;
+typedef CCHAR KPROCESSOR_MODE;
+typedef LONG KPRIORITY;
+
+typedef ULONG EXECUTION_STATE;
+
+typedef enum _MODE {
+  KernelMode,
+  UserMode,
+  MaximumMode
+} MODE;
+
+/* Processor features */
+#define PF_FLOATING_POINT_PRECISION_ERRATA  0   
+#define PF_FLOATING_POINT_EMULATED          1   
+#define PF_COMPARE_EXCHANGE_DOUBLE          2   
+#define PF_MMX_INSTRUCTIONS_AVAILABLE       3   
+#define PF_PPC_MOVEMEM_64BIT_OK             4   
+#define PF_ALPHA_BYTE_INSTRUCTIONS          5   
+#define PF_XMMI_INSTRUCTIONS_AVAILABLE      6   
+#define PF_3DNOW_INSTRUCTIONS_AVAILABLE     7   
+#define PF_RDTSC_INSTRUCTION_AVAILABLE      8   
+#define PF_PAE_ENABLED                      9   
+#define PF_XMMI64_INSTRUCTIONS_AVAILABLE   10   
+#define PF_SSE_DAZ_MODE_AVAILABLE          11   
+#define PF_NX_ENABLED                      12   
+#define PF_SSE3_INSTRUCTIONS_AVAILABLE     13   
+#define PF_COMPARE_EXCHANGE128             14   
+#define PF_COMPARE64_EXCHANGE128           15   
+#define PF_CHANNELS_ENABLED                16   
+#define PF_XSAVE_ENABLED                   17   
+
+#define MAXIMUM_SUPPORTED_EXTENSION  512
+#define MAXIMUM_WAIT_OBJECTS              64
+
+#define ASSERT_APC(Object) \
+    ASSERT((Object)->Type == ApcObject)
+
+#define ASSERT_DPC(Object) \
+    ASSERT(((Object)->Type == 0) || \
+           ((Object)->Type == DpcObject) || \
+           ((Object)->Type == ThreadedDpcObject))
+
+#define ASSERT_GATE(object) \
+    ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
+           (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
+
+#define ASSERT_DEVICE_QUEUE(Object) \
+    ASSERT((Object)->Type == DeviceQueueObject)
+
+#define ASSERT_TIMER(E) \
+    ASSERT(((E)->Header.Type == TimerNotificationObject) || \
+           ((E)->Header.Type == TimerSynchronizationObject))
+
+#define ASSERT_MUTANT(E) \
+    ASSERT((E)->Header.Type == MutantObject)
+
+#define ASSERT_SEMAPHORE(E) \
+    ASSERT((E)->Header.Type == SemaphoreObject)
+
+#define ASSERT_EVENT(E) \
+    ASSERT(((E)->Header.Type == NotificationEvent) || \
+           ((E)->Header.Type == SynchronizationEvent))
+
+#define DPC_NORMAL 0
+#define DPC_THREADED 1
+
+#define GM_LOCK_BIT          0x1
+#define GM_LOCK_BIT_V        0x0
+#define GM_LOCK_WAITER_WOKEN 0x2
+#define GM_LOCK_WAITER_INC   0x4
+
+#define LOCK_QUEUE_WAIT                   1
+#define LOCK_QUEUE_OWNER                  2
+#define LOCK_QUEUE_TIMER_LOCK_SHIFT       4
+#define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
+
+#define PROCESSOR_FEATURE_MAX 64
+
+#define DBG_STATUS_CONTROL_C              1
+#define DBG_STATUS_SYSRQ                  2
+#define DBG_STATUS_BUGCHECK_FIRST         3
+#define DBG_STATUS_BUGCHECK_SECOND        4
+#define DBG_STATUS_FATAL                  5
+#define DBG_STATUS_DEBUG_CONTROL          6
+#define DBG_STATUS_WORKER                 7
+
+#if defined(_WIN64)
+#define MAXIMUM_PROC_PER_GROUP 64
+#else
+#define MAXIMUM_PROC_PER_GROUP 32
+#endif
+#define MAXIMUM_PROCESSORS          MAXIMUM_PROC_PER_GROUP
+
+/* Exception Records */
+#define EXCEPTION_NONCONTINUABLE 1
+#define EXCEPTION_MAXIMUM_PARAMETERS 15
+
+typedef struct _EXCEPTION_RECORD {
+    NTSTATUS ExceptionCode;
+    ULONG ExceptionFlags;
+    struct _EXCEPTION_RECORD *ExceptionRecord;
+    PVOID ExceptionAddress;
+    ULONG NumberParameters;
+    ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
+
+typedef struct _EXCEPTION_RECORD32 {
+    NTSTATUS ExceptionCode;
+    ULONG ExceptionFlags;
+    ULONG ExceptionRecord;
+    ULONG ExceptionAddress;
+    ULONG NumberParameters;
+    ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
+
+typedef struct _EXCEPTION_RECORD64 {
+    NTSTATUS ExceptionCode;
+    ULONG ExceptionFlags;
+    ULONG64 ExceptionRecord;
+    ULONG64 ExceptionAddress;
+    ULONG NumberParameters;
+    ULONG __unusedAlignment;
+    ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
+
+typedef struct _EXCEPTION_POINTERS {
+    PEXCEPTION_RECORD ExceptionRecord;
+    PCONTEXT ContextRecord;
+} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
+
+
+typedef enum _KBUGCHECK_CALLBACK_REASON {
+  KbCallbackInvalid,
+  KbCallbackReserved1,
+  KbCallbackSecondaryDumpData,
+  KbCallbackDumpIo,
+  KbCallbackAddPages
+} KBUGCHECK_CALLBACK_REASON;
+
+struct _KBUGCHECK_REASON_CALLBACK_RECORD;
+
+typedef VOID
+(DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
+  IN KBUGCHECK_CALLBACK_REASON  Reason,
+  IN struct _KBUGCHECK_REASON_CALLBACK_RECORD  *Record,
+  IN OUT PVOID  ReasonSpecificData,
+  IN ULONG  ReasonSpecificDataLength);
+
+typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
+  LIST_ENTRY  Entry;
+  PKBUGCHECK_REASON_CALLBACK_ROUTINE  CallbackRoutine;
+  PUCHAR  Component;
+  ULONG_PTR  Checksum;
+  KBUGCHECK_CALLBACK_REASON  Reason;
+  UCHAR  State;
+} KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
+
+typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
+  BufferEmpty,
+  BufferInserted,
+  BufferStarted,
+  BufferFinished,
+  BufferIncomplete
+} KBUGCHECK_BUFFER_DUMP_STATE;
+
+typedef VOID
+(DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
+  IN PVOID  Buffer,
+  IN ULONG  Length);
+
+typedef struct _KBUGCHECK_CALLBACK_RECORD {
+  LIST_ENTRY  Entry;
+  PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine;
+  PVOID  Buffer;
+  ULONG  Length;
+  PUCHAR  Component;
+  ULONG_PTR  Checksum;
+  UCHAR  State;
+} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
+
+typedef BOOLEAN
+(DDKAPI *PNMI_CALLBACK)(
+    IN PVOID Context,
+    IN BOOLEAN Handled);
+
+typedef enum _TRACE_INFORMATION_CLASS {
+  TraceIdClass,
+  TraceHandleClass,
+  TraceEnableFlagsClass,
+  TraceEnableLevelClass,
+  GlobalLoggerHandleClass,
+  EventLoggerHandleClass,
+  AllLoggerHandlesClass,
+  TraceHandleByNameClass,
+  LoggerEventsLostClass,
+  TraceSessionSettingsClass,
+  LoggerEventsLoggedClass,
+  MaxTraceInformationClass
+} TRACE_INFORMATION_CLASS;
+
+typedef enum _KINTERRUPT_POLARITY {
+  InterruptPolarityUnknown,
+  InterruptActiveHigh,
+  InterruptActiveLow
+} KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
+
+typedef enum _KPROFILE_SOURCE {
+  ProfileTime,
+  ProfileAlignmentFixup,
+  ProfileTotalIssues,
+  ProfilePipelineDry,
+  ProfileLoadInstructions,
+  ProfilePipelineFrozen,
+  ProfileBranchInstructions,
+  ProfileTotalNonissues,
+  ProfileDcacheMisses,
+  ProfileIcacheMisses,
+  ProfileCacheMisses,
+  ProfileBranchMispredictions,
+  ProfileStoreInstructions,
+  ProfileFpInstructions,
+  ProfileIntegerInstructions,
+  Profile2Issue,
+  Profile3Issue,
+  Profile4Issue,
+  ProfileSpecialInstructions,
+  ProfileTotalCycles,
+  ProfileIcacheIssues,
+  ProfileDcacheAccesses,
+  ProfileMemoryBarrierCycles,
+  ProfileLoadLinkedIssues,
+  ProfileMaximum
+} KPROFILE_SOURCE;
+
+typedef enum _KWAIT_REASON {
+  Executive,
+  FreePage,
+  PageIn,
+  PoolAllocation,
+  DelayExecution,
+  Suspended,
+  UserRequest,
+  WrExecutive,
+  WrFreePage,
+  WrPageIn,
+  WrPoolAllocation,
+  WrDelayExecution,
+  WrSuspended,
+  WrUserRequest,
+  WrEventPair,
+  WrQueue,
+  WrLpcReceive,
+  WrLpcReply,
+  WrVirtualMemory,
+  WrPageOut,
+  WrRendezvous,
+  WrKeyedEvent,
+  WrTerminated,
+  WrProcessInSwap,
+  WrCpuRateControl,
+  WrCalloutStack,
+  WrKernel,
+  WrResource,
+  WrPushLock,
+  WrMutex,
+  WrQuantumEnd,
+  WrDispatchInt,
+  WrPreempted,
+  WrYieldExecution,
+  WrFastMutex,
+  WrGuardedMutex,
+  WrRundown,
+  MaximumWaitReason
+} KWAIT_REASON;
+
+typedef struct _KWAIT_BLOCK {
+  LIST_ENTRY WaitListEntry;
+  struct _KTHREAD *Thread;
+  PVOID Object;
+  struct _KWAIT_BLOCK *NextWaitBlock;
+  USHORT WaitKey;
+  UCHAR WaitType;
+  volatile UCHAR BlockState;
+#if defined(_WIN64)
+  LONG SpareLong;
+#endif
+} KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
+
+typedef enum _KINTERRUPT_MODE {
+  LevelSensitive,
+  Latched
+} KINTERRUPT_MODE;
+
+#define THREAD_WAIT_OBJECTS 3
+
+typedef VOID
+(DDKAPI *PKINTERRUPT_ROUTINE)(
+  VOID);
+
+typedef enum _KD_OPTION {
+    KD_OPTION_SET_BLOCK_ENABLE,
+} KD_OPTION;
+
+typedef enum _INTERFACE_TYPE {
+  InterfaceTypeUndefined = -1,
+  Internal,
+  Isa,
+  Eisa,
+  MicroChannel,
+  TurboChannel,
+  PCIBus,
+  VMEBus,
+  NuBus,
+  PCMCIABus,
+  CBus,
+  MPIBus,
+  MPSABus,
+  ProcessorInternal,
+  InternalPowerBus,
+  PNPISABus,
+  PNPBus,
+  Vmcs,
+  MaximumInterfaceType
+} INTERFACE_TYPE, *PINTERFACE_TYPE;
+
+typedef VOID
+(DDKAPI *PKNORMAL_ROUTINE)(
+  IN PVOID  NormalContext,
+  IN PVOID  SystemArgument1,
+  IN PVOID  SystemArgument2);
+
+typedef VOID
+(DDKAPI *PKRUNDOWN_ROUTINE)(
+  IN struct _KAPC  *Apc);
+
+typedef VOID
+(DDKAPI *PKKERNEL_ROUTINE)(
+  IN struct _KAPC  *Apc,
+  IN OUT PKNORMAL_ROUTINE  *NormalRoutine,
+  IN OUT PVOID  *NormalContext,
+  IN OUT PVOID  *SystemArgument1,
+  IN OUT PVOID  *SystemArgument2);
+
+typedef struct _KAPC
+{
+  UCHAR Type;
+  UCHAR SpareByte0;
+  UCHAR Size;
+  UCHAR SpareByte1;
+  ULONG SpareLong0;
+  struct _KTHREAD *Thread;
+  LIST_ENTRY ApcListEntry;
+  PKKERNEL_ROUTINE KernelRoutine;
+  PKRUNDOWN_ROUTINE RundownRoutine;
+  PKNORMAL_ROUTINE NormalRoutine;
+  PVOID NormalContext;
+  PVOID SystemArgument1;
+  PVOID SystemArgument2;
+  CCHAR ApcStateIndex;
+  KPROCESSOR_MODE ApcMode;
+  BOOLEAN Inserted;
+} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
+
+typedef struct _KDEVICE_QUEUE_ENTRY {
+  LIST_ENTRY  DeviceListEntry;
+  ULONG  SortKey;
+  BOOLEAN  Inserted;
+} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
+*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
+
+typedef PVOID PKIPI_CONTEXT;
+
+typedef
+VOID
+(NTAPI *PKIPI_WORKER)(
+  IN PKIPI_CONTEXT PacketContext,
+  IN PVOID Parameter1,
+  IN PVOID Parameter2,
+  IN PVOID Parameter3);
+
+typedef
+ULONG_PTR
+(NTAPI *PKIPI_BROADCAST_WORKER)(
+    IN ULONG_PTR Argument);
+
+typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
+
+typedef struct _KSPIN_LOCK_QUEUE {
+  struct _KSPIN_LOCK_QUEUE  *volatile Next;
+  PKSPIN_LOCK volatile  Lock;
+} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
+
+typedef struct _KLOCK_QUEUE_HANDLE {
+  KSPIN_LOCK_QUEUE  LockQueue;
+  KIRQL  OldIrql;
+} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
+
+#if defined(_AMD64_)
+
+typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
+
+#define LockQueueDispatcherLock 0
+#define LockQueueExpansionLock 1
+#define LockQueuePfnLock 2
+#define LockQueueSystemSpaceLock 3
+#define LockQueueVacbLock 4
+#define LockQueueMasterLock 5
+#define LockQueueNonPagedPoolLock 6
+#define LockQueueIoCancelLock 7
+#define LockQueueWorkQueueLock 8
+#define LockQueueIoVpbLock 9
+#define LockQueueIoDatabaseLock 10
+#define LockQueueIoCompletionLock 11
+#define LockQueueNtfsStructLock 12
+#define LockQueueAfdWorkQueueLock 13
+#define LockQueueBcbLock 14
+#define LockQueueMmNonPagedPoolLock 15
+#define LockQueueUnusedSpare16 16
+#define LockQueueTimerTableLock 17
+#define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
+
+#else
+
+typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
+  LockQueueDispatcherLock,
+  LockQueueExpansionLock,
+  LockQueuePfnLock,
+  LockQueueSystemSpaceLock,
+  LockQueueVacbLock,
+  LockQueueMasterLock,
+  LockQueueNonPagedPoolLock,
+  LockQueueIoCancelLock,
+  LockQueueWorkQueueLock,
+  LockQueueIoVpbLock,
+  LockQueueIoDatabaseLock,
+  LockQueueIoCompletionLock,
+  LockQueueNtfsStructLock,
+  LockQueueAfdWorkQueueLock,
+  LockQueueBcbLock,
+  LockQueueMmNonPagedPoolLock,
+  LockQueueUnusedSpare16,
+  LockQueueTimerTableLock,
+  LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
+} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
+
+#endif
+
+typedef VOID
+(DDKAPI *PKDEFERRED_ROUTINE)(
+  IN struct _KDPC  *Dpc,
+  IN PVOID  DeferredContext,
+  IN PVOID  SystemArgument1,
+  IN PVOID  SystemArgument2);
+
+typedef enum _KDPC_IMPORTANCE {
+  LowImportance,
+  MediumImportance,
+  HighImportance,
+  MediumHighImportance
+} KDPC_IMPORTANCE;
+
+typedef struct _KDPC
+{
+    UCHAR Type;
+    UCHAR Importance;
+    volatile USHORT Number;
+    LIST_ENTRY DpcListEntry;
+    PKDEFERRED_ROUTINE DeferredRoutine;
+    PVOID DeferredContext;
+    PVOID SystemArgument1;
+    PVOID SystemArgument2;
+    volatile PVOID  DpcData;
+} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
+
+typedef struct _KDPC_WATCHDOG_INFORMATION {
+  ULONG DpcTimeLimit;
+  ULONG DpcTimeCount;
+  ULONG DpcWatchdogLimit;
+  ULONG DpcWatchdogCount;
+  ULONG Reserved;
+} KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
+
+typedef struct _KDEVICE_QUEUE {
+  CSHORT Type;
+  CSHORT Size;
+  LIST_ENTRY DeviceListHead;
+  KSPIN_LOCK Lock;
+  #if defined(_AMD64_)
+  union {
+    BOOLEAN Busy;
+    struct {
+      LONG64 Reserved : 8;
+      LONG64 Hint : 56;
+    };
+  };
+  #else
+  BOOLEAN Busy;
+  #endif
+
+} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
+
+#define TIMER_EXPIRED_INDEX_BITS        6
+#define TIMER_PROCESSOR_INDEX_BITS      5
+typedef struct _DISPATCHER_HEADER {
+    _ANONYMOUS_UNION union {
+        _ANONYMOUS_STRUCT struct {
+            UCHAR Type;
+            _ANONYMOUS_UNION union {
+                _ANONYMOUS_UNION union {
+                    UCHAR TimerControlFlags;
+                    _ANONYMOUS_STRUCT struct {
+                        UCHAR Absolute:1;
+                        UCHAR Coalescable:1;
+                        UCHAR KeepShifting:1;
+                        UCHAR EncodedTolerableDelay:5;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME;
+                UCHAR Abandoned;
+#if (NTDDI_VERSION < NTDDI_WIN7)
+                UCHAR NpxIrql;
+#endif
+                BOOLEAN Signalling;
+            } DUMMYUNIONNAME;
+            _ANONYMOUS_UNION union {
+                _ANONYMOUS_UNION union {
+                    UCHAR ThreadControlFlags;
+                    _ANONYMOUS_STRUCT struct {
+                        UCHAR CpuThrottled:1;
+                        UCHAR CycleProfiling:1;
+                        UCHAR CounterProfiling:1;
+                        UCHAR Reserved:5;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME;
+                UCHAR Size;
+                UCHAR Hand;
+            } DUMMYUNIONNAME2;
+            _ANONYMOUS_UNION union {
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+                _ANONYMOUS_UNION union {
+                    UCHAR TimerMiscFlags;
+                    _ANONYMOUS_STRUCT struct {
+#if !defined(_X86_)
+                        UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
+#else
+                        UCHAR Index:1;
+                        UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
+#endif
+                        UCHAR Inserted:1;
+                        volatile UCHAR Expired:1;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME;
+#else
+                /* Pre Win7 compatibility fix to latest WDK */
+                UCHAR Inserted;
+#endif
+                _ANONYMOUS_UNION union {
+                    BOOLEAN DebugActive;
+                    _ANONYMOUS_STRUCT struct {
+                        BOOLEAN ActiveDR7:1;
+                        BOOLEAN Instrumented:1;
+                        BOOLEAN Reserved2:4;
+                        BOOLEAN UmsScheduled:1;
+                        BOOLEAN UmsPrimary:1;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
+                BOOLEAN DpcActive;
+            } DUMMYUNIONNAME3;
+        } DUMMYSTRUCTNAME;
+        volatile LONG Lock;
+    } DUMMYUNIONNAME;
+    LONG SignalState;
+    LIST_ENTRY WaitListHead;
+} DISPATCHER_HEADER, *PDISPATCHER_HEADER;
+
+typedef struct _KEVENT {
+  DISPATCHER_HEADER  Header;
+} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
+
+typedef struct _KSEMAPHORE {
+    DISPATCHER_HEADER Header;
+    LONG Limit;
+} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
+
+typedef struct _KGATE
+{
+    DISPATCHER_HEADER Header;
+} KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
+
+typedef struct _KGUARDED_MUTEX
+{
+    volatile LONG Count;
+    PKTHREAD Owner;
+    ULONG Contention;
+    KGATE Gate;
+    __GNU_EXTENSION union
+    {
+        __GNU_EXTENSION struct
+        {
+            SHORT KernelApcDisable;
+            SHORT SpecialApcDisable;
+        };
+        ULONG CombinedApcDisable;
+    };
+} KGUARDED_MUTEX, *PKGUARDED_MUTEX;
+
+typedef struct _KMUTANT {
+  DISPATCHER_HEADER  Header;
+  LIST_ENTRY  MutantListEntry;
+  struct _KTHREAD  *RESTRICTED_POINTER OwnerThread;
+  BOOLEAN  Abandoned;
+  UCHAR  ApcDisable;
+} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
+
+#define TIMER_TABLE_SIZE 512
+#define TIMER_TABLE_SHIFT 9
+
+typedef struct _KTIMER {
+  DISPATCHER_HEADER Header;
+  ULARGE_INTEGER DueTime;
+  LIST_ENTRY TimerListEntry;
+  struct _KDPC *Dpc;
+  #if !defined(_X86_)
+  ULONG Processor;
+  #endif
+  ULONG Period;
+} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
+
+typedef BOOLEAN
+(DDKAPI *PKSYNCHRONIZE_ROUTINE)(
+  IN PVOID  SynchronizeContext);
+
+typedef enum _POOL_TYPE {
+  NonPagedPool,
+  PagedPool,
+  NonPagedPoolMustSucceed,
+  DontUseThisType,
+  NonPagedPoolCacheAligned,
+  PagedPoolCacheAligned,
+  NonPagedPoolCacheAlignedMustS,
+  MaxPoolType,
+  NonPagedPoolSession = 32,
+  PagedPoolSession,
+  NonPagedPoolMustSucceedSession,
+  DontUseThisTypeSession,
+  NonPagedPoolCacheAlignedSession,
+  PagedPoolCacheAlignedSession,
+  NonPagedPoolCacheAlignedMustSSession
+} POOL_TYPE;
+
+typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
+{
+    StandardDesign,
+    NEC98x86,
+    EndAlternatives
+} ALTERNATIVE_ARCHITECTURE_TYPE;
+
+typedef struct _KSYSTEM_TIME
+{
+    ULONG LowPart;
+    LONG High1Time;
+    LONG High2Time;
+} KSYSTEM_TIME, *PKSYSTEM_TIME;
+
+typedef struct _PNP_BUS_INFORMATION {
+  GUID  BusTypeGuid;
+  INTERFACE_TYPE  LegacyBusType;
+  ULONG  BusNumber;
+} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
+
+typedef struct DECLSPEC_ALIGN(16) _M128A {
+    ULONGLONG Low;
+    LONGLONG High;
+} M128A, *PM128A;
+
+typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
+  USHORT ControlWord;
+  USHORT StatusWord;
+  UCHAR TagWord;
+  UCHAR Reserved1;
+  USHORT ErrorOpcode;
+  ULONG ErrorOffset;
+  USHORT ErrorSelector;
+  USHORT Reserved2;
+  ULONG DataOffset;
+  USHORT DataSelector;
+  USHORT Reserved3;
+  ULONG MxCsr;
+  ULONG MxCsr_Mask;
+  M128A FloatRegisters[8];
+#if defined(_WIN64)
+  M128A XmmRegisters[16];
+  UCHAR Reserved4[96];
+#else
+  M128A XmmRegisters[8];
+  UCHAR Reserved4[192];
+  ULONG StackControl[7];
+  ULONG Cr0NpxState;
+#endif
+} XSAVE_FORMAT, *PXSAVE_FORMAT;
+
+
+
+/******************************************************************************
+ *                         Memory manager Types                               *
+ ******************************************************************************/
+
+#define MM_DONT_ZERO_ALLOCATION                 0x00000001
+#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY        0x00000002
+#define MM_ALLOCATE_FULLY_REQUIRED              0x00000004
+#define MM_ALLOCATE_NO_WAIT                     0x00000008
+#define MM_ALLOCATE_PREFER_CONTIGUOUS           0x00000010
+#define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS   0x00000020
+
+#define MDL_MAPPED_TO_SYSTEM_VA     0x0001
+#define MDL_PAGES_LOCKED            0x0002
+#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
+#define MDL_ALLOCATED_FIXED_SIZE    0x0008
+#define MDL_PARTIAL                 0x0010
+#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
+#define MDL_IO_PAGE_READ            0x0040
+#define MDL_WRITE_OPERATION         0x0080
+#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
+#define MDL_FREE_EXTRA_PTES         0x0200
+#define MDL_DESCRIBES_AWE           0x0400
+#define MDL_IO_SPACE                0x0800
+#define MDL_NETWORK_HEADER          0x1000
+#define MDL_MAPPING_CAN_FAIL        0x2000
+#define MDL_ALLOCATED_MUST_SUCCEED  0x4000
+#define MDL_INTERNAL                0x8000
+
+#define MDL_MAPPING_FLAGS ( \
+  MDL_MAPPED_TO_SYSTEM_VA     | \
+  MDL_PAGES_LOCKED            | \
+  MDL_SOURCE_IS_NONPAGED_POOL | \
+  MDL_PARTIAL_HAS_BEEN_MAPPED | \
+  MDL_PARENT_MAPPED_SYSTEM_VA | \
+  MDL_SYSTEM_VA               | \
+  MDL_IO_SPACE)
+
+#define FLUSH_MULTIPLE_MAXIMUM 32
+
+/* Section access rights */
+#define SECTION_QUERY                0x0001
+#define SECTION_MAP_WRITE            0x0002
+#define SECTION_MAP_READ             0x0004
+#define SECTION_MAP_EXECUTE          0x0008
+#define SECTION_EXTEND_SIZE          0x0010
+#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
+
+#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
+                            SECTION_MAP_WRITE |      \
+                            SECTION_MAP_READ |       \
+                            SECTION_MAP_EXECUTE |    \
+                            SECTION_EXTEND_SIZE)
+
+#define SESSION_QUERY_ACCESS  0x0001
+#define SESSION_MODIFY_ACCESS 0x0002
+
+#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \
+                            SESSION_QUERY_ACCESS |             \
+                            SESSION_MODIFY_ACCESS)
+
+#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
+
+#define PAGE_NOACCESS          0x01
+#define PAGE_READONLY          0x02
+#define PAGE_READWRITE         0x04
+#define PAGE_WRITECOPY         0x08
+#define PAGE_EXECUTE           0x10
+#define PAGE_EXECUTE_READ      0x20
+#define PAGE_EXECUTE_READWRITE 0x40
+#define PAGE_EXECUTE_WRITECOPY 0x80
+#define PAGE_GUARD            0x100
+#define PAGE_NOCACHE          0x200
+#define PAGE_WRITECOMBINE     0x400
+
+#define MEM_COMMIT           0x1000
+#define MEM_RESERVE          0x2000
+#define MEM_DECOMMIT         0x4000
+#define MEM_RELEASE          0x8000
+#define MEM_FREE            0x10000
+#define MEM_PRIVATE         0x20000
+#define MEM_MAPPED          0x40000
+#define MEM_RESET           0x80000
+#define MEM_TOP_DOWN       0x100000
+#define MEM_LARGE_PAGES  0x20000000
+#define MEM_4MB_PAGES    0x80000000
+
+#define SEC_RESERVE       0x4000000
+#define SEC_COMMIT        0x8000000
+#define SEC_LARGE_PAGES  0x80000000
+
+/* Section map options */
+typedef enum _SECTION_INHERIT {
+    ViewShare = 1,
+    ViewUnmap = 2
+} SECTION_INHERIT;
+
+typedef ULONG PFN_COUNT;
+typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
+typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
+
+typedef struct _MDL {
+    struct _MDL *Next;
+    CSHORT Size;
+    CSHORT MdlFlags;
+    struct _EPROCESS *Process;
+    PVOID MappedSystemVa;
+    PVOID StartVa;
+    ULONG ByteCount;
+    ULONG ByteOffset;
+} MDL, *PMDL;
+typedef MDL *PMDLX;
+
+typedef enum _MEMORY_CACHING_TYPE_ORIG {
+  MmFrameBufferCached = 2
+} MEMORY_CACHING_TYPE_ORIG;
+
+typedef enum _MEMORY_CACHING_TYPE {
+  MmNonCached = FALSE,
+  MmCached = TRUE,
+  MmWriteCombined = MmFrameBufferCached,
+  MmHardwareCoherentCached,
+  MmNonCachedUnordered,
+  MmUSWCCached,
+  MmMaximumCacheType
+} MEMORY_CACHING_TYPE;
+
+typedef enum _MM_PAGE_PRIORITY {
+  LowPagePriority,
+  NormalPagePriority = 16,
+  HighPagePriority = 32
+} MM_PAGE_PRIORITY;
+
+typedef enum _LOCK_OPERATION {
+  IoReadAccess,
+  IoWriteAccess,
+  IoModifyAccess
+} LOCK_OPERATION;
+
+typedef enum _MM_SYSTEM_SIZE {
+  MmSmallSystem,
+  MmMediumSystem,
+  MmLargeSystem
+} MM_SYSTEMSIZE;
+
+
+/******************************************************************************
+ *                            Executive Types                                 *
+ ******************************************************************************/
+
+#define EX_RUNDOWN_ACTIVE                 0x1
+#define EX_RUNDOWN_COUNT_SHIFT            0x1
+#define EX_RUNDOWN_COUNT_INC              (1 << EX_RUNDOWN_COUNT_SHIFT)
+
+#ifdef _WIN64
+#define PORT_MAXIMUM_MESSAGE_LENGTH 512
+#else
+#define PORT_MAXIMUM_MESSAGE_LENGTH 256
+#endif
+
+typedef struct _FAST_MUTEX {
+  volatile LONG Count;
+  PKTHREAD Owner;
+  ULONG Contention;
+  KEVENT Event;
+  ULONG OldIrql;
+} FAST_MUTEX, *PFAST_MUTEX;
+
+typedef enum _SUITE_TYPE {
+    SmallBusiness,
+    Enterprise,
+    BackOffice,
+    CommunicationServer,
+    TerminalServer,
+    SmallBusinessRestricted,
+    EmbeddedNT,
+    DataCenter,
+    SingleUserTS,
+    Personal,
+    Blade,
+    EmbeddedRestricted,
+    SecurityAppliance,
+    StorageServer,
+    ComputeServer,
+    WHServer,
+    MaxSuiteType
+} SUITE_TYPE;
+
+typedef enum _EX_POOL_PRIORITY {
+    LowPoolPriority,
+    LowPoolPrioritySpecialPoolOverrun = 8,
+    LowPoolPrioritySpecialPoolUnderrun = 9,
+    NormalPoolPriority = 16,
+    NormalPoolPrioritySpecialPoolOverrun = 24,
+    NormalPoolPrioritySpecialPoolUnderrun = 25,
+    HighPoolPriority = 32,
+    HighPoolPrioritySpecialPoolOverrun = 40,
+    HighPoolPrioritySpecialPoolUnderrun = 41
+} EX_POOL_PRIORITY;
+
+#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
+#define LOOKASIDE_ALIGN
+#else
+#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
+#endif
+
+typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
+
+typedef PVOID
+(DDKAPI *PALLOCATE_FUNCTION)(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag);
+
+typedef PVOID
+(DDKAPI *PALLOCATE_FUNCTION_EX)(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag,
+    IN OUT PLOOKASIDE_LIST_EX Lookaside);
+
+typedef VOID
+(DDKAPI *PFREE_FUNCTION)(
+    IN PVOID Buffer);
+
+typedef VOID
+(DDKAPI *PFREE_FUNCTION_EX)(
+    IN PVOID Buffer,
+    IN OUT PLOOKASIDE_LIST_EX Lookaside);
+
+typedef VOID
+(DDKAPI *PCALLBACK_FUNCTION)(
+  IN PVOID  CallbackContext,
+  IN PVOID  Argument1,
+  IN PVOID  Argument2);
+
+#define GENERAL_LOOKASIDE_LAYOUT                \
+    union {                                     \
+        SLIST_HEADER ListHead;                  \
+        SINGLE_LIST_ENTRY SingleListHead;       \
+    } DUMMYUNIONNAME;                           \
+    USHORT Depth;                               \
+    USHORT MaximumDepth;                        \
+    ULONG TotalAllocates;                       \
+    union {                                     \
+        ULONG AllocateMisses;                   \
+        ULONG AllocateHits;                     \
+    } DUMMYUNIONNAME2;                          \
+                                                \
+    ULONG TotalFrees;                           \
+    union {                                     \
+        ULONG FreeMisses;                       \
+        ULONG FreeHits;                         \
+    } DUMMYUNIONNAME3;                          \
+                                                \
+    POOL_TYPE Type;                             \
+    ULONG Tag;                                  \
+    ULONG Size;                                 \
+    union {                                     \
+        PALLOCATE_FUNCTION_EX AllocateEx;       \
+        PALLOCATE_FUNCTION Allocate;            \
+    } DUMMYUNIONNAME4;                          \
+                                                \
+    union {                                     \
+        PFREE_FUNCTION_EX FreeEx;               \
+        PFREE_FUNCTION Free;                    \
+    } DUMMYUNIONNAME5;                          \
+                                                \
+    LIST_ENTRY ListEntry;                       \
+    ULONG LastTotalAllocates;                   \
+    union {                                     \
+        ULONG LastAllocateMisses;               \
+        ULONG LastAllocateHits;                 \
+    } DUMMYUNIONNAME6;                          \
+    ULONG Future[2];
+
+typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
+    GENERAL_LOOKASIDE_LAYOUT
+} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
+
+typedef struct _GENERAL_LOOKASIDE_POOL {
+    GENERAL_LOOKASIDE_LAYOUT
+} GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
+
+typedef struct _PAGED_LOOKASIDE_LIST {
+    GENERAL_LOOKASIDE L;
+#if !defined(_AMD64_) && !defined(_IA64_)
+    FAST_MUTEX Lock__ObsoleteButDoNotDelete;
+#endif
+} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
+
+typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
+    GENERAL_LOOKASIDE L;
+#if !defined(_AMD64_) && !defined(_IA64_)
+    KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
+#endif
+} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
+
+typedef struct _LOOKASIDE_LIST_EX {
+    GENERAL_LOOKASIDE_POOL L;
+} LOOKASIDE_LIST_EX;
+
+typedef struct _EX_RUNDOWN_REF {
+    __GNU_EXTENSION union {
+        volatile ULONG_PTR Count;
+        volatile PVOID Ptr;
+    };
+} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
+
+typedef struct _EX_RUNDOWN_REF_CACHE_AWARE  *PEX_RUNDOWN_REF_CACHE_AWARE;
+
+typedef VOID
+(DDKAPI *PWORKER_THREAD_ROUTINE)(
+  IN PVOID Parameter);
+
+typedef struct _WORK_QUEUE_ITEM {
+  LIST_ENTRY  List;
+  PWORKER_THREAD_ROUTINE  WorkerRoutine;
+  volatile PVOID  Parameter;
+} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
+
+
+/******************************************************************************
+ *                            Security Manager Types                          *
+ ******************************************************************************/
+
+/* Simple types */
+typedef PVOID PSECURITY_DESCRIPTOR;
+typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
+typedef ULONG ACCESS_MASK, *PACCESS_MASK;
+typedef PVOID PACCESS_TOKEN;
+typedef PVOID PSID;
+
+#define DELETE                           0x00010000L
+#define READ_CONTROL                     0x00020000L
+#define WRITE_DAC                        0x00040000L
+#define WRITE_OWNER                      0x00080000L
+#define SYNCHRONIZE                      0x00100000L
+#define STANDARD_RIGHTS_REQUIRED         0x000F0000L
+#define STANDARD_RIGHTS_READ             READ_CONTROL
+#define STANDARD_RIGHTS_WRITE            READ_CONTROL
+#define STANDARD_RIGHTS_EXECUTE          READ_CONTROL
+#define STANDARD_RIGHTS_ALL              0x001F0000L
+#define SPECIFIC_RIGHTS_ALL              0x0000FFFFL
+#define ACCESS_SYSTEM_SECURITY           0x01000000L
+#define MAXIMUM_ALLOWED                  0x02000000L
+#define GENERIC_READ                     0x80000000L
+#define GENERIC_WRITE                    0x40000000L
+#define GENERIC_EXECUTE                  0x20000000L
+#define GENERIC_ALL                      0x10000000L
+
+typedef struct _GENERIC_MAPPING {
+    ACCESS_MASK GenericRead;
+    ACCESS_MASK GenericWrite;
+    ACCESS_MASK GenericExecute;
+    ACCESS_MASK GenericAll;
+} GENERIC_MAPPING, *PGENERIC_MAPPING;
+
+#define ACL_REVISION                      2
+#define ACL_REVISION_DS                   4
+
+#define ACL_REVISION1                     1
+#define ACL_REVISION2                     2
+#define ACL_REVISION3                     3
+#define ACL_REVISION4                     4
+#define MIN_ACL_REVISION                  ACL_REVISION2
+#define MAX_ACL_REVISION                  ACL_REVISION4
+
+typedef struct _ACL {
+    UCHAR AclRevision;
+    UCHAR Sbz1;
+    USHORT AclSize;
+    USHORT AceCount;
+    USHORT Sbz2;
+} ACL, *PACL;
+
+/* Current security descriptor revision value */
+#define SECURITY_DESCRIPTOR_REVISION     (1)
+#define SECURITY_DESCRIPTOR_REVISION1    (1)
+
+/* Privilege attributes */
+#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
+#define SE_PRIVILEGE_ENABLED            (0x00000002L)
+#define SE_PRIVILEGE_REMOVED            (0X00000004L)
+#define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
+
+#define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
+                                         SE_PRIVILEGE_ENABLED            | \
+                                         SE_PRIVILEGE_REMOVED            | \
+                                         SE_PRIVILEGE_USED_FOR_ACCESS)
+
+#include <pshpack4.h>
+typedef struct _LUID_AND_ATTRIBUTES {
+    LUID Luid;
+    ULONG Attributes;
+} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
+#include <poppack.h>
+
+typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
+typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
+
+/* Privilege sets */
+#define PRIVILEGE_SET_ALL_NECESSARY (1)
+
+typedef struct _PRIVILEGE_SET {
+    ULONG PrivilegeCount;
+    ULONG Control;
+    LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
+} PRIVILEGE_SET,*PPRIVILEGE_SET;
+
+typedef enum _SECURITY_IMPERSONATION_LEVEL {
+    SecurityAnonymous,
+    SecurityIdentification,
+    SecurityImpersonation,
+    SecurityDelegation
+} SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
+
+#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
+#define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
+#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
+#define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
+
+#define SECURITY_DYNAMIC_TRACKING (TRUE)
+#define SECURITY_STATIC_TRACKING (FALSE)
+
+typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
+
+typedef struct _SECURITY_QUALITY_OF_SERVICE {
+    ULONG Length;
+    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+    SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+    BOOLEAN EffectiveOnly;
+} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
+
+typedef struct _SE_IMPERSONATION_STATE {
+    PACCESS_TOKEN Token;
+    BOOLEAN CopyOnOpen;
+    BOOLEAN EffectiveOnly;
+    SECURITY_IMPERSONATION_LEVEL Level;
+} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
+
+#define OWNER_SECURITY_INFORMATION       (0x00000001L)
+#define GROUP_SECURITY_INFORMATION       (0x00000002L)
+#define DACL_SECURITY_INFORMATION        (0x00000004L)
+#define SACL_SECURITY_INFORMATION        (0x00000008L)
+#define LABEL_SECURITY_INFORMATION       (0x00000010L)
+
+#define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)
+#define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)
+#define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)
+#define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)
+
+typedef enum _SECURITY_OPERATION_CODE {
+  SetSecurityDescriptor,
+  QuerySecurityDescriptor,
+  DeleteSecurityDescriptor,
+  AssignSecurityDescriptor
+} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
+
+#define INITIAL_PRIVILEGE_COUNT           3
+
+typedef struct _INITIAL_PRIVILEGE_SET {
+  ULONG  PrivilegeCount;
+  ULONG  Control;
+  LUID_AND_ATTRIBUTES  Privilege[INITIAL_PRIVILEGE_COUNT];
+} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
+
+#define SE_MIN_WELL_KNOWN_PRIVILEGE         2
+#define SE_CREATE_TOKEN_PRIVILEGE           2
+#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE     3
+#define SE_LOCK_MEMORY_PRIVILEGE            4
+#define SE_INCREASE_QUOTA_PRIVILEGE         5
+#define SE_MACHINE_ACCOUNT_PRIVILEGE        6
+#define SE_TCB_PRIVILEGE                    7
+#define SE_SECURITY_PRIVILEGE               8
+#define SE_TAKE_OWNERSHIP_PRIVILEGE         9
+#define SE_LOAD_DRIVER_PRIVILEGE            10
+#define SE_SYSTEM_PROFILE_PRIVILEGE         11
+#define SE_SYSTEMTIME_PRIVILEGE             12
+#define SE_PROF_SINGLE_PROCESS_PRIVILEGE    13
+#define SE_INC_BASE_PRIORITY_PRIVILEGE      14
+#define SE_CREATE_PAGEFILE_PRIVILEGE        15
+#define SE_CREATE_PERMANENT_PRIVILEGE       16
+#define SE_BACKUP_PRIVILEGE                 17
+#define SE_RESTORE_PRIVILEGE                18
+#define SE_SHUTDOWN_PRIVILEGE               19
+#define SE_DEBUG_PRIVILEGE                  20
+#define SE_AUDIT_PRIVILEGE                  21
+#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE     22
+#define SE_CHANGE_NOTIFY_PRIVILEGE          23
+#define SE_REMOTE_SHUTDOWN_PRIVILEGE        24
+#define SE_UNDOCK_PRIVILEGE                 25
+#define SE_SYNC_AGENT_PRIVILEGE             26
+#define SE_ENABLE_DELEGATION_PRIVILEGE      27
+#define SE_MANAGE_VOLUME_PRIVILEGE          28
+#define SE_IMPERSONATE_PRIVILEGE            29
+#define SE_CREATE_GLOBAL_PRIVILEGE          30
+#define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
+#define SE_RELABEL_PRIVILEGE                32
+#define SE_INC_WORKING_SET_PRIVILEGE        33
+#define SE_TIME_ZONE_PRIVILEGE              34
+#define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE   35
+#define SE_MAX_WELL_KNOWN_PRIVILEGE         SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
+
+typedef struct _SECURITY_SUBJECT_CONTEXT {
+  PACCESS_TOKEN  ClientToken;
+  SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
+  PACCESS_TOKEN  PrimaryToken;
+  PVOID  ProcessAuditId;
+} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
+
+typedef struct _ACCESS_STATE {
+  LUID  OperationID;
+  BOOLEAN  SecurityEvaluated;
+  BOOLEAN  GenerateAudit;
+  BOOLEAN  GenerateOnClose;
+  BOOLEAN  PrivilegesAllocated;
+  ULONG  Flags;
+  ACCESS_MASK  RemainingDesiredAccess;
+  ACCESS_MASK  PreviouslyGrantedAccess;
+  ACCESS_MASK  OriginalDesiredAccess;
+  SECURITY_SUBJECT_CONTEXT  SubjectSecurityContext;
+  PSECURITY_DESCRIPTOR  SecurityDescriptor;
+  PVOID  AuxData;
+  union {
+    INITIAL_PRIVILEGE_SET  InitialPrivilegeSet;
+    PRIVILEGE_SET  PrivilegeSet;
+  } Privileges;
+
+  BOOLEAN  AuditPrivileges;
+  UNICODE_STRING  ObjectName;
+  UNICODE_STRING  ObjectTypeName;
+} ACCESS_STATE, *PACCESS_STATE;
+
+
+#ifndef _NTLSA_IFS_
+
+#ifndef _NTLSA_AUDIT_
+#define _NTLSA_AUDIT_
+
+#define SE_MAX_AUDIT_PARAMETERS 32
+#define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
+
+#define SE_ADT_OBJECT_ONLY 0x1
+
+#define SE_ADT_PARAMETERS_SELF_RELATIVE    0x00000001
+#define SE_ADT_PARAMETERS_SEND_TO_LSA      0x00000002
+#define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT  0x00000004
+#define SE_ADT_PARAMETER_GENERIC_AUDIT     0x00000008
+#define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
+
+#define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
+  ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
+    (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
+
+typedef enum _SE_ADT_PARAMETER_TYPE {
+  SeAdtParmTypeNone = 0,
+  SeAdtParmTypeString,
+  SeAdtParmTypeFileSpec,
+  SeAdtParmTypeUlong,
+  SeAdtParmTypeSid,
+  SeAdtParmTypeLogonId,
+  SeAdtParmTypeNoLogonId,
+  SeAdtParmTypeAccessMask,
+  SeAdtParmTypePrivs,
+  SeAdtParmTypeObjectTypes,
+  SeAdtParmTypeHexUlong,
+  SeAdtParmTypePtr,
+  SeAdtParmTypeTime,
+  SeAdtParmTypeGuid,
+  SeAdtParmTypeLuid,
+  SeAdtParmTypeHexInt64,
+  SeAdtParmTypeStringList,
+  SeAdtParmTypeSidList,
+  SeAdtParmTypeDuration,
+  SeAdtParmTypeUserAccountControl,
+  SeAdtParmTypeNoUac,
+  SeAdtParmTypeMessage,
+  SeAdtParmTypeDateTime,
+  SeAdtParmTypeSockAddr,
+  SeAdtParmTypeSD,
+  SeAdtParmTypeLogonHours,
+  SeAdtParmTypeLogonIdNoSid,
+  SeAdtParmTypeUlongNoConv,
+  SeAdtParmTypeSockAddrNoPort,
+  SeAdtParmTypeAccessReason
+} SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
+
+typedef struct _SE_ADT_OBJECT_TYPE {
+  GUID ObjectType;
+  USHORT Flags;
+  USHORT Level;
+  ACCESS_MASK AccessMask;
+} SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
+
+typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
+  SE_ADT_PARAMETER_TYPE Type;
+  ULONG Length;
+  ULONG_PTR Data[2];
+  PVOID Address;
+} SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
+
+typedef struct _SE_ADT_ACCESS_REASON {
+  ACCESS_MASK AccessMask;
+  ULONG  AccessReasons[32];
+  ULONG  ObjectTypeIndex;
+  ULONG AccessGranted;
+  PSECURITY_DESCRIPTOR SecurityDescriptor;
+} SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
+
+typedef struct _SE_ADT_PARAMETER_ARRAY {
+  ULONG CategoryId;
+  ULONG AuditId;
+  ULONG ParameterCount;
+  ULONG Length;
+  USHORT FlatSubCategoryId;
+  USHORT Type;
+  ULONG Flags;
+  SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
+} SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
+
+#endif /* !_NTLSA_AUDIT_ */
+#endif /* !_NTLSA_IFS_ */
+
+
+/******************************************************************************
+ *                            Power Management Support Types                  *
+ ******************************************************************************/
+
+#ifndef _PO_DDK_
+#define _PO_DDK_
+
+/* Power States/Levels */
+typedef enum _SYSTEM_POWER_STATE {
+    PowerSystemUnspecified,
+    PowerSystemWorking,
+    PowerSystemSleeping1,
+    PowerSystemSleeping2,
+    PowerSystemSleeping3,
+    PowerSystemHibernate,
+    PowerSystemShutdown,
+    PowerSystemMaximum
+} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
+
+#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
+
+typedef enum _POWER_INFORMATION_LEVEL {
+    SystemPowerPolicyAc,
+    SystemPowerPolicyDc,
+    VerifySystemPolicyAc,
+    VerifySystemPolicyDc,
+    SystemPowerCapabilities,
+    SystemBatteryState,
+    SystemPowerStateHandler,
+    ProcessorStateHandler,
+    SystemPowerPolicyCurrent,
+    AdministratorPowerPolicy,
+    SystemReserveHiberFile,
+    ProcessorInformation,
+    SystemPowerInformation,
+    ProcessorStateHandler2,
+    LastWakeTime,
+    LastSleepTime,
+    SystemExecutionState,
+    SystemPowerStateNotifyHandler,
+    ProcessorPowerPolicyAc,
+    ProcessorPowerPolicyDc,
+    VerifyProcessorPowerPolicyAc,
+    VerifyProcessorPowerPolicyDc,
+    ProcessorPowerPolicyCurrent,
+    SystemPowerStateLogging,
+    SystemPowerLoggingEntry,
+    SetPowerSettingValue,
+    NotifyUserPowerSetting,
+    PowerInformationLevelUnused0,
+    PowerInformationLevelUnused1,
+    SystemVideoState,
+    TraceApplicationPowerMessage,
+    TraceApplicationPowerMessageEnd,
+    ProcessorPerfStates,
+    ProcessorIdleStates,
+    ProcessorCap,
+    SystemWakeSource,
+    SystemHiberFileInformation,
+    TraceServicePowerMessage,
+    ProcessorLoad,
+    PowerShutdownNotification,
+    MonitorCapabilities,
+    SessionPowerInit,
+    SessionDisplayState,
+    PowerRequestCreate,
+    PowerRequestAction,
+    GetPowerRequestList,
+    ProcessorInformationEx,
+    NotifyUserModeLegacyPowerEvent,
+    GroupPark,
+    ProcessorIdleDomains,
+    WakeTimerList,
+    SystemHiberFileSize,
+    PowerInformationLevelMaximum
+} POWER_INFORMATION_LEVEL;
+
+typedef enum {
+    PowerActionNone,
+    PowerActionReserved,
+    PowerActionSleep,
+    PowerActionHibernate,
+    PowerActionShutdown,
+    PowerActionShutdownReset,
+    PowerActionShutdownOff,
+    PowerActionWarmEject
+} POWER_ACTION, *PPOWER_ACTION;
+
+typedef enum _DEVICE_POWER_STATE {
+    PowerDeviceUnspecified,
+    PowerDeviceD0,
+    PowerDeviceD1,
+    PowerDeviceD2,
+    PowerDeviceD3,
+    PowerDeviceMaximum
+} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
+
+typedef union _POWER_STATE {
+  SYSTEM_POWER_STATE  SystemState;
+  DEVICE_POWER_STATE  DeviceState;
+} POWER_STATE, *PPOWER_STATE;
+
+typedef enum _POWER_STATE_TYPE {
+  SystemPowerState = 0,
+  DevicePowerState
+} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
+typedef struct {
+    ULONG Granularity;
+    ULONG Capacity;
+} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
+
+#endif /* !_PO_DDK_ */
+
+typedef VOID
+(DDKAPI *PREQUEST_POWER_COMPLETE)(
+  IN struct _DEVICE_OBJECT *DeviceObject,
+  IN UCHAR MinorFunction,
+  IN POWER_STATE PowerState,
+  IN PVOID Context,
+  IN struct _IO_STATUS_BLOCK *IoStatus);
+
+typedef
+NTSTATUS
+(DDKAPI POWER_SETTING_CALLBACK)(
+  IN LPCGUID SettingGuid,
+  IN PVOID Value,
+  IN ULONG ValueLength,
+  IN OUT PVOID Context OPTIONAL);
+
+typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
+
+
+/******************************************************************************
+ *                            Configuration Manager Types                     *
+ ******************************************************************************/
+
+/* Resource list definitions */
+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
+
+/* KEY_VALUE_Xxx.Type */
+#define REG_NONE                           0
+#define REG_SZ                             1
+#define REG_EXPAND_SZ                      2
+#define REG_BINARY                         3
+#define REG_DWORD                          4
+#define REG_DWORD_LITTLE_ENDIAN            4
+#define REG_DWORD_BIG_ENDIAN               5
+#define REG_LINK                           6
+#define REG_MULTI_SZ                       7
+#define REG_RESOURCE_LIST                  8
+#define REG_FULL_RESOURCE_DESCRIPTOR       9
+#define REG_RESOURCE_REQUIREMENTS_LIST    10
+#define REG_QWORD                         11
+#define REG_QWORD_LITTLE_ENDIAN           11
+
+/* Registry Access Rights */
+#define KEY_QUERY_VALUE         (0x0001)
+#define KEY_SET_VALUE           (0x0002)
+#define KEY_CREATE_SUB_KEY      (0x0004)
+#define KEY_ENUMERATE_SUB_KEYS  (0x0008)
+#define KEY_NOTIFY              (0x0010)
+#define KEY_CREATE_LINK         (0x0020)
+#define KEY_WOW64_32KEY         (0x0200)
+#define KEY_WOW64_64KEY         (0x0100)
+#define KEY_WOW64_RES           (0x0300)
+
+#define KEY_READ                ((STANDARD_RIGHTS_READ       |\
+                                  KEY_QUERY_VALUE            |\
+                                  KEY_ENUMERATE_SUB_KEYS     |\
+                                  KEY_NOTIFY)                 \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+#define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
+                                  KEY_SET_VALUE              |\
+                                  KEY_CREATE_SUB_KEY)         \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+#define KEY_EXECUTE             ((KEY_READ)                   \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+#define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
+                                  KEY_QUERY_VALUE            |\
+                                  KEY_SET_VALUE              |\
+                                  KEY_CREATE_SUB_KEY         |\
+                                  KEY_ENUMERATE_SUB_KEYS     |\
+                                  KEY_NOTIFY                 |\
+                                  KEY_CREATE_LINK)            \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+/* Registry Open/Create Options */
+#define REG_OPTION_RESERVED         (0x00000000L)
+#define REG_OPTION_NON_VOLATILE     (0x00000000L)
+#define REG_OPTION_VOLATILE         (0x00000001L)
+#define REG_OPTION_CREATE_LINK      (0x00000002L)
+#define REG_OPTION_BACKUP_RESTORE   (0x00000004L)
+#define REG_OPTION_OPEN_LINK        (0x00000008L)
+
+#define REG_LEGAL_OPTION            \
+                (REG_OPTION_RESERVED            |\
+                 REG_OPTION_NON_VOLATILE        |\
+                 REG_OPTION_VOLATILE            |\
+                 REG_OPTION_CREATE_LINK         |\
+                 REG_OPTION_BACKUP_RESTORE      |\
+                 REG_OPTION_OPEN_LINK)
+
+/* Key creation/open disposition */
+#define REG_CREATED_NEW_KEY         (0x00000001L)
+#define REG_OPENED_EXISTING_KEY     (0x00000002L)
+
+/* Key restore & hive load flags */
+#define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)
+#define REG_REFRESH_HIVE                (0x00000002L)
+#define REG_NO_LAZY_FLUSH               (0x00000004L)
+#define REG_FORCE_RESTORE               (0x00000008L)
+#define REG_APP_HIVE                    (0x00000010L)
+#define REG_PROCESS_PRIVATE             (0x00000020L)
+#define REG_START_JOURNAL               (0x00000040L)
+#define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)
+#define REG_HIVE_NO_RM                  (0x00000100L)
+#define REG_HIVE_SINGLE_LOG             (0x00000200L)
+
+/* Unload Flags */
+#define REG_FORCE_UNLOAD            1
+
+/* Notify Filter Values */
+#define REG_NOTIFY_CHANGE_NAME          (0x00000001L)
+#define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
+#define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L)
+#define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
+
+#define REG_LEGAL_CHANGE_FILTER                 \
+                (REG_NOTIFY_CHANGE_NAME          |\
+                 REG_NOTIFY_CHANGE_ATTRIBUTES    |\
+                 REG_NOTIFY_CHANGE_LAST_SET      |\
+                 REG_NOTIFY_CHANGE_SECURITY)
+
+typedef struct _CM_FLOPPY_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  CHAR  Size[8];
+  ULONG  MaxDensity;
+  ULONG  MountDensity;
+  UCHAR  StepRateHeadUnloadTime;
+  UCHAR  HeadLoadTime;
+  UCHAR  MotorOffTime;
+  UCHAR  SectorLengthCode;
+  UCHAR  SectorPerTrack;
+  UCHAR  ReadWriteGapLength;
+  UCHAR  DataTransferLength;
+  UCHAR  FormatGapLength;
+  UCHAR  FormatFillCharacter;
+  UCHAR  HeadSettleTime;
+  UCHAR  MotorSettleTime;
+  UCHAR  MaximumTrackValue;
+  UCHAR  DataTransferRate;
+} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
+
+#include <pshpack4.h>
+typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
+  UCHAR Type;
+  UCHAR ShareDisposition;
+  USHORT Flags;
+  union {
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length;
+    } Generic;
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length;
+    } Port;
+    struct {
+#if defined(NT_PROCESSOR_GROUPS)
+      USHORT Level;
+      USHORT Group;
+#else
+      ULONG Level;
+#endif
+      ULONG Vector;
+      KAFFINITY Affinity;
+    } Interrupt;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    struct {
+      __GNU_EXTENSION union {
+        struct {
+#if defined(NT_PROCESSOR_GROUPS)
+          USHORT Group;
+#else
+          USHORT Reserved;
+#endif
+          USHORT MessageCount;
+          ULONG Vector;
+          KAFFINITY Affinity;
+        } Raw;
+        struct {
+#if defined(NT_PROCESSOR_GROUPS)
+          USHORT Level;
+          USHORT Group;
+#else
+          ULONG Level;
+#endif
+          ULONG Vector;
+          KAFFINITY Affinity;
+        } Translated;
+      } DUMMYUNIONNAME;
+    } MessageInterrupt;
+#endif
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length;
+    } Memory;
+    struct {
+      ULONG Channel;
+      ULONG Port;
+      ULONG Reserved1;
+    } Dma;
+    struct {
+      ULONG Data[3];
+    } DevicePrivate;
+    struct {
+      ULONG Start;
+      ULONG Length;
+      ULONG Reserved;
+    } BusNumber;
+    struct {
+      ULONG DataSize;
+      ULONG Reserved1;
+      ULONG Reserved2;
+    } DeviceSpecificData;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length40;
+    } Memory40;
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length48;
+    } Memory48;
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length64;
+    } Memory64;
+#endif
+  } u;
+} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
+#include <poppack.h>
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
+#define CmResourceTypeNull                0
+#define CmResourceTypePort                1
+#define CmResourceTypeInterrupt           2
+#define CmResourceTypeMemory              3
+#define CmResourceTypeDma                 4
+#define CmResourceTypeDeviceSpecific      5
+#define CmResourceTypeBusNumber           6
+#define CmResourceTypeMemoryLarge         7
+#define CmResourceTypeNonArbitrated     128
+#define CmResourceTypeConfigData        128
+#define CmResourceTypeDevicePrivate     129
+#define CmResourceTypePcCardConfig      130
+#define CmResourceTypeMfCardConfig      131
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
+typedef enum _CM_SHARE_DISPOSITION {
+  CmResourceShareUndetermined,
+  CmResourceShareDeviceExclusive,
+  CmResourceShareDriverExclusive,
+  CmResourceShareShared
+} CM_SHARE_DISPOSITION;
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
+#define CM_RESOURCE_PORT_MEMORY           0x0000
+#define CM_RESOURCE_PORT_IO               0x0001
+#define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
+#define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
+#define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
+#define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
+#define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
+#define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
+#define CM_RESOURCE_PORT_BAR              0x0100
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
+#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
+#define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
+#define CM_RESOURCE_INTERRUPT_MESSAGE         0x0002
+#define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
+#define CM_RESOURCE_MEMORY_READ_WRITE                    0x0000
+#define CM_RESOURCE_MEMORY_READ_ONLY                     0x0001
+#define CM_RESOURCE_MEMORY_WRITE_ONLY                    0x0002
+#define CM_RESOURCE_MEMORY_WRITEABILITY_MASK             0x0003
+#define CM_RESOURCE_MEMORY_PREFETCHABLE                  0x0004
+#define CM_RESOURCE_MEMORY_COMBINEDWRITE                 0x0008
+#define CM_RESOURCE_MEMORY_24                            0x0010
+#define CM_RESOURCE_MEMORY_CACHEABLE                     0x0020
+#define CM_RESOURCE_MEMORY_WINDOW_DECODE                 0x0040
+#define CM_RESOURCE_MEMORY_BAR                           0x0080
+#define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
+#define CM_RESOURCE_DMA_8                 0x0000
+#define CM_RESOURCE_DMA_16                0x0001
+#define CM_RESOURCE_DMA_32                0x0002
+#define CM_RESOURCE_DMA_8_AND_16          0x0004
+#define CM_RESOURCE_DMA_BUS_MASTER        0x0008
+#define CM_RESOURCE_DMA_TYPE_A            0x0010
+#define CM_RESOURCE_DMA_TYPE_B            0x0020
+#define CM_RESOURCE_DMA_TYPE_F            0x0040
+
+typedef struct _CM_PARTIAL_RESOURCE_LIST {
+  USHORT  Version;
+  USHORT  Revision;
+  ULONG  Count;
+  CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
+} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
+
+typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
+  INTERFACE_TYPE  InterfaceType;
+  ULONG  BusNumber;
+  CM_PARTIAL_RESOURCE_LIST  PartialResourceList;
+} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
+
+typedef struct _CM_RESOURCE_LIST {
+  ULONG  Count;
+  CM_FULL_RESOURCE_DESCRIPTOR  List[1];
+} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
+
+#include <pshpack1.h>
+typedef struct _CM_INT13_DRIVE_PARAMETER {
+  USHORT  DriveSelect;
+  ULONG  MaxCylinders;
+  USHORT  SectorsPerTrack;
+  USHORT  MaxHeads;
+  USHORT  NumberDrives;
+} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
+
+typedef struct _CM_PNP_BIOS_DEVICE_NODE {
+  USHORT Size;
+  UCHAR Node;
+  ULONG ProductId;
+  UCHAR DeviceType[3];
+  USHORT DeviceAttributes;
+} CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
+
+typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
+  UCHAR Signature[4];
+  UCHAR Revision;
+  UCHAR Length;
+  USHORT ControlField;
+  UCHAR Checksum;
+  ULONG EventFlagAddress;
+  USHORT RealModeEntryOffset;
+  USHORT RealModeEntrySegment;
+  USHORT ProtectedModeEntryOffset;
+  ULONG ProtectedModeCodeBaseAddress;
+  ULONG OemDeviceId;
+  USHORT RealModeDataBaseAddress;
+  ULONG ProtectedModeDataBaseAddress;
+} CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
+#include <poppack.h>
+
+typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
+    ULONG BytesPerSector;
+    ULONG NumberOfCylinders;
+    ULONG SectorsPerTrack;
+    ULONG NumberOfHeads;
+} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
+
+typedef struct _CM_KEYBOARD_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  UCHAR  Type;
+  UCHAR  Subtype;
+  USHORT  KeyboardFlags;
+} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
+
+typedef struct _CM_MCA_POS_DATA {
+  USHORT  AdapterId;
+  UCHAR  PosData1;
+  UCHAR  PosData2;
+  UCHAR  PosData3;
+  UCHAR  PosData4;
+} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+typedef struct CM_Power_Data_s {
+  ULONG  PD_Size;
+  DEVICE_POWER_STATE  PD_MostRecentPowerState;
+  ULONG  PD_Capabilities;
+  ULONG  PD_D1Latency;
+  ULONG  PD_D2Latency;
+  ULONG  PD_D3Latency;
+  DEVICE_POWER_STATE  PD_PowerStateMapping[PowerSystemMaximum];
+  SYSTEM_POWER_STATE  PD_DeepestSystemWake;
+} CM_POWER_DATA, *PCM_POWER_DATA;
+
+#define PDCAP_D0_SUPPORTED                0x00000001
+#define PDCAP_D1_SUPPORTED                0x00000002
+#define PDCAP_D2_SUPPORTED                0x00000004
+#define PDCAP_D3_SUPPORTED                0x00000008
+#define PDCAP_WAKE_FROM_D0_SUPPORTED      0x00000010
+#define PDCAP_WAKE_FROM_D1_SUPPORTED      0x00000020
+#define PDCAP_WAKE_FROM_D2_SUPPORTED      0x00000040
+#define PDCAP_WAKE_FROM_D3_SUPPORTED      0x00000080
+#define PDCAP_WARM_EJECT_SUPPORTED        0x00000100
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+typedef struct _CM_SCSI_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  UCHAR  HostIdentifier;
+} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
+
+typedef struct _CM_SERIAL_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  ULONG  BaudClock;
+} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
+
+typedef enum _KEY_INFORMATION_CLASS {
+  KeyBasicInformation,
+  KeyNodeInformation,
+  KeyFullInformation,
+  KeyNameInformation,
+  KeyCachedInformation,
+  KeyFlagsInformation
+} KEY_INFORMATION_CLASS;
+
+typedef struct _KEY_BASIC_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+  ULONG  TitleIndex;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
+
+typedef struct _KEY_FULL_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+  ULONG  TitleIndex;
+  ULONG  ClassOffset;
+  ULONG  ClassLength;
+  ULONG  SubKeys;
+  ULONG  MaxNameLen;
+  ULONG  MaxClassLen;
+  ULONG  Values;
+  ULONG  MaxValueNameLen;
+  ULONG  MaxValueDataLen;
+  WCHAR  Class[1];
+} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
+
+typedef struct _KEY_NODE_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+  ULONG  TitleIndex;
+  ULONG  ClassOffset;
+  ULONG  ClassLength;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
+
+typedef struct _KEY_VALUE_BASIC_INFORMATION {
+  ULONG  TitleIndex;
+  ULONG  Type;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
+
+typedef struct _KEY_VALUE_FULL_INFORMATION {
+  ULONG  TitleIndex;
+  ULONG  Type;
+  ULONG  DataOffset;
+  ULONG  DataLength;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
+
+typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
+  ULONG  TitleIndex;
+  ULONG  Type;
+  ULONG  DataLength;
+  UCHAR  Data[1];
+} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
+
+typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
+  ULONG  Type;
+  ULONG  DataLength;
+  UCHAR  Data[1];
+} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
+
+typedef struct _KEY_VALUE_ENTRY {
+  PUNICODE_STRING  ValueName;
+  ULONG  DataLength;
+  ULONG  DataOffset;
+  ULONG  Type;
+} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
+
+typedef enum _KEY_VALUE_INFORMATION_CLASS {
+  KeyValueBasicInformation,
+  KeyValueFullInformation,
+  KeyValuePartialInformation,
+  KeyValueFullInformationAlign64,
+  KeyValuePartialInformationAlign64
+} KEY_VALUE_INFORMATION_CLASS;
+
+typedef struct _KEY_WRITE_TIME_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
+
+typedef enum _KEY_SET_INFORMATION_CLASS {
+  KeyWriteTimeInformation,
+  KeyWow64FlagsInformation,
+  KeyControlFlagsInformation,
+  KeySetVirtualizationInformation,
+  KeySetDebugInformation,
+  KeySetHandleTagsInformation,
+  MaxKeySetInfoClass
+} KEY_SET_INFORMATION_CLASS;
+
+typedef enum _REG_NOTIFY_CLASS {
+  RegNtDeleteKey,
+  RegNtPreDeleteKey = RegNtDeleteKey,
+  RegNtSetValueKey,
+  RegNtPreSetValueKey = RegNtSetValueKey,
+  RegNtDeleteValueKey,
+  RegNtPreDeleteValueKey = RegNtDeleteValueKey,
+  RegNtSetInformationKey,
+  RegNtPreSetInformationKey = RegNtSetInformationKey,
+  RegNtRenameKey,
+  RegNtPreRenameKey = RegNtRenameKey,
+  RegNtEnumerateKey,
+  RegNtPreEnumerateKey = RegNtEnumerateKey,
+  RegNtEnumerateValueKey,
+  RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
+  RegNtQueryKey,
+  RegNtPreQueryKey = RegNtQueryKey,
+  RegNtQueryValueKey,
+  RegNtPreQueryValueKey = RegNtQueryValueKey,
+  RegNtQueryMultipleValueKey,
+  RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
+  RegNtPreCreateKey,
+  RegNtPostCreateKey,
+  RegNtPreOpenKey,
+  RegNtPostOpenKey,
+  RegNtKeyHandleClose,
+  RegNtPreKeyHandleClose = RegNtKeyHandleClose,
+  RegNtPostDeleteKey,
+  RegNtPostSetValueKey,
+  RegNtPostDeleteValueKey,
+  RegNtPostSetInformationKey,
+  RegNtPostRenameKey,
+  RegNtPostEnumerateKey,
+  RegNtPostEnumerateValueKey,
+  RegNtPostQueryKey,
+  RegNtPostQueryValueKey,
+  RegNtPostQueryMultipleValueKey,
+  RegNtPostKeyHandleClose,
+  RegNtPreCreateKeyEx,
+  RegNtPostCreateKeyEx,
+  RegNtPreOpenKeyEx,
+  RegNtPostOpenKeyEx,
+  RegNtPreFlushKey,
+  RegNtPostFlushKey,
+  RegNtPreLoadKey,
+  RegNtPostLoadKey,
+  RegNtPreUnLoadKey,
+  RegNtPostUnLoadKey,
+  RegNtPreQueryKeySecurity,
+  RegNtPostQueryKeySecurity,
+  RegNtPreSetKeySecurity,
+  RegNtPostSetKeySecurity,
+  RegNtCallbackObjectContextCleanup,
+  RegNtPreRestoreKey,
+  RegNtPostRestoreKey,
+  RegNtPreSaveKey,
+  RegNtPostSaveKey,
+  RegNtPreReplaceKey,
+  RegNtPostReplaceKey,
+  MaxRegNtNotifyClass
+} REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
+
+typedef NTSTATUS
+(NTAPI *PEX_CALLBACK_FUNCTION)(
+    IN PVOID CallbackContext,
+    IN PVOID Argument1,
+    IN PVOID Argument2
+);
+
+typedef struct _REG_DELETE_KEY_INFORMATION {
+  PVOID Object;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+, REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
+#endif
+;
+
+typedef struct _REG_SET_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PUNICODE_STRING ValueName;
+  ULONG TitleIndex;
+  ULONG Type;
+  PVOID Data;
+  ULONG DataSize;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PUNICODE_STRING ValueName;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
+  PVOID Object;
+  KEY_SET_INFORMATION_CLASS KeySetInformationClass;
+  PVOID KeySetInformation;
+  ULONG KeySetInformationLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
+
+typedef struct _REG_ENUMERATE_KEY_INFORMATION {
+  PVOID Object;
+  ULONG Index;
+  KEY_INFORMATION_CLASS KeyInformationClass;
+  PVOID KeyInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
+
+typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  ULONG Index;
+  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+  PVOID KeyValueInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_KEY_INFORMATION {
+  PVOID Object;
+  KEY_INFORMATION_CLASS KeyInformationClass;
+  PVOID KeyInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PUNICODE_STRING ValueName;
+  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+  PVOID KeyValueInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PKEY_VALUE_ENTRY ValueEntries;
+  ULONG EntryCount;
+  PVOID ValueBuffer;
+  PULONG BufferLength;
+  PULONG RequiredBufferLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
+  PUNICODE_STRING CompleteName;
+} REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
+
+typedef struct _REG_POST_CREATE_KEY_INFORMATION {
+  PUNICODE_STRING CompleteName;
+  PVOID Object;
+  NTSTATUS Status;
+} REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
+
+typedef struct _REG_POST_OPERATION_INFORMATION {
+  PVOID Object;
+  NTSTATUS Status;
+  PVOID PreInformation;
+  NTSTATUS ReturnStatus;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
+
+typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
+  PVOID Object;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
+
+/******************************************************************************
+ *                         I/O Manager Types                                  *
+ ******************************************************************************/
+
+ /* PCI_COMMON_CONFIG.Command */
+#define PCI_ENABLE_IO_SPACE               0x0001
+#define PCI_ENABLE_MEMORY_SPACE           0x0002
+#define PCI_ENABLE_BUS_MASTER             0x0004
+#define PCI_ENABLE_SPECIAL_CYCLES         0x0008
+#define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
+#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
+#define PCI_ENABLE_PARITY                 0x0040
+#define PCI_ENABLE_WAIT_CYCLE             0x0080
+#define PCI_ENABLE_SERR                   0x0100
+#define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
+#define PCI_DISABLE_LEVEL_INTERRUPT       0x0400
+
+/* PCI_COMMON_CONFIG.Status */
+#define PCI_STATUS_INTERRUPT_PENDING      0x0008
+#define PCI_STATUS_CAPABILITIES_LIST      0x0010
+#define PCI_STATUS_66MHZ_CAPABLE          0x0020
+#define PCI_STATUS_UDF_SUPPORTED          0x0040
+#define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
+#define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
+#define PCI_STATUS_DEVSEL                 0x0600
+#define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
+#define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
+#define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
+#define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
+#define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
+
+/* PCI_COMMON_CONFIG.HeaderType */
+#define PCI_MULTIFUNCTION                 0x80
+#define PCI_DEVICE_TYPE                   0x00
+#define PCI_BRIDGE_TYPE                   0x01
+#define PCI_CARDBUS_BRIDGE_TYPE           0x02
+
+#define PCI_CONFIGURATION_TYPE(PciData) \
+  (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
+
+#define PCI_MULTIFUNCTION_DEVICE(PciData) \
+  ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
+
+/* PCI device classes */
+#define PCI_CLASS_PRE_20                    0x00
+#define PCI_CLASS_MASS_STORAGE_CTLR         0x01
+#define PCI_CLASS_NETWORK_CTLR              0x02
+#define PCI_CLASS_DISPLAY_CTLR              0x03
+#define PCI_CLASS_MULTIMEDIA_DEV            0x04
+#define PCI_CLASS_MEMORY_CTLR               0x05
+#define PCI_CLASS_BRIDGE_DEV                0x06
+#define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
+#define PCI_CLASS_BASE_SYSTEM_DEV           0x08
+#define PCI_CLASS_INPUT_DEV                 0x09
+#define PCI_CLASS_DOCKING_STATION           0x0a
+#define PCI_CLASS_PROCESSOR                 0x0b
+#define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
+#define PCI_CLASS_WIRELESS_CTLR             0x0d
+#define PCI_CLASS_INTELLIGENT_IO_CTLR       0x0e
+#define PCI_CLASS_SATELLITE_COMMS_CTLR      0x0f
+#define PCI_CLASS_ENCRYPTION_DECRYPTION     0x10
+#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC      0x11
+
+/* PCI device subclasses for class 0 */
+#define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
+#define PCI_SUBCLASS_PRE_20_VGA             0x01
+
+/* PCI device subclasses for class 1 (mass storage controllers)*/
+#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
+#define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
+#define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
+#define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
+#define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
+#define PCI_SUBCLASS_MSC_OTHER              0x80
+
+/* PCI device subclasses for class 2 (network controllers)*/
+#define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
+#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
+#define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
+#define PCI_SUBCLASS_NET_ATM_CTLR           0x03
+#define PCI_SUBCLASS_NET_ISDN_CTLR          0x04
+#define PCI_SUBCLASS_NET_OTHER              0x80
+
+/* PCI device subclasses for class 3 (display controllers)*/
+#define PCI_SUBCLASS_VID_VGA_CTLR           0x00
+#define PCI_SUBCLASS_VID_XGA_CTLR           0x01
+#define PCI_SUBCLASS_VID_3D_CTLR            0x02
+#define PCI_SUBCLASS_VID_OTHER              0x80
+
+/* PCI device subclasses for class 4 (multimedia device)*/
+#define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
+#define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
+#define PCI_SUBCLASS_MM_TELEPHONY_DEV       0x02
+#define PCI_SUBCLASS_MM_OTHER               0x80
+
+/* PCI device subclasses for class 5 (memory controller)*/
+#define PCI_SUBCLASS_MEM_RAM                0x00
+#define PCI_SUBCLASS_MEM_FLASH              0x01
+#define PCI_SUBCLASS_MEM_OTHER              0x80
+
+/* PCI device subclasses for class 6 (bridge device)*/
+#define PCI_SUBCLASS_BR_HOST                0x00
+#define PCI_SUBCLASS_BR_ISA                 0x01
+#define PCI_SUBCLASS_BR_EISA                0x02
+#define PCI_SUBCLASS_BR_MCA                 0x03
+#define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
+#define PCI_SUBCLASS_BR_PCMCIA              0x05
+#define PCI_SUBCLASS_BR_NUBUS               0x06
+#define PCI_SUBCLASS_BR_CARDBUS             0x07
+#define PCI_SUBCLASS_BR_RACEWAY             0x08
+#define PCI_SUBCLASS_BR_OTHER               0x80
+
+/* PCI device subclasses for class C (serial bus controller)*/
+#define PCI_SUBCLASS_SB_IEEE1394            0x00
+#define PCI_SUBCLASS_SB_ACCESS              0x01
+#define PCI_SUBCLASS_SB_SSA                 0x02
+#define PCI_SUBCLASS_SB_USB                 0x03
+#define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
+#define PCI_SUBCLASS_SB_SMBUS               0x05
+
+#define PCI_MAX_DEVICES        32
+#define PCI_MAX_FUNCTION       8
+#define PCI_MAX_BRIDGE_NUMBER  0xFF
+#define PCI_INVALID_VENDORID   0xFFFF
+#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
+
+#define PCI_ADDRESS_IO_SPACE                0x00000001
+#define PCI_ADDRESS_MEMORY_TYPE_MASK        0x00000006
+#define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x00000008
+#define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
+#define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
+#define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
+
+#define PCI_TYPE_32BIT 0
+#define PCI_TYPE_20BIT 2
+#define PCI_TYPE_64BIT 4
+
+#define POOL_COLD_ALLOCATION                256
+#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE    8
+#define POOL_RAISE_IF_ALLOCATION_FAILURE    16
+
+#define PCI_TYPE0_ADDRESSES               6
+#define PCI_TYPE1_ADDRESSES               2
+#define PCI_TYPE2_ADDRESSES               5
+
+#define IO_TYPE_ADAPTER                 1
+#define IO_TYPE_CONTROLLER              2
+#define IO_TYPE_DEVICE                  3
+#define IO_TYPE_DRIVER                  4
+#define IO_TYPE_FILE                    5
+#define IO_TYPE_IRP                     6
+#define IO_TYPE_MASTER_ADAPTER          7
+#define IO_TYPE_OPEN_PACKET             8
+#define IO_TYPE_TIMER                   9
+#define IO_TYPE_VPB                     10
+#define IO_TYPE_ERROR_LOG               11
+#define IO_TYPE_ERROR_MESSAGE           12
+#define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
+
+#define IO_TYPE_CSQ_IRP_CONTEXT 1
+#define IO_TYPE_CSQ 2
+#define IO_TYPE_CSQ_EX 3
+
+/* IO_RESOURCE_DESCRIPTOR.Option */
+#define IO_RESOURCE_PREFERRED             0x01
+#define IO_RESOURCE_DEFAULT               0x02
+#define IO_RESOURCE_ALTERNATIVE           0x08
+
+/* DEVICE_OBJECT.Flags */
+#define DO_VERIFY_VOLUME                  0x00000002
+#define DO_BUFFERED_IO                    0x00000004
+#define DO_EXCLUSIVE                      0x00000008
+#define DO_DIRECT_IO                      0x00000010
+#define DO_MAP_IO_BUFFER                  0x00000020
+#define DO_DEVICE_INITIALIZING            0x00000080
+#define DO_SHUTDOWN_REGISTERED            0x00000800
+#define DO_BUS_ENUMERATED_DEVICE          0x00001000
+#define DO_POWER_PAGABLE                  0x00002000
+#define DO_POWER_INRUSH                   0x00004000
+
+/* DEVICE_OBJECT.Characteristics */
+#define FILE_REMOVABLE_MEDIA              0x00000001
+#define FILE_READ_ONLY_DEVICE             0x00000002
+#define FILE_FLOPPY_DISKETTE              0x00000004
+#define FILE_WRITE_ONCE_MEDIA             0x00000008
+#define FILE_REMOTE_DEVICE                0x00000010
+#define FILE_DEVICE_IS_MOUNTED            0x00000020
+#define FILE_VIRTUAL_VOLUME               0x00000040
+#define FILE_AUTOGENERATED_DEVICE_NAME    0x00000080
+#define FILE_DEVICE_SECURE_OPEN           0x00000100
+#define FILE_CHARACTERISTIC_PNP_DEVICE    0x00000800
+#define FILE_CHARACTERISTIC_TS_DEVICE     0x00001000
+#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
+
+/* DEVICE_OBJECT.AlignmentRequirement */
+#define FILE_BYTE_ALIGNMENT             0x00000000
+#define FILE_WORD_ALIGNMENT             0x00000001
+#define FILE_LONG_ALIGNMENT             0x00000003
+#define FILE_QUAD_ALIGNMENT             0x00000007
+#define FILE_OCTA_ALIGNMENT             0x0000000f
+#define FILE_32_BYTE_ALIGNMENT          0x0000001f
+#define FILE_64_BYTE_ALIGNMENT          0x0000003f
+#define FILE_128_BYTE_ALIGNMENT         0x0000007f
+#define FILE_256_BYTE_ALIGNMENT         0x000000ff
+#define FILE_512_BYTE_ALIGNMENT         0x000001ff
+
+/* DEVICE_OBJECT.DeviceType */
+#define DEVICE_TYPE ULONG
+
+#define FILE_DEVICE_BEEP                  0x00000001
+#define FILE_DEVICE_CD_ROM                0x00000002
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
+#define FILE_DEVICE_CONTROLLER            0x00000004
+#define FILE_DEVICE_DATALINK              0x00000005
+#define FILE_DEVICE_DFS                   0x00000006
+#define FILE_DEVICE_DISK                  0x00000007
+#define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
+#define FILE_DEVICE_FILE_SYSTEM           0x00000009
+#define FILE_DEVICE_INPORT_PORT           0x0000000a
+#define FILE_DEVICE_KEYBOARD              0x0000000b
+#define FILE_DEVICE_MAILSLOT              0x0000000c
+#define FILE_DEVICE_MIDI_IN               0x0000000d
+#define FILE_DEVICE_MIDI_OUT              0x0000000e
+#define FILE_DEVICE_MOUSE                 0x0000000f
+#define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
+#define FILE_DEVICE_NAMED_PIPE            0x00000011
+#define FILE_DEVICE_NETWORK               0x00000012
+#define FILE_DEVICE_NETWORK_BROWSER       0x00000013
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
+#define FILE_DEVICE_NULL                  0x00000015
+#define FILE_DEVICE_PARALLEL_PORT         0x00000016
+#define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
+#define FILE_DEVICE_PRINTER               0x00000018
+#define FILE_DEVICE_SCANNER               0x00000019
+#define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
+#define FILE_DEVICE_SERIAL_PORT           0x0000001b
+#define FILE_DEVICE_SCREEN                0x0000001c
+#define FILE_DEVICE_SOUND                 0x0000001d
+#define FILE_DEVICE_STREAMS               0x0000001e
+#define FILE_DEVICE_TAPE                  0x0000001f
+#define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
+#define FILE_DEVICE_TRANSPORT             0x00000021
+#define FILE_DEVICE_UNKNOWN               0x00000022
+#define FILE_DEVICE_VIDEO                 0x00000023
+#define FILE_DEVICE_VIRTUAL_DISK          0x00000024
+#define FILE_DEVICE_WAVE_IN               0x00000025
+#define FILE_DEVICE_WAVE_OUT              0x00000026
+#define FILE_DEVICE_8042_PORT             0x00000027
+#define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
+#define FILE_DEVICE_BATTERY               0x00000029
+#define FILE_DEVICE_BUS_EXTENDER          0x0000002a
+#define FILE_DEVICE_MODEM                 0x0000002b
+#define FILE_DEVICE_VDM                   0x0000002c
+#define FILE_DEVICE_MASS_STORAGE          0x0000002d
+#define FILE_DEVICE_SMB                   0x0000002e
+#define FILE_DEVICE_KS                    0x0000002f
+#define FILE_DEVICE_CHANGER               0x00000030
+#define FILE_DEVICE_SMARTCARD             0x00000031
+#define FILE_DEVICE_ACPI                  0x00000032
+#define FILE_DEVICE_DVD                   0x00000033
+#define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
+#define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
+#define FILE_DEVICE_DFS_VOLUME            0x00000036
+#define FILE_DEVICE_SERENUM               0x00000037
+#define FILE_DEVICE_TERMSRV               0x00000038
+#define FILE_DEVICE_KSEC                  0x00000039
+#define FILE_DEVICE_FIPS                  0x0000003A
+#define FILE_DEVICE_INFINIBAND            0x0000003B
+#define FILE_DEVICE_VMBUS                 0x0000003E
+#define FILE_DEVICE_CRYPT_PROVIDER        0x0000003F
+#define FILE_DEVICE_WPD                   0x00000040
+#define FILE_DEVICE_BLUETOOTH             0x00000041
+#define FILE_DEVICE_MT_COMPOSITE          0x00000042
+#define FILE_DEVICE_MT_TRANSPORT          0x00000043
+#define FILE_DEVICE_BIOMETRIC             0x00000044
+#define FILE_DEVICE_PMI                   0x00000045
+
+#define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
+
+typedef struct _OBJECT_HANDLE_INFORMATION {
+  ULONG HandleAttributes;
+  ACCESS_MASK GrantedAccess;
+} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
+
+typedef struct _CLIENT_ID {
+  HANDLE  UniqueProcess;
+  HANDLE  UniqueThread;
+} CLIENT_ID, *PCLIENT_ID;
+
+typedef VOID
+(DDKAPI *PKSTART_ROUTINE)(
+  IN PVOID  StartContext);
+
+typedef struct _VPB {
+  CSHORT  Type;
+  CSHORT  Size;
+  USHORT  Flags;
+  USHORT  VolumeLabelLength;
+  struct _DEVICE_OBJECT  *DeviceObject;
+  struct _DEVICE_OBJECT  *RealDevice;
+  ULONG  SerialNumber;
+  ULONG  ReferenceCount;
+  WCHAR  VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
+} VPB, *PVPB;
+
+typedef enum _IO_ALLOCATION_ACTION {
+  KeepObject = 1,
+  DeallocateObject,
+  DeallocateObjectKeepRegisters
+} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
+
+typedef IO_ALLOCATION_ACTION
+(DDKAPI *PDRIVER_CONTROL)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN PVOID  MapRegisterBase,
+  IN PVOID  Context);
+
+typedef struct _WAIT_CONTEXT_BLOCK {
+  KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
+  PDRIVER_CONTROL  DeviceRoutine;
+  PVOID  DeviceContext;
+  ULONG  NumberOfMapRegisters;
+  PVOID  DeviceObject;
+  PVOID  CurrentIrp;
+  PKDPC  BufferChainingDpc;
+} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
+
+typedef struct _DEVICE_OBJECT {
+  CSHORT  Type;
+  USHORT  Size;
+  LONG  ReferenceCount;
+  struct _DRIVER_OBJECT  *DriverObject;
+  struct _DEVICE_OBJECT  *NextDevice;
+  struct _DEVICE_OBJECT  *AttachedDevice;
+  struct _IRP  *CurrentIrp;
+  PIO_TIMER  Timer;
+  ULONG  Flags;
+  ULONG  Characteristics;
+  volatile PVPB  Vpb;
+  PVOID  DeviceExtension;
+  DEVICE_TYPE  DeviceType;
+  CCHAR  StackSize;
+  union {
+    LIST_ENTRY  ListEntry;
+    WAIT_CONTEXT_BLOCK  Wcb;
+  } Queue;
+  ULONG  AlignmentRequirement;
+  KDEVICE_QUEUE  DeviceQueue;
+  KDPC  Dpc;
+  ULONG  ActiveThreadCount;
+  PSECURITY_DESCRIPTOR  SecurityDescriptor;
+  KEVENT  DeviceLock;
+  USHORT  SectorSize;
+  USHORT  Spare1;
+  struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
+  PVOID  Reserved;
+} DEVICE_OBJECT, *PDEVICE_OBJECT;
+
+typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
+
+typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
+  BOOLEAN  Removed;
+  BOOLEAN  Reserved[3];
+  volatile LONG  IoCount;
+  KEVENT  RemoveEvent;
+} IO_REMOVE_LOCK_COMMON_BLOCK;
+
+typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
+  LONG  Signature;
+  LONG  HighWatermark;
+  LONGLONG  MaxLockedTicks;
+  LONG  AllocateTag;
+  LIST_ENTRY  LockList;
+  KSPIN_LOCK  Spin;
+  volatile LONG  LowMemoryCount;
+  ULONG  Reserved1[4];
+  PVOID  Reserved2;
+  PIO_REMOVE_LOCK_TRACKING_BLOCK  Blocks;
+} IO_REMOVE_LOCK_DBG_BLOCK;
+
+typedef struct _IO_REMOVE_LOCK {
+  IO_REMOVE_LOCK_COMMON_BLOCK  Common;
+#if DBG
+  IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
+#endif
+} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
+
+typedef struct _IO_WORKITEM *PIO_WORKITEM;
+
+typedef VOID
+(DDKAPI IO_WORKITEM_ROUTINE)(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PVOID  Context);
+typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
+
+typedef struct _SHARE_ACCESS {
+  ULONG  OpenCount;
+  ULONG  Readers;
+  ULONG  Writers;
+  ULONG  Deleters;
+  ULONG  SharedRead;
+  ULONG  SharedWrite;
+  ULONG  SharedDelete;
+} SHARE_ACCESS, *PSHARE_ACCESS;
+
+/* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
+   inheritance, even from a struct renders the type non-POD. So we use
+   this hack */
+#define PCI_COMMON_HEADER_LAYOUT \
+  USHORT  VendorID; \
+  USHORT  DeviceID; \
+  USHORT  Command; \
+  USHORT  Status; \
+  UCHAR   RevisionID; \
+  UCHAR   ProgIf; \
+  UCHAR   SubClass; \
+  UCHAR   BaseClass; \
+  UCHAR   CacheLineSize; \
+  UCHAR   LatencyTimer; \
+  UCHAR   HeaderType; \
+  UCHAR   BIST; \
+  union { \
+    struct _PCI_HEADER_TYPE_0 { \
+      ULONG   BaseAddresses[PCI_TYPE0_ADDRESSES]; \
+      ULONG   CIS; \
+      USHORT  SubVendorID; \
+      USHORT  SubSystemID; \
+      ULONG   ROMBaseAddress; \
+      UCHAR   CapabilitiesPtr; \
+      UCHAR   Reserved1[3]; \
+      ULONG   Reserved2; \
+      UCHAR   InterruptLine; \
+      UCHAR   InterruptPin; \
+      UCHAR   MinimumGrant; \
+      UCHAR   MaximumLatency; \
+    } type0; \
+    struct _PCI_HEADER_TYPE_1 { \
+      ULONG   BaseAddresses[PCI_TYPE1_ADDRESSES]; \
+      UCHAR   PrimaryBus; \
+      UCHAR   SecondaryBus; \
+      UCHAR   SubordinateBus; \
+      UCHAR   SecondaryLatency; \
+      UCHAR   IOBase; \
+      UCHAR   IOLimit; \
+      USHORT  SecondaryStatus; \
+      USHORT  MemoryBase; \
+      USHORT  MemoryLimit; \
+      USHORT  PrefetchBase; \
+      USHORT  PrefetchLimit; \
+      ULONG   PrefetchBaseUpper32; \
+      ULONG   PrefetchLimitUpper32; \
+      USHORT  IOBaseUpper16; \
+      USHORT  IOLimitUpper16; \
+      UCHAR   CapabilitiesPtr; \
+      UCHAR   Reserved1[3]; \
+      ULONG   ROMBaseAddress; \
+      UCHAR   InterruptLine; \
+      UCHAR   InterruptPin; \
+      USHORT  BridgeControl; \
+    } type1; \
+    struct _PCI_HEADER_TYPE_2 { \
+      ULONG   SocketRegistersBaseAddress; \
+      UCHAR   CapabilitiesPtr; \
+      UCHAR   Reserved; \
+      USHORT  SecondaryStatus; \
+      UCHAR   PrimaryBus; \
+      UCHAR   SecondaryBus; \
+      UCHAR   SubordinateBus; \
+      UCHAR   SecondaryLatency; \
+      struct  { \
+        ULONG   Base; \
+        ULONG   Limit; \
+      } Range[PCI_TYPE2_ADDRESSES-1]; \
+      UCHAR   InterruptLine; \
+      UCHAR   InterruptPin; \
+      USHORT  BridgeControl; \
+    } type2; \
+  } u;
+
+typedef struct _PCI_COMMON_HEADER {
+  PCI_COMMON_HEADER_LAYOUT
+} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
+
+#ifdef __cplusplus
+typedef struct _PCI_COMMON_CONFIG {
+  PCI_COMMON_HEADER_LAYOUT
+  UCHAR  DeviceSpecific[192];
+} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+#else
+typedef struct _PCI_COMMON_CONFIG {
+  PCI_COMMON_HEADER DUMMYSTRUCTNAME;
+  UCHAR  DeviceSpecific[192];
+} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+#endif
+
+typedef enum _CREATE_FILE_TYPE {
+  CreateFileTypeNone,
+  CreateFileTypeNamedPipe,
+  CreateFileTypeMailslot
+} CREATE_FILE_TYPE;
+
+#define IO_FORCE_ACCESS_CHECK               0x001
+#define IO_NO_PARAMETER_CHECKING            0x100
+
+#define IO_REPARSE                      0x0
+#define IO_REMOUNT                      0x1
+
+typedef struct _IO_STATUS_BLOCK {
+  _ANONYMOUS_UNION union {
+    NTSTATUS  Status;
+    PVOID  Pointer;
+  } DUMMYUNIONNAME;
+  ULONG_PTR  Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef struct _PCI_SLOT_NUMBER {
+  union {
+    struct {
+      ULONG  DeviceNumber : 5;
+      ULONG  FunctionNumber : 3;
+      ULONG  Reserved : 24;
+    } bits;
+    ULONG  AsULONG;
+  } u;
+} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
+
+typedef VOID
+(DDKAPI *PIO_APC_ROUTINE)(
+  IN PVOID ApcContext,
+  IN PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG Reserved);
+
+typedef VOID
+(DDKAPI *WMI_NOTIFICATION_CALLBACK)(
+  PVOID  Wnode,
+  PVOID  Context);
+
+#define EVENT_INCREMENT                   1
+#define IO_NO_INCREMENT                   0
+#define IO_CD_ROM_INCREMENT               1
+#define IO_DISK_INCREMENT                 1
+#define IO_KEYBOARD_INCREMENT             6
+#define IO_MAILSLOT_INCREMENT             2
+#define IO_MOUSE_INCREMENT                6
+#define IO_NAMED_PIPE_INCREMENT           2
+#define IO_NETWORK_INCREMENT              2
+#define IO_PARALLEL_INCREMENT             1
+#define IO_SERIAL_INCREMENT               2
+#define IO_SOUND_INCREMENT                8
+#define IO_VIDEO_INCREMENT                1
+#define SEMAPHORE_INCREMENT               1
+
+#define MM_MAXIMUM_DISK_IO_SIZE          (0x10000)
+
+typedef struct _BOOTDISK_INFORMATION {
+  LONGLONG  BootPartitionOffset;
+  LONGLONG  SystemPartitionOffset;
+  ULONG  BootDeviceSignature;
+  ULONG  SystemDeviceSignature;
+} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
+
+typedef struct _BOOTDISK_INFORMATION_EX {
+  LONGLONG  BootPartitionOffset;
+  LONGLONG  SystemPartitionOffset;
+  ULONG  BootDeviceSignature;
+  ULONG  SystemDeviceSignature;
+  GUID  BootDeviceGuid;
+  GUID  SystemDeviceGuid;
+  BOOLEAN  BootDeviceIsGpt;
+  BOOLEAN  SystemDeviceIsGpt;
+} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
+
+typedef struct _EISA_MEMORY_TYPE {
+  UCHAR  ReadWrite : 1;
+  UCHAR  Cached : 1;
+  UCHAR  Reserved0 : 1;
+  UCHAR  Type : 2;
+  UCHAR  Shared : 1;
+  UCHAR  Reserved1 : 1;
+  UCHAR  MoreEntries : 1;
+} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
+
+#include <pshpack1.h>
+typedef struct _EISA_MEMORY_CONFIGURATION {
+  EISA_MEMORY_TYPE  ConfigurationByte;
+  UCHAR  DataSize;
+  USHORT  AddressLowWord;
+  UCHAR  AddressHighByte;
+  USHORT  MemorySize;
+} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
+#include <poppack.h>
+
+typedef struct _EISA_IRQ_DESCRIPTOR {
+  UCHAR  Interrupt : 4;
+  UCHAR  Reserved : 1;
+  UCHAR  LevelTriggered : 1;
+  UCHAR  Shared : 1;
+  UCHAR  MoreEntries : 1;
+} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
+
+typedef struct _EISA_IRQ_CONFIGURATION {
+  EISA_IRQ_DESCRIPTOR  ConfigurationByte;
+  UCHAR  Reserved;
+} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
+
+typedef struct _DMA_CONFIGURATION_BYTE0 {
+  UCHAR Channel : 3;
+  UCHAR Reserved : 3;
+  UCHAR Shared : 1;
+  UCHAR MoreEntries : 1;
+} DMA_CONFIGURATION_BYTE0;
+
+typedef struct _DMA_CONFIGURATION_BYTE1 {
+  UCHAR  Reserved0 : 2;
+  UCHAR  TransferSize : 2;
+  UCHAR  Timing : 2;
+  UCHAR  Reserved1 : 2;
+} DMA_CONFIGURATION_BYTE1;
+
+typedef struct _EISA_DMA_CONFIGURATION {
+  DMA_CONFIGURATION_BYTE0  ConfigurationByte0;
+  DMA_CONFIGURATION_BYTE1  ConfigurationByte1;
+} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
+
+#include <pshpack1.h>
+typedef struct _EISA_PORT_DESCRIPTOR {
+  UCHAR  NumberPorts : 5;
+  UCHAR  Reserved : 1;
+  UCHAR  Shared : 1;
+  UCHAR  MoreEntries : 1;
+} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
+
+typedef struct _EISA_PORT_CONFIGURATION {
+  EISA_PORT_DESCRIPTOR  Configuration;
+  USHORT  PortAddress;
+} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
+#include <poppack.h>
+
+typedef struct _CM_EISA_FUNCTION_INFORMATION {
+  ULONG  CompressedId;
+  UCHAR  IdSlotFlags1;
+  UCHAR  IdSlotFlags2;
+  UCHAR  MinorRevision;
+  UCHAR  MajorRevision;
+  UCHAR  Selections[26];
+  UCHAR  FunctionFlags;
+  UCHAR  TypeString[80];
+  EISA_MEMORY_CONFIGURATION  EisaMemory[9];
+  EISA_IRQ_CONFIGURATION  EisaIrq[7];
+  EISA_DMA_CONFIGURATION  EisaDma[4];
+  EISA_PORT_CONFIGURATION  EisaPort[20];
+  UCHAR  InitializationData[60];
+} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
+
+/* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
+
+#define EISA_FUNCTION_ENABLED           0x80
+#define EISA_FREE_FORM_DATA             0x40
+#define EISA_HAS_PORT_INIT_ENTRY        0x20
+#define EISA_HAS_PORT_RANGE             0x10
+#define EISA_HAS_DMA_ENTRY              0x08
+#define EISA_HAS_IRQ_ENTRY              0x04
+#define EISA_HAS_MEMORY_ENTRY           0x02
+#define EISA_HAS_TYPE_ENTRY             0x01
+#define EISA_HAS_INFORMATION \
+  (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
+  + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
+
+typedef struct _CM_EISA_SLOT_INFORMATION {
+  UCHAR  ReturnCode;
+  UCHAR  ReturnFlags;
+  UCHAR  MajorRevision;
+  UCHAR  MinorRevision;
+  USHORT  Checksum;
+  UCHAR  NumberFunctions;
+  UCHAR  FunctionInformation;
+  ULONG  CompressedId;
+} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
+
+/* CM_EISA_SLOT_INFORMATION.ReturnCode */
+
+#define EISA_INVALID_SLOT               0x80
+#define EISA_INVALID_FUNCTION           0x81
+#define EISA_INVALID_CONFIGURATION      0x82
+#define EISA_EMPTY_SLOT                 0x83
+#define EISA_INVALID_BIOS_CALL          0x86
+
+/*
+** Plug and Play structures
+*/
+
+typedef VOID
+(DDKAPI *PINTERFACE_REFERENCE)(
+  PVOID  Context);
+
+typedef VOID
+(DDKAPI *PINTERFACE_DEREFERENCE)(
+  PVOID Context);
+
+typedef BOOLEAN
+(DDKAPI *PTRANSLATE_BUS_ADDRESS)(
+  IN PVOID  Context,
+  IN PHYSICAL_ADDRESS  BusAddress,
+  IN ULONG  Length,
+  IN OUT PULONG  AddressSpace,
+  OUT PPHYSICAL_ADDRESS  TranslatedAddress);
+
+typedef struct _DMA_ADAPTER*
+(DDKAPI *PGET_DMA_ADAPTER)(
+  IN PVOID  Context,
+  IN struct _DEVICE_DESCRIPTION  *DeviceDescriptor,
+  OUT PULONG  NumberOfMapRegisters);
+
+typedef ULONG
+(DDKAPI *PGET_SET_DEVICE_DATA)(
+  IN PVOID  Context,
+  IN ULONG  DataType,
+  IN PVOID  Buffer,
+  IN ULONG  Offset,
+  IN ULONG  Length);
+
+/* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
+#define PCI_USE_SUBSYSTEM_IDS   0x00000001
+#define PCI_USE_REVISION        0x00000002
+#define PCI_USE_VENDEV_IDS      0x00000004
+#define PCI_USE_CLASS_SUBCLASS  0x00000008
+#define PCI_USE_PROGIF          0x00000010
+#define PCI_USE_LOCAL_BUS       0x00000020
+#define PCI_USE_LOCAL_DEVICE    0x00000040
+
+typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
+  ULONG   Size;
+  ULONG   Flags;
+  USHORT  VendorID;
+  USHORT  DeviceID;
+  UCHAR   RevisionID;
+  USHORT  SubVendorID;
+  USHORT  SubSystemID;
+  UCHAR   BaseClass;
+  UCHAR   SubClass;
+  UCHAR   ProgIf;
+} PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
+
+typedef BOOLEAN
+(DDKAPI *PPCI_IS_DEVICE_PRESENT)(
+  IN USHORT  VendorID,
+  IN USHORT  DeviceID,
+  IN UCHAR   RevisionID,
+  IN USHORT  SubVendorID,
+  IN USHORT  SubSystemID,
+  IN ULONG   Flags);
+
+typedef BOOLEAN
+(DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
+  IN PVOID Context,
+  IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
+
+typedef struct _BUS_INTERFACE_STANDARD {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  Context;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+  PTRANSLATE_BUS_ADDRESS  TranslateBusAddress;
+  PGET_DMA_ADAPTER  GetDmaAdapter;
+  PGET_SET_DEVICE_DATA  SetBusData;
+  PGET_SET_DEVICE_DATA  GetBusData;
+} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
+
+typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  Context;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+  PPCI_IS_DEVICE_PRESENT  IsDevicePresent;
+  PPCI_IS_DEVICE_PRESENT_EX  IsDevicePresentEx;
+} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
+
+typedef struct _DEVICE_CAPABILITIES {
+  USHORT  Size;
+  USHORT  Version;
+  ULONG  DeviceD1 : 1;
+  ULONG  DeviceD2 : 1;
+  ULONG  LockSupported : 1;
+  ULONG  EjectSupported : 1;
+  ULONG  Removable : 1;
+  ULONG  DockDevice : 1;
+  ULONG  UniqueID : 1;
+  ULONG  SilentInstall : 1;
+  ULONG  RawDeviceOK : 1;
+  ULONG  SurpriseRemovalOK : 1;
+  ULONG  WakeFromD0 : 1;
+  ULONG  WakeFromD1 : 1;
+  ULONG  WakeFromD2 : 1;
+  ULONG  WakeFromD3 : 1;
+  ULONG  HardwareDisabled : 1;
+  ULONG  NonDynamic : 1;
+  ULONG  WarmEjectSupported : 1;
+  ULONG  NoDisplayInUI : 1;
+  ULONG  Reserved : 14;
+  ULONG  Address;
+  ULONG  UINumber;
+  DEVICE_POWER_STATE  DeviceState[PowerSystemMaximum];
+  SYSTEM_POWER_STATE  SystemWake;
+  DEVICE_POWER_STATE  DeviceWake;
+  ULONG  D1Latency;
+  ULONG  D2Latency;
+  ULONG  D3Latency;
+} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
+
+typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+  GUID  InterfaceClassGuid;
+  PUNICODE_STRING  SymbolicLinkName;
+} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
+
+typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
+
+#undef INTERFACE
+
+typedef struct _INTERFACE {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  Context;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+} INTERFACE, *PINTERFACE;
+
+typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
+
+typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
+
+/* PNP_DEVICE_STATE */
+
+#define PNP_DEVICE_DISABLED                      0x00000001
+#define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
+#define PNP_DEVICE_FAILED                        0x00000004
+#define PNP_DEVICE_REMOVED                       0x00000008
+#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
+#define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
+
+typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+  struct _FILE_OBJECT  *FileObject;
+  LONG  NameBufferOffset;
+  UCHAR  CustomDataBuffer[1];
+} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
+
+typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+  struct _FILE_OBJECT  *FileObject;
+} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
+
+typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
+  DeviceUsageTypeUndefined,
+  DeviceUsageTypePaging,
+  DeviceUsageTypeHibernation,
+  DeviceUsageTypeDumpFile
+} DEVICE_USAGE_NOTIFICATION_TYPE;
+
+typedef struct _POWER_SEQUENCE {
+  ULONG  SequenceD1;
+  ULONG  SequenceD2;
+  ULONG  SequenceD3;
+} POWER_SEQUENCE, *PPOWER_SEQUENCE;
+
+typedef enum {
+  DevicePropertyDeviceDescription = 0x0,
+  DevicePropertyHardwareID = 0x1,
+  DevicePropertyCompatibleIDs = 0x2,
+  DevicePropertyBootConfiguration = 0x3,
+  DevicePropertyBootConfigurationTranslated = 0x4,
+  DevicePropertyClassName = 0x5,
+  DevicePropertyClassGuid = 0x6,
+  DevicePropertyDriverKeyName = 0x7,
+  DevicePropertyManufacturer = 0x8,
+  DevicePropertyFriendlyName = 0x9,
+  DevicePropertyLocationInformation = 0xa,
+  DevicePropertyPhysicalDeviceObjectName = 0xb,
+  DevicePropertyBusTypeGuid = 0xc,
+  DevicePropertyLegacyBusType = 0xd,
+  DevicePropertyBusNumber = 0xe,
+  DevicePropertyEnumeratorName = 0xf,
+  DevicePropertyAddress = 0x10,
+  DevicePropertyUINumber = 0x11,
+  DevicePropertyInstallState = 0x12,
+  DevicePropertyRemovalPolicy = 0x13,
+  DevicePropertyResourceRequirements = 0x14,
+  DevicePropertyAllocatedResources = 0x15,
+  DevicePropertyContainerID = 0x16
+} DEVICE_REGISTRY_PROPERTY;
+
+typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
+  EventCategoryReserved,
+  EventCategoryHardwareProfileChange,
+  EventCategoryDeviceInterfaceChange,
+  EventCategoryTargetDeviceChange
+} IO_NOTIFICATION_EVENT_CATEGORY;
+
+#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
+
+typedef NTSTATUS
+(DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
+  IN PVOID NotificationStructure,
+  IN PVOID Context);
+
+typedef VOID
+(DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
+  IN PVOID Context);
+
+typedef enum _FILE_INFORMATION_CLASS {
+  FileDirectoryInformation = 1,
+  FileFullDirectoryInformation,
+  FileBothDirectoryInformation,
+  FileBasicInformation,
+  FileStandardInformation,
+  FileInternalInformation,
+  FileEaInformation,
+  FileAccessInformation,
+  FileNameInformation,
+  FileRenameInformation,
+  FileLinkInformation,
+  FileNamesInformation,
+  FileDispositionInformation,
+  FilePositionInformation,
+  FileFullEaInformation,
+  FileModeInformation,
+  FileAlignmentInformation,
+  FileAllInformation,
+  FileAllocationInformation,
+  FileEndOfFileInformation,
+  FileAlternateNameInformation,
+  FileStreamInformation,
+  FilePipeInformation,
+  FilePipeLocalInformation,
+  FilePipeRemoteInformation,
+  FileMailslotQueryInformation,
+  FileMailslotSetInformation,
+  FileCompressionInformation,
+  FileObjectIdInformation,
+  FileCompletionInformation,
+  FileMoveClusterInformation,
+  FileQuotaInformation,
+  FileReparsePointInformation,
+  FileNetworkOpenInformation,
+  FileAttributeTagInformation,
+  FileTrackingInformation,
+  FileIdBothDirectoryInformation,
+  FileIdFullDirectoryInformation,
+  FileValidDataLengthInformation,
+  FileShortNameInformation,
+  FileIoCompletionNotificationInformation,
+  FileIoStatusBlockRangeInformation,
+  FileIoPriorityHintInformation,
+  FileSfioReserveInformation,
+  FileSfioVolumeInformation,
+  FileHardLinkInformation,
+  FileProcessIdsUsingFileInformation,
+  FileNormalizedNameInformation,
+  FileNetworkPhysicalNameInformation,
+  FileIdGlobalTxDirectoryInformation,
+  FileIsRemoteDeviceInformation,
+  FileAttributeCacheInformation,
+  FileNumaNodeInformation,
+  FileStandardLinkInformation,
+  FileRemoteProtocolInformation,
+  FileMaximumInformation
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef struct _FILE_POSITION_INFORMATION {
+  LARGE_INTEGER  CurrentByteOffset;
+} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
+
+#include <pshpack8.h>
+typedef struct _FILE_BASIC_INFORMATION {
+  LARGE_INTEGER  CreationTime;
+  LARGE_INTEGER  LastAccessTime;
+  LARGE_INTEGER  LastWriteTime;
+  LARGE_INTEGER  ChangeTime;
+  ULONG  FileAttributes;
+} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
+#include <poppack.h>
+
+typedef struct _FILE_STANDARD_INFORMATION {
+  LARGE_INTEGER  AllocationSize;
+  LARGE_INTEGER  EndOfFile;
+  ULONG  NumberOfLinks;
+  BOOLEAN  DeletePending;
+  BOOLEAN  Directory;
+} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
+
+typedef struct _FILE_NETWORK_OPEN_INFORMATION {
+  LARGE_INTEGER  CreationTime;
+  LARGE_INTEGER  LastAccessTime;
+  LARGE_INTEGER  LastWriteTime;
+  LARGE_INTEGER  ChangeTime;
+  LARGE_INTEGER  AllocationSize;
+  LARGE_INTEGER  EndOfFile;
+  ULONG  FileAttributes;
+} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
+
+typedef enum _FSINFOCLASS {
+  FileFsVolumeInformation = 1,
+  FileFsLabelInformation,
+  FileFsSizeInformation,
+  FileFsDeviceInformation,
+  FileFsAttributeInformation,
+  FileFsControlInformation,
+  FileFsFullSizeInformation,
+  FileFsObjectIdInformation,
+  FileFsDriverPathInformation,
+  FileFsVolumeFlagsInformation,
+  FileFsMaximumInformation
+} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
+
+typedef struct _FILE_FS_DEVICE_INFORMATION {
+  DEVICE_TYPE  DeviceType;
+  ULONG  Characteristics;
+} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
+
+typedef struct _FILE_FULL_EA_INFORMATION {
+  ULONG  NextEntryOffset;
+  UCHAR  Flags;
+  UCHAR  EaNameLength;
+  USHORT  EaValueLength;
+  CHAR  EaName[1];
+} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
+
+#define FM_LOCK_BIT             (0x1)
+#define FM_LOCK_BIT_V           (0x0)
+#define FM_LOCK_WAITER_WOKEN    (0x2)
+#define FM_LOCK_WAITER_INC      (0x4)
+
+typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
+
+typedef struct _OWNER_ENTRY {
+    ERESOURCE_THREAD OwnerThread;
+    _ANONYMOUS_UNION union {
+        LONG OwnerCount;
+        ULONG TableSize;
+    } DUMMYUNIONNAME;
+} OWNER_ENTRY, *POWNER_ENTRY;
+
+typedef struct _ERESOURCE
+{
+    LIST_ENTRY SystemResourcesList;
+    POWNER_ENTRY OwnerTable;
+    SHORT ActiveCount;
+    USHORT Flag;
+    volatile PKSEMAPHORE SharedWaiters;
+    volatile PKEVENT ExclusiveWaiters;
+    OWNER_ENTRY OwnerEntry;
+    ULONG ActiveEntries;
+    ULONG ContentionCount;
+    ULONG NumberOfSharedWaiters;
+    ULONG NumberOfExclusiveWaiters;
+    __GNU_EXTENSION union
+    {
+        PVOID Address;
+        ULONG_PTR CreatorBackTraceIndex;
+    };
+    KSPIN_LOCK SpinLock;
+} ERESOURCE, *PERESOURCE;
+
+/* ERESOURCE.Flag */
+#define ResourceNeverExclusive            0x0010
+#define ResourceReleaseByOtherThread      0x0020
+#define ResourceOwnedExclusive            0x0080
+
+#define RESOURCE_HASH_TABLE_SIZE          64
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN BOOLEAN  Wait,
+  IN ULONG  LockKey,
+  IN BOOLEAN  CheckForReadOperation,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_READ)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN BOOLEAN  Wait,
+  IN ULONG  LockKey,
+  OUT PVOID  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN BOOLEAN  Wait,
+  IN ULONG  LockKey,
+  IN PVOID  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  OUT PFILE_BASIC_INFORMATION  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  OUT PFILE_STANDARD_INFORMATION  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_LOCK)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PLARGE_INTEGER  Length,
+  PEPROCESS  ProcessId,
+  ULONG  Key,
+  BOOLEAN  FailImmediately,
+  BOOLEAN  ExclusiveLock,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PLARGE_INTEGER  Length,
+  PEPROCESS  ProcessId,
+  ULONG  Key,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_UNLOCK_ALL)(
+  IN struct _FILE_OBJECT  *FileObject,
+  PEPROCESS  ProcessId,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
+  IN struct _FILE_OBJECT  *FileObject,
+  PVOID  ProcessId,
+  ULONG  Key,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_DEVICE_CONTROL)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  IN PVOID  InputBuffer  OPTIONAL,
+  IN ULONG  InputBufferLength,
+  OUT PVOID  OutputBuffer  OPTIONAL,
+  IN ULONG  OutputBufferLength,
+  IN ULONG  IoControlCode,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef VOID
+(DDKAPI *PFAST_IO_ACQUIRE_FILE)(
+  IN struct _FILE_OBJECT  *FileObject);
+
+typedef VOID
+(DDKAPI *PFAST_IO_RELEASE_FILE)(
+  IN struct _FILE_OBJECT  *FileObject);
+
+typedef VOID
+(DDKAPI *PFAST_IO_DETACH_DEVICE)(
+  IN struct _DEVICE_OBJECT  *SourceDevice,
+  IN struct _DEVICE_OBJECT  *TargetDevice);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  OUT struct _FILE_NETWORK_OPEN_INFORMATION  *Buffer,
+  OUT struct _IO_STATUS_BLOCK  *IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  EndingOffset,
+  OUT struct _ERESOURCE  **ResourceToRelease,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_READ)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
+  IN struct _FILE_OBJECT *FileObject,
+  IN PMDL MdlChain,
+  IN struct _DEVICE_OBJECT *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PMDL  MdlChain,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_READ_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  OUT PVOID  Buffer,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  OUT struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
+  IN ULONG  CompressedDataInfoLength,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  IN PVOID  Buffer,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
+  IN ULONG  CompressedDataInfoLength,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PMDL  MdlChain,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PMDL  MdlChain,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_OPEN)(
+  IN struct _IRP  *Irp,
+  OUT PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN struct _ERESOURCE  *ResourceToRelease,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
+  IN struct _FILE_OBJECT  *FileObject,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef struct _FAST_IO_DISPATCH {
+  ULONG  SizeOfFastIoDispatch;
+  PFAST_IO_CHECK_IF_POSSIBLE  FastIoCheckIfPossible;
+  PFAST_IO_READ  FastIoRead;
+  PFAST_IO_WRITE  FastIoWrite;
+  PFAST_IO_QUERY_BASIC_INFO  FastIoQueryBasicInfo;
+  PFAST_IO_QUERY_STANDARD_INFO  FastIoQueryStandardInfo;
+  PFAST_IO_LOCK  FastIoLock;
+  PFAST_IO_UNLOCK_SINGLE  FastIoUnlockSingle;
+  PFAST_IO_UNLOCK_ALL  FastIoUnlockAll;
+  PFAST_IO_UNLOCK_ALL_BY_KEY  FastIoUnlockAllByKey;
+  PFAST_IO_DEVICE_CONTROL  FastIoDeviceControl;
+  PFAST_IO_ACQUIRE_FILE  AcquireFileForNtCreateSection;
+  PFAST_IO_RELEASE_FILE  ReleaseFileForNtCreateSection;
+  PFAST_IO_DETACH_DEVICE  FastIoDetachDevice;
+  PFAST_IO_QUERY_NETWORK_OPEN_INFO  FastIoQueryNetworkOpenInfo;
+  PFAST_IO_ACQUIRE_FOR_MOD_WRITE  AcquireForModWrite;
+  PFAST_IO_MDL_READ  MdlRead;
+  PFAST_IO_MDL_READ_COMPLETE  MdlReadComplete;
+  PFAST_IO_PREPARE_MDL_WRITE  PrepareMdlWrite;
+  PFAST_IO_MDL_WRITE_COMPLETE  MdlWriteComplete;
+  PFAST_IO_READ_COMPRESSED  FastIoReadCompressed;
+  PFAST_IO_WRITE_COMPRESSED  FastIoWriteCompressed;
+  PFAST_IO_MDL_READ_COMPLETE_COMPRESSED  MdlReadCompleteCompressed;
+  PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED  MdlWriteCompleteCompressed;
+  PFAST_IO_QUERY_OPEN  FastIoQueryOpen;
+  PFAST_IO_RELEASE_FOR_MOD_WRITE  ReleaseForModWrite;
+  PFAST_IO_ACQUIRE_FOR_CCFLUSH  AcquireForCcFlush;
+  PFAST_IO_RELEASE_FOR_CCFLUSH  ReleaseForCcFlush;
+} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
+
+typedef struct _SECTION_OBJECT_POINTERS {
+  PVOID  DataSectionObject;
+  PVOID  SharedCacheMap;
+  PVOID  ImageSectionObject;
+} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
+
+typedef struct _IO_COMPLETION_CONTEXT {
+  PVOID  Port;
+  PVOID  Key;
+} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
+
+/* FILE_OBJECT.Flags */
+#define FO_FILE_OPEN                 0x00000001
+#define FO_SYNCHRONOUS_IO            0x00000002
+#define FO_ALERTABLE_IO              0x00000004
+#define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
+#define FO_WRITE_THROUGH             0x00000010
+#define FO_SEQUENTIAL_ONLY           0x00000020
+#define FO_CACHE_SUPPORTED           0x00000040
+#define FO_NAMED_PIPE                0x00000080
+#define FO_STREAM_FILE               0x00000100
+#define FO_MAILSLOT                  0x00000200
+#define FO_GENERATE_AUDIT_ON_CLOSE   0x00000400
+#define FO_QUEUE_IRP_TO_THREAD       0x00000400
+#define FO_DIRECT_DEVICE_OPEN        0x00000800
+#define FO_FILE_MODIFIED             0x00001000
+#define FO_FILE_SIZE_CHANGED         0x00002000
+#define FO_CLEANUP_COMPLETE          0x00004000
+#define FO_TEMPORARY_FILE            0x00008000
+#define FO_DELETE_ON_CLOSE           0x00010000
+#define FO_OPENED_CASE_SENSITIVE     0x00020000
+#define FO_HANDLE_CREATED            0x00040000
+#define FO_FILE_FAST_IO_READ         0x00080000
+#define FO_RANDOM_ACCESS             0x00100000
+#define FO_FILE_OPEN_CANCELLED       0x00200000
+#define FO_VOLUME_OPEN               0x00400000
+#define FO_REMOTE_ORIGIN             0x01000000
+#define FO_DISALLOW_EXCLUSIVE        0x02000000
+#define FO_SKIP_COMPLETION_PORT      0x02000000
+#define FO_SKIP_SET_EVENT            0x04000000
+#define FO_SKIP_SET_FAST_IO          0x08000000
+
+/* VPB.Flags */
+#define VPB_MOUNTED                       0x0001
+#define VPB_LOCKED                        0x0002
+#define VPB_PERSISTENT                    0x0004
+#define VPB_REMOVE_PENDING                0x0008
+#define VPB_RAW_MOUNT                     0x0010
+#define VPB_DIRECT_WRITES_ALLOWED         0x0020
+
+/* IRP.Flags */
+
+#define SL_FORCE_ACCESS_CHECK             0x01
+#define SL_OPEN_PAGING_FILE               0x02
+#define SL_OPEN_TARGET_DIRECTORY          0x04
+#define SL_CASE_SENSITIVE                 0x80
+
+#define SL_KEY_SPECIFIED                  0x01
+#define SL_OVERRIDE_VERIFY_VOLUME         0x02
+#define SL_WRITE_THROUGH                  0x04
+#define SL_FT_SEQUENTIAL_WRITE            0x08
+
+#define SL_FAIL_IMMEDIATELY               0x01
+#define SL_EXCLUSIVE_LOCK                 0x02
+
+#define SL_RESTART_SCAN                   0x01
+#define SL_RETURN_SINGLE_ENTRY            0x02
+#define SL_INDEX_SPECIFIED                0x04
+
+#define SL_WATCH_TREE                     0x01
+
+#define SL_ALLOW_RAW_MOUNT                0x01
+
+#define CTL_CODE(DeviceType, Function, Method, Access) \
+  (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
+
+#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
+
+#define IRP_NOCACHE                     0x00000001
+#define IRP_PAGING_IO                   0x00000002
+#define IRP_MOUNT_COMPLETION            0x00000002
+#define IRP_SYNCHRONOUS_API             0x00000004
+#define IRP_ASSOCIATED_IRP              0x00000008
+#define IRP_BUFFERED_IO                 0x00000010
+#define IRP_DEALLOCATE_BUFFER           0x00000020
+#define IRP_INPUT_OPERATION             0x00000040
+#define IRP_SYNCHRONOUS_PAGING_IO       0x00000040
+#define IRP_CREATE_OPERATION            0x00000080
+#define IRP_READ_OPERATION              0x00000100
+#define IRP_WRITE_OPERATION             0x00000200
+#define IRP_CLOSE_OPERATION             0x00000400
+#define IRP_DEFER_IO_COMPLETION         0x00000800
+#define IRP_OB_QUERY_NAME               0x00001000
+#define IRP_HOLD_DEVICE_QUEUE           0x00002000
+
+#define IRP_QUOTA_CHARGED                 0x01
+#define IRP_ALLOCATED_MUST_SUCCEED        0x02
+#define IRP_ALLOCATED_FIXED_SIZE          0x04
+#define IRP_LOOKASIDE_ALLOCATION          0x08
+
+/*
+** IRP function codes
+*/
+
+#define IRP_MJ_CREATE                     0x00
+#define IRP_MJ_CREATE_NAMED_PIPE          0x01
+#define IRP_MJ_CLOSE                      0x02
+#define IRP_MJ_READ                       0x03
+#define IRP_MJ_WRITE                      0x04
+#define IRP_MJ_QUERY_INFORMATION          0x05
+#define IRP_MJ_SET_INFORMATION            0x06
+#define IRP_MJ_QUERY_EA                   0x07
+#define IRP_MJ_SET_EA                     0x08
+#define IRP_MJ_FLUSH_BUFFERS              0x09
+#define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
+#define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
+#define IRP_MJ_DIRECTORY_CONTROL          0x0c
+#define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
+#define IRP_MJ_DEVICE_CONTROL             0x0e
+#define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
+#define IRP_MJ_SCSI                       0x0f
+#define IRP_MJ_SHUTDOWN                   0x10
+#define IRP_MJ_LOCK_CONTROL               0x11
+#define IRP_MJ_CLEANUP                    0x12
+#define IRP_MJ_CREATE_MAILSLOT            0x13
+#define IRP_MJ_QUERY_SECURITY             0x14
+#define IRP_MJ_SET_SECURITY               0x15
+#define IRP_MJ_POWER                      0x16
+#define IRP_MJ_SYSTEM_CONTROL             0x17
+#define IRP_MJ_DEVICE_CHANGE              0x18
+#define IRP_MJ_QUERY_QUOTA                0x19
+#define IRP_MJ_SET_QUOTA                  0x1a
+#define IRP_MJ_PNP                        0x1b
+#define IRP_MJ_PNP_POWER                  0x1b
+#define IRP_MJ_MAXIMUM_FUNCTION           0x1b
+
+#define IRP_MN_SCSI_CLASS                 0x01
+
+#define IRP_MN_START_DEVICE               0x00
+#define IRP_MN_QUERY_REMOVE_DEVICE        0x01
+#define IRP_MN_REMOVE_DEVICE              0x02
+#define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
+#define IRP_MN_STOP_DEVICE                0x04
+#define IRP_MN_QUERY_STOP_DEVICE          0x05
+#define IRP_MN_CANCEL_STOP_DEVICE         0x06
+
+#define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
+#define IRP_MN_QUERY_INTERFACE              0x08
+#define IRP_MN_QUERY_CAPABILITIES           0x09
+#define IRP_MN_QUERY_RESOURCES              0x0A
+#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
+#define IRP_MN_QUERY_DEVICE_TEXT            0x0C
+#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
+
+#define IRP_MN_READ_CONFIG                  0x0F
+#define IRP_MN_WRITE_CONFIG                 0x10
+#define IRP_MN_EJECT                        0x11
+#define IRP_MN_SET_LOCK                     0x12
+#define IRP_MN_QUERY_ID                     0x13
+#define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
+#define IRP_MN_QUERY_BUS_INFORMATION        0x15
+#define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
+#define IRP_MN_SURPRISE_REMOVAL             0x17
+
+#define IRP_MN_WAIT_WAKE                  0x00
+#define IRP_MN_POWER_SEQUENCE             0x01
+#define IRP_MN_SET_POWER                  0x02
+#define IRP_MN_QUERY_POWER                0x03
+
+#define IRP_MN_QUERY_ALL_DATA             0x00
+#define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
+#define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
+#define IRP_MN_CHANGE_SINGLE_ITEM         0x03
+#define IRP_MN_ENABLE_EVENTS              0x04
+#define IRP_MN_DISABLE_EVENTS             0x05
+#define IRP_MN_ENABLE_COLLECTION          0x06
+#define IRP_MN_DISABLE_COLLECTION         0x07
+#define IRP_MN_REGINFO                    0x08
+#define IRP_MN_EXECUTE_METHOD             0x09
+
+#define IRP_MN_REGINFO_EX                 0x0b
+
+typedef struct _FILE_OBJECT
+{
+    CSHORT Type;
+    CSHORT Size;
+    PDEVICE_OBJECT DeviceObject;
+    PVPB Vpb;
+    PVOID FsContext;
+    PVOID FsContext2;
+    PSECTION_OBJECT_POINTERS SectionObjectPointer;
+    PVOID PrivateCacheMap;
+    NTSTATUS FinalStatus;
+    struct _FILE_OBJECT *RelatedFileObject;
+    BOOLEAN LockOperation;
+    BOOLEAN DeletePending;
+    BOOLEAN ReadAccess;
+    BOOLEAN WriteAccess;
+    BOOLEAN DeleteAccess;
+    BOOLEAN SharedRead;
+    BOOLEAN SharedWrite;
+    BOOLEAN SharedDelete;
+    ULONG Flags;
+    UNICODE_STRING FileName;
+    LARGE_INTEGER CurrentByteOffset;
+    volatile ULONG Waiters;
+    volatile ULONG Busy;
+    PVOID LastLock;
+    KEVENT Lock;
+    KEVENT Event;
+    volatile PIO_COMPLETION_CONTEXT CompletionContext;
+    KSPIN_LOCK IrpListLock;
+    LIST_ENTRY IrpList;
+    volatile PVOID FileObjectExtension;
+} FILE_OBJECT, *PFILE_OBJECT;
+
+typedef struct _IO_ERROR_LOG_PACKET {
+  UCHAR  MajorFunctionCode;
+  UCHAR  RetryCount;
+  USHORT  DumpDataSize;
+  USHORT  NumberOfStrings;
+  USHORT  StringOffset;
+  USHORT  EventCategory;
+  NTSTATUS  ErrorCode;
+  ULONG  UniqueErrorValue;
+  NTSTATUS  FinalStatus;
+  ULONG  SequenceNumber;
+  ULONG  IoControlCode;
+  LARGE_INTEGER  DeviceOffset;
+  ULONG  DumpData[1];
+} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
+
+typedef struct _IO_ERROR_LOG_MESSAGE {
+  USHORT  Type;
+  USHORT  Size;
+  USHORT  DriverNameLength;
+  LARGE_INTEGER  TimeStamp;
+  ULONG  DriverNameOffset;
+  IO_ERROR_LOG_PACKET  EntryData;
+} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
+
+#define ERROR_LOG_LIMIT_SIZE               240
+#define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
+                                            sizeof(IO_ERROR_LOG_PACKET) + \
+                                            (sizeof(WCHAR) * 40))
+#define ERROR_LOG_MESSAGE_LIMIT_SIZE                                          \
+    (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
+#define IO_ERROR_LOG_MESSAGE_LENGTH                                           \
+    ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ?           \
+        ERROR_LOG_MESSAGE_LIMIT_SIZE :                                        \
+        PORT_MAXIMUM_MESSAGE_LENGTH)
+#define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH -                 \
+                                IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
+
+typedef enum _DMA_WIDTH {
+  Width8Bits,
+  Width16Bits,
+  Width32Bits,
+  MaximumDmaWidth
+} DMA_WIDTH, *PDMA_WIDTH;
+
+typedef enum _DMA_SPEED {
+  Compatible,
+  TypeA,
+  TypeB,
+  TypeC,
+  TypeF,
+  MaximumDmaSpeed
+} DMA_SPEED, *PDMA_SPEED;
+
+/* DEVICE_DESCRIPTION.Version */
+
+#define DEVICE_DESCRIPTION_VERSION        0x0000
+#define DEVICE_DESCRIPTION_VERSION1       0x0001
+#define DEVICE_DESCRIPTION_VERSION2       0x0002
+
+typedef struct _DEVICE_DESCRIPTION {
+  ULONG  Version;
+  BOOLEAN  Master;
+  BOOLEAN  ScatterGather;
+  BOOLEAN  DemandMode;
+  BOOLEAN  AutoInitialize;
+  BOOLEAN  Dma32BitAddresses;
+  BOOLEAN  IgnoreCount;
+  BOOLEAN  Reserved1;
+  BOOLEAN  Dma64BitAddresses;
+  ULONG  BusNumber;
+  ULONG  DmaChannel;
+  INTERFACE_TYPE  InterfaceType;
+  DMA_WIDTH  DmaWidth;
+  DMA_SPEED  DmaSpeed;
+  ULONG  MaximumLength;
+  ULONG  DmaPort;
+} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
+
+typedef enum _DEVICE_RELATION_TYPE {
+  BusRelations,
+  EjectionRelations,
+  PowerRelations,
+  RemovalRelations,
+  TargetDeviceRelation,
+  SingleBusRelations,
+  TransportRelations
+} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
+
+typedef struct _DEVICE_RELATIONS {
+  ULONG  Count;
+  PDEVICE_OBJECT Objects[1];
+} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
+
+typedef struct _DEVOBJ_EXTENSION
+{
+    CSHORT Type;
+    USHORT Size;
+    PDEVICE_OBJECT DeviceObject;
+} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
+
+typedef struct _SCATTER_GATHER_ELEMENT {
+  PHYSICAL_ADDRESS  Address;
+  ULONG  Length;
+  ULONG_PTR  Reserved;
+} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
+
+#if defined(_MSC_EXTENSIONS)
+
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+#pragma warning(disable:4200)
+typedef struct _SCATTER_GATHER_LIST {
+  ULONG  NumberOfElements;
+  ULONG_PTR  Reserved;
+  SCATTER_GATHER_ELEMENT  Elements[1];
+} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
+
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#else
+#pragma warning(default:4200)
+#endif
+
+#else
+
+struct _SCATTER_GATHER_LIST;
+typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
+
+#endif
+
+typedef NTSTATUS
+(DDKAPI DRIVER_ADD_DEVICE)(
+  IN struct _DRIVER_OBJECT  *DriverObject,
+  IN struct _DEVICE_OBJECT  *PhysicalDeviceObject);
+typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
+
+typedef struct _DRIVER_EXTENSION {
+  struct _DRIVER_OBJECT  *DriverObject;
+  PDRIVER_ADD_DEVICE  AddDevice;
+  ULONG  Count;
+  UNICODE_STRING  ServiceKeyName;
+} DRIVER_EXTENSION, *PDRIVER_EXTENSION;
+
+#define DRVO_UNLOAD_INVOKED               0x00000001
+#define DRVO_LEGACY_DRIVER                0x00000002
+#define DRVO_BUILTIN_DRIVER               0x00000004
+
+typedef NTSTATUS
+(DDKAPI DRIVER_INITIALIZE)(
+  IN struct _DRIVER_OBJECT  *DriverObject,
+  IN PUNICODE_STRING  RegistryPath);
+typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
+
+typedef VOID
+(DDKAPI DRIVER_STARTIO)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp);
+typedef DRIVER_STARTIO *PDRIVER_STARTIO;
+
+typedef VOID
+(DDKAPI DRIVER_UNLOAD)(
+  IN struct _DRIVER_OBJECT  *DriverObject);
+typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
+
+typedef NTSTATUS
+(DDKAPI DRIVER_DISPATCH)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp);
+typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
+
+typedef struct _DRIVER_OBJECT {
+  CSHORT  Type;
+  CSHORT  Size;
+  PDEVICE_OBJECT  DeviceObject;
+  ULONG  Flags;
+  PVOID  DriverStart;
+  ULONG  DriverSize;
+  PVOID  DriverSection;
+  PDRIVER_EXTENSION  DriverExtension;
+  UNICODE_STRING  DriverName;
+  PUNICODE_STRING  HardwareDatabase;
+  struct _FAST_IO_DISPATCH *FastIoDispatch;
+  PDRIVER_INITIALIZE  DriverInit;
+  PDRIVER_STARTIO  DriverStartIo;
+  PDRIVER_UNLOAD  DriverUnload;
+  PDRIVER_DISPATCH  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
+} DRIVER_OBJECT;
+typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
+
+typedef struct _DMA_ADAPTER {
+  USHORT  Version;
+  USHORT  Size;
+  struct _DMA_OPERATIONS*  DmaOperations;
+} DMA_ADAPTER, *PDMA_ADAPTER;
+
+typedef VOID
+(DDKAPI *PPUT_DMA_ADAPTER)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef PVOID
+(DDKAPI *PALLOCATE_COMMON_BUFFER)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN ULONG  Length,
+  OUT PPHYSICAL_ADDRESS  LogicalAddress,
+  IN BOOLEAN  CacheEnabled);
+
+typedef VOID
+(DDKAPI *PFREE_COMMON_BUFFER)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN ULONG  Length,
+  IN PHYSICAL_ADDRESS  LogicalAddress,
+  IN PVOID  VirtualAddress,
+  IN BOOLEAN  CacheEnabled);
+
+typedef NTSTATUS
+(DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN ULONG  NumberOfMapRegisters,
+  IN PDRIVER_CONTROL  ExecutionRoutine,
+  IN PVOID  Context);
+
+typedef BOOLEAN
+(DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PMDL  Mdl,
+  IN PVOID  MapRegisterBase,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  IN BOOLEAN  WriteToDevice);
+
+typedef VOID
+(DDKAPI *PFREE_ADAPTER_CHANNEL)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef VOID
+(DDKAPI *PFREE_MAP_REGISTERS)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  PVOID  MapRegisterBase,
+  ULONG  NumberOfMapRegisters);
+
+typedef PHYSICAL_ADDRESS
+(DDKAPI *PMAP_TRANSFER)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PMDL  Mdl,
+  IN PVOID  MapRegisterBase,
+  IN PVOID  CurrentVa,
+  IN OUT PULONG  Length,
+  IN BOOLEAN  WriteToDevice);
+
+typedef ULONG
+(DDKAPI *PGET_DMA_ALIGNMENT)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef ULONG
+(DDKAPI *PREAD_DMA_COUNTER)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef VOID
+(DDKAPI *PDRIVER_LIST_CONTROL)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN struct _SCATTER_GATHER_LIST  *ScatterGather,
+  IN PVOID  Context);
+
+typedef NTSTATUS
+(DDKAPI *PGET_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PMDL  Mdl,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
+  IN PVOID  Context,
+  IN BOOLEAN  WriteToDevice);
+
+typedef VOID
+(DDKAPI *PPUT_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PSCATTER_GATHER_LIST  ScatterGather,
+  IN BOOLEAN  WriteToDevice);
+
+typedef NTSTATUS
+(DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PMDL  Mdl  OPTIONAL,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  OUT PULONG  ScatterGatherListSize,
+  OUT PULONG  pNumberOfMapRegisters  OPTIONAL);
+
+typedef NTSTATUS
+(DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PMDL  Mdl,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
+  IN PVOID  Context,
+  IN BOOLEAN  WriteToDevice,
+  IN PVOID  ScatterGatherBuffer,
+  IN ULONG  ScatterGatherLength);
+
+typedef NTSTATUS
+(DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PSCATTER_GATHER_LIST  ScatterGather,
+  IN PMDL  OriginalMdl,
+  OUT PMDL  *TargetMdl);
+
+typedef struct _DMA_OPERATIONS {
+  ULONG  Size;
+  PPUT_DMA_ADAPTER  PutDmaAdapter;
+  PALLOCATE_COMMON_BUFFER  AllocateCommonBuffer;
+  PFREE_COMMON_BUFFER  FreeCommonBuffer;
+  PALLOCATE_ADAPTER_CHANNEL  AllocateAdapterChannel;
+  PFLUSH_ADAPTER_BUFFERS  FlushAdapterBuffers;
+  PFREE_ADAPTER_CHANNEL  FreeAdapterChannel;
+  PFREE_MAP_REGISTERS  FreeMapRegisters;
+  PMAP_TRANSFER  MapTransfer;
+  PGET_DMA_ALIGNMENT  GetDmaAlignment;
+  PREAD_DMA_COUNTER  ReadDmaCounter;
+  PGET_SCATTER_GATHER_LIST  GetScatterGatherList;
+  PPUT_SCATTER_GATHER_LIST  PutScatterGatherList;
+  PCALCULATE_SCATTER_GATHER_LIST_SIZE  CalculateScatterGatherList;
+  PBUILD_SCATTER_GATHER_LIST  BuildScatterGatherList;
+  PBUILD_MDL_FROM_SCATTER_GATHER_LIST  BuildMdlFromScatterGatherList;
+} DMA_OPERATIONS, *PDMA_OPERATIONS;
+
+typedef struct _IO_RESOURCE_DESCRIPTOR {
+  UCHAR  Option;
+  UCHAR  Type;
+  UCHAR  ShareDisposition;
+  UCHAR  Spare1;
+  USHORT  Flags;
+  USHORT  Spare2;
+  union {
+    struct {
+      ULONG  Length;
+      ULONG  Alignment;
+      PHYSICAL_ADDRESS  MinimumAddress;
+      PHYSICAL_ADDRESS  MaximumAddress;
+    } Port;
+    struct {
+      ULONG  Length;
+      ULONG  Alignment;
+      PHYSICAL_ADDRESS  MinimumAddress;
+      PHYSICAL_ADDRESS  MaximumAddress;
+    } Memory;
+    struct {
+      ULONG  MinimumVector;
+      ULONG  MaximumVector;
+    } Interrupt;
+    struct {
+      ULONG  MinimumChannel;
+      ULONG  MaximumChannel;
+    } Dma;
+    struct {
+      ULONG  Length;
+      ULONG  Alignment;
+      PHYSICAL_ADDRESS  MinimumAddress;
+      PHYSICAL_ADDRESS  MaximumAddress;
+    } Generic;
+    struct {
+      ULONG  Data[3];
+    } DevicePrivate;
+    struct {
+      ULONG  Length;
+      ULONG  MinBusNumber;
+      ULONG  MaxBusNumber;
+      ULONG  Reserved;
+    } BusNumber;
+    struct {
+      ULONG  Priority;
+      ULONG  Reserved1;
+      ULONG  Reserved2;
+    } ConfigData;
+  } u;
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
+
+typedef struct _IO_RESOURCE_LIST {
+  USHORT  Version;
+  USHORT  Revision;
+  ULONG  Count;
+  IO_RESOURCE_DESCRIPTOR  Descriptors[1];
+} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
+
+typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
+  ULONG  ListSize;
+  INTERFACE_TYPE  InterfaceType;
+  ULONG  BusNumber;
+  ULONG  SlotNumber;
+  ULONG  Reserved[3];
+  ULONG  AlternativeLists;
+  IO_RESOURCE_LIST  List[1];
+} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
+
+typedef VOID
+(DDKAPI DRIVER_CANCEL)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp);
+typedef DRIVER_CANCEL *PDRIVER_CANCEL;
+
+typedef struct _IRP {
+  CSHORT  Type;
+  USHORT  Size;
+  struct _MDL  *MdlAddress;
+  ULONG  Flags;
+  union {
+    struct _IRP  *MasterIrp;
+    volatile LONG  IrpCount;
+    PVOID  SystemBuffer;
+  } AssociatedIrp;
+  LIST_ENTRY  ThreadListEntry;
+  IO_STATUS_BLOCK  IoStatus;
+  KPROCESSOR_MODE  RequestorMode;
+  BOOLEAN  PendingReturned;
+  CHAR  StackCount;
+  CHAR  CurrentLocation;
+  BOOLEAN  Cancel;
+  KIRQL  CancelIrql;
+  CCHAR  ApcEnvironment;
+  UCHAR  AllocationFlags;
+  PIO_STATUS_BLOCK  UserIosb;
+  PKEVENT  UserEvent;
+  union {
+    struct {
+      _ANONYMOUS_UNION union {      
+        PIO_APC_ROUTINE  UserApcRoutine;
+        PVOID IssuingProcess;
+      } DUMMYUNIONNAME;
+      PVOID  UserApcContext;
+    } AsynchronousParameters;
+    LARGE_INTEGER  AllocationSize;
+  } Overlay;
+  volatile PDRIVER_CANCEL  CancelRoutine;
+  PVOID  UserBuffer;
+  union {
+    struct {
+      _ANONYMOUS_UNION union {
+        KDEVICE_QUEUE_ENTRY  DeviceQueueEntry;
+        _ANONYMOUS_STRUCT struct {
+          PVOID  DriverContext[4];
+        } DUMMYSTRUCTNAME;
+      } DUMMYUNIONNAME;
+      PETHREAD  Thread;
+      PCHAR  AuxiliaryBuffer;
+      _ANONYMOUS_STRUCT struct {
+        LIST_ENTRY  ListEntry;
+        _ANONYMOUS_UNION union {
+          struct _IO_STACK_LOCATION  *CurrentStackLocation;
+          ULONG  PacketType;
+        } DUMMYUNIONNAME;
+      } DUMMYSTRUCTNAME;
+      struct _FILE_OBJECT  *OriginalFileObject;
+    } Overlay;
+    KAPC  Apc;
+    PVOID  CompletionKey;
+  } Tail;
+} IRP;
+typedef struct _IRP *PIRP;
+
+typedef enum _IO_PAGING_PRIORITY {
+  IoPagingPriorityInvalid,
+  IoPagingPriorityNormal,
+  IoPagingPriorityHigh,
+  IoPagingPriorityReserved1,
+  IoPagingPriorityReserved2
+} IO_PAGING_PRIORITY;
+
+typedef NTSTATUS
+(DDKAPI IO_COMPLETION_ROUTINE)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN PVOID  Context);
+typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
+
+typedef VOID
+(DDKAPI *PIO_DPC_ROUTINE)(
+  IN struct _KDPC  *Dpc,
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN PVOID  Context);
+
+typedef NTSTATUS
+(DDKAPI *PMM_DLL_INITIALIZE)(
+  IN PUNICODE_STRING  RegistryPath);
+
+typedef NTSTATUS
+(DDKAPI *PMM_DLL_UNLOAD)(
+  VOID);
+
+typedef BOOLEAN
+(DDKAPI KSERVICE_ROUTINE)(
+  IN struct _KINTERRUPT  *Interrupt,
+  IN PVOID  ServiceContext);
+typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
+
+typedef VOID
+(DDKAPI *PIO_TIMER_ROUTINE)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN PVOID  Context);
+
+typedef struct _IO_SECURITY_CONTEXT {
+  PSECURITY_QUALITY_OF_SERVICE  SecurityQos;
+  PACCESS_STATE  AccessState;
+  ACCESS_MASK  DesiredAccess;
+  ULONG  FullCreateOptions;
+} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
+
+struct _IO_CSQ;
+
+typedef struct _IO_CSQ_IRP_CONTEXT {
+  ULONG  Type;
+  struct _IRP  *Irp;
+  struct _IO_CSQ  *Csq;
+} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
+
+typedef VOID
+(DDKAPI *PIO_CSQ_INSERT_IRP)(
+  IN struct _IO_CSQ  *Csq,
+  IN PIRP  Irp);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_REMOVE_IRP)(
+  IN struct _IO_CSQ  *Csq,
+  IN PIRP  Irp);
+
+typedef PIRP
+(DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
+  IN struct _IO_CSQ  *Csq,
+  IN PIRP  Irp,
+  IN PVOID  PeekContext);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
+  IN  struct _IO_CSQ  *Csq,
+  OUT PKIRQL  Irql);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_RELEASE_LOCK)(
+  IN struct _IO_CSQ  *Csq,
+  IN KIRQL  Irql);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
+  IN  struct _IO_CSQ  *Csq,
+  IN  PIRP  Irp);
+
+typedef struct _IO_CSQ {
+  ULONG  Type;
+  PIO_CSQ_INSERT_IRP  CsqInsertIrp;
+  PIO_CSQ_REMOVE_IRP  CsqRemoveIrp;
+  PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp;
+  PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock;
+  PIO_CSQ_RELEASE_LOCK  CsqReleaseLock;
+  PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
+  PVOID  ReservePointer;
+} IO_CSQ, *PIO_CSQ;
+
+typedef enum _BUS_QUERY_ID_TYPE {
+  BusQueryDeviceID,
+  BusQueryHardwareIDs,
+  BusQueryCompatibleIDs,
+  BusQueryInstanceID,
+  BusQueryDeviceSerialNumber
+} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
+
+typedef enum _DEVICE_TEXT_TYPE {
+  DeviceTextDescription,
+  DeviceTextLocationInformation
+} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
+
+typedef enum _WORK_QUEUE_TYPE {
+  CriticalWorkQueue,
+  DelayedWorkQueue,
+  HyperCriticalWorkQueue,
+  MaximumWorkQueue
+} WORK_QUEUE_TYPE;
+
+#if !defined(_AMD64_) && !defined(_IA64_)
+#include <pshpack4.h>
+#endif
+typedef struct _IO_STACK_LOCATION {
+  UCHAR  MajorFunction;
+  UCHAR  MinorFunction;
+  UCHAR  Flags;
+  UCHAR  Control;
+  union {
+    struct {
+      PIO_SECURITY_CONTEXT  SecurityContext;
+      ULONG  Options;
+      USHORT POINTER_ALIGNMENT  FileAttributes;
+      USHORT  ShareAccess;
+      ULONG POINTER_ALIGNMENT  EaLength;
+    } Create;
+    struct {
+      ULONG  Length;
+      ULONG POINTER_ALIGNMENT  Key;
+      LARGE_INTEGER  ByteOffset;
+    } Read;
+    struct {
+      ULONG  Length;
+      ULONG POINTER_ALIGNMENT  Key;
+      LARGE_INTEGER  ByteOffset;
+    } Write;
+    struct {
+      ULONG  Length;
+      PUNICODE_STRING  FileName;
+      FILE_INFORMATION_CLASS  FileInformationClass;
+      ULONG  FileIndex;
+    } QueryDirectory;
+    struct {
+      ULONG  Length;
+      ULONG  CompletionFilter;
+    } NotifyDirectory;
+    struct {
+      ULONG  Length;
+      FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
+    } QueryFile;
+    struct {
+      ULONG  Length;
+      FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
+      PFILE_OBJECT  FileObject;
+      _ANONYMOUS_UNION union {
+        _ANONYMOUS_STRUCT struct {
+          BOOLEAN  ReplaceIfExists;
+          BOOLEAN  AdvanceOnly;
+        } DUMMYSTRUCTNAME;
+        ULONG  ClusterCount;
+        HANDLE  DeleteHandle;
+      } DUMMYUNIONNAME;
+    } SetFile;
+    struct {
+      ULONG  Length;
+      PVOID  EaList;
+      ULONG  EaListLength;
+      ULONG  EaIndex;
+    } QueryEa;
+    struct {
+      ULONG  Length;
+    } SetEa;
+    struct {
+      ULONG  Length;
+      FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
+    } QueryVolume;
+    struct {
+      ULONG  Length;
+      FS_INFORMATION_CLASS  FsInformationClass;
+    } SetVolume;
+    struct {
+      ULONG  OutputBufferLength;
+      ULONG  InputBufferLength;
+      ULONG  FsControlCode;
+      PVOID  Type3InputBuffer;
+    } FileSystemControl;
+    struct {
+      PLARGE_INTEGER  Length;
+      ULONG  Key;
+      LARGE_INTEGER  ByteOffset;
+    } LockControl;
+    struct {
+      ULONG  OutputBufferLength;
+      ULONG POINTER_ALIGNMENT  InputBufferLength;
+      ULONG POINTER_ALIGNMENT  IoControlCode;
+      PVOID  Type3InputBuffer;
+    } DeviceIoControl;
+    struct {
+      SECURITY_INFORMATION  SecurityInformation;
+      ULONG POINTER_ALIGNMENT  Length;
+    } QuerySecurity;
+    struct {
+      SECURITY_INFORMATION  SecurityInformation;
+      PSECURITY_DESCRIPTOR  SecurityDescriptor;
+    } SetSecurity;
+    struct {
+      PVPB  Vpb;
+      PDEVICE_OBJECT  DeviceObject;
+    } MountVolume;
+    struct {
+      PVPB  Vpb;
+      PDEVICE_OBJECT  DeviceObject;
+    } VerifyVolume;
+    struct {
+      struct _SCSI_REQUEST_BLOCK  *Srb;
+    } Scsi;
+    struct {
+      ULONG  Length;
+      PSID  StartSid;
+      struct _FILE_GET_QUOTA_INFORMATION  *SidList;
+      ULONG  SidListLength;
+    } QueryQuota;
+    struct {
+      ULONG  Length;
+    } SetQuota;
+    struct {
+      DEVICE_RELATION_TYPE  Type;
+    } QueryDeviceRelations;
+    struct {
+      CONST GUID  *InterfaceType;
+      USHORT  Size;
+      USHORT  Version;
+      PINTERFACE  Interface;
+      PVOID  InterfaceSpecificData;
+    } QueryInterface;
+    struct {
+      PDEVICE_CAPABILITIES  Capabilities;
+    } DeviceCapabilities;
+    struct {
+      PIO_RESOURCE_REQUIREMENTS_LIST  IoResourceRequirementList;
+    } FilterResourceRequirements;
+    struct {
+      ULONG  WhichSpace;
+      PVOID  Buffer;
+      ULONG  Offset;
+      ULONG POINTER_ALIGNMENT  Length;
+    } ReadWriteConfig;
+    struct {
+      BOOLEAN  Lock;
+    } SetLock;
+    struct {
+      BUS_QUERY_ID_TYPE  IdType;
+    } QueryId;
+    struct {
+      DEVICE_TEXT_TYPE  DeviceTextType;
+      LCID POINTER_ALIGNMENT  LocaleId;
+    } QueryDeviceText;
+    struct {
+      BOOLEAN  InPath;
+      BOOLEAN  Reserved[3];
+      DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT  Type;
+    } UsageNotification;
+    struct {
+      SYSTEM_POWER_STATE  PowerState;
+    } WaitWake;
+    struct {
+      PPOWER_SEQUENCE  PowerSequence;
+    } PowerSequence;
+    struct {
+      ULONG  SystemContext;
+      POWER_STATE_TYPE POINTER_ALIGNMENT  Type;
+      POWER_STATE POINTER_ALIGNMENT  State;
+      POWER_ACTION POINTER_ALIGNMENT  ShutdownType;
+    } Power;
+    struct {
+      PCM_RESOURCE_LIST  AllocatedResources;
+      PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
+    } StartDevice;
+    struct {
+      ULONG_PTR  ProviderId;
+      PVOID  DataPath;
+      ULONG  BufferSize;
+      PVOID  Buffer;
+    } WMI;
+    struct {
+      PVOID  Argument1;
+      PVOID  Argument2;
+      PVOID  Argument3;
+      PVOID  Argument4;
+    } Others;
+  } Parameters;
+  PDEVICE_OBJECT  DeviceObject;
+  PFILE_OBJECT  FileObject;
+  PIO_COMPLETION_ROUTINE  CompletionRoutine;
+  PVOID  Context;
+} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
+#if !defined(_AMD64_) && !defined(_IA64_)
+#include <poppack.h>
+#endif
+
+/* IO_STACK_LOCATION.Control */
+
+#define SL_PENDING_RETURNED               0x01
+#define SL_ERROR_RETURNED                 0x02
+#define SL_INVOKE_ON_CANCEL               0x20
+#define SL_INVOKE_ON_SUCCESS              0x40
+#define SL_INVOKE_ON_ERROR                0x80
+
+/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
+
+#define PCI_WHICHSPACE_CONFIG             0x0
+#define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
+
+#define METHOD_BUFFERED                   0
+#define METHOD_IN_DIRECT                  1
+#define METHOD_OUT_DIRECT                 2
+#define METHOD_NEITHER                    3
+
+
+#define FILE_SUPERSEDED                   0x00000000
+#define FILE_OPENED                       0x00000001
+#define FILE_CREATED                      0x00000002
+#define FILE_OVERWRITTEN                  0x00000003
+#define FILE_EXISTS                       0x00000004
+#define FILE_DOES_NOT_EXIST               0x00000005
+
+#define FILE_USE_FILE_POINTER_POSITION    0xfffffffe
+#define FILE_WRITE_TO_END_OF_FILE         0xffffffff
+
+/* also in winnt.h */
+#define FILE_LIST_DIRECTORY               0x00000001
+#define FILE_READ_DATA                    0x00000001
+#define FILE_ADD_FILE                     0x00000002
+#define FILE_WRITE_DATA                   0x00000002
+#define FILE_ADD_SUBDIRECTORY             0x00000004
+#define FILE_APPEND_DATA                  0x00000004
+#define FILE_CREATE_PIPE_INSTANCE         0x00000004
+#define FILE_READ_EA                      0x00000008
+#define FILE_WRITE_EA                     0x00000010
+#define FILE_EXECUTE                      0x00000020
+#define FILE_TRAVERSE                     0x00000020
+#define FILE_DELETE_CHILD                 0x00000040
+#define FILE_READ_ATTRIBUTES              0x00000080
+#define FILE_WRITE_ATTRIBUTES             0x00000100
+
+#define FILE_SHARE_READ                   0x00000001
+#define FILE_SHARE_WRITE                  0x00000002
+#define FILE_SHARE_DELETE                 0x00000004
+#define FILE_SHARE_VALID_FLAGS            0x00000007
+
+#define FILE_ATTRIBUTE_READONLY           0x00000001
+#define FILE_ATTRIBUTE_HIDDEN             0x00000002
+#define FILE_ATTRIBUTE_SYSTEM             0x00000004
+#define FILE_ATTRIBUTE_DIRECTORY          0x00000010
+#define FILE_ATTRIBUTE_ARCHIVE            0x00000020
+#define FILE_ATTRIBUTE_DEVICE             0x00000040
+#define FILE_ATTRIBUTE_NORMAL             0x00000080
+#define FILE_ATTRIBUTE_TEMPORARY          0x00000100
+#define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
+#define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
+#define FILE_ATTRIBUTE_COMPRESSED         0x00000800
+#define FILE_ATTRIBUTE_OFFLINE            0x00001000
+#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
+#define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
+
+#define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
+#define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
+
+#define FILE_VALID_OPTION_FLAGS           0x00ffffff
+#define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
+#define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
+#define FILE_VALID_SET_FLAGS              0x00000036
+
+#define FILE_SUPERSEDE                    0x00000000
+#define FILE_OPEN                         0x00000001
+#define FILE_CREATE                       0x00000002
+#define FILE_OPEN_IF                      0x00000003
+#define FILE_OVERWRITE                    0x00000004
+#define FILE_OVERWRITE_IF                 0x00000005
+#define FILE_MAXIMUM_DISPOSITION          0x00000005
+
+#define FILE_DIRECTORY_FILE               0x00000001
+#define FILE_WRITE_THROUGH                0x00000002
+#define FILE_SEQUENTIAL_ONLY              0x00000004
+#define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
+#define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
+#define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
+#define FILE_NON_DIRECTORY_FILE           0x00000040
+#define FILE_CREATE_TREE_CONNECTION       0x00000080
+#define FILE_COMPLETE_IF_OPLOCKED         0x00000100
+#define FILE_NO_EA_KNOWLEDGE              0x00000200
+#define FILE_OPEN_REMOTE_INSTANCE         0x00000400
+#define FILE_RANDOM_ACCESS                0x00000800
+#define FILE_DELETE_ON_CLOSE              0x00001000
+#define FILE_OPEN_BY_FILE_ID              0x00002000
+#define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
+#define FILE_NO_COMPRESSION               0x00008000
+#define FILE_RESERVE_OPFILTER             0x00100000
+#define FILE_OPEN_REPARSE_POINT           0x00200000
+#define FILE_OPEN_NO_RECALL               0x00400000
+#define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
+
+#define FILE_ANY_ACCESS                   0x00000000
+#define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
+#define FILE_READ_ACCESS                  0x00000001
+#define FILE_WRITE_ACCESS                 0x00000002
+
+#define FILE_ALL_ACCESS \
+  (STANDARD_RIGHTS_REQUIRED | \
+   SYNCHRONIZE | \
+   0x1FF)
+
+#define FILE_GENERIC_EXECUTE \
+  (STANDARD_RIGHTS_EXECUTE | \
+   FILE_READ_ATTRIBUTES | \
+   FILE_EXECUTE | \
+   SYNCHRONIZE)
+
+#define FILE_GENERIC_READ \
+  (STANDARD_RIGHTS_READ | \
+   FILE_READ_DATA | \
+   FILE_READ_ATTRIBUTES | \
+   FILE_READ_EA | \
+   SYNCHRONIZE)
+
+#define FILE_GENERIC_WRITE \
+  (STANDARD_RIGHTS_WRITE | \
+   FILE_WRITE_DATA | \
+   FILE_WRITE_ATTRIBUTES | \
+   FILE_WRITE_EA | \
+   FILE_APPEND_DATA | \
+   SYNCHRONIZE)
+
+/* end winnt.h */
+
+/******************************************************************************
+ *                            Object Manager Types                            *
+ ******************************************************************************/
+
+typedef struct _OBJECT_NAME_INFORMATION {
+  UNICODE_STRING  Name;
+} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
+
+/* Exported object types */
+extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
+extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
+extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
+extern POBJECT_TYPE NTSYSAPI PsThreadType;
+extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
+extern POBJECT_TYPE NTSYSAPI PsProcessType;
+
+
+/******************************************************************************
+ *                           Process Manager Types                            *
+ ******************************************************************************/
+
+#define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
+#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
+#define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
+#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
+#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
+
+/* Process Qoutas */
+typedef struct _QUOTA_LIMITS {
+    SIZE_T PagedPoolLimit;
+    SIZE_T NonPagedPoolLimit;
+    SIZE_T MinimumWorkingSetSize;
+    SIZE_T MaximumWorkingSetSize;
+    SIZE_T PagefileLimit;
+    LARGE_INTEGER TimeLimit;
+} QUOTA_LIMITS, *PQUOTA_LIMITS;
+
+/* Thread Access Rights */
+#define THREAD_TERMINATE                 0x0001
+#define THREAD_SUSPEND_RESUME            0x0002
+#define THREAD_ALERT                     0x0004
+#define THREAD_GET_CONTEXT               0x0008
+#define THREAD_SET_CONTEXT               0x0010
+#define THREAD_SET_INFORMATION           0x0020
+#define THREAD_SET_LIMITED_INFORMATION   0x0400
+#define THREAD_QUERY_LIMITED_INFORMATION 0x0800
+
+#define PROCESS_DUP_HANDLE                 (0x0040)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
+#else
+#define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
+#else
+#define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
+#endif
+
+#define ES_SYSTEM_REQUIRED                0x00000001
+#define ES_DISPLAY_REQUIRED               0x00000002
+#define ES_USER_PRESENT                   0x00000004
+#define ES_CONTINUOUS                     0x80000000
+
+#define LOW_PRIORITY                      0
+#define LOW_REALTIME_PRIORITY             16
+#define HIGH_PRIORITY                     31
+#define MAXIMUM_PRIORITY                  32
+
+
+#ifdef _X86_
+/** Kernel definitions for x86 **/
+
+/* Interrupt request levels */
+#define PASSIVE_LEVEL           0
+#define LOW_LEVEL               0
+#define APC_LEVEL               1
+#define DISPATCH_LEVEL          2
+#define CMCI_LEVEL              5
+#define PROFILE_LEVEL           27
+#define CLOCK1_LEVEL            28
+#define CLOCK2_LEVEL            28
+#define IPI_LEVEL               29
+#define POWER_LEVEL             30
+#define HIGH_LEVEL              31
+#define CLOCK_LEVEL             (CLOCK2_LEVEL)
+
+#define KIP0PCRADDRESS          0xffdff000  
+#define KI_USER_SHARED_DATA     0xffdf0000
+#define SharedUserData          ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
+
+#define PAGE_SIZE               0x1000
+#define PAGE_SHIFT              12L
+#define KeGetDcacheFillSize()   1L
+
+#define EFLAG_SIGN              0x8000
+#define EFLAG_ZERO              0x4000
+#define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
+
+#define RESULT_NEGATIVE         ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
+#define RESULT_ZERO             ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
+#define RESULT_POSITIVE         ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
+
+
+typedef struct _KFLOATING_SAVE {
+  ULONG  ControlWord;
+  ULONG  StatusWord;
+  ULONG  ErrorOffset;
+  ULONG  ErrorSelector;
+  ULONG  DataOffset;
+  ULONG  DataSelector;
+  ULONG  Cr0NpxState;
+  ULONG  Spare1;
+} KFLOATING_SAVE, *PKFLOATING_SAVE;
+
+extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
+
+#define YieldProcessor _mm_pause
+
+FORCEINLINE
+VOID
+KeMemoryBarrier(
+  VOID)
+{
+  volatile LONG Barrier;
+#if defined(__GNUC__)
+  __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
+#elif defined(_MSC_VER)
+  __asm xchg [Barrier], eax
+#endif
+}
+
+NTHALAPI
+VOID
+FASTCALL
+KfLowerIrql(
+  IN KIRQL  NewIrql);
+#define KeLowerIrql(a) KfLowerIrql(a)
+
+NTHALAPI
+KIRQL
+FASTCALL
+KfRaiseIrql(
+  IN KIRQL  NewIrql);
+#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
+
+NTHALAPI
+KIRQL
+DDKAPI
+KeRaiseIrqlToDpcLevel(
+  VOID);
+
+NTHALAPI
+KIRQL
+DDKAPI
+KeRaiseIrqlToSynchLevel(
+    VOID);
+
+NTHALAPI
+KIRQL
+FASTCALL
+KfAcquireSpinLock(
+  IN PKSPIN_LOCK SpinLock);
+#define KeAcquireSpinLock(a,b)  *(b) = KfAcquireSpinLock(a)
+
+NTHALAPI
+VOID
+FASTCALL
+KfReleaseSpinLock(
+  IN PKSPIN_LOCK SpinLock,
+  IN KIRQL NewIrql);
+#define KeReleaseSpinLock(a,b)  KfReleaseSpinLock(a,b)
+
+NTKERNELAPI
+VOID
+FASTCALL
+KefAcquireSpinLockAtDpcLevel(
+  IN PKSPIN_LOCK  SpinLock);
+#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
+
+NTKERNELAPI
+VOID
+FASTCALL
+KefReleaseSpinLockFromDpcLevel(
+  IN PKSPIN_LOCK  SpinLock);
+#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
+
+NTSYSAPI
+PKTHREAD
+NTAPI
+KeGetCurrentThread(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSaveFloatingPointState(
+  OUT PKFLOATING_SAVE  FloatSave);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeRestoreFloatingPointState(
+  IN PKFLOATING_SAVE  FloatSave);
+
+/* VOID
+ * KeFlushIoBuffers(
+ *   IN PMDL Mdl,
+ *   IN BOOLEAN ReadOperation,
+ *   IN BOOLEAN DmaOperation)
+ */
+#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
+
+/* x86 and x64 performs a 0x2C interrupt */
+#define DbgRaiseAssertionFailure __int2c
+
+FORCEINLINE
+VOID
+_KeQueryTickCount(
+  OUT PLARGE_INTEGER CurrentCount)
+{
+    for (;;)
+    {
+        CurrentCount->HighPart = KeTickCount.High1Time;
+        CurrentCount->LowPart = KeTickCount.LowPart;
+        if (CurrentCount->HighPart == KeTickCount.High2Time) break;
+        YieldProcessor();
+    }
+}
+#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
+
+#endif /* _X86_ */
+
+
+
+/******************************************************************************
+ *                         Runtime Library Functions                          *
+ ******************************************************************************/
+
+FORCEINLINE
+VOID
+InitializeListHead(
+  OUT PLIST_ENTRY ListHead)
+{
+  ListHead->Flink = ListHead->Blink = ListHead;
+}
+
+FORCEINLINE
+VOID
+InsertHeadList(
+  IN OUT PLIST_ENTRY  ListHead,
+  IN OUT PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldFlink;
+  OldFlink = ListHead->Flink;
+  Entry->Flink = OldFlink;
+  Entry->Blink = ListHead;
+  OldFlink->Blink = Entry;
+  ListHead->Flink = Entry;
+}
+
+FORCEINLINE
+VOID
+InsertTailList(
+  IN OUT PLIST_ENTRY  ListHead,
+  IN OUT PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldBlink;
+  OldBlink = ListHead->Blink;
+  Entry->Flink = ListHead;
+  Entry->Blink = OldBlink;
+  OldBlink->Flink = Entry;
+  ListHead->Blink = Entry;
+}
+
+BOOLEAN
+FORCEINLINE
+IsListEmpty(
+  IN CONST LIST_ENTRY * ListHead)
+{
+  return (BOOLEAN)(ListHead->Flink == ListHead);
+}
+
+FORCEINLINE
+PSINGLE_LIST_ENTRY
+PopEntryList(
+  IN OUT PSINGLE_LIST_ENTRY ListHead)
+{
+  PSINGLE_LIST_ENTRY FirstEntry;
+  FirstEntry = ListHead->Next;
+  if (FirstEntry != NULL) {
+    ListHead->Next = FirstEntry->Next;
+  }
+  return FirstEntry;
+}
+
+FORCEINLINE
+VOID
+PushEntryList(
+  IN OUT PSINGLE_LIST_ENTRY ListHead,
+  IN OUT PSINGLE_LIST_ENTRY Entry)
+{
+  Entry->Next = ListHead->Next;
+  ListHead->Next = Entry;
+}
+
+FORCEINLINE
+BOOLEAN
+RemoveEntryList(
+  IN PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldFlink;
+  PLIST_ENTRY OldBlink;
+
+  OldFlink = Entry->Flink;
+  OldBlink = Entry->Blink;
+  OldFlink->Blink = OldBlink;
+  OldBlink->Flink = OldFlink;
+  return (BOOLEAN)(OldFlink == OldBlink);
+}
+
+FORCEINLINE
+PLIST_ENTRY
+RemoveHeadList(
+  IN OUT PLIST_ENTRY  ListHead)
+{
+  PLIST_ENTRY Flink;
+  PLIST_ENTRY Entry;
+
+  Entry = ListHead->Flink;
+  Flink = Entry->Flink;
+  ListHead->Flink = Flink;
+  Flink->Blink = ListHead;
+  return Entry;
+}
+
+FORCEINLINE
+PLIST_ENTRY
+RemoveTailList(
+  IN OUT PLIST_ENTRY  ListHead)
+{
+  PLIST_ENTRY Blink;
+  PLIST_ENTRY Entry;
+
+  Entry = ListHead->Blink;
+  Blink = Entry->Blink;
+  ListHead->Blink = Blink;
+  Blink->Flink = ListHead;
+  return Entry;
+}
+
+NTSYSAPI
+VOID
+NTAPI
+RtlAssert(
+    IN PVOID FailedAssertion,
+    IN PVOID FileName,
+    IN ULONG LineNumber,
+    IN PSTR Message);
+
+/* VOID
+ * RtlCopyMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN CONST VOID UNALIGNED *Source,
+ *     IN SIZE_T Length)
+ */
+#define RtlCopyMemory(Destination, Source, Length) \
+    memcpy(Destination, Source, Length)
+
+#define RtlCopyBytes RtlCopyMemory
+
+#if defined(_M_AMD64)
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyMemoryNonTemporal(
+    VOID UNALIGNED *Destination,
+    CONST VOID UNALIGNED *Source,
+    SIZE_T Length);
+#else
+#define RtlCopyMemoryNonTemporal RtlCopyMemory
+#endif
+
+/* BOOLEAN
+ * RtlEqualLuid(
+ *     IN PLUID Luid1,
+ *     IN PLUID Luid2)
+ */
+#define RtlEqualLuid(Luid1, Luid2) \
+    (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
+
+/* ULONG
+ * RtlEqualMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN CONST VOID UNALIGNED *Source,
+ *     IN SIZE_T Length)
+ */
+#define RtlEqualMemory(Destination, Source, Length) \
+    (!memcmp(Destination, Source, Length))
+
+/* VOID
+ * RtlFillMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN SIZE_T Length,
+ *     IN UCHAR Fill)
+ */
+#define RtlFillMemory(Destination, Length, Fill) \
+    memset(Destination, Fill, Length)
+
+#define RtlFillBytes RtlFillMemory
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFreeUnicodeString(
+    IN OUT PUNICODE_STRING UnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGUIDFromString(
+    IN PUNICODE_STRING GuidString,
+    OUT GUID *Guid);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitUnicodeString(
+    IN OUT PUNICODE_STRING DestinationString,
+    IN PCWSTR SourceString OPTIONAL);
+
+/* VOID
+ * RtlMoveMemory(
+ *    IN VOID UNALIGNED *Destination,
+ *    IN CONST VOID UNALIGNED *Source,
+ *    IN SIZE_T Length)
+ */
+#define RtlMoveMemory(Destination, Source, Length) \
+    memmove(Destination, Source, Length)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlStringFromGUID(
+    IN REFGUID Guid,
+    OUT PUNICODE_STRING GuidString);
+
+/* VOID
+ * RtlZeroMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN SIZE_T Length)
+ */
+#define RtlZeroMemory(Destination, Length) \
+    memset(Destination, 0, Length)
+
+#define RtlZeroBytes RtlZeroMemory
+
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlAreBitsClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG Length);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlAreBitsSet(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG Length);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAnsiStringToUnicodeString(
+    IN OUT PUNICODE_STRING DestinationString,
+    IN PANSI_STRING SourceString,
+    IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxAnsiStringToUnicodeSize(
+    IN PCANSI_STRING AnsiString);
+
+#define RtlAnsiStringToUnicodeSize(String) (               \
+  NLS_MB_CODE_PAGE_TAG ?                                   \
+  RtlxAnsiStringToUnicodeSize(String) :                    \
+  ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
+)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAppendUnicodeStringToString(
+    IN OUT PUNICODE_STRING Destination,
+    IN PCUNICODE_STRING Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAppendUnicodeToString(
+    IN OUT PUNICODE_STRING Destination,
+    IN PCWSTR Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCheckRegistryKey(
+    IN ULONG RelativeTo,
+    IN PWSTR Path);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlClearAllBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlClearBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG NumberToClear);
+
+NTSYSAPI
+SIZE_T
+NTAPI
+RtlCompareMemory(
+    IN CONST VOID *Source1,
+    IN CONST VOID *Source2,
+    IN SIZE_T Length);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareUnicodeString(
+    IN PCUNICODE_STRING String1,
+    IN PCUNICODE_STRING String2,
+    IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareUnicodeStrings(
+    IN PCWCH String1,
+    IN SIZE_T String1Length,
+    IN PCWCH String2,
+    IN SIZE_T String2Length,
+    IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyUnicodeString(
+  IN OUT PUNICODE_STRING  DestinationString,
+  IN PCUNICODE_STRING  SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateRegistryKey(
+    IN ULONG RelativeTo,
+    IN PWSTR Path);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSecurityDescriptor(
+    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+    IN ULONG Revision);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDeleteRegistryValue(
+    IN ULONG RelativeTo,
+    IN PCWSTR Path,
+    IN PCWSTR ValueName);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualUnicodeString(
+    IN CONST UNICODE_STRING *String1,
+    IN CONST UNICODE_STRING *String2,
+    IN BOOLEAN CaseInSensitive);
+
+#if !defined(_AMD64_) && !defined(_IA64_)
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedIntegerMultiply(
+    IN LARGE_INTEGER Multiplicand,
+    IN LONG Multiplier);
+
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedLargeIntegerDivide(
+  IN LARGE_INTEGER Dividend,
+  IN ULONG Divisor,
+  IN OUT PULONG Remainder);
+#endif
+
+#if defined(_X86_) || defined(_IA64_)
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedMagicDivide(
+    IN LARGE_INTEGER Dividend,
+    IN LARGE_INTEGER MagicDivisor,
+    IN CCHAR  ShiftCount);
+#endif
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFreeAnsiString(
+    IN PANSI_STRING AnsiString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindClearBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindClearBitsAndSet(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindFirstRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    OUT PULONG StartingIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindClearRuns(
+    IN PRTL_BITMAP BitMapHeader,
+    OUT PRTL_BITMAP_RUN RunArray,
+    IN ULONG SizeOfRunArray,
+    IN BOOLEAN LocateLongestRuns);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindLastBackwardRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG FromIndex,
+    OUT PULONG StartingRunIndex);
+
+NTSYSAPI
+CCHAR
+NTAPI
+RtlFindLeastSignificantBit(
+    IN ULONGLONG Set);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindLongestRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    OUT PULONG StartingIndex);
+
+NTSYSAPI
+CCHAR
+NTAPI
+RtlFindMostSignificantBit(
+    IN ULONGLONG Set);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindNextForwardRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG FromIndex,
+    OUT PULONG StartingRunIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindSetBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindSetBitsAndClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlHashUnicodeString(
+    IN CONST UNICODE_STRING *String,
+    IN BOOLEAN CaseInSensitive,
+    IN ULONG HashAlgorithm,
+    OUT PULONG HashValue);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitAnsiString(
+    IN OUT PANSI_STRING DestinationString,
+    IN PCSZ SourceString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeBitMap(
+    IN PRTL_BITMAP BitMapHeader,
+    IN PULONG BitMapBuffer,
+    IN ULONG SizeOfBitMap);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitString(
+    IN OUT PSTRING DestinationString,
+    IN PCSZ SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIntegerToUnicodeString(
+    IN ULONG Value,
+    IN ULONG Base OPTIONAL,
+    IN OUT PUNICODE_STRING String);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInt64ToUnicodeString(
+    IN ULONGLONG Value,
+    IN ULONG Base OPTIONAL,
+    IN OUT PUNICODE_STRING String);
+
+#ifdef _WIN64
+#define RtlIntPtrToUnicodeString(Value, Base, String) \
+    RtlInt64ToUnicodeString(Value, Base, String)
+#else
+#define RtlIntPtrToUnicodeString(Value, Base, String) \
+    RtlIntegerToUnicodeString(Value, Base, String)
+#endif
+
+/* BOOLEAN
+ * RtlIsZeroLuid(
+ *     IN PLUID L1);
+ */
+#define RtlIsZeroLuid(_L1) \
+    ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberOfClearBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberOfSetBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlQueryRegistryValues(
+    IN ULONG RelativeTo,
+    IN PCWSTR Path,
+    IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
+    IN PVOID Context,
+    IN PVOID Environment OPTIONAL);
+
+#define LONG_SIZE (sizeof(LONG))
+#define LONG_MASK (LONG_SIZE - 1)
+
+/* VOID
+ * RtlRetrieveUlong(
+ *       PULONG DestinationAddress,
+ *       PULONG SourceAddress);
+ */
+#if defined(_AMD64_)
+#define RtlRetrieveUlong(DestAddress,SrcAddress) \
+    *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
+#else
+#define RtlRetrieveUlong(DestAddress,SrcAddress) \
+    if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
+    { \
+        ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
+        ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
+        ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
+        ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
+    } \
+    else \
+    { \
+        *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
+    }
+#endif
+
+/* VOID
+ * RtlRetrieveUshort(
+ *       PUSHORT DestinationAddress,
+ *       PUSHORT SourceAddress);
+ */
+#if defined(_AMD64_)
+#define RtlRetrieveUshort(DestAddress,SrcAddress) \
+    *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
+#else
+#define RtlRetrieveUshort(DestAddress,SrcAddress) \
+    if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
+    { \
+        ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
+        ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
+    } \
+    else \
+    { \
+        *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
+    }
+#endif
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSetAllBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSetBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG NumberToSet);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetDaclSecurityDescriptor(
+    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+    IN BOOLEAN DaclPresent,
+    IN PACL Dacl OPTIONAL,
+    IN BOOLEAN DaclDefaulted OPTIONAL);
+
+/* VOID
+ * RtlStoreUlong(
+ *     IN PULONG Address,
+ *     IN ULONG Value);
+ */
+#if defined(_AMD64_)
+#define RtlStoreUlong(Address,Value) \
+    *(ULONG UNALIGNED *)(Address) = (Value)
+#else
+#define RtlStoreUlong(Address,Value)                      \
+    if ((ULONG_PTR)(Address) & LONG_MASK) { \
+        ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT]    = (UCHAR)(FIRSTBYTE(Value)); \
+        ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
+        ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
+        ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT]     = (UCHAR)(FOURTHBYTE(Value)); \
+    } \
+    else { \
+        *((PULONG)(Address)) = (ULONG) (Value); \
+    }
+#endif
+
+/* VOID
+ * RtlStoreUlonglong(
+ *     IN OUT PULONGLONG Address,
+ *     ULONGLONG Value);
+ */
+#if defined(_AMD64_)
+#define RtlStoreUlonglong(Address,Value) \
+    *(ULONGLONG UNALIGNED *)(Address) = (Value)
+#else
+#define RtlStoreUlonglong(Address,Value) \
+    if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
+        RtlStoreUlong((ULONG_PTR)(Address), \
+                      (ULONGLONG)(Value) & 0xFFFFFFFF); \
+        RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
+                      (ULONGLONG)(Value) >> 32); \
+    } else { \
+        *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
+    }
+#endif
+
+/* VOID
+ * RtlStoreUlongPtr(
+ *     IN OUT PULONG_PTR Address,
+ *     IN ULONG_PTR Value);
+ */
+#ifdef _WIN64
+#define RtlStoreUlongPtr(Address,Value)                         \
+    RtlStoreUlonglong(Address,Value)
+#else
+#define RtlStoreUlongPtr(Address,Value)                         \
+    RtlStoreUlong(Address,Value)
+#endif
+
+/* VOID
+ * RtlStoreUshort(
+ *     IN PUSHORT Address,
+ *     IN USHORT Value);
+ */
+#if defined(_AMD64_)
+#define RtlStoreUshort(Address,Value) \
+    *(USHORT UNALIGNED *)(Address) = (Value)
+#else
+#define RtlStoreUshort(Address,Value) \
+    if ((ULONG_PTR)(Address) & SHORT_MASK) { \
+        ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
+        ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
+    } \
+    else { \
+        *((PUSHORT) (Address)) = (USHORT)Value; \
+    }
+#endif
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeFieldsToTime(
+    IN PTIME_FIELDS TimeFields,
+    IN PLARGE_INTEGER Time);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlTimeToTimeFields(
+    IN PLARGE_INTEGER Time,
+    IN PTIME_FIELDS TimeFields);
+
+NTSYSAPI
+ULONG
+FASTCALL
+RtlUlongByteSwap(
+    IN ULONG Source);
+
+NTSYSAPI
+ULONGLONG
+FASTCALL
+RtlUlonglongByteSwap(
+    IN ULONGLONG Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToAnsiString(
+    IN OUT PANSI_STRING DestinationString,
+    IN PCUNICODE_STRING SourceString,
+    IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxUnicodeStringToAnsiSize(
+    IN PCUNICODE_STRING UnicodeString);
+
+#define RtlUnicodeStringToAnsiSize(String) (                  \
+    NLS_MB_CODE_PAGE_TAG ?                                    \
+    RtlxUnicodeStringToAnsiSize(String) :                     \
+    ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToInteger(
+    IN PCUNICODE_STRING String,
+    IN ULONG Base OPTIONAL,
+    OUT PULONG Value);
+
+NTSYSAPI
+WCHAR
+NTAPI
+RtlUpcaseUnicodeChar(
+    IN WCHAR SourceCharacter);
+
+NTSYSAPI
+USHORT
+FASTCALL
+RtlUshortByteSwap(
+    IN USHORT Source);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlValidRelativeSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
+    IN ULONG SecurityDescriptorLength,
+    IN SECURITY_INFORMATION RequiredInformation);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlValidSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlWriteRegistryValue(
+    IN ULONG RelativeTo,
+    IN PCWSTR Path,
+    IN PCWSTR ValueName,
+    IN ULONG ValueType,
+    IN PVOID ValueData,
+    IN ULONG ValueLength);
+
+#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
+NTSYSAPI
+VOID
+FASTCALL
+RtlPrefetchMemoryNonTemporal(
+    IN PVOID Source,
+    IN SIZE_T Length);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTSYSAPI
+VOID
+NTAPI
+RtlClearBit(
+    PRTL_BITMAP BitMapHeader,
+    ULONG BitNumber);
+
+NTSYSAPI
+WCHAR
+NTAPI
+RtlDowncaseUnicodeChar(
+    IN WCHAR SourceCharacter);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSetBit(
+    PRTL_BITMAP BitMapHeader,
+    ULONG BitNumber);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTestBit(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG BitNumber);
+
+#endif // (NTDDI_VERSION >= NTDDI_WINXP)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberOfSetBitsUlongPtr(
+    IN ULONG_PTR Target);
+
+NTSYSAPI
+ULONGLONG
+NTAPI
+RtlIoDecodeMemIoResource (
+    IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
+    OUT PULONGLONG Alignment OPTIONAL,
+    OUT PULONGLONG MinimumAddress OPTIONAL,
+    OUT PULONGLONG MaximumAddress OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIoEncodeMemIoResource(
+    IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
+    IN UCHAR Type,
+    IN ULONGLONG Length,
+    IN ULONGLONG Alignment,
+    IN ULONGLONG MinimumAddress,
+    IN ULONGLONG MaximumAddress);
+
+NTSYSAPI
+ULONGLONG
+NTAPI
+RtlCmDecodeMemIoResource(
+    IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
+    OUT PULONGLONG Start OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlFindClosestEncodableLength(
+    IN ULONGLONG SourceLength,
+    OUT PULONGLONG TargetLength);
+
+#endif
+
+#if !defined(MIDL_PASS)
+/* inline funftions */
+//DECLSPEC_DEPRECATED_DDK_WINXP
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlConvertLongToLargeInteger(LONG SignedInteger)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = SignedInteger;
+    return ret;
+}
+
+//DECLSPEC_DEPRECATED_DDK_WINXP
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlConvertUlongToLargeInteger(
+  ULONG UnsignedInteger)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = UnsignedInteger;
+    return ret;
+}
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+ULONG
+NTAPI_INLINE
+RtlEnlargedUnsignedDivide(
+    IN ULARGE_INTEGER Dividend,
+    IN ULONG Divisor,
+    IN OUT PULONG Remainder)
+{
+    if (Remainder)
+        *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+    return (ULONG)(Dividend.QuadPart / Divisor);
+}
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlEnlargedUnsignedMultiply(
+    IN ULONG Multiplicand,
+    IN ULONG Multiplier)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+    return ret;
+}
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlEnlargedIntegerMultiply(
+    IN LONG Multiplicand,
+    IN LONG Multiplier)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+    return ret;
+}
+
+FORCEINLINE
+VOID
+RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
+                       IN PCHAR Buffer,
+                       IN USHORT BufferSize)
+{
+    AnsiString->Length = 0;
+    AnsiString->MaximumLength = BufferSize;
+    AnsiString->Buffer = Buffer;
+}
+
+FORCEINLINE
+VOID
+RtlInitEmptyUnicodeString(
+    OUT PUNICODE_STRING UnicodeString,
+    IN PWSTR Buffer,
+    IN USHORT BufferSize)
+{
+    UnicodeString->Length = 0;
+    UnicodeString->MaximumLength = BufferSize;
+    UnicodeString->Buffer = Buffer;
+}
+
+#if defined(_AMD64_) || defined(_IA64_)
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlExtendedIntegerMultiply(
+    LARGE_INTEGER Multiplicand,
+    LONG Multiplier)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = Multiplicand.QuadPart * Multiplier;
+    return ret;
+}
+
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlExtendedLargeIntegerDivide(
+    LARGE_INTEGER Dividend,
+    ULONG Divisor,
+    PULONG Remainder)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
+    if (Remainder)
+        *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+    return ret;
+}
+#endif
+
+#if defined(_AMD64_)
+
+#define MultiplyHigh __mulh
+#define UnsignedMultiplyHigh __umulh
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlExtendedMagicDivide(
+    IN LARGE_INTEGER Dividend,
+    IN LARGE_INTEGER MagicDivisor,
+    IN CCHAR ShiftCount)
+{
+    LARGE_INTEGER ret;
+    ULONG64 ret64;
+    BOOLEAN Pos;
+    Pos = (Dividend.QuadPart >= 0);
+    ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
+                                 MagicDivisor.QuadPart);
+    ret64 >>= ShiftCount;
+    ret.QuadPart = Pos ? ret64 : -ret64;
+    return ret;
+}
+#endif
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlLargeIntegerAdd(
+    IN LARGE_INTEGER Addend1,
+    IN LARGE_INTEGER Addend2)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
+    return ret;
+}
+
+/* VOID
+ * RtlLargeIntegerAnd(
+ *     IN OUT LARGE_INTEGER Result,
+ *     IN LARGE_INTEGER Source,
+ *     IN LARGE_INTEGER Mask);
+ */
+#define RtlLargeIntegerAnd(Result, Source, Mask) \
+    Result.QuadPart = Source.QuadPart & Mask.QuadPart
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlLargeIntegerArithmeticShift(
+    IN LARGE_INTEGER LargeInteger,
+    IN CCHAR ShiftCount)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
+    return ret;
+}
+
+/* BOOLEAN
+ * RtlLargeIntegerEqualTo(
+ *     IN LARGE_INTEGER  Operand1,
+ *     IN LARGE_INTEGER  Operand2);
+ */
+#define RtlLargeIntegerEqualTo(X,Y) \
+    (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
+
+FORCEINLINE
+PVOID
+RtlSecureZeroMemory(
+    OUT PVOID Pointer,
+    IN SIZE_T Size)
+{
+    volatile char* vptr = (volatile char*)Pointer;
+#if defined(_M_AMD64)
+    __stosb((PUCHAR)vptr, 0, Size);
+#else
+    char * endptr = (char *)vptr + Size;
+    while (vptr < endptr)
+    {
+        *vptr = 0; vptr++;
+    }
+#endif
+     return Pointer;
+}
+
+#if defined(_M_AMD64)
+FORCEINLINE
+ULONG
+RtlCheckBit(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG BitPosition)
+{
+    return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
+}
+#else
+#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
+#endif // defined(_M_AMD64)
+
+#endif // !defined(MIDL_PASS)
+
+/* Byte Swap Functions */
+#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
+    ((defined(_M_AMD64) || defined(_M_IA64)) \
+        && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
+
+#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
+#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
+#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
+
+#endif
+
+#if DBG
+
+#define ASSERT(exp) \
+  (VOID)((!(exp)) ? \
+    RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
+
+#define ASSERTMSG(msg, exp) \
+  (VOID)((!(exp)) ? \
+    RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
+
+#define RTL_SOFT_ASSERT(exp) \
+  (VOID)((!(exp)) ? \
+    DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
+
+#define RTL_SOFT_ASSERTMSG(msg, exp) \
+  (VOID)((!(exp)) ? \
+    DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
+
+#define RTL_VERIFY(exp) ASSERT(exp)
+#define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
+
+#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
+#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
+
+#if defined(_MSC_VER)
+
+#define NT_ASSERT(exp) \
+   ((!(exp)) ? \
+      (__annotation(L"Debug", L"AssertFail", L#exp), \
+       DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#define NT_ASSERTMSG(msg, exp) \
+   ((!(exp)) ? \
+      (__annotation(L"Debug", L"AssertFail", L##msg), \
+      DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#define NT_ASSERTMSGW(msg, exp) \
+    ((!(exp)) ? \
+        (__annotation(L"Debug", L"AssertFail", msg), \
+         DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#else
+
+/* GCC doesn't support __annotation (nor PDB) */
+#define NT_ASSERT(exp) \
+   (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#define NT_ASSERTMSG NT_ASSERT
+#define NT_ASSERTMSGW NT_ASSERT
+
+#endif
+
+#else /* !DBG */
+
+#define ASSERT(exp) ((VOID) 0)
+#define ASSERTMSG(msg, exp) ((VOID) 0)
+
+#define RTL_SOFT_ASSERT(exp) ((VOID) 0)
+#define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
+
+#define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
+#define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
+
+#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
+#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
+
+#define NT_ASSERT(exp)     ((VOID)0)
+#define NT_ASSERTMSG(exp)  ((VOID)0)
+#define NT_ASSERTMSGW(exp) ((VOID)0)
+
+#endif /* DBG */
+
+#if !defined(_WINBASE_)
+
+#if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
+
+NTKERNELAPI
+VOID
+InitializeSListHead(
+  OUT PSLIST_HEADER SListHead);
+
+#else
+
+VOID
+FORCEINLINE
+InitializeSListHead(
+  OUT PSLIST_HEADER SListHead)
+{
+#if defined(_IA64_)
+    ULONG64 FeatureBits;
+#endif
+
+#if defined(_WIN64)
+    if (((ULONG_PTR)SListHead & 0xf) != 0)
+    {
+        RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
+    }
+#endif
+
+    RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
+
+#if defined(_IA64_)
+    FeatureBits = __getReg(CV_IA64_CPUID4);
+    if ((FeatureBits & KF_16BYTE_INSTR) != 0)
+    {
+        SListHead->Header16.HeaderType = 1;
+        SListHead->Header16.Init = 1;
+    }
+#endif
+}
+
+#endif
+
+#if defined(_WIN64)
+
+#define InterlockedPopEntrySList(Head) \
+    ExpInterlockedPopEntrySList(Head)
+
+#define InterlockedPushEntrySList(Head, Entry) \
+    ExpInterlockedPushEntrySList(Head, Entry)
+
+#define InterlockedFlushSList(Head) \
+    ExpInterlockedFlushSList(Head)
+
+#define QueryDepthSList(Head) \
+    ExQueryDepthSList(Head)
+
+#else /* !defined(_WIN64) */
+
+NTKERNELAPI
+PSLIST_ENTRY
+FASTCALL
+InterlockedPopEntrySList(
+    IN PSLIST_HEADER ListHead);
+
+NTKERNELAPI
+PSLIST_ENTRY
+FASTCALL
+InterlockedPushEntrySList(
+    IN PSLIST_HEADER ListHead,
+    IN PSLIST_ENTRY ListEntry);
+
+#define InterlockedFlushSList(ListHead) \
+    ExInterlockedFlushSList(ListHead)
+
+#define QueryDepthSList(Head) \
+    ExQueryDepthSList(Head)
+
+#endif /* !defined(_WIN64) */
+
+#endif /* !defined(_WINBASE_) */
+
+/******************************************************************************
+ *                              Kernel Functions                              *
+ ******************************************************************************/
+
+NTHALAPI
+KIRQL
+NTAPI
+KeGetCurrentIrql(
+    VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeEvent(
+  OUT PRKEVENT  Event,
+  IN EVENT_TYPE  Type,
+  IN BOOLEAN  State);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeClearEvent(
+  IN OUT PRKEVENT Event);
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+VOID
+NTAPI
+ProbeForRead(
+  IN CONST VOID *Address, /* CONST is added */
+  IN SIZE_T Length,
+  IN ULONG Alignment);
+
+NTKERNELAPI
+VOID
+NTAPI
+ProbeForWrite(
+  IN PVOID Address,
+  IN SIZE_T Length,
+  IN ULONG Alignment);
+
+#if defined(SINGLE_GROUP_LEGACY_API)
+NTKERNELAPI
+VOID
+NTAPI
+KeRevertToUserAffinityThread(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetSystemAffinityThread(
+    IN KAFFINITY Affinity);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetTargetProcessorDpc(
+  IN OUT PRKDPC Dpc,
+  IN CCHAR Number);
+
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeQueryActiveProcessors(
+  VOID);
+#endif
+
+#if !defined(_M_AMD64)
+NTKERNELAPI
+ULONGLONG
+NTAPI
+KeQueryInterruptTime(
+  VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeQuerySystemTime(
+  OUT PLARGE_INTEGER  CurrentTime);
+#endif /* !_M_AMD64 */
+
+#if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeSpinLock(
+    IN PKSPIN_LOCK SpinLock);
+#else
+FORCEINLINE
+VOID
+KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
+{
+    /* Clear the lock */
+    *SpinLock = 0;
+}
+#endif
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+KeBugCheckEx(
+  IN ULONG  BugCheckCode,
+  IN ULONG_PTR  BugCheckParameter1,
+  IN ULONG_PTR  BugCheckParameter2,
+  IN ULONG_PTR  BugCheckParameter3,
+  IN ULONG_PTR  BugCheckParameter4);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeCancelTimer(
+  IN OUT PKTIMER);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeDelayExecutionThread(
+  IN KPROCESSOR_MODE WaitMode,
+  IN BOOLEAN Alertable,
+  IN PLARGE_INTEGER Interval);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeDeregisterBugCheckCallback(
+  IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeEnterCriticalRegion(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeDeviceQueue(
+  OUT PKDEVICE_QUEUE  DeviceQueue);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeDpc(
+  OUT PRKDPC  Dpc,
+  IN PKDEFERRED_ROUTINE  DeferredRoutine,
+  IN PVOID  DeferredContext OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeMutex(
+  OUT PRKMUTEX  Mutex,
+  IN ULONG  Level);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeSemaphore(
+  OUT PRKSEMAPHORE  Semaphore,
+  IN LONG  Count,
+  IN LONG  Limit);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeTimer(
+  OUT PKTIMER  Timer);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeTimerEx(
+  OUT PKTIMER  Timer,
+  IN TIMER_TYPE  Type);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeInsertByKeyDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN OUT PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry,
+  IN ULONG  SortKey);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeInsertDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN OUT PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeInsertQueueDpc(
+  IN OUT PRKDPC  Dpc,
+  IN PVOID  SystemArgument1 OPTIONAL,
+  IN PVOID  SystemArgument2 OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeLeaveCriticalRegion(VOID);
+
+NTHALAPI
+LARGE_INTEGER
+NTAPI
+KeQueryPerformanceCounter(
+  OUT PLARGE_INTEGER  PerformanceFrequency  OPTIONAL);
+
+NTKERNELAPI
+KPRIORITY
+NTAPI
+KeQueryPriorityThread(
+  IN PRKTHREAD  Thread);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryTimeIncrement(
+  VOID);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateEvent(
+  IN PRKEVENT  Event);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateMutex(
+  IN PRKMUTEX  Mutex);
+
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateSemaphore(
+  IN PRKSEMAPHORE  Semaphore);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeReadStateTimer(
+  IN PKTIMER  Timer);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRegisterBugCheckCallback(
+  OUT PKBUGCHECK_CALLBACK_RECORD  CallbackRecord,
+  IN PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine,
+  IN PVOID  Buffer,
+  IN ULONG  Length,
+  IN PUCHAR  Component);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReleaseMutex(
+  IN OUT PRKMUTEX  Mutex,
+  IN BOOLEAN  Wait);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReleaseSemaphore(
+  IN OUT PRKSEMAPHORE  Semaphore,
+  IN KPRIORITY  Increment,
+  IN LONG  Adjustment,
+  IN BOOLEAN  Wait);
+
+NTKERNELAPI
+PKDEVICE_QUEUE_ENTRY
+NTAPI
+KeRemoveByKeyDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN ULONG  SortKey);
+
+NTKERNELAPI
+PKDEVICE_QUEUE_ENTRY
+NTAPI
+KeRemoveDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRemoveEntryDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN OUT PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRemoveQueueDpc(
+  IN OUT PRKDPC  Dpc);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeResetEvent(
+  IN OUT PRKEVENT  Event);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeSetEvent(
+  IN OUT PRKEVENT  Event,
+  IN KPRIORITY  Increment,
+  IN BOOLEAN  Wait);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetImportanceDpc(
+  IN OUT PRKDPC  Dpc,
+  IN KDPC_IMPORTANCE  Importance);
+
+NTKERNELAPI
+KPRIORITY
+NTAPI
+KeSetPriorityThread(
+  IN OUT PKTHREAD  Thread,
+  IN KPRIORITY  Priority);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSetTimer(
+  IN OUT PKTIMER  Timer,
+  IN LARGE_INTEGER  DueTime,
+  IN PKDPC  Dpc  OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSetTimerEx(
+  IN OUT PKTIMER  Timer,
+  IN LARGE_INTEGER  DueTime,
+  IN LONG  Period  OPTIONAL,
+  IN PKDPC  Dpc  OPTIONAL);
+
+NTHALAPI
+VOID
+NTAPI
+KeStallExecutionProcessor(
+  IN ULONG  MicroSeconds);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSynchronizeExecution(
+  IN OUT PKINTERRUPT    Interrupt,
+  IN PKSYNCHRONIZE_ROUTINE  SynchronizeRoutine,
+  IN PVOID  SynchronizeContext OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeWaitForMultipleObjects(
+  IN ULONG  Count,
+  IN PVOID  Object[],
+  IN WAIT_TYPE  WaitType,
+  IN KWAIT_REASON  WaitReason,
+  IN KPROCESSOR_MODE  WaitMode,
+  IN BOOLEAN  Alertable,
+  IN PLARGE_INTEGER  Timeout  OPTIONAL,
+  OUT PKWAIT_BLOCK  WaitBlockArray  OPTIONAL);
+
+#define KeWaitForMutexObject KeWaitForSingleObject
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeWaitForSingleObject(
+  IN PVOID  Object,
+  IN KWAIT_REASON  WaitReason,
+  IN KPROCESSOR_MODE  WaitMode,
+  IN BOOLEAN  Alertable,
+  IN PLARGE_INTEGER  Timeout  OPTIONAL);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+_DECL_HAL_KE_IMPORT
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLock(
+  IN OUT PKSPIN_LOCK SpinLock,
+  OUT PKLOCK_QUEUE_HANDLE LockHandle);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLockAtDpcLevel(
+  IN OUT PKSPIN_LOCK  SpinLock,
+  OUT PKLOCK_QUEUE_HANDLE  LockHandle);
+
+NTKERNELAPI
+KIRQL
+NTAPI
+KeAcquireInterruptSpinLock(
+  IN OUT PKINTERRUPT  Interrupt);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeAreApcsDisabled(VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeGetRecommendedSharedDataAlignment(VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryRuntimeThread(
+  IN PKTHREAD Thread,
+  OUT PULONG UserTime);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLockFromDpcLevel(
+  IN PKLOCK_QUEUE_HANDLE  LockHandle);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeReleaseInterruptSpinLock(
+  IN OUT PKINTERRUPT  Interrupt,
+  IN KIRQL  OldIrql);
+
+NTKERNELAPI
+PKDEVICE_QUEUE_ENTRY
+NTAPI
+KeRemoveByKeyDeviceQueueIfBusy(
+  IN OUT PKDEVICE_QUEUE DeviceQueue,
+  IN ULONG SortKey);
+
+_DECL_HAL_KE_IMPORT
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLock(
+  IN PKLOCK_QUEUE_HANDLE LockHandle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP1)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeDeregisterBugCheckReasonCallback(
+  IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRegisterBugCheckReasonCallback(
+  OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
+  IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
+  IN KBUGCHECK_CALLBACK_REASON Reason,
+  IN PUCHAR Component);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+
+NTKERNELAPI
+VOID
+NTAPI
+KeFlushQueuedDpcs(
+  VOID);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+
+NTKERNELAPI
+PVOID
+NTAPI
+KeRegisterNmiCallback(
+  IN PNMI_CALLBACK CallbackRoutine,
+  IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeDeregisterNmiCallback(
+  IN PVOID Handle);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeThreadedDpc(
+  OUT PRKDPC Dpc,
+  IN PKDEFERRED_ROUTINE DeferredRoutine,
+  IN PVOID DeferredContext OPTIONAL);
+
+NTKERNELAPI
+ULONG_PTR
+NTAPI
+KeIpiGenericCall(
+  IN PKIPI_BROADCAST_WORKER BroadcastFunction,
+  IN ULONG_PTR Context);
+
+NTKERNELAPI
+KIRQL
+FASTCALL
+KeAcquireSpinLockForDpc(
+  IN OUT PKSPIN_LOCK SpinLock);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseSpinLockForDpc(
+  IN OUT PKSPIN_LOCK SpinLock,
+  IN KIRQL OldIrql);
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+KeTestSpinLock(
+  IN PKSPIN_LOCK SpinLock);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+KeTryToAcquireSpinLockAtDpcLevel(
+  IN OUT PKSPIN_LOCK SpinLock);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeAreAllApcsDisabled(
+  VOID);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireGuardedMutex(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireGuardedMutexUnsafe(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeEnterGuardedRegion(
+    VOID
+);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeLeaveGuardedRegion(
+    VOID
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeInitializeGuardedMutex(
+    OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseGuardedMutexUnsafe(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseGuardedMutex(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+KeTryToAcquireGuardedMutex(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLockForDpc(
+  IN OUT PKSPIN_LOCK SpinLock,
+  OUT PKLOCK_QUEUE_HANDLE LockHandle);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLockForDpc(
+  IN PKLOCK_QUEUE_HANDLE LockHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryDpcWatchdogInformation(
+  OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
+
+#if defined(SINGLE_GROUP_LEGACY_API)
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeSetSystemAffinityThreadEx(
+  IN KAFFINITY Affinity);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCount(
+  OUT PKAFFINITY ActiveProcessors OPTIONAL);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCount(
+  VOID);
+#endif
+
+#endif /*  (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WS08)
+
+PVOID
+KeRegisterProcessorChangeCallback(
+  IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
+  IN PVOID CallbackContext OPTIONAL,
+  IN ULONG Flags);
+
+VOID
+KeDeregisterProcessorChangeCallback(
+  IN PVOID CallbackHandle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS08) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+ULONG64
+NTAPI
+KeQueryTotalCycleTimeProcess(
+  IN OUT PKPROCESS Process,
+  OUT PULONG64 CycleTimeStamp);
+
+ULONG64
+NTAPI
+KeQueryTotalCycleTimeThread(
+  IN OUT PKTHREAD Thread,
+  OUT PULONG64 CycleTimeStamp);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSetTargetProcessorDpcEx(
+  IN OUT PKDPC Dpc,
+  IN PPROCESSOR_NUMBER ProcNumber);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetSystemGroupAffinityThread(
+  IN PGROUP_AFFINITY Affinity,
+  OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeRevertToUserGroupAffinityThread(
+  IN PGROUP_AFFINITY PreviousAffinity);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSetCoalescableTimer(
+  IN OUT PKTIMER Timer,
+  IN LARGE_INTEGER DueTime,
+  IN ULONG Period,
+  IN ULONG TolerableDelay,
+  IN PKDPC Dpc OPTIONAL);
+
+NTKERNELAPI
+ULONGLONG
+NTAPI
+KeQueryUnbiasedInterruptTime(
+  VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCountEx(
+  IN USHORT GroupNumber);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCountEx(
+  IN USHORT GroupNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryActiveGroupCount(
+  VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryMaximumGroupCount(
+  VOID);
+
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeQueryGroupAffinity 
+  IN USHORT GroupNumber);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeGetCurrentProcessorNumberEx(
+  OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeQueryNodeActiveAffinity(
+  IN USHORT NodeNumber,
+  OUT PGROUP_AFFINITY Affinity OPTIONAL,
+  OUT PUSHORT Count OPTIONAL);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryNodeMaximumProcessorCount(
+  IN USHORT NodeNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryHighestNodeNumber(
+  VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeGetCurrentNodeNumber(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryLogicalProcessorRelationship(
+  IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
+  IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
+  OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
+  IN OUT PULONG Length);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSaveExtendedProcessorState(
+  IN ULONG64 Mask,
+  OUT PXSTATE_SAVE XStateSave);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeRestoreExtendedProcessorState(
+  IN PXSTATE_SAVE XStateSave);
+
+#endif /*  (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#if !defined(_IA64_)
+NTHALAPI
+VOID
+NTAPI
+KeFlushWriteBuffer(VOID);
+#endif
+
+/* VOID
+ * KeInitializeCallbackRecord(
+ *   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
+ */
+#define KeInitializeCallbackRecord(CallbackRecord) \
+  CallbackRecord->State = BufferEmpty;
+
+#if DBG
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define PAGED_ASSERT( exp ) NT_ASSERT( exp )
+#else
+#define PAGED_ASSERT( exp ) ASSERT( exp )
+#endif
+
+#define PAGED_CODE() { \
+  if (KeGetCurrentIrql() > APC_LEVEL) { \
+    KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
+    PAGED_ASSERT(FALSE); \
+  } \
+}
+
+#else
+
+#define PAGED_CODE()
+
+#endif
+
+#define PAGED_CODE_LOCKED() NOP_FUNCTION;
+
+/******************************************************************************
+ *                       Memory manager Functions                             *
+ ******************************************************************************/
+
+/*
+ * Alignment Macros
+ */
+#define ALIGN_DOWN_BY(size, align) \
+    ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
+
+#define ALIGN_UP_BY(size, align) \
+    (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
+
+#define ALIGN_DOWN_POINTER_BY(ptr, align) \
+    ((PVOID)ALIGN_DOWN_BY(ptr, align))
+
+#define ALIGN_UP_POINTER_BY(ptr, align) \
+    ((PVOID)ALIGN_UP_BY(ptr, align))
+
+#define ALIGN_DOWN(size, type) \
+    ALIGN_DOWN_BY(size, sizeof(type))
+
+#define ALIGN_UP(size, type) \
+    ALIGN_UP_BY(size, sizeof(type))
+
+#define ALIGN_DOWN_POINTER(ptr, type) \
+    ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
+
+#define ALIGN_UP_POINTER(ptr, type) \
+    ALIGN_UP_POINTER_BY(ptr, sizeof(type))
+
+/* ULONG
+ * BYTE_OFFSET(
+ *   IN PVOID Va)
+ */
+#define BYTE_OFFSET(Va) \
+  ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
+
+/* ULONG
+ * BYTES_TO_PAGES(
+ *   IN ULONG Size)
+ */
+#define BYTES_TO_PAGES(Size) \
+  (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
+
+/* PVOID
+ * PAGE_ALIGN(
+ *   IN PVOID Va)
+ */
+#define PAGE_ALIGN(Va) \
+  ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
+
+/* ULONG_PTR
+ * ROUND_TO_PAGES(
+ *   IN ULONG_PTR Size)
+ */
+#define ROUND_TO_PAGES(Size) \
+  (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
+
+/* ULONG
+ * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
+ *   IN PVOID Va,
+ *   IN ULONG Size)
+ */
+#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
+  ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
+    + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
+
+/*
+ * ULONG
+ * MmGetMdlByteCount(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlByteCount(_Mdl) \
+  ((_Mdl)->ByteCount)
+
+/*
+ * ULONG
+ * MmGetMdlByteOffset(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlByteOffset(_Mdl) \
+  ((_Mdl)->ByteOffset)
+
+/*
+ * PPFN_NUMBER
+ * MmGetMdlPfnArray(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlPfnArray(_Mdl) \
+  ((PPFN_NUMBER) ((_Mdl) + 1))
+
+/*
+ * PVOID
+ * MmGetMdlVirtualAddress(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlVirtualAddress(_Mdl) \
+  ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
+
+#define MmGetProcedureAddress(Address) (Address)
+
+/* PVOID MmGetSystemAddressForMdl(
+ *     IN PMDL Mdl);
+ */
+#define MmGetSystemAddressForMdl(Mdl) \
+  (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
+    MDL_SOURCE_IS_NONPAGED_POOL)) ? \
+      ((Mdl)->MappedSystemVa) : \
+      (MmMapLockedPages((Mdl), KernelMode)))
+
+/* PVOID
+ * MmGetSystemAddressForMdlSafe(
+ *     IN PMDL Mdl,
+ *     IN MM_PAGE_PRIORITY Priority)
+ */
+#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
+  (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
+    | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
+    (_Mdl)->MappedSystemVa : \
+    (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
+      KernelMode, MmCached, NULL, FALSE, (_Priority)))
+
+/*
+ * VOID
+ * MmInitializeMdl(
+ *   IN PMDL  MemoryDescriptorList,
+ *   IN PVOID  BaseVa,
+ *   IN SIZE_T  Length)
+ */
+#define MmInitializeMdl(_MemoryDescriptorList, \
+                        _BaseVa, \
+                        _Length) \
+{ \
+  (_MemoryDescriptorList)->Next = (PMDL) NULL; \
+  (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
+    (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
+  (_MemoryDescriptorList)->MdlFlags = 0; \
+  (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
+  (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
+  (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
+}
+
+/*
+ * VOID
+ * MmPrepareMdlForReuse(
+ *   IN PMDL  Mdl)
+ */
+#define MmPrepareMdlForReuse(_Mdl) \
+{ \
+  if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
+    ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
+    MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
+  } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
+    ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
+  } \
+}
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemory(
+  IN SIZE_T  NumberOfBytes,
+  IN PHYSICAL_ADDRESS  HighestAcceptableAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemorySpecifyCache(
+  IN SIZE_T  NumberOfBytes,
+  IN PHYSICAL_ADDRESS  LowestAcceptableAddress,
+  IN PHYSICAL_ADDRESS  HighestAcceptableAddress,
+  IN PHYSICAL_ADDRESS  BoundaryAddressMultiple  OPTIONAL,
+  IN MEMORY_CACHING_TYPE  CacheType);
+
+NTKERNELAPI
+PMDL
+NTAPI
+MmAllocatePagesForMdl(
+  IN PHYSICAL_ADDRESS  LowAddress,
+  IN PHYSICAL_ADDRESS  HighAddress,
+  IN PHYSICAL_ADDRESS  SkipBytes,
+  IN SIZE_T  TotalBytes);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmBuildMdlForNonPagedPool(
+  IN OUT PMDLX  MemoryDescriptorList);
+
+//DECLSPEC_DEPRECATED_DDK
+NTKERNELAPI
+PMDL
+NTAPI
+MmCreateMdl(
+  IN PMDL  MemoryDescriptorList  OPTIONAL,
+  IN PVOID  Base,
+  IN SIZE_T  Length);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemory(
+  IN PVOID  BaseAddress);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemorySpecifyCache(
+  IN PVOID  BaseAddress,
+  IN SIZE_T  NumberOfBytes,
+  IN MEMORY_CACHING_TYPE  CacheType);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreePagesFromMdl(
+  IN PMDLX MemoryDescriptorList);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmGetSystemRoutineAddress(
+  IN PUNICODE_STRING  SystemRoutineName);
+
+NTKERNELAPI
+LOGICAL
+NTAPI
+MmIsDriverVerifying(
+  IN struct _DRIVER_OBJECT *DriverObject);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmLockPagableDataSection(
+  IN PVOID  AddressWithinSection);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapIoSpace(
+  IN PHYSICAL_ADDRESS  PhysicalAddress,
+  IN SIZE_T  NumberOfBytes,
+  IN MEMORY_CACHING_TYPE  CacheEnable);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapLockedPages(
+  IN PMDL  MemoryDescriptorList,
+  IN KPROCESSOR_MODE  AccessMode);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapLockedPagesSpecifyCache(
+  IN PMDLX MemoryDescriptorList,
+  IN KPROCESSOR_MODE AccessMode,
+  IN MEMORY_CACHING_TYPE CacheType,
+  IN PVOID BaseAddress OPTIONAL,
+  IN ULONG BugCheckOnFailure,
+  IN MM_PAGE_PRIORITY Priority);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmPageEntireDriver(
+  IN PVOID  AddressWithinSection);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmProbeAndLockPages(
+  IN OUT PMDL  MemoryDescriptorList,
+  IN KPROCESSOR_MODE  AccessMode,
+  IN LOCK_OPERATION  Operation);
+
+NTKERNELAPI
+MM_SYSTEMSIZE
+NTAPI
+MmQuerySystemSize(
+  VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmResetDriverPaging(
+  IN PVOID  AddressWithinSection);
+
+NTKERNELAPI
+SIZE_T
+NTAPI
+MmSizeOfMdl(
+  IN PVOID  Base,
+  IN SIZE_T  Length);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnlockPagableImageSection(
+  IN PVOID  ImageSectionHandle);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnlockPages(
+  IN OUT PMDL  MemoryDescriptorList);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapIoSpace(
+  IN PVOID  BaseAddress,
+  IN SIZE_T  NumberOfBytes);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmProbeAndLockProcessPages(
+  IN OUT PMDL  MemoryDescriptorList,
+  IN PEPROCESS  Process,
+  IN KPROCESSOR_MODE  AccessMode,
+  IN LOCK_OPERATION  Operation);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapLockedPages(
+  IN PVOID  BaseAddress,
+  IN PMDL  MemoryDescriptorList);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmAdvanceMdl(
+  IN OUT PMDL  Mdl,
+  IN ULONG  NumberOfBytes);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateMappingAddress(
+  IN SIZE_T  NumberOfBytes,
+  IN ULONG  PoolTag);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeMappingAddress(
+  IN PVOID  BaseAddress,
+  IN ULONG  PoolTag);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmIsVerifierEnabled(
+  OUT PULONG  VerifierFlags);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapLockedPagesWithReservedMapping(
+  IN PVOID  MappingAddress,
+  IN ULONG  PoolTag,
+  IN PMDL  MemoryDescriptorList,
+  IN MEMORY_CACHING_TYPE  CacheType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmProtectMdlSystemAddress(
+  IN PMDL  MemoryDescriptorList,
+  IN ULONG  NewProtect);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapReservedMapping(
+  IN PVOID  BaseAddress,
+  IN ULONG  PoolTag,
+  IN PMDL  MemoryDescriptorList);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+NTKERNELAPI
+PMDL
+NTAPI
+MmAllocatePagesForMdlEx(
+  IN PHYSICAL_ADDRESS LowAddress,
+  IN PHYSICAL_ADDRESS HighAddress,
+  IN PHYSICAL_ADDRESS SkipBytes,
+  IN SIZE_T TotalBytes,
+  IN MEMORY_CACHING_TYPE CacheType,
+  IN ULONG Flags);
+#endif
+
+/******************************************************************************
+ *                            Security Manager Functions                      *
+ ******************************************************************************/
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAccessCheck(
+  IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
+  IN PSECURITY_SUBJECT_CONTEXT  SubjectSecurityContext,
+  IN BOOLEAN  SubjectContextLocked,
+  IN ACCESS_MASK  DesiredAccess,
+  IN ACCESS_MASK  PreviouslyGrantedAccess,
+  OUT PPRIVILEGE_SET  *Privileges  OPTIONAL,
+  IN PGENERIC_MAPPING  GenericMapping,
+  IN KPROCESSOR_MODE  AccessMode,
+  OUT PACCESS_MASK  GrantedAccess,
+  OUT PNTSTATUS  AccessStatus);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeAssignSecurity(
+  IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
+  IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
+  OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
+  IN BOOLEAN  IsDirectoryObject,
+  IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
+  IN PGENERIC_MAPPING  GenericMapping,
+  IN POOL_TYPE  PoolType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeAssignSecurityEx(
+  IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
+  IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
+  OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
+  IN GUID  *ObjectType  OPTIONAL,
+  IN BOOLEAN  IsDirectoryObject,
+  IN ULONG  AutoInheritFlags,
+  IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
+  IN PGENERIC_MAPPING  GenericMapping,
+  IN POOL_TYPE  PoolType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeDeassignSecurity(
+  IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeValidSecurityDescriptor(
+  IN ULONG Length,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTKERNELAPI
+ULONG
+NTAPI
+SeObjectCreateSaclAccessBits(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeReleaseSubjectContext(
+  IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeUnlockSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeCaptureSubjectContext(
+  OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeLockSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+NTSTATUS
+NTAPI
+SeSetAuditParameter(
+  IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
+  IN SE_ADT_PARAMETER_TYPE Type,
+  IN ULONG Index,
+  IN PVOID Data);
+
+NTSTATUS
+NTAPI
+SeReportSecurityEvent(
+  IN ULONG Flags,
+  IN PUNICODE_STRING SourceName,
+  IN PSID UserSid OPTIONAL,
+  IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+ULONG
+NTAPI
+SeComputeAutoInheritByObjectType(
+  IN PVOID ObjectType,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+  IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
+
+#ifdef SE_NTFS_WORLD_CACHE
+VOID
+NTAPI
+SeGetWorldRights(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PGENERIC_MAPPING GenericMapping,
+  OUT PACCESS_MASK GrantedAccess);
+#endif /* SE_NTFS_WORLD_CACHE */
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+/******************************************************************************
+ *                         Configuration Manager Functions                    *
+ ******************************************************************************/
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+CmRegisterCallback(
+  IN PEX_CALLBACK_FUNCTION  Function,
+  IN PVOID  Context  OPTIONAL,
+  OUT PLARGE_INTEGER  Cookie);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+CmUnRegisterCallback(
+  IN LARGE_INTEGER  Cookie);
+#endif
+
+
+/******************************************************************************
+ *                         I/O Manager Functions                              *
+ ******************************************************************************/
+
+#if !defined(_M_AMD64)
+NTHALAPI
+VOID
+NTAPI
+READ_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+READ_PORT_BUFFER_ULONG(
+  IN PULONG Port,
+  IN PULONG Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+READ_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+UCHAR
+NTAPI
+READ_PORT_UCHAR(
+  IN PUCHAR Port);
+
+NTHALAPI
+ULONG
+NTAPI
+READ_PORT_ULONG(
+  IN PULONG Port);
+
+NTHALAPI
+USHORT
+NTAPI
+READ_PORT_USHORT(
+  IN PUSHORT Port);
+
+NTKERNELAPI
+VOID
+NTAPI
+READ_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+READ_REGISTER_BUFFER_ULONG(
+  IN PULONG Register,
+  IN PULONG Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+READ_REGISTER_BUFFER_USHORT(
+  IN PUSHORT Register,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+UCHAR
+NTAPI
+READ_REGISTER_UCHAR(
+  IN PUCHAR Register);
+
+NTKERNELAPI
+ULONG
+NTAPI
+READ_REGISTER_ULONG(
+  IN PULONG Register);
+
+NTKERNELAPI
+USHORT
+NTAPI
+READ_REGISTER_USHORT(
+  IN PUSHORT Register);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_BUFFER_ULONG(
+  IN PULONG Port,
+  IN PULONG Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_UCHAR(
+  IN PUCHAR Port,
+  IN UCHAR Value);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_ULONG(
+  IN PULONG Port,
+  IN ULONG Value);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_USHORT(
+  IN PUSHORT Port,
+  IN USHORT Value);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_BUFFER_ULONG(
+  IN PULONG  Register,
+  IN PULONG  Buffer,
+  IN ULONG  Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_BUFFER_USHORT(
+  IN PUSHORT Register,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_UCHAR(
+  IN PUCHAR Register,
+  IN UCHAR Value);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_ULONG(
+  IN PULONG Register,
+  IN ULONG Value);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_USHORT(
+  IN PUSHORT  Register,
+  IN USHORT  Value);
+
+#else
+
+FORCEINLINE
+VOID
+READ_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_PORT_BUFFER_ULONG(
+  IN PULONG  Port,
+  IN PULONG  Buffer,
+  IN ULONG  Count)
+{
+    __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count)
+{
+    __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+UCHAR
+READ_PORT_UCHAR(
+  IN PUCHAR Port)
+{
+    return __inbyte((USHORT)(ULONG_PTR)Port);
+}
+
+FORCEINLINE
+ULONG
+READ_PORT_ULONG(
+  IN PULONG Port)
+{
+    return __indword((USHORT)(ULONG_PTR)Port);
+}
+
+FORCEINLINE
+USHORT
+READ_PORT_USHORT(
+  IN PUSHORT Port)
+{
+    return __inword((USHORT)(ULONG_PTR)Port);
+}
+
+FORCEINLINE
+VOID
+READ_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    __movsb(Register, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_REGISTER_BUFFER_ULONG(
+  IN PULONG  Register,
+  IN PULONG  Buffer,
+  IN ULONG  Count)
+{
+    __movsd(Register, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_REGISTER_BUFFER_USHORT(
+  IN PUSHORT  Register,
+  IN PUSHORT  Buffer,
+  IN ULONG  Count)
+{
+    __movsw(Register, Buffer, Count);
+}
+
+FORCEINLINE
+UCHAR
+READ_REGISTER_UCHAR(
+  IN volatile UCHAR *Register)
+{
+    return *Register;
+}
+
+FORCEINLINE
+ULONG
+READ_REGISTER_ULONG(
+  IN volatile ULONG *Register)
+{
+    return *Register;
+}
+
+FORCEINLINE
+USHORT
+READ_REGISTER_USHORT(
+  IN volatile USHORT *Register)
+{
+    return *Register;
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_BUFFER_ULONG(
+  IN PULONG Port,
+  IN PULONG Buffer,
+  IN ULONG Count)
+{
+    __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count)
+{
+    __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_UCHAR(
+  IN PUCHAR Port,
+  IN UCHAR Value)
+{
+    __outbyte((USHORT)(ULONG_PTR)Port, Value);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_ULONG(
+  IN PULONG Port,
+  IN ULONG Value)
+{
+    __outdword((USHORT)(ULONG_PTR)Port, Value);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_USHORT(
+  IN PUSHORT Port,
+  IN USHORT Value)
+{
+    __outword((USHORT)(ULONG_PTR)Port, Value);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    LONG Synch;
+    __movsb(Register, Buffer, Count);
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_BUFFER_ULONG(
+  IN PULONG Register,
+  IN PULONG Buffer,
+  IN ULONG Count)
+{
+    LONG Synch;
+    __movsd(Register, Buffer, Count);
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_BUFFER_USHORT(
+  IN PUSHORT Register,
+  IN PUSHORT Buffer,
+  IN ULONG Count)
+{
+    LONG Synch;
+    __movsw(Register, Buffer, Count);
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_UCHAR(
+  IN volatile UCHAR *Register,
+  IN UCHAR Value)
+{
+    LONG Synch;
+    *Register = Value;
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_ULONG(
+  IN volatile ULONG *Register,
+  IN ULONG Value)
+{
+    LONG Synch;
+    *Register = Value;
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_USHORT(
+  IN volatile USHORT *Register,
+  IN USHORT Value)
+{
+    LONG Sync;
+    *Register = Value;
+    InterlockedOr(&Sync, 1);
+}
+#endif
+
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
+   (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
+
+#define DMA_MACROS_DEFINED
+
+FORCEINLINE
+NTSTATUS
+IoAllocateAdapterChannel(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG NumberOfMapRegisters,
+    IN PDRIVER_CONTROL ExecutionRoutine,
+    IN PVOID Context)
+{
+    PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
+    AllocateAdapterChannel =
+        *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
+    ASSERT(AllocateAdapterChannel);
+    return AllocateAdapterChannel(DmaAdapter,
+                                  DeviceObject,
+                                  NumberOfMapRegisters,
+                                  ExecutionRoutine,
+                                  Context );
+}
+
+FORCEINLINE
+BOOLEAN
+NTAPI
+IoFlushAdapterBuffers(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PMDL Mdl,
+    IN PVOID MapRegisterBase,
+    IN PVOID CurrentVa,
+    IN ULONG Length,
+    IN BOOLEAN WriteToDevice)
+{
+    PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
+    FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
+    ASSERT(FlushAdapterBuffers);
+    return FlushAdapterBuffers(DmaAdapter,
+                               Mdl,
+                               MapRegisterBase,
+                               CurrentVa,
+                               Length,
+                               WriteToDevice);
+}
+
+FORCEINLINE
+VOID
+NTAPI
+IoFreeAdapterChannel(
+    IN PDMA_ADAPTER DmaAdapter)
+{
+    PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
+    FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
+    ASSERT(FreeAdapterChannel);
+    FreeAdapterChannel(DmaAdapter);
+}
+
+FORCEINLINE
+VOID
+NTAPI
+IoFreeMapRegisters(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PVOID MapRegisterBase,
+    IN ULONG NumberOfMapRegisters)
+{
+    PFREE_MAP_REGISTERS FreeMapRegisters;
+    FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
+    ASSERT(FreeMapRegisters);
+    FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
+}
+
+FORCEINLINE
+PHYSICAL_ADDRESS
+NTAPI
+IoMapTransfer(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PMDL Mdl,
+    IN PVOID MapRegisterBase,
+    IN PVOID CurrentVa,
+    IN OUT PULONG Length,
+    IN BOOLEAN WriteToDevice)
+{
+    PMAP_TRANSFER MapTransfer;
+
+    MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
+    ASSERT(MapTransfer);
+    return MapTransfer(DmaAdapter,
+                       Mdl,
+                       MapRegisterBase,
+                       CurrentVa,
+                       Length,
+                       WriteToDevice);
+}
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+VOID
+NTAPI
+IoAcquireCancelSpinLock(
+  OUT PKIRQL  Irql);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAcquireRemoveLockEx(
+  IN PIO_REMOVE_LOCK  RemoveLock,
+  IN PVOID  Tag  OPTIONAL,
+  IN PCSTR  File,
+  IN ULONG  Line,
+  IN ULONG  RemlockSize);
+#endif
+
+/*
+ * NTSTATUS
+ * IoAcquireRemoveLock(
+ *   IN PIO_REMOVE_LOCK  RemoveLock,
+ *   IN OPTIONAL PVOID  Tag)
+ */
+#if DBG
+#define IoAcquireRemoveLock(RemoveLock, Tag) \
+  IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
+#else
+#define IoAcquireRemoveLock(RemoveLock, Tag) \
+  IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
+#endif
+
+/*
+ * VOID
+ * IoAdjustPagingPathCount(
+ *   IN PLONG  Count,
+ *   IN BOOLEAN  Increment)
+ */
+#define IoAdjustPagingPathCount(_Count, \
+                                _Increment) \
+{ \
+  if (_Increment) \
+    { \
+      InterlockedIncrement(_Count); \
+    } \
+  else \
+    { \
+      InterlockedDecrement(_Count); \
+    } \
+}
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAllocateDriverObjectExtension(
+  IN PDRIVER_OBJECT  DriverObject,
+  IN PVOID  ClientIdentificationAddress,
+  IN ULONG  DriverObjectExtensionSize,
+  OUT PVOID  *DriverObjectExtension);
+
+NTKERNELAPI
+PVOID
+NTAPI
+IoAllocateErrorLogEntry(
+  IN PVOID  IoObject,
+  IN UCHAR  EntrySize);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoAllocateIrp(
+  IN CCHAR  StackSize,
+  IN BOOLEAN  ChargeQuota);
+
+NTKERNELAPI
+PMDL
+NTAPI
+IoAllocateMdl(
+  IN PVOID  VirtualAddress OPTIONAL,
+  IN ULONG  Length,
+  IN BOOLEAN  SecondaryBuffer,
+  IN BOOLEAN  ChargeQuota,
+  IN OUT PIRP  Irp  OPTIONAL);
+
+NTKERNELAPI
+PIO_WORKITEM
+NTAPI
+IoAllocateWorkItem(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAttachDevice(
+  IN PDEVICE_OBJECT  SourceDevice,
+  IN PUNICODE_STRING  TargetDevice,
+  OUT PDEVICE_OBJECT  *AttachedDevice);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoAttachDeviceToDeviceStack(
+  IN PDEVICE_OBJECT  SourceDevice,
+  IN PDEVICE_OBJECT  TargetDevice);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoBuildAsynchronousFsdRequest(
+  IN ULONG  MajorFunction,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN OUT PVOID  Buffer  OPTIONAL,
+  IN ULONG  Length  OPTIONAL,
+  IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
+  IN PIO_STATUS_BLOCK  IoStatusBlock  OPTIONAL);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoBuildDeviceIoControlRequest(
+  IN ULONG  IoControlCode,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PVOID  InputBuffer  OPTIONAL,
+  IN ULONG  InputBufferLength,
+  OUT PVOID  OutputBuffer  OPTIONAL,
+  IN ULONG  OutputBufferLength,
+  IN BOOLEAN  InternalDeviceIoControl,
+  IN PKEVENT  Event,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoBuildPartialMdl(
+  IN PMDL  SourceMdl,
+  IN OUT PMDL  TargetMdl,
+  IN PVOID  VirtualAddress,
+  IN ULONG  Length);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoBuildSynchronousFsdRequest(
+  IN ULONG  MajorFunction,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN OUT PVOID  Buffer  OPTIONAL,
+  IN ULONG  Length  OPTIONAL,
+  IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
+  IN PKEVENT  Event,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IofCallDriver(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN OUT PIRP  Irp);
+#define IoCallDriver IofCallDriver
+
+NTKERNELAPI
+VOID
+FASTCALL
+IofCompleteRequest(
+  IN PIRP Irp,
+  IN CCHAR PriorityBoost);
+#define IoCompleteRequest IofCompleteRequest
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoCancelIrp(
+  IN PIRP  Irp);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckShareAccess(
+  IN ACCESS_MASK  DesiredAccess,
+  IN ULONG  DesiredShareAccess,
+  IN OUT PFILE_OBJECT  FileObject,
+  IN OUT PSHARE_ACCESS  ShareAccess,
+  IN BOOLEAN  Update);
+
+NTKERNELAPI
+VOID
+FASTCALL
+IofCompleteRequest(
+  IN PIRP  Irp,
+  IN CCHAR  PriorityBoost);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoConnectInterrupt(
+  OUT PKINTERRUPT  *InterruptObject,
+  IN PKSERVICE_ROUTINE  ServiceRoutine,
+  IN PVOID  ServiceContext OPTIONAL,
+  IN PKSPIN_LOCK  SpinLock  OPTIONAL,
+  IN ULONG  Vector,
+  IN KIRQL  Irql,
+  IN KIRQL  SynchronizeIrql,
+  IN KINTERRUPT_MODE    InterruptMode,
+  IN BOOLEAN  ShareVector,
+  IN KAFFINITY  ProcessorEnableMask,
+  IN BOOLEAN  FloatingSave);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateDevice(
+  IN PDRIVER_OBJECT  DriverObject,
+  IN ULONG  DeviceExtensionSize,
+  IN PUNICODE_STRING  DeviceName  OPTIONAL,
+  IN DEVICE_TYPE  DeviceType,
+  IN ULONG  DeviceCharacteristics,
+  IN BOOLEAN  Exclusive,
+  OUT PDEVICE_OBJECT  *DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateFile(
+  OUT PHANDLE FileHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PLARGE_INTEGER AllocationSize OPTIONAL,
+  IN ULONG FileAttributes,
+  IN ULONG ShareAccess,
+  IN ULONG Disposition,
+  IN ULONG CreateOptions,
+  IN PVOID EaBuffer OPTIONAL,
+  IN ULONG EaLength,
+  IN CREATE_FILE_TYPE CreateFileType,
+  IN PVOID InternalParameters OPTIONAL,
+  IN ULONG Options);
+
+NTKERNELAPI
+PKEVENT
+NTAPI
+IoCreateNotificationEvent(
+  IN PUNICODE_STRING  EventName,
+  OUT PHANDLE  EventHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateSymbolicLink(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN PUNICODE_STRING  DeviceName);
+
+NTKERNELAPI
+PKEVENT
+NTAPI
+IoCreateSynchronizationEvent(
+  IN PUNICODE_STRING  EventName,
+  OUT PHANDLE  EventHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateUnprotectedSymbolicLink(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN PUNICODE_STRING  DeviceName);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDeleteDevice(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoDeleteSymbolicLink(
+  IN PUNICODE_STRING  SymbolicLinkName);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDetachDevice(
+  IN OUT PDEVICE_OBJECT  TargetDevice);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDisconnectInterrupt(
+  IN PKINTERRUPT  InterruptObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeIrp(
+  IN PIRP Irp);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeMdl(
+  IN PMDL Mdl);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeWorkItem(
+  IN PIO_WORKITEM IoWorkItem);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetAttachedDevice(
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetAttachedDeviceReference(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetBootDiskInformation(
+  IN OUT PBOOTDISK_INFORMATION  BootDiskInformation,
+  IN ULONG  Size);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceInterfaceAlias(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN CONST GUID  *AliasInterfaceClassGuid,
+  OUT PUNICODE_STRING  AliasSymbolicLinkName);
+
+NTKERNELAPI
+PEPROCESS
+NTAPI
+IoGetCurrentProcess(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceInterfaces(
+  IN CONST GUID  *InterfaceClassGuid,
+  IN PDEVICE_OBJECT  PhysicalDeviceObject  OPTIONAL,
+  IN ULONG  Flags,
+  OUT PWSTR  *SymbolicLinkList);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceObjectPointer(
+  IN PUNICODE_STRING  ObjectName,
+  IN ACCESS_MASK  DesiredAccess,
+  OUT PFILE_OBJECT  *FileObject,
+  OUT PDEVICE_OBJECT  *DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceProperty(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN DEVICE_REGISTRY_PROPERTY  DeviceProperty,
+  IN ULONG  BufferLength,
+  OUT PVOID  PropertyBuffer,
+  OUT PULONG  ResultLength);
+
+NTKERNELAPI
+PDMA_ADAPTER
+NTAPI
+IoGetDmaAdapter(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
+  IN PDEVICE_DESCRIPTION  DeviceDescription,
+  IN OUT PULONG  NumberOfMapRegisters);
+
+NTKERNELAPI
+PVOID
+NTAPI
+IoGetDriverObjectExtension(
+  IN PDRIVER_OBJECT  DriverObject,
+  IN PVOID  ClientIdentificationAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+IoGetInitialStack(
+  VOID);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetRelatedDeviceObject(
+  IN PFILE_OBJECT  FileObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoQueueWorkItem(
+  IN PIO_WORKITEM  IoWorkItem,
+  IN PIO_WORKITEM_ROUTINE  WorkerRoutine,
+  IN WORK_QUEUE_TYPE  QueueType,
+  IN PVOID  Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInitializeIrp(
+  IN OUT PIRP  Irp,
+  IN USHORT  PacketSize,
+  IN CCHAR  StackSize);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInitializeRemoveLockEx(
+  IN  PIO_REMOVE_LOCK Lock,
+  IN  ULONG   AllocateTag,
+  IN  ULONG   MaxLockedMinutes,
+  IN  ULONG   HighWatermark,
+  IN  ULONG   RemlockSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoInitializeTimer(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIO_TIMER_ROUTINE  TimerRoutine,
+  IN PVOID  Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInvalidateDeviceRelations(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN DEVICE_RELATION_TYPE  Type);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInvalidateDeviceState(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoIsWdmVersionAvailable(
+  IN UCHAR  MajorVersion,
+  IN UCHAR  MinorVersion);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoOpenDeviceInterfaceRegistryKey(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN ACCESS_MASK  DesiredAccess,
+  OUT PHANDLE  DeviceInterfaceKey);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoOpenDeviceRegistryKey(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN ULONG  DevInstKeyType,
+  IN ACCESS_MASK  DesiredAccess,
+  OUT PHANDLE  DevInstRegKey);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterDeviceInterface(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject,
+  IN CONST GUID  *InterfaceClassGuid,
+  IN PUNICODE_STRING  ReferenceString  OPTIONAL,
+  OUT PUNICODE_STRING  SymbolicLinkName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterPlugPlayNotification(
+  IN IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
+  IN ULONG  EventCategoryFlags,
+  IN PVOID  EventCategoryData  OPTIONAL,
+  IN PDRIVER_OBJECT  DriverObject,
+  IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
+  IN OUT PVOID  Context OPTIONAL,
+  OUT PVOID  *NotificationEntry);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterShutdownNotification(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReleaseCancelSpinLock(
+  IN KIRQL  Irql);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReleaseRemoveLockAndWaitEx(
+  IN PIO_REMOVE_LOCK  RemoveLock,
+  IN PVOID  Tag OPTIONAL,
+  IN ULONG  RemlockSize);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReleaseRemoveLockEx(
+  IN PIO_REMOVE_LOCK  RemoveLock,
+  IN PVOID  Tag OPTIONAL,
+  IN ULONG  RemlockSize);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRemoveShareAccess(
+  IN PFILE_OBJECT  FileObject,
+  IN OUT PSHARE_ACCESS  ShareAccess);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportTargetDeviceChange(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject,
+  IN PVOID  NotificationStructure);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportTargetDeviceChangeAsynchronous(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject,
+  IN PVOID  NotificationStructure,
+  IN PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  OPTIONAL,
+  IN PVOID  Context  OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRequestDeviceEject(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReuseIrp(
+  IN OUT PIRP  Irp,
+  IN NTSTATUS  Status);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetDeviceInterfaceState(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN BOOLEAN  Enable);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoSetShareAccess(
+  IN ACCESS_MASK  DesiredAccess,
+  IN ULONG  DesiredShareAccess,
+  IN OUT PFILE_OBJECT  FileObject,
+  OUT PSHARE_ACCESS  ShareAccess);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartNextPacket(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN BOOLEAN  Cancelable);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartNextPacketByKey(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN BOOLEAN  Cancelable,
+  IN ULONG  Key);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartPacket(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIRP  Irp,
+  IN PULONG  Key  OPTIONAL,
+  IN PDRIVER_CANCEL  CancelFunction  OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartTimer(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStopTimer(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoUnregisterPlugPlayNotification(
+  IN PVOID  NotificationEntry);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoUnregisterShutdownNotification(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoUpdateShareAccess(
+  IN PFILE_OBJECT  FileObject,
+  IN OUT PSHARE_ACCESS  ShareAccess);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIAllocateInstanceIds(
+  IN GUID  *Guid,
+  IN ULONG  InstanceCount,
+  OUT ULONG  *FirstInstanceId);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQuerySingleInstanceMultiple(
+  IN PVOID  *DataBlockObjectList,
+  IN PUNICODE_STRING  InstanceNames,
+  IN ULONG  ObjectCount,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID  OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIRegistrationControl(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN ULONG  Action);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISuggestInstanceName(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
+  IN PUNICODE_STRING  SymbolicLinkName OPTIONAL,
+  IN BOOLEAN  CombineNames,
+  OUT PUNICODE_STRING  SuggestedInstanceName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIWriteEvent(
+  IN PVOID  WnodeEventItem);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoWriteErrorLogEntry(
+  IN PVOID  ElEntry);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCsqInitialize(
+  IN PIO_CSQ Csq,
+  IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
+  IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
+  IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
+  IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
+  IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
+  IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoCsqInsertIrp(
+  IN PIO_CSQ Csq,
+  IN PIRP Irp,
+  IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoCsqRemoveIrp(
+  IN PIO_CSQ Csq,
+  IN PIO_CSQ_IRP_CONTEXT Context);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoCsqRemoveNextIrp(
+  IN PIO_CSQ  Csq,
+  IN PVOID  PeekContext);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoForwardIrpSynchronously(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIRP  Irp);
+
+#define IoForwardAndCatchIrp IoForwardIrpSynchronously
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeErrorLogEntry(
+  PVOID  ElEntry);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetCompletionRoutineEx(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIRP  Irp,
+  IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
+  IN PVOID  Context,
+  IN BOOLEAN  InvokeOnSuccess,
+  IN BOOLEAN  InvokeOnError,
+  IN BOOLEAN  InvokeOnCancel);
+
+VOID
+NTAPI
+IoSetStartIoAttributes(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN BOOLEAN  DeferredStartIo,
+  IN BOOLEAN  NonCancelable);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIDeviceObjectToInstanceName(
+  IN PVOID  DataBlockObject,
+  IN PDEVICE_OBJECT  DeviceObject,
+  OUT PUNICODE_STRING  InstanceName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIExecuteMethod(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN ULONG  MethodId,
+  IN ULONG  InBufferSize,
+  IN OUT PULONG  OutBufferSize,
+  IN OUT  PUCHAR  InOutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIHandleToInstanceName(
+  IN PVOID  DataBlockObject,
+  IN HANDLE  FileHandle,
+  OUT PUNICODE_STRING  InstanceName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIOpenBlock(
+  IN GUID  *DataBlockGuid,
+  IN ULONG  DesiredAccess,
+  OUT PVOID  *DataBlockObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQueryAllData(
+  IN PVOID  DataBlockObject,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID  OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQueryAllDataMultiple(
+  IN PVOID  *DataBlockObjectList,
+  IN ULONG  ObjectCount,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID  OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQuerySingleInstance(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISetNotificationCallback(
+  IN OUT PVOID  Object,
+  IN WMI_NOTIFICATION_CALLBACK  Callback,
+  IN PVOID  Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISetSingleInstance(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN ULONG  Version,
+  IN ULONG  ValueBufferSize,
+  IN PVOID  ValueBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISetSingleItem(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN ULONG  DataItemId,
+  IN ULONG  Version,
+  IN ULONG  ValueBufferSize,
+  IN PVOID  ValueBuffer);
+
+#endif
+
+#if defined(_WIN64)
+NTKERNELAPI
+ULONG
+NTAPI
+IoWMIDeviceObjectToProviderId(
+  IN PDEVICE_OBJECT DeviceObject);
+#else
+#define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
+#endif
+
+/*
+ * USHORT
+ * IoSizeOfIrp(
+ *   IN CCHAR  StackSize)
+ */
+#define IoSizeOfIrp(_StackSize) \
+  ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
+
+FORCEINLINE
+VOID
+IoSkipCurrentIrpStackLocation (
+  IN OUT PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation <= Irp->StackCount);
+  Irp->CurrentLocation++;
+  Irp->Tail.Overlay.CurrentStackLocation++;
+}
+
+FORCEINLINE
+VOID
+IoSetNextIrpStackLocation (
+  IN OUT PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation > 0);
+  Irp->CurrentLocation--;
+  Irp->Tail.Overlay.CurrentStackLocation--;
+}
+
+FORCEINLINE
+PIO_STACK_LOCATION
+IoGetNextIrpStackLocation(
+  IN PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation > 0);
+  return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
+}
+
+FORCEINLINE
+VOID
+IoSetCompletionRoutine(
+  IN PIRP Irp,
+  IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
+  IN PVOID Context OPTIONAL,
+  IN BOOLEAN InvokeOnSuccess,
+  IN BOOLEAN InvokeOnError,
+  IN BOOLEAN InvokeOnCancel)
+{
+  PIO_STACK_LOCATION irpSp;
+  ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
+  irpSp = IoGetNextIrpStackLocation(Irp);
+  irpSp->CompletionRoutine = CompletionRoutine;
+  irpSp->Context = Context;
+  irpSp->Control = 0;
+
+  if (InvokeOnSuccess) {
+    irpSp->Control = SL_INVOKE_ON_SUCCESS;
+  }
+
+  if (InvokeOnError) {
+    irpSp->Control |= SL_INVOKE_ON_ERROR;
+  }
+
+  if (InvokeOnCancel) {
+    irpSp->Control |= SL_INVOKE_ON_CANCEL;
+  }
+}
+
+/*
+ * PDRIVER_CANCEL
+ * IoSetCancelRoutine(
+ *   IN PIRP  Irp,
+ *   IN PDRIVER_CANCEL  CancelRoutine)
+ */
+#define IoSetCancelRoutine(_Irp, \
+                           _CancelRoutine) \
+  ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
+    (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
+
+/*
+ * VOID
+ * IoRequestDpc(
+ *   IN PDEVICE_OBJECT  DeviceObject,
+ *   IN PIRP  Irp,
+ *   IN PVOID  Context);
+ */
+#define IoRequestDpc(DeviceObject, Irp, Context)( \
+  KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
+
+/*
+ * VOID
+ * IoReleaseRemoveLock(
+ *   IN PIO_REMOVE_LOCK  RemoveLock,
+ *   IN PVOID  Tag)
+ */
+#define IoReleaseRemoveLock(_RemoveLock, \
+                            _Tag) \
+  IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
+
+/*
+ * VOID
+ * IoReleaseRemoveLockAndWait(
+ *   IN PIO_REMOVE_LOCK  RemoveLock,
+ *   IN PVOID  Tag)
+ */
+#define IoReleaseRemoveLockAndWait(_RemoveLock, \
+                                   _Tag) \
+  IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
+
+#if defined(_WIN64)
+
+NTKERNELAPI
+BOOLEAN
+IoIs32bitProcess(
+  IN PIRP  Irp  OPTIONAL);
+
+#endif
+
+#define PLUGPLAY_REGKEY_DEVICE                            1
+#define PLUGPLAY_REGKEY_DRIVER                            2
+#define PLUGPLAY_REGKEY_CURRENT_HWPROFILE                 4
+
+FORCEINLINE
+PIO_STACK_LOCATION
+IoGetCurrentIrpStackLocation(
+  IN PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
+  return Irp->Tail.Overlay.CurrentStackLocation;
+}
+
+FORCEINLINE
+VOID
+IoMarkIrpPending(
+  IN OUT PIRP Irp)
+{
+  IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
+}
+
+/*
+ * BOOLEAN
+ * IoIsErrorUserInduced(
+ *   IN NTSTATUS  Status);
+ */
+#define IoIsErrorUserInduced(Status) \
+   ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
+   ((Status) == STATUS_IO_TIMEOUT) || \
+   ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
+   ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
+   ((Status) == STATUS_VERIFY_REQUIRED) || \
+   ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
+   ((Status) == STATUS_WRONG_VOLUME)))
+
+/* VOID
+ * IoInitializeRemoveLock(
+ *   IN PIO_REMOVE_LOCK  Lock,
+ *   IN ULONG  AllocateTag,
+ *   IN ULONG  MaxLockedMinutes,
+ *   IN ULONG  HighWatermark)
+ */
+#define IoInitializeRemoveLock( \
+  Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
+  IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
+    HighWatermark, sizeof(IO_REMOVE_LOCK))
+
+VOID
+FORCEINLINE
+IoInitializeDpcRequest(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PIO_DPC_ROUTINE DpcRoutine)
+{
+  KeInitializeDpc( &DeviceObject->Dpc,
+                   (PKDEFERRED_ROUTINE) DpcRoutine,
+                   DeviceObject );
+}
+
+#define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
+
+/*
+ * ULONG
+ * IoGetFunctionCodeFromCtlCode(
+ *   IN ULONG  ControlCode)
+ */
+#define IoGetFunctionCodeFromCtlCode(_ControlCode) \
+  (((_ControlCode) >> 2) & 0x00000FFF)
+
+FORCEINLINE
+VOID
+IoCopyCurrentIrpStackLocationToNext(
+  IN PIRP Irp)
+{
+  PIO_STACK_LOCATION irpSp;
+  PIO_STACK_LOCATION nextIrpSp;
+  irpSp = IoGetCurrentIrpStackLocation(Irp);
+  nextIrpSp = IoGetNextIrpStackLocation(Irp);
+  RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
+  nextIrpSp->Control = 0;
+}
+
+NTKERNELAPI
+VOID
+NTAPI
+IoGetStackLimits(
+  OUT PULONG_PTR  LowLimit,
+  OUT PULONG_PTR  HighLimit);
+
+FORCEINLINE
+ULONG_PTR
+IoGetRemainingStackSize(
+  VOID)
+{
+  ULONG_PTR End, Begin;
+  ULONG_PTR Result;
+
+  IoGetStackLimits(&Begin, &End);
+  Result = (ULONG_PTR)(&End) - Begin;
+  return Result;
+}
+
+/******************************************************************************
+ *                     Power Management Support Functions                     *
+ ******************************************************************************/
+
+#define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoCallDriver(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN OUT struct _IRP  *Irp);
+
+NTKERNELAPI
+PULONG
+NTAPI
+PoRegisterDeviceForIdleDetection(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN ULONG  ConservationIdleTime,
+  IN ULONG  PerformanceIdleTime,
+  IN DEVICE_POWER_STATE  State);
+
+NTKERNELAPI
+PVOID
+NTAPI
+PoRegisterSystemState(
+  IN OUT PVOID StateHandle OPTIONAL,
+  IN EXECUTION_STATE Flags);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoRequestPowerIrp(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN UCHAR  MinorFunction,
+  IN POWER_STATE  PowerState,
+  IN PREQUEST_POWER_COMPLETE  CompletionFunction OPTIONAL,
+  IN PVOID  Context OPTIONAL,
+  OUT struct _IRP  **Irp OPTIONAL);
+
+NTKERNELAPI
+POWER_STATE
+NTAPI
+PoSetPowerState(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN POWER_STATE_TYPE  Type,
+  IN POWER_STATE  State);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoSetSystemState(
+  IN EXECUTION_STATE  Flags);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoStartNextPowerIrp(
+  IN OUT struct _IRP *Irp);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoUnregisterSystemState(
+  IN OUT PVOID StateHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoRequestShutdownEvent(
+  OUT PVOID *Event);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+VOID
+NTAPI
+PoSetSystemWake(
+  IN OUT struct _IRP *Irp);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PoGetSystemWake(
+  IN struct _IRP *Irp);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoRegisterPowerSettingCallback(
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+  IN LPCGUID SettingGuid,
+  IN PPOWER_SETTING_CALLBACK Callback,
+  IN PVOID Context OPTIONAL,
+  OUT PVOID *Handle OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoUnregisterPowerSettingCallback(
+  IN OUT PVOID Handle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+
+NTKERNELAPI
+VOID
+NTAPI
+PoSetDeviceBusyEx(
+  IN OUT PULONG IdlePointer);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+NTKERNELAPI
+VOID
+NTAPI
+PoStartDeviceBusy(
+  IN OUT PULONG IdlePointer);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoEndDeviceBusy(
+  IN OUT PULONG IdlePointer);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PoQueryWatchdogTime(
+  IN PDEVICE_OBJECT Pdo,
+  OUT PULONG SecondsRemaining);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoDeletePowerRequest(
+  IN OUT PVOID PowerRequest);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoSetPowerRequest(
+  IN OUT PVOID PowerRequest,
+  IN POWER_REQUEST_TYPE Type);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoClearPowerRequest(
+  IN OUT PVOID PowerRequest,
+  IN POWER_REQUEST_TYPE Type);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoCreatePowerRequest(
+  OUT PVOID *PowerRequest,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PCOUNTED_REASON_CONTEXT Context);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+/******************************************************************************
+ *                          Executive Functions                               *
+ ******************************************************************************/
+
+#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
+#define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
+#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
+
+#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
+#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
+#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
+#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
+
+#define ExInitializeSListHead InitializeSListHead
+
+#if defined(_X86_)
+#if defined(_NTHAL_)
+#define ExAcquireFastMutex ExiAcquireFastMutex
+#define ExReleaseFastMutex ExiReleaseFastMutex
+#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
+#endif
+#define ExInterlockedAddUlong ExfInterlockedAddUlong
+#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
+#define ExInterlockedInsertTailList ExfInterlockedInsertTailList
+#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
+#define ExInterlockedPopEntryList ExfInterlockedPopEntryList
+#define ExInterlockedPushEntryList ExfInterlockedPushEntryList
+#endif
+
+#if defined(_WIN64)
+
+#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
+    defined(_NTHAL_) || defined(_NTOSP_)
+NTKERNELAPI
+USHORT
+ExQueryDepthSList(IN PSLIST_HEADER ListHead);
+#else
+FORCEINLINE
+USHORT
+ExQueryDepthSList(IN PSLIST_HEADER ListHead)
+{
+    return (USHORT)(ListHead->Alignment & 0xffff);
+}
+#endif
+
+NTKERNELAPI
+PSLIST_ENTRY
+ExpInterlockedFlushSList(
+    PSLIST_HEADER ListHead);
+
+NTKERNELAPI
+PSLIST_ENTRY
+ExpInterlockedPopEntrySList(
+    PSLIST_HEADER ListHead);
+
+NTKERNELAPI
+PSLIST_ENTRY
+ExpInterlockedPushEntrySList(
+    PSLIST_HEADER ListHead,
+    PSLIST_ENTRY ListEntry);
+
+#define ExInterlockedFlushSList(Head) \
+    ExpInterlockedFlushSList(Head)
+#define ExInterlockedPopEntrySList(Head, Lock) \
+    ExpInterlockedPopEntrySList(Head)
+#define ExInterlockedPushEntrySList(Head, Entry, Lock) \
+    ExpInterlockedPushEntrySList(Head, Entry)
+
+#else // !defined(_WIN64)
+
+#define ExQueryDepthSList(listhead) (listhead)->Depth
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList(
+    IN PSLIST_HEADER ListHead);
+
+#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
+NTKERNELAPI
+PSINGLE_LIST_ENTRY 
+FASTCALL
+ExInterlockedPopEntrySList(
+    IN PSLIST_HEADER ListHead,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY 
+FASTCALL
+ExInterlockedPushEntrySList(
+    IN PSLIST_HEADER ListHead,
+    IN PSINGLE_LIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
+#else
+#define ExInterlockedPopEntrySList(_ListHead, _Lock) \
+    InterlockedPopEntrySList(_ListHead)
+#define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
+    InterlockedPushEntrySList(_ListHead, _ListEntry)
+#endif // _WIN2K_COMPAT_SLIST_USAGE
+
+#endif // !defined(_WIN64)
+
+/* ERESOURCE_THREAD
+ * ExGetCurrentResourceThread(
+ *     VOID);
+ */
+#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
+
+#define ExReleaseResource(R) (ExReleaseResourceLite(R))
+
+/* VOID
+ * ExInitializeWorkItem(
+ *     IN PWORK_QUEUE_ITEM Item,
+ *     IN PWORKER_THREAD_ROUTINE Routine,
+ *     IN PVOID Context)
+ */
+#define ExInitializeWorkItem(Item, Routine, Context) \
+{ \
+  (Item)->WorkerRoutine = Routine; \
+  (Item)->Parameter = Context; \
+  (Item)->List.Flink = NULL; \
+}
+
+FORCEINLINE
+VOID
+ExInitializeFastMutex(
+  OUT PFAST_MUTEX FastMutex)
+{
+  FastMutex->Count = FM_LOCK_BIT;
+  FastMutex->Owner = NULL;
+  FastMutex->Contention = 0;
+  KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
+  return;
+}
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExAcquireFastMutex(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseFastMutex(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+ExTryToAcquireFastMutex(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExAcquireFastMutexUnsafe(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseFastMutexUnsafe(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireResourceExclusiveLite(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireResourceSharedLite(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireSharedStarveExclusive(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireSharedWaitForExclusive(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePool(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes);
+
+#ifdef POOL_TAGGING
+#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
+#endif /* POOL_TAGGING */
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithQuota(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes);
+
+#ifdef POOL_TAGGING
+#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
+#endif /* POOL_TAGGING */
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithQuotaTag(
+  IN POOL_TYPE  PoolType,
+  IN SIZE_T  NumberOfBytes,
+  IN ULONG  Tag);
+
+#ifndef POOL_TAGGING
+#define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
+#endif /* POOL_TAGGING */
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithTag(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag);
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithTagPriority(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag,
+    IN EX_POOL_PRIORITY Priority);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExConvertExclusiveToSharedLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExCreateCallback(
+    OUT PCALLBACK_OBJECT *CallbackObject,
+    IN POBJECT_ATTRIBUTES ObjectAttributes,
+    IN BOOLEAN Create,
+    IN BOOLEAN AllowMultipleCallbacks);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExDeleteNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExDeletePagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExDeleteResourceLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExFreePool(
+    IN PVOID P);
+
+#ifdef POOL_TAGGING
+#define ExFreePool(P) ExFreePoolWithTag(P, 0)
+#endif
+
+NTKERNELAPI
+VOID
+NTAPI
+ExFreePoolWithTag(
+    IN PVOID P,
+    IN ULONG Tag);
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExGetExclusiveWaiterCount(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+KPROCESSOR_MODE
+NTAPI
+ExGetPreviousMode(
+    VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExGetSharedWaiterCount(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExInitializeNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside,
+    IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+    IN PFREE_FUNCTION Free OPTIONAL,
+    IN ULONG Flags,
+    IN SIZE_T Size,
+    IN ULONG Tag,
+    IN USHORT Depth);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExInitializePagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside,
+    IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+    IN PFREE_FUNCTION Free OPTIONAL,
+    IN ULONG Flags,
+    IN SIZE_T Size,
+    IN ULONG Tag,
+    IN USHORT Depth);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInitializeResourceLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+LARGE_INTEGER
+NTAPI
+ExInterlockedAddLargeInteger(
+    IN PLARGE_INTEGER Addend,
+    IN LARGE_INTEGER Increment,
+    IN PKSPIN_LOCK Lock);
+
+#if defined(_WIN64)
+#define ExInterlockedAddLargeStatistic(Addend, Increment) \
+    (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
+#else
+#define ExInterlockedAddLargeStatistic(Addend, Increment) \
+    _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
+#endif
+
+NTKERNELAPI
+ULONG
+FASTCALL
+ExInterlockedAddUlong(
+    IN PULONG Addend,
+    IN ULONG Increment,
+    PKSPIN_LOCK Lock);
+
+#if defined(_AMD64_) || defined(_IA64_)
+#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
+    InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
+#elif defined(_X86_)
+NTKERNELAPI
+LONGLONG
+FASTCALL
+ExfInterlockedCompareExchange64(
+    IN OUT LONGLONG volatile *Destination,
+    IN PLONGLONG Exchange,
+    IN PLONGLONG Comperand);
+#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
+    ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
+#else
+NTKERNELAPI
+LONGLONG
+FASTCALL
+ExInterlockedCompareExchange64(
+    IN OUT LONGLONG volatile *Destination,
+    IN PLONGLONG Exchange,
+    IN PLONGLONG Comparand,
+    IN PKSPIN_LOCK Lock);
+#endif
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExInterlockedInsertHeadList(
+    IN PLIST_ENTRY ListHead,
+    IN PLIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExInterlockedInsertTailList(
+    IN PLIST_ENTRY ListHead,
+    IN PLIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedPopEntryList(
+    IN PSINGLE_LIST_ENTRY ListHead,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedPushEntryList(
+    IN PSINGLE_LIST_ENTRY ListHead,
+    IN PSINGLE_LIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExInterlockedRemoveHeadList(
+    IN PLIST_ENTRY ListHead,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExIsProcessorFeaturePresent(
+    IN ULONG ProcessorFeature);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExIsResourceAcquiredExclusiveLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExIsResourceAcquiredSharedLite(
+    IN PERESOURCE Resource);
+
+#define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
+
+NTKERNELAPI
+VOID
+NTAPI
+ExLocalTimeToSystemTime(
+    IN PLARGE_INTEGER LocalTime,
+    OUT PLARGE_INTEGER SystemTime);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExNotifyCallback(
+    IN PCALLBACK_OBJECT CallbackObject,
+    IN PVOID Argument1,
+    IN PVOID Argument2);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExQueueWorkItem(
+    IN PWORK_QUEUE_ITEM WorkItem,
+    IN WORK_QUEUE_TYPE QueueType);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseStatus(
+    IN NTSTATUS Status);
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExRegisterCallback(
+    IN PCALLBACK_OBJECT CallbackObject,
+    IN PCALLBACK_FUNCTION CallbackFunction,
+    IN PVOID CallbackContext);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExReinitializeResourceLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExReleaseResourceForThreadLite(
+    IN PERESOURCE Resource,
+    IN ERESOURCE_THREAD ResourceThreadId);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseResourceLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExSetResourceOwnerPointer(
+    IN PERESOURCE Resource,
+    IN PVOID OwnerPointer);
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExSetTimerResolution(
+    IN ULONG DesiredTime,
+    IN BOOLEAN SetResolution);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExSystemTimeToLocalTime(
+    IN PLARGE_INTEGER SystemTime,
+    OUT PLARGE_INTEGER LocalTime);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExUnregisterCallback(
+    IN PVOID CbRegistration);
+
+
+#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+ExAcquireRundownProtection(
+    IN OUT PEX_RUNDOWN_REF RunRef);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExInitializeRundownProtection(
+    OUT PEX_RUNDOWN_REF RunRef);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReInitializeRundownProtection(
+    OUT PEX_RUNDOWN_REF RunRef);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseRundownProtection(
+    IN OUT PEX_RUNDOWN_REF RunRef);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExRundownCompleted(
+    OUT PEX_RUNDOWN_REF RunRef);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExVerifySuite(
+    IN SUITE_TYPE SuiteType);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExWaitForRundownProtectionRelease(
+    IN OUT PEX_RUNDOWN_REF RunRef);
+
+#endif // (NTDDI_VERSION >= NTDDI_WINXP)
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+ExAcquireRundownProtectionEx(
+    IN OUT PEX_RUNDOWN_REF RunRef,
+    IN ULONG Count);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseRundownProtectionEx(
+    IN OUT PEX_RUNDOWN_REF RunRef,
+    IN ULONG Count);
+#endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+NTKERNELAPI
+PEX_RUNDOWN_REF_CACHE_AWARE
+NTAPI
+ExAllocateCacheAwareRundownProtection(
+    IN POOL_TYPE PoolType,
+    IN ULONG PoolTag);
+
+NTKERNELAPI
+SIZE_T
+NTAPI
+ExSizeOfRundownProtectionCacheAware(VOID);
+#endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInitializeLookasideListEx(
+    OUT PLOOKASIDE_LIST_EX Lookaside,
+    IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
+    IN PFREE_FUNCTION_EX Free OPTIONAL,
+    IN POOL_TYPE PoolType,
+    IN ULONG Flags,
+    IN SIZE_T Size,
+    IN ULONG Tag,
+    IN USHORT Depth);
+#endif
+
+#if !defined(MIDL_PASS)
+
+static __inline PVOID
+ExAllocateFromNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside)
+{
+    PVOID Entry;
+
+    Lookaside->L.TotalAllocates++;
+    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
+    if (Entry == NULL) {
+        Lookaside->L.AllocateMisses++;
+        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
+                                        Lookaside->L.Size,
+                                        Lookaside->L.Tag);
+    }
+    return Entry;
+}
+
+static __inline PVOID
+ExAllocateFromPagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside)
+{
+    PVOID Entry;
+
+    Lookaside->L.TotalAllocates++;
+    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
+    if (Entry == NULL) {
+        Lookaside->L.AllocateMisses++;
+        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
+                                        Lookaside->L.Size,
+                                        Lookaside->L.Tag);
+    }
+    return Entry;
+}
+
+static __inline VOID
+ExFreeToNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside,
+    IN PVOID  Entry)
+{
+    Lookaside->L.TotalFrees++;
+    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
+        Lookaside->L.FreeMisses++;
+        (Lookaside->L.Free)(Entry);
+    } else {
+        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
+    }
+}
+
+static __inline VOID
+ExFreeToPagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside,
+    IN PVOID  Entry)
+{
+    Lookaside->L.TotalFrees++;
+    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
+        Lookaside->L.FreeMisses++;
+        (Lookaside->L.Free)(Entry);
+    } else {
+        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
+    }
+}
+
+#endif // !defined(MIDL_PASS)
+
+/******************************************************************************
+ *                          Object Manager Functions                          *
+ ******************************************************************************/
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+LONG_PTR
+FASTCALL
+ObfDereferenceObject(
+  IN PVOID Object);
+#define ObDereferenceObject ObfDereferenceObject
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObGetObjectSecurity(
+  IN PVOID Object,
+  OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
+  OUT PBOOLEAN MemoryAllocated);
+
+NTKERNELAPI
+LONG_PTR
+FASTCALL
+ObfReferenceObject(
+  IN PVOID Object);
+#define ObReferenceObject ObfReferenceObject
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObReferenceObjectByHandle(
+  IN HANDLE Handle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_TYPE ObjectType OPTIONAL,
+  IN KPROCESSOR_MODE AccessMode,
+  OUT PVOID *Object,
+  OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObReferenceObjectByPointer(
+  IN PVOID  Object,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_TYPE ObjectType OPTIONAL,
+  IN KPROCESSOR_MODE AccessMode);
+
+NTKERNELAPI
+VOID
+NTAPI
+ObReleaseObjectSecurity(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN BOOLEAN MemoryAllocated);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+/******************************************************************************
+ *                          Process Manager Functions                         *
+ ******************************************************************************/
+
+/*
+ * PEPROCESS
+ * PsGetCurrentProcess(VOID)
+ */
+#define PsGetCurrentProcess IoGetCurrentProcess
+
+#if !defined(_PSGETCURRENTTHREAD_)
+
+#define _PSGETCURRENTTHREAD_
+
+FORCEINLINE
+PETHREAD
+NTAPI
+PsGetCurrentThread (
+  VOID)
+{
+  return (PETHREAD)KeGetCurrentThread();
+}
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsCreateSystemThread(
+  OUT PHANDLE  ThreadHandle,
+  IN ULONG  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
+  IN HANDLE  ProcessHandle  OPTIONAL,
+  OUT PCLIENT_ID  ClientId  OPTIONAL,
+  IN PKSTART_ROUTINE  StartRoutine,
+  IN PVOID  StartContext OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsTerminateSystemThread(
+  IN NTSTATUS  ExitStatus);
+
+#endif
+
+/******************************************************************************
+ *                          WMI Library Support Functions                     *
+ ******************************************************************************/
+
+#ifdef RUN_WPP
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+DDKCDECLAPI
+WmiTraceMessage(
+  IN TRACEHANDLE  LoggerHandle,
+  IN ULONG  MessageFlags,
+  IN LPGUID  MessageGuid,
+  IN USHORT  MessageNumber,
+  IN ...);
+#endif
+
+#endif
+
+ #if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+WmiQueryTraceInformation(
+  IN TRACE_INFORMATION_CLASS  TraceInformationClass,
+  OUT PVOID  TraceInformation,
+  IN ULONG  TraceInformationLength,
+  OUT PULONG  RequiredLength OPTIONAL,
+  IN PVOID  Buffer OPTIONAL);
+
+#if 0
+/* FIXME: Get va_list from where? */
+NTKERNELAPI
+NTSTATUS
+DDKCDECLAPI
+WmiTraceMessageVa(
+  IN TRACEHANDLE  LoggerHandle,
+  IN ULONG  MessageFlags,
+  IN LPGUID  MessageGuid,
+  IN USHORT  MessageNumber,
+  IN va_list  MessageArgList);
+#endif
+
+#endif
+
+/******************************************************************************
+ *                          Kernel Debugger Functions                         *
+ ******************************************************************************/
+
+#ifndef _DBGNT_
+ULONG
+DDKCDECLAPI
+DbgPrint(
+  IN PCSTR  Format,
+  IN ...);
+#endif
+
+#if DBG
+
+#define KdPrint(_x_) DbgPrint _x_
+#define KdPrintEx(_x_) DbgPrintEx _x_
+#define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
+#define KdBreakPoint() DbgBreakPoint()
+#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
+
+#else /* !DBG */
+
+#define KdPrint(_x_)
+#define KdPrintEx(_x_)
+#define vKdPrintExWithPrefix(_x_)
+#define KdBreakPoint()
+#define KdBreakPointWithStatus(s)
+
+#endif /* !DBG */
+
+#if defined(__GNUC__)
+
+extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
+extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
+#define KD_DEBUGGER_ENABLED     KdDebuggerEnabled
+#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
+
+#elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
+
+extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
+extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
+#define KD_DEBUGGER_ENABLED     *KdDebuggerEnabled
+#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
+
+#else
+
+extern BOOLEAN KdDebuggerNotPresent;
+extern BOOLEAN KdDebuggerEnabled;
+#define KD_DEBUGGER_ENABLED     KdDebuggerEnabled
+#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
+
+#endif
+
+#ifdef _VA_LIST_DEFINED
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTSYSAPI
+ULONG
+NTAPI
+vDbgPrintEx(
+  IN ULONG ComponentId,
+  IN ULONG Level,
+  IN PCCH Format,
+  IN va_list ap);
+
+NTSYSAPI
+ULONG
+NTAPI
+vDbgPrintExWithPrefix(
+  IN PCCH Prefix,
+  IN ULONG ComponentId,
+  IN ULONG Level,
+  IN PCCH Format,
+  IN va_list ap);
+
+#endif
+#endif // _VA_LIST_DEFINED
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KdDisableDebugger(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KdEnableDebugger(
+  VOID);
+
+#if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
+#define DbgBreakPoint __debugbreak
+#else
+VOID
+NTAPI
+DbgBreakPoint(
+  VOID);
+#endif
+
+NTSYSAPI
+VOID
+NTAPI
+DbgBreakPointWithStatus(
+  IN ULONG  Status);
+
+NTSYSAPI
+ULONG
+DDKCDECLAPI
+DbgPrintReturnControlC(
+  IN PCCH  Format,
+  IN ...);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTSYSAPI
+ULONG
+DDKCDECLAPI
+DbgPrintEx(
+  IN ULONG  ComponentId,
+  IN ULONG  Level,
+  IN PCSTR  Format,
+  IN ...);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+DbgQueryDebugFilterState(
+  IN ULONG  ComponentId,
+  IN ULONG  Level);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+DbgSetDebugFilterState(
+  IN ULONG  ComponentId,
+  IN ULONG  Level,
+  IN BOOLEAN  State);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KdRefreshDebuggerNotPresent(
+    VOID
+);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KdChangeOption(
+  IN KD_OPTION Option,
+  IN ULONG InBufferBytes OPTIONAL,
+  IN PVOID InBuffer,
+  IN ULONG OutBufferBytes OPTIONAL,
+  OUT PVOID OutBuffer,
+  OUT PULONG OutBufferNeeded OPTIONAL);
+#endif
+
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
+FORCEINLINE
+PVOID
+NTAPI
+HalAllocateCommonBuffer(
+  IN PDMA_ADAPTER DmaAdapter,
+  IN ULONG  Length,
+  OUT PPHYSICAL_ADDRESS  LogicalAddress,
+  IN BOOLEAN  CacheEnabled)
+{
+  PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
+  PVOID commonBuffer;
+
+  allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
+  ASSERT( allocateCommonBuffer != NULL );
+  commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
+  return commonBuffer;
+}
+
+FORCEINLINE
+VOID
+NTAPI
+HalFreeCommonBuffer(
+  IN PDMA_ADAPTER DmaAdapter,
+  IN ULONG  Length,
+  IN PHYSICAL_ADDRESS  LogicalAddress,
+  IN PVOID  VirtualAddress,
+  IN BOOLEAN  CacheEnabled)
+{
+  PFREE_COMMON_BUFFER freeCommonBuffer;
+
+  freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
+  ASSERT( freeCommonBuffer != NULL );
+  freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
+}
+
+FORCEINLINE
+ULONG
+NTAPI
+HalReadDmaCounter(
+  IN PDMA_ADAPTER DmaAdapter)
+{
+  PREAD_DMA_COUNTER readDmaCounter;
+  ULONG counter;
+
+  readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
+  ASSERT( readDmaCounter != NULL );
+  counter = readDmaCounter( DmaAdapter );
+  return counter;
+}
+
+#endif
+
+
+#ifndef _NTTMAPI_
+#define _NTTMAPI_
+
+#include <ktmtypes.h>
+
+typedef enum _KTMOBJECT_TYPE {
+  KTMOBJECT_TRANSACTION,
+  KTMOBJECT_TRANSACTION_MANAGER,
+  KTMOBJECT_RESOURCE_MANAGER,
+  KTMOBJECT_ENLISTMENT,
+  KTMOBJECT_INVALID
+} KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
+
+typedef struct _KTMOBJECT_CURSOR {
+  GUID LastQuery;
+  ULONG ObjectIdCount;
+  GUID ObjectIds[1];
+} KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
+
+typedef enum _TRANSACTION_INFORMATION_CLASS {
+  TransactionBasicInformation,
+  TransactionPropertiesInformation,
+  TransactionEnlistmentInformation,
+  TransactionSuperiorEnlistmentInformation
+} TRANSACTION_INFORMATION_CLASS;
+
+typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
+  TransactionManagerBasicInformation,
+  TransactionManagerLogInformation,
+  TransactionManagerLogPathInformation,
+  TransactionManagerRecoveryInformation = 4
+} TRANSACTIONMANAGER_INFORMATION_CLASS;
+
+typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
+  ResourceManagerBasicInformation,
+  ResourceManagerCompletionInformation,
+} RESOURCEMANAGER_INFORMATION_CLASS;
+
+typedef enum _ENLISTMENT_INFORMATION_CLASS {
+  EnlistmentBasicInformation,
+  EnlistmentRecoveryInformation,
+  EnlistmentCrmInformation
+} ENLISTMENT_INFORMATION_CLASS;
+
+#endif /* !_NTTMAPI_ */
+/******************************************************************************
+ *                            ZwXxx Functions                                 *
+ ******************************************************************************/
+
+/* Constants */
+#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
+#define ZwCurrentProcess() NtCurrentProcess()
+#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
+#define ZwCurrentThread() NtCurrentThread()
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwClose(
+  IN HANDLE  Handle);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCreateDirectoryObject(
+  OUT PHANDLE  DirectoryHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCreateFile(
+  OUT PHANDLE  FileHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
+  IN ULONG  FileAttributes,
+  IN ULONG  ShareAccess,
+  IN ULONG  CreateDisposition,
+  IN ULONG  CreateOptions,
+  IN PVOID  EaBuffer  OPTIONAL,
+  IN ULONG  EaLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCreateKey(
+  OUT PHANDLE  KeyHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes,
+  IN ULONG  TitleIndex,
+  IN PUNICODE_STRING  Class  OPTIONAL,
+  IN ULONG  CreateOptions,
+  OUT PULONG  Disposition  OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCreateSection(
+  OUT PHANDLE SectionHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN PLARGE_INTEGER MaximumSize OPTIONAL,
+  IN ULONG SectionPageProtection,
+  IN ULONG AllocationAttributes,
+  IN HANDLE FileHandle OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDeleteKey(
+  IN HANDLE KeyHandle);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDeleteValueKey(
+  IN HANDLE  KeyHandle,
+  IN PUNICODE_STRING ValueName);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwEnumerateKey(
+  IN HANDLE KeyHandle,
+  IN ULONG Index,
+  IN KEY_INFORMATION_CLASS KeyInformationClass,
+  OUT PVOID KeyInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwEnumerateValueKey(
+  IN HANDLE KeyHandle,
+  IN ULONG Index,
+  IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+  OUT PVOID KeyValueInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwFlushKey(
+  IN HANDLE  KeyHandle);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwLoadDriver(
+  IN PUNICODE_STRING DriverServiceName);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwMakeTemporaryObject(
+  IN HANDLE  Handle);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwMapViewOfSection(
+  IN HANDLE  SectionHandle,
+  IN HANDLE  ProcessHandle,
+  IN OUT PVOID  *BaseAddress,
+  IN ULONG_PTR  ZeroBits,
+  IN SIZE_T  CommitSize,
+  IN OUT PLARGE_INTEGER  SectionOffset  OPTIONAL,
+  IN OUT PSIZE_T  ViewSize,
+  IN SECTION_INHERIT  InheritDisposition,
+  IN ULONG  AllocationType,
+  IN ULONG  Protect);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenFile(
+  OUT PHANDLE FileHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG ShareAccess,
+  IN ULONG OpenOptions);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenKey(
+  OUT PHANDLE  KeyHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenSection(
+  OUT PHANDLE  SectionHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenSymbolicLinkObject(
+  OUT PHANDLE  LinkHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationFile(
+  IN HANDLE  FileHandle,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  OUT PVOID  FileInformation,
+  IN ULONG  Length,
+  IN FILE_INFORMATION_CLASS  FileInformationClass);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryKey(
+  IN HANDLE KeyHandle,
+  IN KEY_INFORMATION_CLASS KeyInformationClass,
+  OUT PVOID KeyInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQuerySymbolicLinkObject(
+  IN HANDLE  LinkHandle,
+  IN OUT PUNICODE_STRING  LinkTarget,
+  OUT PULONG  ReturnedLength  OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryValueKey(
+  IN HANDLE KeyHandle,
+  IN PUNICODE_STRING ValueName,
+  IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+  OUT PVOID KeyValueInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwReadFile(
+  IN HANDLE  FileHandle,
+  IN HANDLE  Event  OPTIONAL,
+  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
+  IN PVOID  ApcContext  OPTIONAL,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  OUT PVOID  Buffer,
+  IN ULONG  Length,
+  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
+  IN PULONG  Key  OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationFile(
+  IN HANDLE  FileHandle,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  IN PVOID  FileInformation,
+  IN ULONG  Length,
+  IN FILE_INFORMATION_CLASS  FileInformationClass);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetValueKey(
+  IN HANDLE  KeyHandle,
+  IN PUNICODE_STRING  ValueName,
+  IN ULONG  TitleIndex  OPTIONAL,
+  IN ULONG  Type,
+  IN PVOID  Data OPTIONAL,
+  IN ULONG  DataSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwUnloadDriver(
+  IN PUNICODE_STRING DriverServiceName);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwUnmapViewOfSection(
+  IN HANDLE  ProcessHandle,
+  IN PVOID  BaseAddress OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwWriteFile(
+  IN HANDLE  FileHandle,
+  IN HANDLE  Event  OPTIONAL,
+  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
+  IN PVOID  ApcContext  OPTIONAL,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  IN PVOID  Buffer,
+  IN ULONG  Length,
+  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
+  IN PULONG  Key  OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryFullAttributesFile(
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2003)
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenEvent(
+  OUT PHANDLE EventHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTSYSAPI
+NTSTATUS
+ZwCreateKeyTransacted(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN ULONG TitleIndex,
+  IN PUNICODE_STRING Class OPTIONAL,
+  IN ULONG CreateOptions,
+  IN HANDLE TransactionHandle,
+  OUT PULONG Disposition OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenKeyTransacted(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN HANDLE TransactionHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCreateTransactionManager(
+  OUT PHANDLE TmHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN PUNICODE_STRING LogFileName OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN ULONG CommitStrength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenTransactionManager(
+  OUT PHANDLE TmHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN PUNICODE_STRING LogFileName OPTIONAL,
+  IN LPGUID TmIdentity OPTIONAL,
+  IN ULONG OpenOptions OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollforwardTransactionManager(
+  IN HANDLE TransactionManagerHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRecoverTransactionManager(
+  IN HANDLE TransactionManagerHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationTransactionManager(
+  IN HANDLE TransactionManagerHandle,
+  IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
+  OUT PVOID TransactionManagerInformation,
+  IN ULONG TransactionManagerInformationLength,
+  OUT PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSetInformationTransactionManager(
+  IN HANDLE TmHandle,
+  IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
+  IN PVOID TransactionManagerInformation,
+  IN ULONG TransactionManagerInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwEnumerateTransactionObject(
+  IN HANDLE RootObjectHandle OPTIONAL,
+  IN KTMOBJECT_TYPE QueryType,
+  IN OUT PKTMOBJECT_CURSOR ObjectCursor,
+  IN ULONG ObjectCursorLength,
+  OUT PULONG ReturnLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCreateTransaction(
+  OUT PHANDLE TransactionHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN LPGUID Uow OPTIONAL,
+  IN HANDLE TmHandle OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN ULONG IsolationLevel OPTIONAL,
+  IN ULONG IsolationFlags OPTIONAL,
+  IN PLARGE_INTEGER Timeout OPTIONAL,
+  IN PUNICODE_STRING Description OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenTransaction(
+  OUT PHANDLE TransactionHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN LPGUID Uow,
+  IN HANDLE TmHandle OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationTransaction(
+  IN HANDLE TransactionHandle,
+  IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
+  OUT PVOID TransactionInformation,
+  IN ULONG TransactionInformationLength,
+  OUT PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSetInformationTransaction(
+  IN HANDLE TransactionHandle,
+  IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
+  IN PVOID TransactionInformation,
+  IN ULONG TransactionInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCommitTransaction(
+  IN HANDLE TransactionHandle,
+  IN BOOLEAN Wait);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollbackTransaction(
+  IN HANDLE TransactionHandle,
+  IN BOOLEAN Wait);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCreateResourceManager(
+  OUT PHANDLE ResourceManagerHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE TmHandle,
+  IN LPGUID ResourceManagerGuid OPTIONAL,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN PUNICODE_STRING Description OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenResourceManager(
+  OUT PHANDLE ResourceManagerHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE TmHandle,
+  IN LPGUID ResourceManagerGuid,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRecoverResourceManager(
+  IN HANDLE ResourceManagerHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwGetNotificationResourceManager(
+  IN HANDLE ResourceManagerHandle,
+  OUT PTRANSACTION_NOTIFICATION TransactionNotification,
+  IN ULONG NotificationLength,
+  IN PLARGE_INTEGER Timeout,
+  IN PULONG ReturnLength OPTIONAL,
+  IN ULONG Asynchronous,
+  IN ULONG_PTR AsynchronousContext OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationResourceManager(
+  IN HANDLE ResourceManagerHandle,
+  IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
+  OUT PVOID ResourceManagerInformation,
+  IN ULONG ResourceManagerInformationLength,
+  IN PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSetInformationResourceManager(
+  IN HANDLE ResourceManagerHandle,
+  IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
+  IN PVOID ResourceManagerInformation,
+  IN ULONG ResourceManagerInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCreateEnlistment(
+  OUT PHANDLE EnlistmentHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE ResourceManagerHandle,
+  IN HANDLE TransactionHandle,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN NOTIFICATION_MASK NotificationMask,
+  IN PVOID EnlistmentKey OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenEnlistment(
+  OUT PHANDLE EnlistmentHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE RmHandle,
+  IN LPGUID EnlistmentGuid,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
+  OUT PVOID EnlistmentInformation,
+  IN ULONG EnlistmentInformationLength,
+  IN PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSetInformationEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
+  IN PVOID EnlistmentInformation,
+  IN ULONG EnlistmentInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRecoverEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PVOID EnlistmentKey OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwPrePrepareEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwPrepareEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCommitEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollbackEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwPrePrepareComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwPrepareComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCommitComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwReadOnlyEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollbackComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSinglePhaseReject(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenKeyEx(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN ULONG OpenOptions);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenKeyTransactedEx(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN ULONG OpenOptions,
+  IN HANDLE TransactionHandle);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwNotifyChangeMultipleKeys(
+  IN HANDLE MasterKeyHandle,
+  IN ULONG Count OPTIONAL,
+  IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG CompletionFilter,
+  IN BOOLEAN WatchTree,
+  OUT PVOID Buffer OPTIONAL,
+  IN ULONG BufferSize,
+  IN BOOLEAN Asynchronous);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryMultipleValueKey(
+  IN HANDLE KeyHandle,
+  IN OUT PKEY_VALUE_ENTRY ValueEntries,
+  IN ULONG EntryCount,
+  OUT PVOID ValueBuffer,
+  IN OUT PULONG BufferLength,
+  OUT PULONG RequiredBufferLength OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwRenameKey(
+  IN HANDLE KeyHandle,
+  IN PUNICODE_STRING NewName);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationKey(
+  IN HANDLE KeyHandle,
+  IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
+  IN PVOID KeySetInformation,
+  IN ULONG KeySetInformationLength);
+
+#endif
+
+/******************************************************************************
+ *                          Unsorted                                          *
+ ******************************************************************************/
+
+/* GUID Comparison */
+#ifndef __IID_ALIGNED__
+#define __IID_ALIGNED__
+#ifdef __cplusplus
+inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
+{
+    return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && 
+             (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
+}
+#else
+#define IsEqualGUIDAligned(guid1, guid2) \
+           ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
+             (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
+#endif /* __cplusplus */
+#endif /* !__IID_ALIGNED__ */
+
+typedef enum {
+    LT_DONT_CARE,
+    LT_LOWEST_LATENCY
+} LATENCY_TIME;
+
+#define MAXIMUM_SUSPEND_COUNT             MAXCHAR
+
+#define MAXIMUM_FILENAME_LENGTH           256
+
+#define OBJ_NAME_PATH_SEPARATOR     ((WCHAR)L'\\')
+
+#define OBJECT_TYPE_CREATE (0x0001)
+#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
+
+#define DIRECTORY_QUERY (0x0001)
+#define DIRECTORY_TRAVERSE (0x0002)
+#define DIRECTORY_CREATE_OBJECT (0x0004)
+#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
+#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
+
+#define EVENT_QUERY_STATE (0x0001)
+#define EVENT_MODIFY_STATE (0x0002)
+#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
+
+#define SEMAPHORE_QUERY_STATE (0x0001)
+#define SEMAPHORE_MODIFY_STATE (0x0002)
+#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
+
+#define SYMBOLIC_LINK_QUERY               0x0001
+#define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
+
+#define DUPLICATE_CLOSE_SOURCE            0x00000001
+#define DUPLICATE_SAME_ACCESS             0x00000002
+#define DUPLICATE_SAME_ATTRIBUTES         0x00000004
+
+/* Global debug flag */
+extern ULONG NtGlobalFlag;
+
+/* Service Start Types */
+#define SERVICE_BOOT_START             0x00000000
+#define SERVICE_SYSTEM_START           0x00000001
+#define SERVICE_AUTO_START             0x00000002
+#define SERVICE_DEMAND_START           0x00000003
+#define SERVICE_DISABLED               0x00000004
+
+#ifndef _TRACEHANDLE_DEFINED
+#define _TRACEHANDLE_DEFINED
+typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
+#endif
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_WDMDDK_ */