Sync with trunk head (part 1 of 2)
authorAmine Khaldi <amine.khaldi@reactos.org>
Thu, 18 Mar 2010 15:37:13 +0000 (15:37 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Thu, 18 Mar 2010 15:37:13 +0000 (15:37 +0000)
svn path=/branches/header-work/; revision=46262

142 files changed:
1  2 
base/applications/dxdiag/dxdiag.c
base/applications/dxdiag/system.c
base/applications/rapps/rapps/firefox3.txt
base/applications/rapps/rapps/openoffice2.4.txt
base/applications/rapps/rapps/openoffice3.0.txt
base/applications/rapps/rapps/scite.txt
base/services/eventlog/eventlog.c
base/services/eventlog/eventlog.h
base/services/eventlog/rpc.c
baseaddress.rbuild
boot/bootdata/packages/reactos.dff
boot/freeldr/freeldr/windows/winldr.c
dll/directx/ksproxy/datatype.cpp
dll/directx/ksproxy/input_pin.cpp
dll/directx/ksproxy/interface.cpp
dll/directx/ksproxy/ksproxy.cpp
dll/directx/ksproxy/ksproxy.rbuild
dll/directx/ksproxy/node.cpp
dll/directx/ksproxy/output_pin.cpp
dll/directx/ksproxy/precomp.h
dll/directx/ksproxy/proxy.cpp
dll/directx/ksuser/ksuser.c
dll/win32/advapi32/reg/reg.c
dll/win32/advapi32/sec/sid.c
dll/win32/advapi32/service/eventlog.c
dll/win32/advapi32/service/scm.c
dll/win32/advapi32/service/sctrl.c
dll/win32/dbghelp/coff.c
dll/win32/dbghelp/cpu_i386.c
dll/win32/dbghelp/cpu_ppc.c
dll/win32/dbghelp/cpu_x86_64.c
dll/win32/dbghelp/crc32.c
dll/win32/dbghelp/dbghelp.c
dll/win32/dbghelp/dbghelp.rbuild
dll/win32/dbghelp/dbghelp_private.h
dll/win32/dbghelp/dwarf.c
dll/win32/dbghelp/dwarf.h
dll/win32/dbghelp/elf_module.c
dll/win32/dbghelp/macho_module.c
dll/win32/dbghelp/minidump.c
dll/win32/dbghelp/module.c
dll/win32/dbghelp/msc.c
dll/win32/dbghelp/path.c
dll/win32/dbghelp/pe_module.c
dll/win32/dbghelp/rosstubs.c
dll/win32/dbghelp/source.c
dll/win32/dbghelp/stabs.c
dll/win32/dbghelp/stack.c
dll/win32/dbghelp/storage.c
dll/win32/dbghelp/symbol.c
dll/win32/dbghelp/type.c
dll/win32/dbghelp/version.rc
dll/win32/faultrep/faultrep.c
dll/win32/faultrep/faultrep.rbuild
dll/win32/faultrep/faultrep.spec
dll/win32/kernel32/file/dir.c
dll/win32/kernel32/misc/profile.c
dll/win32/kernel32/misc/stubs.c
dll/win32/shell32/shell32_main.c
dll/win32/shell32/shellord.c
dll/win32/shell32/shlfileop.c
dll/win32/user32/windows/menu.c
dll/win32/win32.rbuild
dll/win32/wininet/cookie.c
dll/win32/wininet/dialogs.c
dll/win32/wininet/ftp.c
dll/win32/wininet/http.c
dll/win32/wininet/internet.c
dll/win32/wininet/internet.h
dll/win32/wininet/netconnection.c
dll/win32/wininet/resource.h
dll/win32/wininet/rsrc.rc
dll/win32/wininet/urlcache.c
dll/win32/wininet/utility.c
dll/win32/wininet/wininet.rbuild
dll/win32/wininet/wininet.spec
dll/win32/wininet/wininet_Bg.rc
dll/win32/wininet/wininet_Cs.rc
dll/win32/wininet/wininet_Da.rc
dll/win32/wininet/wininet_De.rc
dll/win32/wininet/wininet_En.rc
dll/win32/wininet/wininet_Eo.rc
dll/win32/wininet/wininet_Es.rc
dll/win32/wininet/wininet_Fi.rc
dll/win32/wininet/wininet_Fr.rc
dll/win32/wininet/wininet_Hu.rc
dll/win32/wininet/wininet_It.rc
dll/win32/wininet/wininet_Ja.rc
dll/win32/wininet/wininet_Ko.rc
dll/win32/wininet/wininet_Lt.rc
dll/win32/wininet/wininet_Nl.rc
dll/win32/wininet/wininet_No.rc
dll/win32/wininet/wininet_Pl.rc
dll/win32/wininet/wininet_Pt.rc
dll/win32/wininet/wininet_Ro.rc
dll/win32/wininet/wininet_Ru.rc
dll/win32/wininet/wininet_Si.rc
dll/win32/wininet/wininet_Sv.rc
dll/win32/wininet/wininet_Tr.rc
dll/win32/wininet/wininet_Uk.rc
dll/win32/wininet/wininet_Zh.rc
drivers/bus/acpi/acpi.rbuild
drivers/bus/acpi/acpica/acpica.rbuild
drivers/bus/acpi/acpica/events/evgpe.c
drivers/bus/acpi/acpienum.c
drivers/bus/acpi/busmgr/bus.c
drivers/bus/acpi/busmgr/power.c
drivers/bus/acpi/busmgr/system.c
drivers/bus/acpi/busmgr/utils.c
drivers/bus/acpi/buspdo.c
drivers/bus/acpi/cmbatt/cmbatt.c
drivers/bus/acpi/cmbatt/cmbatt.h
drivers/bus/acpi/cmbatt/cmbatt.rbuild
drivers/bus/acpi/cmbatt/cmbatt.rc
drivers/bus/acpi/cmbatt/cmbpnp.c
drivers/bus/acpi/cmbatt/cmbwmi.c
drivers/bus/acpi/cmbatt/cmexec.c
drivers/bus/acpi/main.c
drivers/bus/acpi/osl.c
drivers/bus/acpi/pnp.c
drivers/bus/acpi/power.c
drivers/storage/port/buslogic/BusLogic958.c
drivers/storage/port/buslogic/buslogic.rbuild
drivers/video/font/ftfd/freetype.def
include/ddk/wdm.h
include/dxsdk/axextend.idl
include/psdk/ks.h
include/psdk/winternl.h
include/reactos/wine/mscvpdb.h
include/xdk/iotypes.h
lib/3rdparty/freetype/src/base/ftbitmap.c
ntoskrnl/include/internal/i386/asmmacro.S
ntoskrnl/include/internal/trap_x.h
ntoskrnl/io/iomgr/driver.c
ntoskrnl/io/iomgr/drvrlist.c
ntoskrnl/io/pnpmgr/pnpmgr.c
ntoskrnl/ke/i386/cpu.c
ntoskrnl/ke/i386/trap.s
ntoskrnl/ke/i386/traphdlr.c
subsystems/win32/csrss/csrsrv/init.c
subsystems/win32/win32k/eng/surface.c
subsystems/win32/win32k/objects/freetype.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,d2686bb..d2686bb
mode 000000,100644..100644
--- /dev/null
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,f3de652..f3de652
mode 000000,100644..100644
--- /dev/null
index 0000000,fca5ec7..fca5ec7
mode 000000,100644..100644
--- /dev/null
index 0000000,cd0e32c..cd0e32c
mode 000000,100644..100644
--- /dev/null
index 0000000,edd42ea..edd42ea
mode 000000,100644..100644
--- /dev/null
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,379596b..379596b
mode 000000,100644..100644
--- /dev/null
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,1818010..1818010
mode 000000,100644..100644
--- /dev/null
index 0000000,d4bd713..d4bd713
mode 000000,100644..100644
--- /dev/null
index 0000000,77e543f..77e543f
mode 000000,100644..100644
--- /dev/null
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,cd4bf48..cd4bf48
mode 000000,100644..100644
--- /dev/null
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,1957597..1957597
mode 000000,100644..100644
--- /dev/null
index 0000000,0443c4c..0443c4c
mode 000000,100644..100644
--- /dev/null
index 0000000,d1542f9..d1542f9
mode 000000,100644..100644
--- /dev/null
index 0000000,fee3ec8..fee3ec8
mode 000000,100644..100644
--- /dev/null
index 0000000,848c920..848c920
mode 000000,100644..100644
--- /dev/null
index 0000000,a41865c..a41865c
mode 000000,100644..100644
--- /dev/null
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 36ff1c3,0000000..0a75b5e
mode 100644,000000..100644
--- /dev/null
@@@ -1,11901 -1,0 +1,11966 @@@
 +/*
 + * 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>
 +#include <ntiologc.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 _ADAPTER_OBJECT *PADAPTER_OBJECT; 
 +typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
 +typedef struct _EPROCESS *PEPROCESS;
 +typedef struct _ETHREAD *PETHREAD;
 +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_ */
 +
 +/* MS definition is broken! */
 +extern BOOLEAN NTSYSAPI NlsMbCodePageTag;
 +extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag;
 +#define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
 +#define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
 +
 +/******************************************************************************
 + *                              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_CAPABILITIES_HEADER {
 +  UCHAR CapabilityID;
 +  UCHAR Next;
 +} PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
 +
 +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;
 +
 +typedef enum _IO_PRIORITY_HINT {
 +  IoPriorityVeryLow = 0,
 +  IoPriorityLow,
 +  IoPriorityNormal,
 +  IoPriorityHigh,
 +  IoPriorityCritical,
 +  MaxIoPriorityTypes
 +} IO_PRIORITY_HINT;
 +
 +#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 METHOD_FROM_CTL_CODE(ctrlCode)          ((ULONG)(ctrlCode & 3))
 +
 +#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;
 +
++typedef BOOLEAN
++(*PGPE_SERVICE_ROUTINE2)(
++  PVOID ObjectContext,
++  PVOID ServiceContext);
++
++typedef NTSTATUS
++(*PGPE_CONNECT_VECTOR2)(
++  PVOID Context,
++  ULONG GpeNumber,
++  KINTERRUPT_MODE Mode,
++  BOOLEAN Shareable,
++  PGPE_SERVICE_ROUTINE2 ServiceRoutine,
++  PVOID ServiceContext,
++  PVOID *ObjectContext);
++
++typedef NTSTATUS
++(*PGPE_DISCONNECT_VECTOR2)(
++  PVOID Context,
++  PVOID ObjectContext);
++
++typedef NTSTATUS
++(*PGPE_ENABLE_EVENT2)(
++  PVOID Context,
++  PVOID ObjectContext);
++
++typedef NTSTATUS
++(*PGPE_DISABLE_EVENT2)(
++  PVOID Context,
++  PVOID ObjectContext);
++
++typedef NTSTATUS
++(*PGPE_CLEAR_STATUS2)(
++  PVOID Context,
++  PVOID ObjectContext);
++
++typedef VOID
++(*PDEVICE_NOTIFY_CALLBACK2)(
++  PVOID NotificationContext,
++  ULONG NotifyCode);
++
++typedef NTSTATUS
++(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
++  PVOID Context,
++  PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
++  PVOID NotificationContext);
++
++typedef VOID
++(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
++  PVOID Context);
++
++typedef struct _ACPI_INTERFACE_STANDARD2 {
++  USHORT Size;
++  USHORT Version;
++  PVOID Context;
++  PINTERFACE_REFERENCE InterfaceReference;
++  PINTERFACE_DEREFERENCE InterfaceDereference;
++  PGPE_CONNECT_VECTOR2 GpeConnectVector;
++  PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
++  PGPE_ENABLE_EVENT2 GpeEnableEvent;
++  PGPE_DISABLE_EVENT2 GpeDisableEvent;
++  PGPE_CLEAR_STATUS2 GpeClearStatus;
++  PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
++  PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
++} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
++
 +#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 METHOD_DIRECT_TO_HARDWARE       METHOD_IN_DIRECT
 +#define METHOD_DIRECT_FROM_HARDWARE     METHOD_OUT_DIRECT
 +
 +#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
 +
 +/* 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
 +
 +
 +#if defined(_M_IX86)
 +/** 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)
 +
 +
 +
 +#elif defined(_M_AMD64)
 +/** Kernel definitions for AMD64 **/
 +
 +/* Interrupt request levels */
 +#define PASSIVE_LEVEL           0
 +#define LOW_LEVEL               0
 +#define APC_LEVEL               1
 +#define DISPATCH_LEVEL          2
 +#define CMCI_LEVEL              5
 +#define CLOCK_LEVEL             13
 +#define IPI_LEVEL               14
 +#define DRS_LEVEL               14
 +#define POWER_LEVEL             14
 +#define PROFILE_LEVEL           15
 +#define HIGH_LEVEL              15
 +
 +#define PAGE_SIZE               0x1000
 +#define PAGE_SHIFT              12L
 +
 +#define KI_USER_SHARED_DATA     0xFFFFF78000000000UI64
 +#define SharedUserData          ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
 +
 +
 +typedef struct _KFLOATING_SAVE {
 +  ULONG Dummy;
 +} KFLOATING_SAVE, *PKFLOATING_SAVE;
 +
 +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
 +
 +#define KeQueryInterruptTime() \
 +    (*(volatile ULONG64*)SharedInterruptTime)
 +
 +#define KeQuerySystemTime(CurrentCount) \
 +    *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
 +
 +#define KeQueryTickCount(CurrentCount) \
 +    *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
 +
 +#define KeGetDcacheFillSize() 1L
 +
 +#define YieldProcessor _mm_pause
 +
 +FORCEINLINE
 +KIRQL
 +KeGetCurrentIrql(VOID)
 +{
 +    return (KIRQL)__readcr8();
 +}
 +
 +FORCEINLINE
 +VOID
 +KeLowerIrql(IN KIRQL NewIrql)
 +{
 +    ASSERT(KeGetCurrentIrql() >= NewIrql);
 +    __writecr8(NewIrql);
 +}
 +
 +FORCEINLINE
 +KIRQL
 +KfRaiseIrql(IN KIRQL NewIrql)
 +{
 +    KIRQL OldIrql;
 +
 +    OldIrql = __readcr8();
 +    ASSERT(OldIrql <= NewIrql);
 +    __writecr8(NewIrql);
 +    return OldIrql;
 +}
 +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
 +
 +FORCEINLINE
 +KIRQL
 +KeRaiseIrqlToDpcLevel(VOID)
 +{
 +    return KfRaiseIrql(DISPATCH_LEVEL);
 +}
 +
 +FORCEINLINE
 +KIRQL
 +KeRaiseIrqlToSynchLevel(VOID)
 +{
 +    return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
 +}
 +
 +FORCEINLINE
 +PKTHREAD
 +KeGetCurrentThread (
 +  VOID)
 +{
 +    return (struct _KTHREAD *)__readgsqword(0x188);
 +}
 +
 +/* x86 and x64 performs a 0x2C interrupt */
 +#define DbgRaiseAssertionFailure __int2c
 +
 +#elif defined(_M_IA64)
 +/** Kernel definitions for IA64 **/
 +
 +/* Interrupt request levels */
 +#define PASSIVE_LEVEL           0
 +#define LOW_LEVEL               0
 +#define APC_LEVEL               1
 +#define DISPATCH_LEVEL          2
 +#define CMC_LEVEL               3
 +#define DEVICE_LEVEL_BASE       4
 +#define PC_LEVEL                12
 +#define IPI_LEVEL               14
 +#define DRS_LEVEL               14
 +#define CLOCK_LEVEL             13
 +#define POWER_LEVEL             15
 +#define PROFILE_LEVEL           15
 +#define HIGH_LEVEL              15
 +
 +#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
 +extern volatile LARGE_INTEGER KeTickCount;
 +
 +FORCEINLINE
 +VOID
 +KeFlushWriteBuffer(VOID)
 +{
 +  __mf ();
 +  return;
 +}
 +
 +NTSYSAPI
 +PKTHREAD
 +NTAPI
 +KeGetCurrentThread(
 +  VOID);
 +
 +
 +#elif defined(_M_PPC)
 +
 +/* Interrupt request levels */
 +#define PASSIVE_LEVEL                      0
 +#define LOW_LEVEL                          0
 +#define APC_LEVEL                          1
 +#define DISPATCH_LEVEL                     2
 +#define PROFILE_LEVEL                     27
 +#define CLOCK1_LEVEL                      28
 +#define CLOCK2_LEVEL                      28
 +#define IPI_LEVEL                         29
 +#define POWER_LEVEL                       30
 +#define HIGH_LEVEL                        31
 +
 +//
 +// Used to contain PFNs and PFN counts
 +//
 +typedef ULONG PFN_COUNT;
 +typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
 +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
 +
 +
 +typedef struct _KFLOATING_SAVE {
 +  ULONG Dummy;
 +} KFLOATING_SAVE, *PKFLOATING_SAVE;
 +
 +typedef struct _KPCR_TIB {
 +  PVOID  ExceptionList;         /* 00 */
 +  PVOID  StackBase;             /* 04 */
 +  PVOID  StackLimit;            /* 08 */
 +  PVOID  SubSystemTib;          /* 0C */
 +  _ANONYMOUS_UNION union {
 +    PVOID  FiberData;           /* 10 */
 +    ULONG  Version;             /* 10 */
 +  } DUMMYUNIONNAME;
 +  PVOID  ArbitraryUserPointer;  /* 14 */
 +  struct _KPCR_TIB *Self;       /* 18 */
 +} KPCR_TIB, *PKPCR_TIB;         /* 1C */
 +
 +#define PCR_MINOR_VERSION 1
 +#define PCR_MAJOR_VERSION 1
 +
 +typedef struct _KPCR {
 +  KPCR_TIB  Tib;                /* 00 */
 +  struct _KPCR  *Self;          /* 1C */
 +  struct _KPRCB  *Prcb;         /* 20 */
 +  KIRQL  Irql;                  /* 24 */
 +  ULONG  IRR;                   /* 28 */
 +  ULONG  IrrActive;             /* 2C */
 +  ULONG  IDR;                   /* 30 */
 +  PVOID  KdVersionBlock;        /* 34 */
 +  PUSHORT  IDT;                 /* 38 */
 +  PUSHORT  GDT;                 /* 3C */
 +  struct _KTSS  *TSS;           /* 40 */
 +  USHORT  MajorVersion;         /* 44 */
 +  USHORT  MinorVersion;         /* 46 */
 +  KAFFINITY  SetMember;         /* 48 */
 +  ULONG  StallScaleFactor;      /* 4C */
 +  UCHAR  SpareUnused;           /* 50 */
 +  UCHAR  Number;                /* 51 */
 +} KPCR, *PKPCR;                 /* 54 */
 +
 +#define KeGetPcr()                      PCR
 +
 +#define YieldProcessor() __asm__ __volatile__("nop");
 +
 +FORCEINLINE
 +ULONG
 +DDKAPI
 +KeGetCurrentProcessorNumber(VOID)
 +{
 +    ULONG Number;
 +  __asm__ __volatile__ (
 +    "lwz %0, %c1(12)\n"
 +    : "=r" (Number)
 +    : "i" (FIELD_OFFSET(KPCR, Number))
 +  );
 +  return Number;
 +}
 +
 +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);
 +
 +
 +
 +#elif defined(_M_MIPS)
 +#error MIPS Headers are totally incorrect
 +
 +//
 +// Used to contain PFNs and PFN counts
 +//
 +typedef ULONG PFN_COUNT;
 +typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
 +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
 +
 +#define PASSIVE_LEVEL                      0
 +#define APC_LEVEL                          1
 +#define DISPATCH_LEVEL                     2
 +#define PROFILE_LEVEL                     27
 +#define IPI_LEVEL                         29
 +#define HIGH_LEVEL                        31
 +
 +typedef struct _KPCR {
 +    struct _KPRCB  *Prcb;         /* 20 */
 +    KIRQL  Irql;                  /* 24 */
 +    ULONG  IRR;                   /* 28 */
 +    ULONG  IDR;                   /* 30 */
 +} KPCR, *PKPCR;
 +
 +#define KeGetPcr()                      PCR
 +
 +typedef struct _KFLOATING_SAVE {
 +} KFLOATING_SAVE, *PKFLOATING_SAVE;
 +
 +static __inline
 +ULONG
 +DDKAPI
 +KeGetCurrentProcessorNumber(VOID)
 +{
 +    return 0;
 +}
 +
 +#define YieldProcessor() __asm__ __volatile__("nop");
 +
 +#define KeLowerIrql(a) KfLowerIrql(a)
 +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
 +
 +NTKERNELAPI
 +VOID
 +NTAPI
 +KfLowerIrql(
 +  IN KIRQL  NewIrql);
 +
 +NTKERNELAPI
 +KIRQL
 +NTAPI
 +KfRaiseIrql(
 +  IN KIRQL  NewIrql);
 +
 +NTKERNELAPI
 +KIRQL
 +NTAPI
 +KeRaiseIrqlToDpcLevel(
 +  VOID);
 +
 +NTKERNELAPI
 +KIRQL
 +DDKAPI
 +KeRaiseIrqlToSynchLevel(
 +    VOID);
 +
 +
 +#elif defined(_M_ARM)
 +#include <armddk.h>
 +#else
 +#error Unknown Architecture
 +#endif
 +
 +/******************************************************************************
 + *                         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 PIR