Merge trunk HEAD (r46369)
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 24 Mar 2010 00:03:54 +0000 (00:03 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 24 Mar 2010 00:03:54 +0000 (00:03 +0000)
(part 6/6)

svn path=/branches/ros-amd64-bringup/; revision=46380

90 files changed:
1  2 
reactos/Makefile
reactos/ReactOS-i386.rbuild
reactos/base/setup/usetup/inffile.h
reactos/base/setup/usetup/usetup.h
reactos/boot/freeldr/freeldr/debug.c
reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
reactos/boot/freeldr/freeldr/windows/peloader.c
reactos/boot/freeldr/freeldr/windows/winldr.c
reactos/dll/ntdll/ldr/utils.c
reactos/drivers/base/bootvid/i386/bootvid.c
reactos/drivers/base/kdcom/i386/kdbg.c
reactos/drivers/bus/acpi/acpi.rbuild
reactos/drivers/bus/acpi/acpi.rc
reactos/drivers/network/dd/ne2000/include/ne2000.h
reactos/drivers/storage/floppy/floppy.c
reactos/drivers/storage/ide/uniata/id_ata.cpp
reactos/drivers/storage/ide/uniata/id_probe.cpp
reactos/drivers/video/videoprt/int10.c
reactos/drivers/video/videoprt/videoprt.c
reactos/drivers/video/videoprt/videoprt.spec
reactos/drivers/wdm/audio/legacy/wdmaud/control.c
reactos/drivers/wdm/audio/legacy/wdmaud/entry.c
reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
reactos/hal/halx86/generic/misc.c
reactos/hal/halx86/generic/timer.c
reactos/hal/halx86/hal_generic.rbuild
reactos/hal/halx86/hal_generic_mp.rbuild
reactos/hal/halx86/hal_generic_up.rbuild
reactos/hal/halx86/halmps.rbuild
reactos/hal/halx86/include/hal.h
reactos/hal/halx86/include/halp.h
reactos/hal/halx86/mp/apic.c
reactos/include/crt/_mingw.h
reactos/include/crt/math.h
reactos/include/crt/setjmp.h
reactos/include/crt/stdio.h
reactos/include/crt/tchar.h
reactos/include/crt/time.h
reactos/include/crt/vadefs.h
reactos/include/crt/wchar.h
reactos/include/ddk/wdm.h
reactos/include/ndk/i386/ketypes.h
reactos/include/ndk/rtlfuncs.h
reactos/include/psdk/windef.h
reactos/include/psdk/wingdi.h
reactos/include/psdk/winnt.h
reactos/include/psdk/winuser.h
reactos/include/reactos/win32k/ntuser.h
reactos/lib/inflib/infpriv.h
reactos/lib/inflib/infros.h
reactos/lib/rtl/actctx.c
reactos/lib/sdk/crt/crt.rbuild
reactos/lib/sdk/crt/libcntpr.rbuild
reactos/lib/sdk/crt/stdio/file.c
reactos/lib/tdilib/tdilib.rbuild
reactos/ntoskrnl/include/internal/arch/intrin_i.h
reactos/ntoskrnl/include/internal/arch/ke.h
reactos/ntoskrnl/include/internal/arch/mm.h
reactos/ntoskrnl/include/internal/arm/mm.h
reactos/ntoskrnl/include/internal/i386/mm.h
reactos/ntoskrnl/include/internal/ke.h
reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/include/internal/ntoskrnl.h
reactos/ntoskrnl/io/iomgr/irp.c
reactos/ntoskrnl/kdbg/kdb.h
reactos/ntoskrnl/ke/except.c
reactos/ntoskrnl/ke/i386/cpu.c
reactos/ntoskrnl/mm/ARM3/hypermap.c
reactos/ntoskrnl/mm/ARM3/iosup.c
reactos/ntoskrnl/mm/ARM3/mdlsup.c
reactos/ntoskrnl/mm/ARM3/miarm.h
reactos/ntoskrnl/mm/ARM3/mmsup.c
reactos/ntoskrnl/mm/ARM3/ncache.c
reactos/ntoskrnl/mm/ARM3/pagfault.c
reactos/ntoskrnl/mm/ARM3/procsup.c
reactos/ntoskrnl/mm/anonmem.c
reactos/ntoskrnl/mm/balance.c
reactos/ntoskrnl/mm/freelist.c
reactos/ntoskrnl/mm/i386/page.c
reactos/ntoskrnl/mm/mmdbg.c
reactos/ntoskrnl/mm/mmfault.c
reactos/ntoskrnl/mm/mminit.c
reactos/ntoskrnl/mm/rmap.c
reactos/ntoskrnl/mm/section.c
reactos/ntoskrnl/mm/sysldr.c
reactos/ntoskrnl/ntoskrnl-generic.rbuild
reactos/ntoskrnl/ntoskrnl.pspec
reactos/subsystems/win32/win32k/include/msgqueue.h
reactos/subsystems/win32/win32k/ntuser/message.c
reactos/tools/rsym/rsym64.h

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -253,13 -261,10 +261,13 @@@ WinLdrLoadDeviceDriver(PLOADER_PARAMETE
        }
  
        // It's not loaded, we have to load it
-       sprintf(FullPath,"%s%S", BootPath, FilePath->Buffer);
+       snprintf(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath);
        Status = WinLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase);
        if (!Status)
 +      {
 +              DPRINTM(DPRINT_WINDOWS, "WinLdrLoadImage() failed\n");
                return FALSE;
 +      }
  
        // Allocate a DTE for it
        Status = WinLdrAllocateDataTableEntry(LoaderBlock, DllName, DllName, DriverBase, DriverDTE);
@@@ -587,10 -592,8 +596,10 @@@ LoadAndBootWindows(PCSTR OperatingSyste
        /* Turn on paging mode of CPU*/
        WinLdrTurnOnPaging(LoaderBlock, PcrBasePage, TssBasePage, GdtIdt);
  
 +DbgPrint("Heeelooo\n");
 +
        /* Save final value of LoaderPagesSpanned */
-       LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
+       LoaderBlockVA->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
  
        DPRINTM(DPRINT_WINDOWS, "Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
                KiSystemStartup, LoaderBlockVA);
Simple merge
diff --cc reactos/drivers/bus/acpi/acpi.rbuild
index 94b960a,4b9ec86..0000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,142 -1,34 +1,0 @@@
--<?xml version="1.0"?>
--<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
- <module name="acpi" type="kernelmodedriver" installbase="system32/drivers" installname="acpi.sys">
 -<group xmlns:xi="http://www.w3.org/2001/XInclude">
 -<directory name="acpica">
 -      <xi:include href="acpica/acpica.rbuild" />
 -</directory>
 -<directory name="cmbatt">
 -      <xi:include href="cmbatt/cmbatt.rbuild" />
 -</directory>
 -</group>
 -
 -<module name="acpi" type="kernelmodedriver" installbase="system32/drivers" installname="acpi.sys" allowwarnings="true">
--      <bootstrap installbase="$(CDOUTPUT)" />
--      <include base="acpi">include</include>
-       <include base="acpi">ospm/include</include>
 -      <include base="acpica">include</include>
--      <library>ntoskrnl</library>
--      <library>hal</library>
-       <directory name="dispatcher">
-               <file>dsfield.c</file>
-               <file>dsmethod.c</file>
-               <file>dsmthdat.c</file>
-               <file>dsobject.c</file>
-               <file>dsopcode.c</file>
-               <file>dsutils.c</file>
-               <file>dswexec.c</file>
-               <file>dswload.c</file>
-               <file>dswscope.c</file>
-               <file>dswstate.c</file>
-       </directory>
-       <directory name="events">
-               <file>evevent.c</file>
-               <file>evmisc.c</file>
-               <file>evregion.c</file>
-               <file>evrgnini.c</file>
-               <file>evsci.c</file>
-               <file>evxface.c</file>
-               <file>evxfevnt.c</file>
-               <file>evxfregn.c</file>
-       </directory>
-       <directory name="executer">
-               <file>amconfig.c</file>
-               <file>amconvrt.c</file>
-               <file>amcreate.c</file>
-               <file>amdump.c</file>
-               <file>amdyadic.c</file>
-               <file>amfield.c</file>
-               <file>amfldio.c</file>
-               <file>ammisc.c</file>
-               <file>ammonad.c</file>
-               <file>ammutex.c</file>
-               <file>amnames.c</file>
-               <file>amprep.c</file>
-               <file>amregion.c</file>
-               <file>amresnte.c</file>
-               <file>amresolv.c</file>
-               <file>amresop.c</file>
-               <file>amstore.c</file>
-               <file>amstoren.c</file>
-               <file>amstorob.c</file>
-               <file>amsystem.c</file>
-               <file>amutils.c</file>
-               <file>amxface.c</file>
-       </directory>
-       <directory name="hardware">
-               <file>hwacpi.c</file>
-               <file>hwgpe.c</file>
-               <file>hwregs.c</file>
-               <file>hwsleep.c</file>
-               <file>hwtimer.c</file>
-       </directory>
-       <directory name="namespace">
-               <file>nsaccess.c</file>
-               <file>nsalloc.c</file>
-               <file>nseval.c</file>
-               <file>nsinit.c</file>
-               <file>nsload.c</file>
-               <file>nsnames.c</file>
-               <file>nsobject.c</file>
-               <file>nssearch.c</file>
-               <file>nsutils.c</file>
-               <file>nswalk.c</file>
-               <file>nsxfname.c</file>
-               <file>nsxfobj.c</file>
-       </directory>
-       <directory name="ospm">
-               <directory name="busmgr">
-                       <file>bm.c</file>
-                       <file>bmnotify.c</file>
-                       <file>bmpm.c</file>
-                       <file>bmpower.c</file>
-                       <file>bmrequest.c</file>
-                       <file>bmsearch.c</file>
-                       <file>bmutils.c</file>
-                       <file>bmxface.c</file>
-               </directory>
-               <file>acpienum.c</file>
-               <file>acpisys.c</file>
-               <file>bn.c</file>
-               <file>fdo.c</file>
-               <file>osl.c</file>
-               <file>pdo.c</file>
-       </directory>
-       <directory name="parser">
-               <file>psargs.c</file>
-               <file>psopcode.c</file>
-               <file>psparse.c</file>
-               <file>psscope.c</file>
-               <file>pstree.c</file>
-               <file>psutils.c</file>
-               <file>pswalk.c</file>
-               <file>psxface.c</file>
-       </directory>
-       <directory name="resource">
-               <file>rsaddr.c</file>
-               <file>rscalc.c</file>
-               <file>rscreate.c</file>
-               <file>rsdump.c</file>
-               <file>rsio.c</file>
-               <file>rsirq.c</file>
-               <file>rslist.c</file>
-               <file>rsmemory.c</file>
-               <file>rsmisc.c</file>
-               <file>rsutils.c</file>
-               <file>rsxface.c</file>
-       </directory>
-       <directory name="tables">
-               <file>tbconvrt.c</file>
-               <file>tbget.c</file>
-               <file>tbinstal.c</file>
-               <file>tbutils.c</file>
-               <file>tbxface.c</file>
-               <file>tbxfroot.c</file>
-       </directory>
-       <directory name="utils">
-               <file>cmalloc.c</file>
-               <file>cmclib.c</file>
-               <file>cmcopy.c</file>
-               <file>cmdebug.c</file>
-               <file>cmdelete.c</file>
-               <file>cmeval.c</file>
-               <file>cmglobal.c</file>
-               <file>cminit.c</file>
-               <file>cmobject.c</file>
-               <file>cmutils.c</file>
-               <file>cmxface.c</file>
-       </directory>
-       <file>acpi.rc</file>
-       <directory name="include">
-               <pch>acpi.h</pch>
 -      <library>wdmguid</library>
 -      <library>acpica</library>
 -      <directory name="busmgr">
 -              <file>bus.c</file>
 -              <file>button.c</file>
 -              <file>power.c</file>
 -              <file>utils.c</file>
 -              <file>system.c</file>
--      </directory>
 -      <file>osl.c</file>
 -      <file>acpienum.c</file>
 -      <file>interface.c</file>
 -      <file>pnp.c</file>
 -      <file>power.c</file>
 -      <file>buspdo.c</file>
 -      <file>main.c</file>
--</module>
diff --cc reactos/drivers/bus/acpi/acpi.rc
index 41b0006,7a46694..0000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,7 -1,7 +1,0 @@@
- /* $Id$ */
 -/* $Id: acpi.rc 21698 2006-04-22 05:55:17Z tretiakov $ */
--
--#define REACTOS_VERSION_DLL
--#define REACTOS_STR_FILE_DESCRIPTION  "ReactOS ACPI Driver\0"
--#define REACTOS_STR_INTERNAL_NAME     "acpi\0"
--#define REACTOS_STR_ORIGINAL_FILENAME "acpi.sys\0"
--#include <reactos/version.rc>
@@@ -188,9 -187,9 +188,10 @@@ IntInt10CallBios
  
      /* Detach and return status */
      IntDetachFromCSRSS(&CallingProcess, &ApcState);
-     return Status;
+     if (NT_SUCCESS(Status)) return NO_ERROR;
+     return ERROR_INVALID_PARAMETER;
  }
 +#endif
  
  /* PUBLIC FUNCTIONS ***********************************************************/
  
@@@ -243,11 -241,6 +244,11 @@@ VideoPortInt10
  
      /* Detach from CSRSS */
      IntDetachFromCSRSS(&CallingProcess, &ApcState);
-     return Status;
+     if (NT_SUCCESS(Status)) return NO_ERROR;
+     return ERROR_INVALID_PARAMETER;
 +#else
 +    /* Not implemented for anything else than X86*/
 +    DPRINT1("Int10 not available on non-x86!\n");
 +    return ERROR_INVALID_FUNCTION;
 +#endif
  }
@@@ -52,8 -47,8 +52,9 @@@
  @ fastcall VideoPortInterlockedDecrement(ptr) NTOSKRNL.InterlockedDecrement
  @ fastcall VideoPortInterlockedExchange(ptr long) NTOSKRNL.InterlockedExchange
  @ fastcall VideoPortInterlockedIncrement(ptr) NTOSKRNL.InterlockedIncrement
+ @ stdcall VideoPortIsNoVesa()
  @ stdcall VideoPortLockBuffer(ptr ptr long long)
 +;VideoPortIsNoVesa // 2003 and later
  @ stdcall VideoPortLockPages(ptr ptr ptr ptr long)
  @ stdcall VideoPortLogError(ptr ptr long long)
  @ stdcall VideoPortMapBankedMemory(ptr long long ptr ptr ptr long long ptr ptr)
Simple merge
@@@ -109,7 -109,7 +109,8 @@@ HalpInitializeClock(VOID
      HalpCurrentRollOver = RollOver;
  }
  
 +#ifdef _M_IX86
+ #ifndef _MINIHAL_
  VOID
  FASTCALL
  HalpClockInterruptHandler(IN PKTRAP_FRAME TrapFrame)
@@@ -161,10 -161,8 +162,9 @@@ HalpProfileInterruptHandler(IN PKTRAP_F
      /* Spurious, just end the interrupt */
      KiEoiHelper(TrapFrame);
  }
+ #endif
  
- KiTrap(HalpClockInterrupt,   KI_PUSH_FAKE_ERROR_CODE);
- KiTrap(HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE);
 +#endif
  
  /* PUBLIC FUNCTIONS ***********************************************************/
  
                        <file>profil.c</file>
                        <file>reboot.c</file>
                        <file>sysinfo.c</file>
 -                      <file>systimer.S</file>
                        <file>timer.c</file>
 -                      <file>trap.S</file>
 -                      <file>usage.c</file>
 +                      <if property="ARCH" value="i386">
 +                              <file>bios.c</file>
 +                              <file>halinit.c</file>
 +                              <file>misc.c</file>
 +                              <file>pic.c</file>
++                              <file>trap.S</file>
 +                              <file>usage.c</file>
 +                              <directory name="i386">
 +                                      <file>portio.c</file>
 +                                      <file>systimer.S</file>
 +                                      <file>v86.s</file>
 +                              </directory>
 +                      </if>
 +                      <if property="ARCH" value="amd64">
 +                              <directory name="amd64">
 +                                      <file>halinit.c</file>
 +                                      <file>irq.S</file>
 +                                      <file>misc.c</file>
 +                                      <file>apic.c</file>
 +                                      <file>systimer.S</file>
 +                                      <file>usage.c</file>
 +                              </directory>
 +                      </if>
                </directory>
 +              <if property="ARCH" value="amd64">
 +                      <directory name="mp">
 +                              <file>apic.c</file>
 +                      </directory>
 +              </if>
                <directory name="include">
                        <pch>hal.h</pch>
                </directory>
@@@ -4,11 -4,9 +4,12 @@@
        <module name="hal_generic_mp" type="objectlibrary">
                <include>include</include>
                <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <define name="CONFIG_SMP" />
 +              <directory name="generic">
 +                      <file>spinlock.c</file>
 +              </directory>
                <directory name="mp">
                        <file>apic.c</file>
                        <file>halinit_mp.c</file>
@@@ -4,15 -4,12 +4,16 @@@
        <module name="hal_generic_up" type="objectlibrary">
                <include>include</include>
                <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <directory name="generic">
 -                      <file>pic.c</file>
 -                      <file>processor.c</file>
                        <file>spinlock.c</file>
                </directory>
 +              <directory name="up">
 +                      <file>processor.c</file>
 +                      <if property="ARCH" value="i386">
 +                              <file>irq.S</file>
 +                      </if>
 +              </directory>
        </module>
  </group>
                <library>hal_generic</library>
                <library>hal_generic_mp</library>
                <library>ntoskrnl</library>
+               <library>libcntpr</library>
                <directory name="mp">
 -                      <file>mps.S</file>
 -                      <file>mpsboot.asm</file>
                        <file>mpsirql.c</file>
 -
 +                      <directory name="i386">
 +                              <file>mps.S</file>
 +                              <file>mpsboot.asm</file>
 +                      </directory>
                </directory>
        </module>
  </group>
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -36,12 -32,10 +36,12 @@@ extern "C" 
      unsigned long UnwindFunc;
      unsigned long UnwindData[6];
    } _JUMP_BUFFER;
 +
  #elif defined(__ia64__)
 +
    typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
-     __int64 LowPart;
-     __int64 HighPart;
+     __MINGW_EXTENSION __int64 LowPart;
+     __MINGW_EXTENSION __int64 HighPart;
    } SETJMP_FLOAT128;
  
  #define _JBLEN 33
      SETJMP_FLOAT128 FltS17;
      SETJMP_FLOAT128 FltS18;
      SETJMP_FLOAT128 FltS19;
-     __int64 FPSR;
-     __int64 StIIP;
-     __int64 BrS0;
-     __int64 BrS1;
-     __int64 BrS2;
-     __int64 BrS3;
-     __int64 BrS4;
-     __int64 IntS0;
-     __int64 IntS1;
-     __int64 IntS2;
-     __int64 IntS3;
-     __int64 RsBSP;
-     __int64 RsPFS;
-     __int64 ApUNAT;
-     __int64 ApLC;
-     __int64 IntSp;
-     __int64 IntNats;
-     __int64 Preds;
+     __MINGW_EXTENSION __int64 FPSR;
+     __MINGW_EXTENSION __int64 StIIP;
+     __MINGW_EXTENSION __int64 BrS0;
+     __MINGW_EXTENSION __int64 BrS1;
+     __MINGW_EXTENSION __int64 BrS2;
+     __MINGW_EXTENSION __int64 BrS3;
+     __MINGW_EXTENSION __int64 BrS4;
+     __MINGW_EXTENSION __int64 IntS0;
+     __MINGW_EXTENSION __int64 IntS1;
+     __MINGW_EXTENSION __int64 IntS2;
+     __MINGW_EXTENSION __int64 IntS3;
+     __MINGW_EXTENSION __int64 RsBSP;
+     __MINGW_EXTENSION __int64 RsPFS;
+     __MINGW_EXTENSION __int64 ApUNAT;
+     __MINGW_EXTENSION __int64 ApLC;
+     __MINGW_EXTENSION __int64 IntSp;
+     __MINGW_EXTENSION __int64 IntNats;
+     __MINGW_EXTENSION __int64 Preds;
  
    } _JUMP_BUFFER;
 +
  #elif defined(__x86_64)
 +
    typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
-     unsigned __int64 Part[2];
+     __MINGW_EXTENSION unsigned __int64 Part[2];
    } SETJMP_FLOAT128;
  
  #define _JBLEN 16
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -553,52 -321,102 +328,102 @@@ InterlockedAdd64
  
  #endif /* !__INTERLOCKED_DECLARED */
  
- #if defined(_M_IX86)
- #define YieldProcessor _mm_pause
- #elif defined (_M_AMD64)
- #define YieldProcessor _mm_pause
- #elif defined(_M_PPC)
- #define YieldProcessor() __asm__ __volatile__("nop");
- #elif defined(_M_MIPS)
- #define YieldProcessor() __asm__ __volatile__("nop");
- #elif defined(_M_ARM)
- #define YieldProcessor()
- #else
- #error Unknown architecture
- #endif
  
+ /******************************************************************************
+  *                           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
  
- //
- // Slist Header
- //
- #ifndef _SLIST_HEADER_
- #define _SLIST_HEADER_
+ /* 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
  
- #if defined(_WIN64)
- typedef struct _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;
+ #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 _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;
@@@ -1164,2048 -1158,10607 +1165,10607 @@@ typedef struct DECLSPEC_ALIGN(16) _XSAV
  
  
  /******************************************************************************
-  *                               RTL Functions                                *
+  *                         Memory manager Types                               *
   ******************************************************************************/
  
- NTSYSAPI
- VOID
- NTAPI
- RtlAssert(
-     IN PVOID FailedAssertion,
-     IN PVOID FileName,
-     IN ULONG LineNumber,
-     IN PCHAR 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 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 RtlCopyBytes RtlCopyMemory
+ #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
+                             SECTION_MAP_WRITE |      \
+                             SECTION_MAP_READ |       \
+                             SECTION_MAP_EXECUTE |    \
+                             SECTION_EXTEND_SIZE)
  
- #if defined(_M_AMD64)
- NTSYSAPI
- VOID
- NTAPI
- RtlCopyMemoryNonTemporal(
-     VOID UNALIGNED *Destination,
-     CONST VOID UNALIGNED *Source,
-     SIZE_T Length);
- #else
- #define RtlCopyMemoryNonTemporal RtlCopyMemory
- #endif
+ #define SESSION_QUERY_ACCESS  0x0001
+ #define SESSION_MODIFY_ACCESS 0x0002
  
- /* BOOLEAN
-  * RtlEqualLuid(
-  *     IN PLUID Luid1,
-  *     IN PLUID Luid2)
-  */
- #define RtlEqualLuid(Luid1, Luid2) \
-     (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
+ #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \
+                             SESSION_QUERY_ACCESS |             \
+                             SESSION_MODIFY_ACCESS)
  
- /* ULONG
-  * RtlEqualMemory(
-  *     IN VOID UNALIGNED *Destination,
-  *     IN CONST VOID UNALIGNED *Source,
-  *     IN SIZE_T Length)
-  */
- #define RtlEqualMemory(Destination, Source, Length) \
-     (!memcmp(Destination, Source, Length))
+ #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
  
- /* VOID
-  * RtlFillMemory(
-  *     IN VOID UNALIGNED *Destination,
-  *     IN SIZE_T Length,
-  *     IN UCHAR Fill)
-  */
- #define RtlFillMemory(Destination, Length, Fill) \
-     memset(Destination, Fill, Length)
+ #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 RtlFillBytes RtlFillMemory
+ #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
  
- NTSYSAPI
- VOID
- NTAPI
- RtlFreeUnicodeString(
-     IN PUNICODE_STRING UnicodeString);
+ #define SEC_RESERVE       0x4000000
+ #define SEC_COMMIT        0x8000000
+ #define SEC_LARGE_PAGES  0x80000000
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlGUIDFromString(
-     IN PUNICODE_STRING GuidString,
-     OUT GUID *Guid);
+ /* Section map options */
+ typedef enum _SECTION_INHERIT {
+     ViewShare = 1,
+     ViewUnmap = 2
+ } SECTION_INHERIT;
  
- NTSYSAPI
- VOID
- NTAPI
- RtlInitUnicodeString(
-     IN OUT PUNICODE_STRING DestinationString,
-     IN PCWSTR SourceString);
+ typedef ULONG PFN_COUNT;
+ typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
+ typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
  
- /* VOID
-  * RtlMoveMemory(
-  *    IN VOID UNALIGNED *Destination,
-  *    IN CONST VOID UNALIGNED *Source,
-  *    IN SIZE_T Length)
-  */
- #define RtlMoveMemory(Destination, Source, Length) \
-     memmove(Destination, Source, Length)
+ 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;
  
- 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)
+ /******************************************************************************
+  *                            Executive Types                                 *
+  ******************************************************************************/
  
- #define RtlZeroBytes RtlZeroMemory
+ #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
  
- #if (NTDDI_VERSION >= NTDDI_WIN2K)
- NTSYSAPI
- BOOLEAN
- NTAPI
- RtlAreBitsClear(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG StartingIndex,
-     IN ULONG Length);
+ typedef struct _FAST_MUTEX {
+   volatile LONG Count;
+   PKTHREAD Owner;
+   ULONG Contention;
+   KEVENT Event;
+   ULONG OldIrql;
+ } FAST_MUTEX, *PFAST_MUTEX;
  
- 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);
+ typedef enum _SUITE_TYPE {
+     SmallBusiness,
+     Enterprise,
+     BackOffice,
+     CommunicationServer,
+     TerminalServer,
+     SmallBusinessRestricted,
+     EmbeddedNT,
+     DataCenter,
+     SingleUserTS,
+     Personal,
+     Blade,
+     EmbeddedRestricted,
+     SecurityAppliance,
+     StorageServer,
+     ComputeServer,
+     WHServer,
+     MaxSuiteType
+ } SUITE_TYPE;
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlCheckRegistryKey(
-     IN ULONG RelativeTo,
-     IN PWSTR Path);
+ 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;
  
- NTSYSAPI
- VOID
- NTAPI
- RtlClearAllBits(
-     IN PRTL_BITMAP BitMapHeader);
+ #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
+ #define LOOKASIDE_ALIGN
+ #else
+ #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
+ #endif
  
- NTSYSAPI
- VOID
- NTAPI
- RtlClearBits(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG StartingIndex,
-     IN ULONG NumberToClear);
+ typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
  
- NTSYSAPI
- SIZE_T
- NTAPI
- RtlCompareMemory(
-     IN CONST VOID *Source1,
-     IN CONST VOID *Source2,
-     IN SIZE_T Length);
+ typedef PVOID
+ (DDKAPI *PALLOCATE_FUNCTION)(
+     IN POOL_TYPE PoolType,
+     IN SIZE_T NumberOfBytes,
+     IN ULONG Tag);
  
- NTSYSAPI
- LONG
- NTAPI
- RtlCompareUnicodeString(
-     IN PCUNICODE_STRING String1,
-     IN PCUNICODE_STRING String2,
-     IN BOOLEAN CaseInSensitive);
+ typedef PVOID
+ (DDKAPI *PALLOCATE_FUNCTION_EX)(
+     IN POOL_TYPE PoolType,
+     IN SIZE_T NumberOfBytes,
+     IN ULONG Tag,
+     IN OUT PLOOKASIDE_LIST_EX Lookaside);
  
- NTSYSAPI
- LONG
- NTAPI
- RtlCompareUnicodeStrings(
-     IN PCWCH String1,
-     IN SIZE_T String1Length,
-     IN PCWCH String2,
-     IN SIZE_T String2Length,
-     IN BOOLEAN CaseInSensitive);
+ typedef VOID
+ (DDKAPI *PFREE_FUNCTION)(
+     IN PVOID Buffer);
  
- NTSYSAPI
- VOID
- NTAPI
- RtlCopyUnicodeString(
-   IN OUT PUNICODE_STRING  DestinationString,
-   IN PCUNICODE_STRING  SourceString);
+ typedef VOID
+ (DDKAPI *PFREE_FUNCTION_EX)(
+     IN PVOID Buffer,
+     IN OUT PLOOKASIDE_LIST_EX Lookaside);
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlCreateRegistryKey(
-     IN ULONG RelativeTo,
-     IN PWSTR Path);
+ typedef VOID
+ (DDKAPI *PCALLBACK_FUNCTION)(
+   IN PVOID  CallbackContext,
+   IN PVOID  Argument1,
+   IN PVOID  Argument2);
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlCreateSecurityDescriptor(
-     IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
-     IN ULONG Revision);
+ #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];
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlDeleteRegistryValue(
-     IN ULONG RelativeTo,
-     IN PCWSTR Path,
-     IN PCWSTR ValueName);
+ typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
+     GENERAL_LOOKASIDE_LAYOUT
+ } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
  
- NTSYSAPI
- BOOLEAN
- NTAPI
- RtlEqualUnicodeString(
-     IN CONST UNICODE_STRING *String1,
-     IN CONST UNICODE_STRING *String2,
-     IN BOOLEAN CaseInSensitive);
+ 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_)
- 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);
+     FAST_MUTEX Lock__ObsoleteButDoNotDelete;
  #endif
+ } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
  
- #if defined(_X86_) || defined(_IA64_)
- NTSYSAPI
- LARGE_INTEGER
- NTAPI
- RtlExtendedMagicDivide(
-     IN LARGE_INTEGER Dividend,
-     IN LARGE_INTEGER MagicDivisor,
-     IN CCHAR  ShiftCount);
+ 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;
  
- NTSYSAPI
- VOID
- NTAPI
- RtlFreeAnsiString(
-     IN PANSI_STRING AnsiString);
+ typedef struct _LOOKASIDE_LIST_EX {
+     GENERAL_LOOKASIDE_POOL L;
+ } LOOKASIDE_LIST_EX;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindClearBits(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG NumberToFind,
-     IN ULONG HintIndex);
+ typedef struct _EX_RUNDOWN_REF {
+     __GNU_EXTENSION union {
+         volatile ULONG_PTR Count;
+         volatile PVOID Ptr;
+     };
+ } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindClearBitsAndSet(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG NumberToFind,
-     IN ULONG HintIndex);
+ typedef struct _EX_RUNDOWN_REF_CACHE_AWARE  *PEX_RUNDOWN_REF_CACHE_AWARE;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindFirstRunClear(
-     IN PRTL_BITMAP BitMapHeader,
-     OUT PULONG StartingIndex);
+ typedef VOID
+ (DDKAPI *PWORKER_THREAD_ROUTINE)(
+   IN PVOID Parameter);
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindClearRuns(
-     IN PRTL_BITMAP BitMapHeader,
-     OUT PRTL_BITMAP_RUN RunArray,
-     IN ULONG SizeOfRunArray,
-     IN BOOLEAN LocateLongestRuns);
+ typedef struct _WORK_QUEUE_ITEM {
+   LIST_ENTRY  List;
+   PWORKER_THREAD_ROUTINE  WorkerRoutine;
+   volatile PVOID  Parameter;
+ } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindLastBackwardRunClear(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG FromIndex,
-     OUT PULONG StartingRunIndex);
  
- NTSYSAPI
- CCHAR
- NTAPI
- RtlFindLeastSignificantBit(
-     IN ULONGLONG Set);
+ /******************************************************************************
+  *                            Security Manager Types                          *
+  ******************************************************************************/
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindLongestRunClear(
-     IN PRTL_BITMAP BitMapHeader,
    OUT PULONG StartingIndex);
+ /* 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;
  
- NTSYSAPI
- CCHAR
- NTAPI
- RtlFindMostSignificantBit(
-     IN ULONGLONG Set);
+ #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
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindNextForwardRunClear(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG FromIndex,
-     OUT PULONG StartingRunIndex);
+ typedef struct _GENERIC_MAPPING {
+     ACCESS_MASK GenericRead;
+     ACCESS_MASK GenericWrite;
+     ACCESS_MASK GenericExecute;
+     ACCESS_MASK GenericAll;
+ } GENERIC_MAPPING, *PGENERIC_MAPPING;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindSetBits(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG NumberToFind,
-     IN ULONG HintIndex);
+ #define ACL_REVISION                      2
+ #define ACL_REVISION_DS                   4
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlFindSetBitsAndClear(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG NumberToFind,
-     IN ULONG HintIndex);
+ #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
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlHashUnicodeString(
-     IN CONST UNICODE_STRING *String,
-     IN BOOLEAN CaseInSensitive,
-     IN ULONG HashAlgorithm,
-     OUT PULONG HashValue);
+ typedef struct _ACL {
+     UCHAR AclRevision;
+     UCHAR Sbz1;
+     USHORT AclSize;
+     USHORT AceCount;
+     USHORT Sbz2;
+ } ACL, *PACL;
  
- NTSYSAPI
- VOID
- NTAPI
- RtlInitAnsiString(
-     IN OUT PANSI_STRING DestinationString,
-     IN PCSZ SourceString);
+ /* Current security descriptor revision value */
+ #define SECURITY_DESCRIPTOR_REVISION     (1)
+ #define SECURITY_DESCRIPTOR_REVISION1    (1)
  
- NTSYSAPI
- VOID
- NTAPI
- RtlInitializeBitMap(
-     IN PRTL_BITMAP BitMapHeader,
-     IN PULONG BitMapBuffer,
-     IN ULONG SizeOfBitMap);
+ /* 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)
  
- NTSYSAPI
- VOID
- NTAPI
- RtlInitString(
-     IN OUT PSTRING DestinationString,
-     IN PCSZ SourceString);
+ #define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
+                                          SE_PRIVILEGE_ENABLED            | \
+                                          SE_PRIVILEGE_REMOVED            | \
+                                          SE_PRIVILEGE_USED_FOR_ACCESS)
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlIntegerToUnicodeString(
-     IN ULONG Value,
-     IN ULONG Base OPTIONAL,
-     IN OUT PUNICODE_STRING String);
+ #include <pshpack4.h>
+ typedef struct _LUID_AND_ATTRIBUTES {
+     LUID Luid;
+     ULONG Attributes;
+ } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
+ #include <poppack.h>
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlInt64ToUnicodeString(
-     IN ULONGLONG Value,
-     IN ULONG Base OPTIONAL,
-     IN OUT PUNICODE_STRING String);
+ typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
+ typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
  
- #ifdef _WIN64
- #define RtlIntPtrToUnicodeString(Value, Base, String) \
-     RtlInt64ToUnicodeString(Value, Base, String)
- #else
- #define RtlIntPtrToUnicodeString(Value, Base, String) \
-     RtlIntegerToUnicodeString(Value, Base, String)
- #endif
+ /* Privilege sets */
+ #define PRIVILEGE_SET_ALL_NECESSARY (1)
  
- /* BOOLEAN
-  * RtlIsZeroLuid(
-  *     IN PLUID L1);
-  */
- #define RtlIsZeroLuid(_L1) \
-     ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
+ typedef struct _PRIVILEGE_SET {
+     ULONG PrivilegeCount;
+     ULONG Control;
+     LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
+ } PRIVILEGE_SET,*PPRIVILEGE_SET;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlLengthSecurityDescriptor(
-     IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+ typedef enum _SECURITY_IMPERSONATION_LEVEL {
+     SecurityAnonymous,
+     SecurityIdentification,
+     SecurityImpersonation,
+     SecurityDelegation
+ } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlNumberOfClearBits(
-     IN PRTL_BITMAP BitMapHeader);
+ #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))
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlNumberOfSetBits(
-     IN PRTL_BITMAP BitMapHeader);
+ #define SECURITY_DYNAMIC_TRACKING (TRUE)
+ #define SECURITY_STATIC_TRACKING (FALSE)
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlQueryRegistryValues(
-     IN ULONG RelativeTo,
-     IN PCWSTR Path,
-     IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
-     IN PVOID Context,
-     IN PVOID Environment OPTIONAL);
+ typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
  
- #define LONG_SIZE (sizeof(LONG))
- #define LONG_MASK (LONG_SIZE - 1)
+ 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;
  
- /* 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
+ typedef struct _SE_IMPERSONATION_STATE {
+     PACCESS_TOKEN Token;
+     BOOLEAN CopyOnOpen;
+     BOOLEAN EffectiveOnly;
+     SECURITY_IMPERSONATION_LEVEL Level;
+ } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
  
- /* 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
+ #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)
  
- NTSYSAPI
- VOID
- NTAPI
- RtlSetAllBits(
-     IN PRTL_BITMAP BitMapHeader);
+ #define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)
+ #define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)
+ #define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)
+ #define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)
  
- NTSYSAPI
- VOID
- NTAPI
- RtlSetBits(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG StartingIndex,
-     IN ULONG NumberToSet);
+ 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_ */
  
- 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
+ /******************************************************************************
+  *                            Power Management Support Types                  *
+  ******************************************************************************/
  
- /* 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
+ #ifndef _PO_DDK_
+ #define _PO_DDK_
  
- /* 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
+ /* Power States/Levels */
+ typedef enum _SYSTEM_POWER_STATE {
+     PowerSystemUnspecified,
+     PowerSystemWorking,
+     PowerSystemSleeping1,
+     PowerSystemSleeping2,
+     PowerSystemSleeping3,
+     PowerSystemHibernate,
+     PowerSystemShutdown,
+     PowerSystemMaximum
+ } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
  
- /* 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
+ #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
  
- NTSYSAPI
- BOOLEAN
- NTAPI
- RtlTimeFieldsToTime(
-     IN PTIME_FIELDS TimeFields,
-     IN PLARGE_INTEGER Time);
+ 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;
  
- NTSYSAPI
- VOID
- NTAPI
- RtlTimeToTimeFields(
-     IN PLARGE_INTEGER Time,
-     IN PTIME_FIELDS TimeFields);
+ typedef enum {
+     PowerActionNone,
+     PowerActionReserved,
+     PowerActionSleep,
+     PowerActionHibernate,
+     PowerActionShutdown,
+     PowerActionShutdownReset,
+     PowerActionShutdownOff,
+     PowerActionWarmEject
+ } POWER_ACTION, *PPOWER_ACTION;
  
- NTSYSAPI
- ULONG
- FASTCALL
- RtlUlongByteSwap(
-     IN ULONG Source);
+ typedef enum _DEVICE_POWER_STATE {
+     PowerDeviceUnspecified,
+     PowerDeviceD0,
+     PowerDeviceD1,
+     PowerDeviceD2,
+     PowerDeviceD3,
+     PowerDeviceMaximum
+ } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
  
- NTSYSAPI
- ULONGLONG
- FASTCALL
- RtlUlonglongByteSwap(
-     IN ULONGLONG Source);
+ typedef union _POWER_STATE {
+   SYSTEM_POWER_STATE  SystemState;
+   DEVICE_POWER_STATE  DeviceState;
+ } POWER_STATE, *PPOWER_STATE;
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlUnicodeStringToAnsiString(
-     IN OUT PANSI_STRING DestinationString,
-     IN PCUNICODE_STRING SourceString,
-     IN BOOLEAN AllocateDestinationString);
+ typedef enum _POWER_STATE_TYPE {
+   SystemPowerState = 0,
+   DevicePowerState
+ } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
  
- NTSYSAPI
- ULONG
- NTAPI
- RtlxUnicodeStringToAnsiSize(
-     IN PCUNICODE_STRING UnicodeString);
+ #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_) */
  
- #define RtlUnicodeStringToAnsiSize(String) (                  \
-     NLS_MB_CODE_PAGE_TAG ?                                    \
-     RtlxUnicodeStringToAnsiSize(String) :                     \
-     ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
- )
+ #endif /* !_PO_DDK_ */
  
- NTSYSAPI
+ 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
- NTAPI
- RtlUnicodeStringToInteger(
-     IN PCUNICODE_STRING String,
-     IN ULONG Base OPTIONAL,
-     OUT PULONG Value);
+ (DDKAPI POWER_SETTING_CALLBACK)(
+   IN LPCGUID SettingGuid,
+   IN PVOID Value,
+   IN ULONG ValueLength,
+   IN OUT PVOID Context OPTIONAL);
  
- NTSYSAPI
- WCHAR
- NTAPI
- RtlUpcaseUnicodeChar(
-     IN WCHAR SourceCharacter);
+ typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
  
- NTSYSAPI
- USHORT
- FASTCALL
- RtlUshortByteSwap(
-     IN USHORT Source);
+ #define PO_CB_SYSTEM_POWER_POLICY       0
+ #define PO_CB_AC_STATUS                 1
+ #define PO_CB_BUTTON_COLLISION          2
+ #define PO_CB_SYSTEM_STATE_LOCK         3
+ #define PO_CB_LID_SWITCH_STATE          4
+ #define PO_CB_PROCESSOR_POWER_POLICY    5
  
- NTSYSAPI
- BOOLEAN
- NTAPI
- RtlValidRelativeSecurityDescriptor(
-     IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
-     IN ULONG SecurityDescriptorLength,
-     IN SECURITY_INFORMATION RequiredInformation);
+ /******************************************************************************
+  *                            Configuration Manager Types                     *
+  ******************************************************************************/
  
- NTSYSAPI
- BOOLEAN
- NTAPI
- RtlValidSecurityDescriptor(
-     IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+ /* Resource list definitions */
+ typedef int CM_RESOURCE_TYPE;
  
- NTSYSAPI
- NTSTATUS
- NTAPI
- RtlWriteRegistryValue(
-     IN ULONG RelativeTo,
-     IN PCWSTR Path,
-     IN PCWSTR ValueName,
-     IN ULONG ValueType,
-     IN PVOID ValueData,
-     IN ULONG ValueLength);
+ #define CmResourceTypeNull              0
+ #define CmResourceTypePort              1
+ #define CmResourceTypeInterrupt         2
+ #define CmResourceTypeMemory            3
+ #define CmResourceTypeDma               4
+ #define CmResourceTypeDeviceSpecific    5
+ #define CmResourceTypeBusNumber         6
+ #define CmResourceTypeNonArbitrated     128
+ #define CmResourceTypeConfigData        128
+ #define CmResourceTypeDevicePrivate     129
+ #define CmResourceTypePcCardConfig      130
+ #define CmResourceTypeMfCardConfig      131
  
- #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
+ /* 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)
  
- #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
- NTSYSAPI
- VOID
- FASTCALL
- RtlPrefetchMemoryNonTemporal(
+ #define KEY_READ                ((STANDARD_RIGHTS_READ       |\
+                                   KEY_QUERY_VALUE            |\
+                                   KEY_ENUMERATE_SUB_KEYS     |\
+                                   KEY_NOTIFY)                 \
+                                   &                           \
+                                  (~SYNCHRONIZE))
+ #define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
+                                   KEY_SET_VALUE              |\
+                                   KEY_CREATE_SUB_KEY)         \
+                                   &                           \
+                                  (~SYNCHRONIZE))
+ #define KEY_EXECUTE             ((KEY_READ)                   \
+                                   &                           \
+                                  (~SYNCHRONIZE))
+ #define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
+                                   KEY_QUERY_VALUE            |\
+                                   KEY_SET_VALUE              |\
+                                   KEY_CREATE_SUB_KEY         |\
+                                   KEY_ENUMERATE_SUB_KEYS     |\
+                                   KEY_NOTIFY                 |\
+                                   KEY_CREATE_LINK)            \
+                                   &                           \
+                                  (~SYNCHRONIZE))
+ /* Registry Open/Create Options */
+ #define REG_OPTION_RESERVED         (0x00000000L)
+ #define REG_OPTION_NON_VOLATILE     (0x00000000L)
+ #define REG_OPTION_VOLATILE         (0x00000001L)
+ #define REG_OPTION_CREATE_LINK      (0x00000002L)
+ #define REG_OPTION_BACKUP_RESTORE   (0x00000004L)
+ #define REG_OPTION_OPEN_LINK        (0x00000008L)
+ #define REG_LEGAL_OPTION            \
+                 (REG_OPTION_RESERVED            |\
+                  REG_OPTION_NON_VOLATILE        |\
+                  REG_OPTION_VOLATILE            |\
+                  REG_OPTION_CREATE_LINK         |\
+                  REG_OPTION_BACKUP_RESTORE      |\
+                  REG_OPTION_OPEN_LINK)
+ /* Key creation/open disposition */
+ #define REG_CREATED_NEW_KEY         (0x00000001L)
+ #define REG_OPENED_EXISTING_KEY     (0x00000002L)
+ /* Key restore & hive load flags */
+ #define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)
+ #define REG_REFRESH_HIVE                (0x00000002L)
+ #define REG_NO_LAZY_FLUSH               (0x00000004L)
+ #define REG_FORCE_RESTORE               (0x00000008L)
+ #define REG_APP_HIVE                    (0x00000010L)
+ #define REG_PROCESS_PRIVATE             (0x00000020L)
+ #define REG_START_JOURNAL               (0x00000040L)
+ #define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)
+ #define REG_HIVE_NO_RM                  (0x00000100L)
+ #define REG_HIVE_SINGLE_LOG             (0x00000200L)
+ /* Unload Flags */
+ #define REG_FORCE_UNLOAD            1
+ /* Notify Filter Values */
+ #define REG_NOTIFY_CHANGE_NAME          (0x00000001L)
+ #define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
+ #define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L)
+ #define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
+ #define REG_LEGAL_CHANGE_FILTER                 \
+                 (REG_NOTIFY_CHANGE_NAME          |\
+                  REG_NOTIFY_CHANGE_ATTRIBUTES    |\
+                  REG_NOTIFY_CHANGE_LAST_SET      |\
+                  REG_NOTIFY_CHANGE_SECURITY)
+ typedef struct _CM_FLOPPY_DEVICE_DATA {
+   USHORT  Version;
+   USHORT  Revision;
+   CHAR  Size[8];
+   ULONG  MaxDensity;
+   ULONG  MountDensity;
+   UCHAR  StepRateHeadUnloadTime;
+   UCHAR  HeadLoadTime;
+   UCHAR  MotorOffTime;
+   UCHAR  SectorLengthCode;
+   UCHAR  SectorPerTrack;
+   UCHAR  ReadWriteGapLength;
+   UCHAR  DataTransferLength;
+   UCHAR  FormatGapLength;
+   UCHAR  FormatFillCharacter;
+   UCHAR  HeadSettleTime;
+   UCHAR  MotorSettleTime;
+   UCHAR  MaximumTrackValue;
+   UCHAR  DataTransferRate;
+ } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
+ #include <pshpack4.h>
+ typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
+   UCHAR Type;
+   UCHAR ShareDisposition;
+   USHORT Flags;
+   union {
+     struct {
+       PHYSICAL_ADDRESS Start;
+       ULONG Length;
+     } Generic;
+     struct {
+       PHYSICAL_ADDRESS Start;
+       ULONG Length;
+     } Port;
+     struct {
+ #if defined(NT_PROCESSOR_GROUPS)
+       USHORT Level;
+       USHORT Group;
+ #else
+       ULONG Level;
+ #endif
+       ULONG Vector;
+       KAFFINITY Affinity;
+     } Interrupt;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
+     struct {
+       __GNU_EXTENSION union {
+         struct {
+ #if defined(NT_PROCESSOR_GROUPS)
+           USHORT Group;
+ #else
+           USHORT Reserved;
+ #endif
+           USHORT MessageCount;
+           ULONG Vector;
+           KAFFINITY Affinity;
+         } Raw;
+         struct {
+ #if defined(NT_PROCESSOR_GROUPS)
+           USHORT Level;
+           USHORT Group;
+ #else
+           ULONG Level;
+ #endif
+           ULONG Vector;
+           KAFFINITY Affinity;
+         } Translated;
+       } DUMMYUNIONNAME;
+     } MessageInterrupt;
+ #endif
+     struct {
+       PHYSICAL_ADDRESS Start;
+       ULONG Length;
+     } Memory;
+     struct {
+       ULONG Channel;
+       ULONG Port;
+       ULONG Reserved1;
+     } Dma;
+     struct {
+       ULONG Data[3];
+     } DevicePrivate;
+     struct {
+       ULONG Start;
+       ULONG Length;
+       ULONG Reserved;
+     } BusNumber;
+     struct {
+       ULONG DataSize;
+       ULONG Reserved1;
+       ULONG Reserved2;
+     } DeviceSpecificData;
+ #if (NTDDI_VERSION >= NTDDI_LONGHORN)
+     struct {
+       PHYSICAL_ADDRESS Start;
+       ULONG Length40;
+     } Memory40;
+     struct {
+       PHYSICAL_ADDRESS Start;
+       ULONG Length48;
+     } Memory48;
+     struct {
+       PHYSICAL_ADDRESS Start;
+       ULONG Length64;
+     } Memory64;
+ #endif
+   } u;
+ } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
+ #include <poppack.h>
+ /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
+ #define CmResourceTypeNull                0
+ #define CmResourceTypePort                1
+ #define CmResourceTypeInterrupt           2
+ #define CmResourceTypeMemory              3
+ #define CmResourceTypeDma                 4
+ #define CmResourceTypeDeviceSpecific      5
+ #define CmResourceTypeBusNumber           6
+ #define CmResourceTypeMemoryLarge         7
+ #define CmResourceTypeNonArbitrated     128
+ #define CmResourceTypeConfigData        128
+ #define CmResourceTypeDevicePrivate     129
+ #define CmResourceTypePcCardConfig      130
+ #define CmResourceTypeMfCardConfig      131
+ /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
+ typedef enum _CM_SHARE_DISPOSITION {
+   CmResourceShareUndetermined,
+   CmResourceShareDeviceExclusive,
+   CmResourceShareDriverExclusive,
+   CmResourceShareShared
+ } CM_SHARE_DISPOSITION;
+ /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
+ #define CM_RESOURCE_PORT_MEMORY           0x0000
+ #define CM_RESOURCE_PORT_IO               0x0001
+ #define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
+ #define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
+ #define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
+ #define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
+ #define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
+ #define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
+ #define CM_RESOURCE_PORT_BAR              0x0100
+ /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
+ #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
+ #define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
+ #define CM_RESOURCE_INTERRUPT_MESSAGE         0x0002
+ #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
+ /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
+ #define CM_RESOURCE_MEMORY_READ_WRITE                    0x0000
+ #define CM_RESOURCE_MEMORY_READ_ONLY                     0x0001
+ #define CM_RESOURCE_MEMORY_WRITE_ONLY                    0x0002
+ #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK             0x0003
+ #define CM_RESOURCE_MEMORY_PREFETCHABLE                  0x0004
+ #define CM_RESOURCE_MEMORY_COMBINEDWRITE                 0x0008
+ #define CM_RESOURCE_MEMORY_24                            0x0010
+ #define CM_RESOURCE_MEMORY_CACHEABLE                     0x0020
+ #define CM_RESOURCE_MEMORY_WINDOW_DECODE                 0x0040
+ #define CM_RESOURCE_MEMORY_BAR                           0x0080
+ #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
+ /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
+ #define CM_RESOURCE_DMA_8                 0x0000
+ #define CM_RESOURCE_DMA_16                0x0001
+ #define CM_RESOURCE_DMA_32                0x0002
+ #define CM_RESOURCE_DMA_8_AND_16          0x0004
+ #define CM_RESOURCE_DMA_BUS_MASTER        0x0008
+ #define CM_RESOURCE_DMA_TYPE_A            0x0010
+ #define CM_RESOURCE_DMA_TYPE_B            0x0020
+ #define CM_RESOURCE_DMA_TYPE_F            0x0040
+ typedef struct _CM_PARTIAL_RESOURCE_LIST {
+   USHORT  Version;
+   USHORT  Revision;
+   ULONG  Count;
+   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
+ } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
+ typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
+   INTERFACE_TYPE  InterfaceType;
+   ULONG  BusNumber;
+   CM_PARTIAL_RESOURCE_LIST  PartialResourceList;
+ } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
+ typedef struct _CM_RESOURCE_LIST {
+   ULONG  Count;
+   CM_FULL_RESOURCE_DESCRIPTOR  List[1];
+ } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
+ #include <pshpack1.h>
+ typedef struct _CM_INT13_DRIVE_PARAMETER {
+   USHORT  DriveSelect;
+   ULONG  MaxCylinders;
+   USHORT  SectorsPerTrack;
+   USHORT  MaxHeads;
+   USHORT  NumberDrives;
+ } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
+ typedef struct _CM_PNP_BIOS_DEVICE_NODE {
+   USHORT Size;
+   UCHAR Node;
+   ULONG ProductId;
+   UCHAR DeviceType[3];
+   USHORT DeviceAttributes;
+ } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
+ typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
+   UCHAR Signature[4];
+   UCHAR Revision;
+   UCHAR Length;
+   USHORT ControlField;
+   UCHAR Checksum;
+   ULONG EventFlagAddress;
+   USHORT RealModeEntryOffset;
+   USHORT RealModeEntrySegment;
+   USHORT ProtectedModeEntryOffset;
+   ULONG ProtectedModeCodeBaseAddress;
+   ULONG OemDeviceId;
+   USHORT RealModeDataBaseAddress;
+   ULONG ProtectedModeDataBaseAddress;
+ } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
+ #include <poppack.h>
+ typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
+     ULONG BytesPerSector;
+     ULONG NumberOfCylinders;
+     ULONG SectorsPerTrack;
+     ULONG NumberOfHeads;
+ } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
+ typedef struct _CM_KEYBOARD_DEVICE_DATA {
+   USHORT  Version;
+   USHORT  Revision;
+   UCHAR  Type;
+   UCHAR  Subtype;
+   USHORT  KeyboardFlags;
+ } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
+ typedef struct _CM_MCA_POS_DATA {
+   USHORT  AdapterId;
+   UCHAR  PosData1;
+   UCHAR  PosData2;
+   UCHAR  PosData3;
+   UCHAR  PosData4;
+ } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
+ #if (NTDDI_VERSION >= NTDDI_WINXP)
+ typedef struct CM_Power_Data_s {
+   ULONG  PD_Size;
+   DEVICE_POWER_STATE  PD_MostRecentPowerState;
+   ULONG  PD_Capabilities;
+   ULONG  PD_D1Latency;
+   ULONG  PD_D2Latency;
+   ULONG  PD_D3Latency;
+   DEVICE_POWER_STATE  PD_PowerStateMapping[PowerSystemMaximum];
+   SYSTEM_POWER_STATE  PD_DeepestSystemWake;
+ } CM_POWER_DATA, *PCM_POWER_DATA;
+ #define PDCAP_D0_SUPPORTED                0x00000001
+ #define PDCAP_D1_SUPPORTED                0x00000002
+ #define PDCAP_D2_SUPPORTED                0x00000004
+ #define PDCAP_D3_SUPPORTED                0x00000008
+ #define PDCAP_WAKE_FROM_D0_SUPPORTED      0x00000010
+ #define PDCAP_WAKE_FROM_D1_SUPPORTED      0x00000020
+ #define PDCAP_WAKE_FROM_D2_SUPPORTED      0x00000040
+ #define PDCAP_WAKE_FROM_D3_SUPPORTED      0x00000080
+ #define PDCAP_WARM_EJECT_SUPPORTED        0x00000100
+ #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+ typedef struct _CM_SCSI_DEVICE_DATA {
+   USHORT  Version;
+   USHORT  Revision;
+   UCHAR  HostIdentifier;
+ } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
+ typedef struct _CM_SERIAL_DEVICE_DATA {
+   USHORT  Version;
+   USHORT  Revision;
+   ULONG  BaudClock;
+ } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
+ typedef enum _KEY_INFORMATION_CLASS {
+   KeyBasicInformation,
+   KeyNodeInformation,
+   KeyFullInformation,
+   KeyNameInformation,
+   KeyCachedInformation,
+   KeyFlagsInformation
+ } KEY_INFORMATION_CLASS;
+ typedef struct _KEY_BASIC_INFORMATION {
+   LARGE_INTEGER  LastWriteTime;
+   ULONG  TitleIndex;
+   ULONG  NameLength;
+   WCHAR  Name[1];
+ } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
+ typedef struct _KEY_FULL_INFORMATION {
+   LARGE_INTEGER  LastWriteTime;
+   ULONG  TitleIndex;
+   ULONG  ClassOffset;
+   ULONG  ClassLength;
+   ULONG  SubKeys;
+   ULONG  MaxNameLen;
+   ULONG  MaxClassLen;
+   ULONG  Values;
+   ULONG  MaxValueNameLen;
+   ULONG  MaxValueDataLen;
+   WCHAR  Class[1];
+ } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
+ typedef struct _KEY_NODE_INFORMATION {
+   LARGE_INTEGER  LastWriteTime;
+   ULONG  TitleIndex;
+   ULONG  ClassOffset;
+   ULONG  ClassLength;
+   ULONG  NameLength;
+   WCHAR  Name[1];
+ } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
+ typedef struct _KEY_VALUE_BASIC_INFORMATION {
+   ULONG  TitleIndex;
+   ULONG  Type;
+   ULONG  NameLength;
+   WCHAR  Name[1];
+ } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
+ typedef struct _KEY_VALUE_FULL_INFORMATION {
+   ULONG  TitleIndex;
+   ULONG  Type;
+   ULONG  DataOffset;
+   ULONG  DataLength;
+   ULONG  NameLength;
+   WCHAR  Name[1];
+ } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
+ typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
+   ULONG  TitleIndex;
+   ULONG  Type;
+   ULONG  DataLength;
+   UCHAR  Data[1];
+ } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
+ typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
+   ULONG  Type;
+   ULONG  DataLength;
+   UCHAR  Data[1];
+ } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
+ typedef struct _KEY_VALUE_ENTRY {
+   PUNICODE_STRING  ValueName;
+   ULONG  DataLength;
+   ULONG  DataOffset;
+   ULONG  Type;
+ } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
+ typedef enum _KEY_VALUE_INFORMATION_CLASS {
+   KeyValueBasicInformation,
+   KeyValueFullInformation,
+   KeyValuePartialInformation,
+   KeyValueFullInformationAlign64,
+   KeyValuePartialInformationAlign64
+ } KEY_VALUE_INFORMATION_CLASS;
+ typedef struct _KEY_WRITE_TIME_INFORMATION {
+   LARGE_INTEGER  LastWriteTime;
+ } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
+ typedef enum _KEY_SET_INFORMATION_CLASS {
+   KeyWriteTimeInformation,
+   KeyWow64FlagsInformation,
+   KeyControlFlagsInformation,
+   KeySetVirtualizationInformation,
+   KeySetDebugInformation,
+   KeySetHandleTagsInformation,
+   MaxKeySetInfoClass
+ } KEY_SET_INFORMATION_CLASS;
+ typedef enum _REG_NOTIFY_CLASS {
+   RegNtDeleteKey,
+   RegNtPreDeleteKey = RegNtDeleteKey,
+   RegNtSetValueKey,
+   RegNtPreSetValueKey = RegNtSetValueKey,
+   RegNtDeleteValueKey,
+   RegNtPreDeleteValueKey = RegNtDeleteValueKey,
+   RegNtSetInformationKey,
+   RegNtPreSetInformationKey = RegNtSetInformationKey,
+   RegNtRenameKey,
+   RegNtPreRenameKey = RegNtRenameKey,
+   RegNtEnumerateKey,
+   RegNtPreEnumerateKey = RegNtEnumerateKey,
+   RegNtEnumerateValueKey,
+   RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
+   RegNtQueryKey,
+   RegNtPreQueryKey = RegNtQueryKey,
+   RegNtQueryValueKey,
+   RegNtPreQueryValueKey = RegNtQueryValueKey,
+   RegNtQueryMultipleValueKey,
+   RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
+   RegNtPreCreateKey,
+   RegNtPostCreateKey,
+   RegNtPreOpenKey,
+   RegNtPostOpenKey,
+   RegNtKeyHandleClose,
+   RegNtPreKeyHandleClose = RegNtKeyHandleClose,
+   RegNtPostDeleteKey,
+   RegNtPostSetValueKey,
+   RegNtPostDeleteValueKey,
+   RegNtPostSetInformationKey,
+   RegNtPostRenameKey,
+   RegNtPostEnumerateKey,
+   RegNtPostEnumerateValueKey,
+   RegNtPostQueryKey,
+   RegNtPostQueryValueKey,
+   RegNtPostQueryMultipleValueKey,
+   RegNtPostKeyHandleClose,
+   RegNtPreCreateKeyEx,
+   RegNtPostCreateKeyEx,
+   RegNtPreOpenKeyEx,
+   RegNtPostOpenKeyEx,
+   RegNtPreFlushKey,
+   RegNtPostFlushKey,
+   RegNtPreLoadKey,
+   RegNtPostLoadKey,
+   RegNtPreUnLoadKey,
+   RegNtPostUnLoadKey,
+   RegNtPreQueryKeySecurity,
+   RegNtPostQueryKeySecurity,
+   RegNtPreSetKeySecurity,
+   RegNtPostSetKeySecurity,
+   RegNtCallbackObjectContextCleanup,
+   RegNtPreRestoreKey,
+   RegNtPostRestoreKey,
+   RegNtPreSaveKey,
+   RegNtPostSaveKey,
+   RegNtPreReplaceKey,
+   RegNtPostReplaceKey,
+   MaxRegNtNotifyClass
+ } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
+ typedef NTSTATUS
+ (NTAPI *PEX_CALLBACK_FUNCTION)(
+     IN PVOID CallbackContext,
+     IN PVOID Argument1,
+     IN PVOID Argument2
+ );
+ typedef struct _REG_DELETE_KEY_INFORMATION {
+   PVOID Object;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
+ #if (NTDDI_VERSION >= NTDDI_VISTA)
+ , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
+ #endif
+ ;
+ typedef struct _REG_SET_VALUE_KEY_INFORMATION {
+   PVOID Object;
+   PUNICODE_STRING ValueName;
+   ULONG TitleIndex;
+   ULONG Type;
+   PVOID Data;
+   ULONG DataSize;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
+ typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
+   PVOID Object;
+   PUNICODE_STRING ValueName;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
+ typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
+   PVOID Object;
+   KEY_SET_INFORMATION_CLASS KeySetInformationClass;
+   PVOID KeySetInformation;
+   ULONG KeySetInformationLength;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
+ typedef struct _REG_ENUMERATE_KEY_INFORMATION {
+   PVOID Object;
+   ULONG Index;
+   KEY_INFORMATION_CLASS KeyInformationClass;
+   PVOID KeyInformation;
+   ULONG Length;
+   PULONG ResultLength;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
+ typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
+   PVOID Object;
+   ULONG Index;
+   KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+   PVOID KeyValueInformation;
+   ULONG Length;
+   PULONG ResultLength;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
+ typedef struct _REG_QUERY_KEY_INFORMATION {
+   PVOID Object;
+   KEY_INFORMATION_CLASS KeyInformationClass;
+   PVOID KeyInformation;
+   ULONG Length;
+   PULONG ResultLength;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
+ typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
+   PVOID Object;
+   PUNICODE_STRING ValueName;
+   KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+   PVOID KeyValueInformation;
+   ULONG Length;
+   PULONG ResultLength;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
+ typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
+   PVOID Object;
+   PKEY_VALUE_ENTRY ValueEntries;
+   ULONG EntryCount;
+   PVOID ValueBuffer;
+   PULONG BufferLength;
+   PULONG RequiredBufferLength;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
+ typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
+   PUNICODE_STRING CompleteName;
+ } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
+ typedef struct _REG_POST_CREATE_KEY_INFORMATION {
+   PUNICODE_STRING CompleteName;
+   PVOID Object;
+   NTSTATUS Status;
+ } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
+ typedef struct _REG_POST_OPERATION_INFORMATION {
+   PVOID Object;
+   NTSTATUS Status;
+   PVOID PreInformation;
+   NTSTATUS ReturnStatus;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
+ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
+   PVOID Object;
+   PVOID CallContext;
+   PVOID ObjectContext;
+   PVOID Reserved;
+ } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
+ /******************************************************************************
+  *                         I/O Manager Types                                  *
+  ******************************************************************************/
+  /* PCI_COMMON_CONFIG.Command */
+ #define PCI_ENABLE_IO_SPACE               0x0001
+ #define PCI_ENABLE_MEMORY_SPACE           0x0002
+ #define PCI_ENABLE_BUS_MASTER             0x0004
+ #define PCI_ENABLE_SPECIAL_CYCLES         0x0008
+ #define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
+ #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
+ #define PCI_ENABLE_PARITY                 0x0040
+ #define PCI_ENABLE_WAIT_CYCLE             0x0080
+ #define PCI_ENABLE_SERR                   0x0100
+ #define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
+ #define PCI_DISABLE_LEVEL_INTERRUPT       0x0400
+ /* PCI_COMMON_CONFIG.Status */
+ #define PCI_STATUS_INTERRUPT_PENDING      0x0008
+ #define PCI_STATUS_CAPABILITIES_LIST      0x0010
+ #define PCI_STATUS_66MHZ_CAPABLE          0x0020
+ #define PCI_STATUS_UDF_SUPPORTED          0x0040
+ #define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
+ #define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
+ #define PCI_STATUS_DEVSEL                 0x0600
+ #define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
+ #define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
+ #define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
+ #define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
+ #define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
+ /* PCI_COMMON_CONFIG.HeaderType */
+ #define PCI_MULTIFUNCTION                 0x80
+ #define PCI_DEVICE_TYPE                   0x00
+ #define PCI_BRIDGE_TYPE                   0x01
+ #define PCI_CARDBUS_BRIDGE_TYPE           0x02
+ #define PCI_CONFIGURATION_TYPE(PciData) \
+   (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
+ #define PCI_MULTIFUNCTION_DEVICE(PciData) \
+   ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
+ /* PCI device classes */
+ #define PCI_CLASS_PRE_20                    0x00
+ #define PCI_CLASS_MASS_STORAGE_CTLR         0x01
+ #define PCI_CLASS_NETWORK_CTLR              0x02
+ #define PCI_CLASS_DISPLAY_CTLR              0x03
+ #define PCI_CLASS_MULTIMEDIA_DEV            0x04
+ #define PCI_CLASS_MEMORY_CTLR               0x05
+ #define PCI_CLASS_BRIDGE_DEV                0x06
+ #define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
+ #define PCI_CLASS_BASE_SYSTEM_DEV           0x08
+ #define PCI_CLASS_INPUT_DEV                 0x09
+ #define PCI_CLASS_DOCKING_STATION           0x0a
+ #define PCI_CLASS_PROCESSOR                 0x0b
+ #define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
+ #define PCI_CLASS_WIRELESS_CTLR             0x0d
+ #define PCI_CLASS_INTELLIGENT_IO_CTLR       0x0e
+ #define PCI_CLASS_SATELLITE_COMMS_CTLR      0x0f
+ #define PCI_CLASS_ENCRYPTION_DECRYPTION     0x10
+ #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC      0x11
+ /* PCI device subclasses for class 0 */
+ #define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
+ #define PCI_SUBCLASS_PRE_20_VGA             0x01
+ /* PCI device subclasses for class 1 (mass storage controllers)*/
+ #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
+ #define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
+ #define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
+ #define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
+ #define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
+ #define PCI_SUBCLASS_MSC_OTHER              0x80
+ /* PCI device subclasses for class 2 (network controllers)*/
+ #define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
+ #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
+ #define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
+ #define PCI_SUBCLASS_NET_ATM_CTLR           0x03
+ #define PCI_SUBCLASS_NET_ISDN_CTLR          0x04
+ #define PCI_SUBCLASS_NET_OTHER              0x80
+ /* PCI device subclasses for class 3 (display controllers)*/
+ #define PCI_SUBCLASS_VID_VGA_CTLR           0x00
+ #define PCI_SUBCLASS_VID_XGA_CTLR           0x01
+ #define PCI_SUBCLASS_VID_3D_CTLR            0x02
+ #define PCI_SUBCLASS_VID_OTHER              0x80
+ /* PCI device subclasses for class 4 (multimedia device)*/
+ #define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
+ #define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
+ #define PCI_SUBCLASS_MM_TELEPHONY_DEV       0x02
+ #define PCI_SUBCLASS_MM_OTHER               0x80
+ /* PCI device subclasses for class 5 (memory controller)*/
+ #define PCI_SUBCLASS_MEM_RAM                0x00
+ #define PCI_SUBCLASS_MEM_FLASH              0x01
+ #define PCI_SUBCLASS_MEM_OTHER              0x80
+ /* PCI device subclasses for class 6 (bridge device)*/
+ #define PCI_SUBCLASS_BR_HOST                0x00
+ #define PCI_SUBCLASS_BR_ISA                 0x01
+ #define PCI_SUBCLASS_BR_EISA                0x02
+ #define PCI_SUBCLASS_BR_MCA                 0x03
+ #define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
+ #define PCI_SUBCLASS_BR_PCMCIA              0x05
+ #define PCI_SUBCLASS_BR_NUBUS               0x06
+ #define PCI_SUBCLASS_BR_CARDBUS             0x07
+ #define PCI_SUBCLASS_BR_RACEWAY             0x08
+ #define PCI_SUBCLASS_BR_OTHER               0x80
+ /* PCI device subclasses for class C (serial bus controller)*/
+ #define PCI_SUBCLASS_SB_IEEE1394            0x00
+ #define PCI_SUBCLASS_SB_ACCESS              0x01
+ #define PCI_SUBCLASS_SB_SSA                 0x02
+ #define PCI_SUBCLASS_SB_USB                 0x03
+ #define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
+ #define PCI_SUBCLASS_SB_SMBUS               0x05
+ #define PCI_MAX_DEVICES        32
+ #define PCI_MAX_FUNCTION       8
+ #define PCI_MAX_BRIDGE_NUMBER  0xFF
+ #define PCI_INVALID_VENDORID   0xFFFF
+ #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
+ #define PCI_ADDRESS_IO_SPACE                0x00000001
+ #define PCI_ADDRESS_MEMORY_TYPE_MASK        0x00000006
+ #define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x00000008
+ #define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
+ #define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
+ #define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
+ #define PCI_TYPE_32BIT 0
+ #define PCI_TYPE_20BIT 2
+ #define PCI_TYPE_64BIT 4
+ #define POOL_COLD_ALLOCATION                256
+ #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE    8
+ #define POOL_RAISE_IF_ALLOCATION_FAILURE    16
+ #define PCI_TYPE0_ADDRESSES               6
+ #define PCI_TYPE1_ADDRESSES               2
+ #define PCI_TYPE2_ADDRESSES               5
+ #define IO_TYPE_ADAPTER                 1
+ #define IO_TYPE_CONTROLLER              2
+ #define IO_TYPE_DEVICE                  3
+ #define IO_TYPE_DRIVER                  4
+ #define IO_TYPE_FILE                    5
+ #define IO_TYPE_IRP                     6
+ #define IO_TYPE_MASTER_ADAPTER          7
+ #define IO_TYPE_OPEN_PACKET             8
+ #define IO_TYPE_TIMER                   9
+ #define IO_TYPE_VPB                     10
+ #define IO_TYPE_ERROR_LOG               11
+ #define IO_TYPE_ERROR_MESSAGE           12
+ #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
+ #define IO_TYPE_CSQ_IRP_CONTEXT 1
+ #define IO_TYPE_CSQ 2
+ #define IO_TYPE_CSQ_EX 3
+ /* IO_RESOURCE_DESCRIPTOR.Option */
+ #define IO_RESOURCE_PREFERRED             0x01
+ #define IO_RESOURCE_DEFAULT               0x02
+ #define IO_RESOURCE_ALTERNATIVE           0x08
+ /* DEVICE_OBJECT.Flags */
+ #define DO_VERIFY_VOLUME                  0x00000002
+ #define DO_BUFFERED_IO                    0x00000004
+ #define DO_EXCLUSIVE                      0x00000008
+ #define DO_DIRECT_IO                      0x00000010
+ #define DO_MAP_IO_BUFFER                  0x00000020
+ #define DO_DEVICE_INITIALIZING            0x00000080
+ #define DO_SHUTDOWN_REGISTERED            0x00000800
+ #define DO_BUS_ENUMERATED_DEVICE          0x00001000
+ #define DO_POWER_PAGABLE                  0x00002000
+ #define DO_POWER_INRUSH                   0x00004000
+ /* DEVICE_OBJECT.Characteristics */
+ #define FILE_REMOVABLE_MEDIA              0x00000001
+ #define FILE_READ_ONLY_DEVICE             0x00000002
+ #define FILE_FLOPPY_DISKETTE              0x00000004
+ #define FILE_WRITE_ONCE_MEDIA             0x00000008
+ #define FILE_REMOTE_DEVICE                0x00000010
+ #define FILE_DEVICE_IS_MOUNTED            0x00000020
+ #define FILE_VIRTUAL_VOLUME               0x00000040
+ #define FILE_AUTOGENERATED_DEVICE_NAME    0x00000080
+ #define FILE_DEVICE_SECURE_OPEN           0x00000100
+ #define FILE_CHARACTERISTIC_PNP_DEVICE    0x00000800
+ #define FILE_CHARACTERISTIC_TS_DEVICE     0x00001000
+ #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
+ /* DEVICE_OBJECT.AlignmentRequirement */
+ #define FILE_BYTE_ALIGNMENT             0x00000000
+ #define FILE_WORD_ALIGNMENT             0x00000001
+ #define FILE_LONG_ALIGNMENT             0x00000003
+ #define FILE_QUAD_ALIGNMENT             0x00000007
+ #define FILE_OCTA_ALIGNMENT             0x0000000f
+ #define FILE_32_BYTE_ALIGNMENT          0x0000001f
+ #define FILE_64_BYTE_ALIGNMENT          0x0000003f
+ #define FILE_128_BYTE_ALIGNMENT         0x0000007f
+ #define FILE_256_BYTE_ALIGNMENT         0x000000ff
+ #define FILE_512_BYTE_ALIGNMENT         0x000001ff
+ /* DEVICE_OBJECT.DeviceType */
+ #define DEVICE_TYPE ULONG
+ #define FILE_DEVICE_BEEP                  0x00000001
+ #define FILE_DEVICE_CD_ROM                0x00000002
+ #define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
+ #define FILE_DEVICE_CONTROLLER            0x00000004
+ #define FILE_DEVICE_DATALINK              0x00000005
+ #define FILE_DEVICE_DFS                   0x00000006
+ #define FILE_DEVICE_DISK                  0x00000007
+ #define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
+ #define FILE_DEVICE_FILE_SYSTEM           0x00000009
+ #define FILE_DEVICE_INPORT_PORT           0x0000000a
+ #define FILE_DEVICE_KEYBOARD              0x0000000b
+ #define FILE_DEVICE_MAILSLOT              0x0000000c
+ #define FILE_DEVICE_MIDI_IN               0x0000000d
+ #define FILE_DEVICE_MIDI_OUT              0x0000000e
+ #define FILE_DEVICE_MOUSE                 0x0000000f
+ #define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
+ #define FILE_DEVICE_NAMED_PIPE            0x00000011
+ #define FILE_DEVICE_NETWORK               0x00000012
+ #define FILE_DEVICE_NETWORK_BROWSER       0x00000013
+ #define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
+ #define FILE_DEVICE_NULL                  0x00000015
+ #define FILE_DEVICE_PARALLEL_PORT         0x00000016
+ #define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
+ #define FILE_DEVICE_PRINTER               0x00000018
+ #define FILE_DEVICE_SCANNER               0x00000019
+ #define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
+ #define FILE_DEVICE_SERIAL_PORT           0x0000001b
+ #define FILE_DEVICE_SCREEN                0x0000001c
+ #define FILE_DEVICE_SOUND                 0x0000001d
+ #define FILE_DEVICE_STREAMS               0x0000001e
+ #define FILE_DEVICE_TAPE                  0x0000001f
+ #define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
+ #define FILE_DEVICE_TRANSPORT             0x00000021
+ #define FILE_DEVICE_UNKNOWN               0x00000022
+ #define FILE_DEVICE_VIDEO                 0x00000023
+ #define FILE_DEVICE_VIRTUAL_DISK          0x00000024
+ #define FILE_DEVICE_WAVE_IN               0x00000025
+ #define FILE_DEVICE_WAVE_OUT              0x00000026
+ #define FILE_DEVICE_8042_PORT             0x00000027
+ #define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
+ #define FILE_DEVICE_BATTERY               0x00000029
+ #define FILE_DEVICE_BUS_EXTENDER          0x0000002a
+ #define FILE_DEVICE_MODEM                 0x0000002b
+ #define FILE_DEVICE_VDM                   0x0000002c
+ #define FILE_DEVICE_MASS_STORAGE          0x0000002d
+ #define FILE_DEVICE_SMB                   0x0000002e
+ #define FILE_DEVICE_KS                    0x0000002f
+ #define FILE_DEVICE_CHANGER               0x00000030
+ #define FILE_DEVICE_SMARTCARD             0x00000031
+ #define FILE_DEVICE_ACPI                  0x00000032
+ #define FILE_DEVICE_DVD                   0x00000033
+ #define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
+ #define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
+ #define FILE_DEVICE_DFS_VOLUME            0x00000036
+ #define FILE_DEVICE_SERENUM               0x00000037
+ #define FILE_DEVICE_TERMSRV               0x00000038
+ #define FILE_DEVICE_KSEC                  0x00000039
+ #define FILE_DEVICE_FIPS                  0x0000003A
+ #define FILE_DEVICE_INFINIBAND            0x0000003B
+ #define FILE_DEVICE_VMBUS                 0x0000003E
+ #define FILE_DEVICE_CRYPT_PROVIDER        0x0000003F
+ #define FILE_DEVICE_WPD                   0x00000040
+ #define FILE_DEVICE_BLUETOOTH             0x00000041
+ #define FILE_DEVICE_MT_COMPOSITE          0x00000042
+ #define FILE_DEVICE_MT_TRANSPORT          0x00000043
+ #define FILE_DEVICE_BIOMETRIC             0x00000044
+ #define FILE_DEVICE_PMI                   0x00000045
+ #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
+ typedef struct _OBJECT_HANDLE_INFORMATION {
+   ULONG HandleAttributes;
+   ACCESS_MASK GrantedAccess;
+ } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
+ typedef struct _CLIENT_ID {
+   HANDLE  UniqueProcess;
+   HANDLE  UniqueThread;
+ } CLIENT_ID, *PCLIENT_ID;
+ typedef VOID
+ (DDKAPI *PKSTART_ROUTINE)(
+   IN PVOID  StartContext);
+ typedef struct _VPB {
+   CSHORT  Type;
+   CSHORT  Size;
+   USHORT  Flags;
+   USHORT  VolumeLabelLength;
+   struct _DEVICE_OBJECT  *DeviceObject;
+   struct _DEVICE_OBJECT  *RealDevice;
+   ULONG  SerialNumber;
+   ULONG  ReferenceCount;
+   WCHAR  VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
+ } VPB, *PVPB;
+ typedef enum _IO_ALLOCATION_ACTION {
+   KeepObject = 1,
+   DeallocateObject,
+   DeallocateObjectKeepRegisters
+ } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
+ typedef IO_ALLOCATION_ACTION
+ (DDKAPI *PDRIVER_CONTROL)(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN struct _IRP  *Irp,
+   IN PVOID  MapRegisterBase,
+   IN PVOID  Context);
+ typedef struct _WAIT_CONTEXT_BLOCK {
+   KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
+   PDRIVER_CONTROL  DeviceRoutine;
+   PVOID  DeviceContext;
+   ULONG  NumberOfMapRegisters;
+   PVOID  DeviceObject;
+   PVOID  CurrentIrp;
+   PKDPC  BufferChainingDpc;
+ } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
+ typedef struct _DEVICE_OBJECT {
+   CSHORT  Type;
+   USHORT  Size;
+   LONG  ReferenceCount;
+   struct _DRIVER_OBJECT  *DriverObject;
+   struct _DEVICE_OBJECT  *NextDevice;
+   struct _DEVICE_OBJECT  *AttachedDevice;
+   struct _IRP  *CurrentIrp;
+   PIO_TIMER  Timer;
+   ULONG  Flags;
+   ULONG  Characteristics;
+   volatile PVPB  Vpb;
+   PVOID  DeviceExtension;
+   DEVICE_TYPE  DeviceType;
+   CCHAR  StackSize;
+   union {
+     LIST_ENTRY  ListEntry;
+     WAIT_CONTEXT_BLOCK  Wcb;
+   } Queue;
+   ULONG  AlignmentRequirement;
+   KDEVICE_QUEUE  DeviceQueue;
+   KDPC  Dpc;
+   ULONG  ActiveThreadCount;
+   PSECURITY_DESCRIPTOR  SecurityDescriptor;
+   KEVENT  DeviceLock;
+   USHORT  SectorSize;
+   USHORT  Spare1;
+   struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
+   PVOID  Reserved;
+ } DEVICE_OBJECT, *PDEVICE_OBJECT;
+ typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
+ typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
+   BOOLEAN  Removed;
+   BOOLEAN  Reserved[3];
+   volatile LONG  IoCount;
+   KEVENT  RemoveEvent;
+ } IO_REMOVE_LOCK_COMMON_BLOCK;
+ typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
+   LONG  Signature;
+   LONG  HighWatermark;
+   LONGLONG  MaxLockedTicks;
+   LONG  AllocateTag;
+   LIST_ENTRY  LockList;
+   KSPIN_LOCK  Spin;
+   volatile LONG  LowMemoryCount;
+   ULONG  Reserved1[4];
+   PVOID  Reserved2;
+   PIO_REMOVE_LOCK_TRACKING_BLOCK  Blocks;
+ } IO_REMOVE_LOCK_DBG_BLOCK;
+ typedef struct _IO_REMOVE_LOCK {
+   IO_REMOVE_LOCK_COMMON_BLOCK  Common;
+ #if DBG
+   IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
+ #endif
+ } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
+ typedef struct _IO_WORKITEM *PIO_WORKITEM;
+ typedef VOID
+ (DDKAPI IO_WORKITEM_ROUTINE)(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PVOID  Context);
+ typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
+ typedef struct _SHARE_ACCESS {
+   ULONG  OpenCount;
+   ULONG  Readers;
+   ULONG  Writers;
+   ULONG  Deleters;
+   ULONG  SharedRead;
+   ULONG  SharedWrite;
+   ULONG  SharedDelete;
+ } SHARE_ACCESS, *PSHARE_ACCESS;
+ /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
+    inheritance, even from a struct renders the type non-POD. So we use
+    this hack */
+ #define PCI_COMMON_HEADER_LAYOUT \
+   USHORT  VendorID; \
+   USHORT  DeviceID; \
+   USHORT  Command; \
+   USHORT  Status; \
+   UCHAR   RevisionID; \
+   UCHAR   ProgIf; \
+   UCHAR   SubClass; \
+   UCHAR   BaseClass; \
+   UCHAR   CacheLineSize; \
+   UCHAR   LatencyTimer; \
+   UCHAR   HeaderType; \
+   UCHAR   BIST; \
+   union { \
+     struct _PCI_HEADER_TYPE_0 { \
+       ULONG   BaseAddresses[PCI_TYPE0_ADDRESSES]; \
+       ULONG   CIS; \
+       USHORT  SubVendorID; \
+       USHORT  SubSystemID; \
+       ULONG   ROMBaseAddress; \
+       UCHAR   CapabilitiesPtr; \
+       UCHAR   Reserved1[3]; \
+       ULONG   Reserved2; \
+       UCHAR   InterruptLine; \
+       UCHAR   InterruptPin; \
+       UCHAR   MinimumGrant; \
+       UCHAR   MaximumLatency; \
+     } type0; \
+     struct _PCI_HEADER_TYPE_1 { \
+       ULONG   BaseAddresses[PCI_TYPE1_ADDRESSES]; \
+       UCHAR   PrimaryBus; \
+       UCHAR   SecondaryBus; \
+       UCHAR   SubordinateBus; \
+       UCHAR   SecondaryLatency; \
+       UCHAR   IOBase; \
+       UCHAR   IOLimit; \
+       USHORT  SecondaryStatus; \
+       USHORT  MemoryBase; \
+       USHORT  MemoryLimit; \
+       USHORT  PrefetchBase; \
+       USHORT  PrefetchLimit; \
+       ULONG   PrefetchBaseUpper32; \
+       ULONG   PrefetchLimitUpper32; \
+       USHORT  IOBaseUpper16; \
+       USHORT  IOLimitUpper16; \
+       UCHAR   CapabilitiesPtr; \
+       UCHAR   Reserved1[3]; \
+       ULONG   ROMBaseAddress; \
+       UCHAR   InterruptLine; \
+       UCHAR   InterruptPin; \
+       USHORT  BridgeControl; \
+     } type1; \
+     struct _PCI_HEADER_TYPE_2 { \
+       ULONG   SocketRegistersBaseAddress; \
+       UCHAR   CapabilitiesPtr; \
+       UCHAR   Reserved; \
+       USHORT  SecondaryStatus; \
+       UCHAR   PrimaryBus; \
+       UCHAR   SecondaryBus; \
+       UCHAR   SubordinateBus; \
+       UCHAR   SecondaryLatency; \
+       struct  { \
+         ULONG   Base; \
+         ULONG   Limit; \
+       } Range[PCI_TYPE2_ADDRESSES-1]; \
+       UCHAR   InterruptLine; \
+       UCHAR   InterruptPin; \
+       USHORT  BridgeControl; \
+     } type2; \
+   } u;
+ typedef struct _PCI_COMMON_HEADER {
+   PCI_COMMON_HEADER_LAYOUT
+ } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
+ #ifdef __cplusplus
+ typedef struct _PCI_COMMON_CONFIG {
+   PCI_COMMON_HEADER_LAYOUT
+   UCHAR  DeviceSpecific[192];
+ } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+ #else
+ typedef struct _PCI_COMMON_CONFIG {
+   PCI_COMMON_HEADER DUMMYSTRUCTNAME;
+   UCHAR  DeviceSpecific[192];
+ } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+ #endif
+ typedef enum _CREATE_FILE_TYPE {
+   CreateFileTypeNone,
+   CreateFileTypeNamedPipe,
+   CreateFileTypeMailslot
+ } CREATE_FILE_TYPE;
+ #define IO_FORCE_ACCESS_CHECK               0x001
+ #define IO_NO_PARAMETER_CHECKING            0x100
+ #define IO_REPARSE                      0x0
+ #define IO_REMOUNT                      0x1
+ typedef struct _IO_STATUS_BLOCK {
+   _ANONYMOUS_UNION union {
+     NTSTATUS  Status;
+     PVOID  Pointer;
+   } DUMMYUNIONNAME;
+   ULONG_PTR  Information;
+ } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+ typedef struct _PCI_SLOT_NUMBER {
+   union {
+     struct {
+       ULONG  DeviceNumber : 5;
+       ULONG  FunctionNumber : 3;
+       ULONG  Reserved : 24;
+     } bits;
+     ULONG  AsULONG;
+   } u;
+ } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
+ typedef VOID
+ (DDKAPI *PIO_APC_ROUTINE)(
+   IN PVOID ApcContext,
+   IN PIO_STATUS_BLOCK IoStatusBlock,
+   IN ULONG Reserved);
+ typedef VOID
+ (DDKAPI *WMI_NOTIFICATION_CALLBACK)(
+   PVOID  Wnode,
+   PVOID  Context);
 -  
++
+ #define WMIREG_ACTION_REGISTER      1
+ #define WMIREG_ACTION_DEREGISTER    2
+ #define WMIREG_ACTION_REREGISTER    3
+ #define WMIREG_ACTION_UPDATE_GUIDS  4
+ #define WMIREG_ACTION_BLOCK_IRPS    5
+ #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
+ 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
+ {
+     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;
+ typedef
+ BOOLEAN
+ (*PGPE_SERVICE_ROUTINE)(
+     PDEVICE_OBJECT ObjectContext,
+     PVOID ServiceContext
+ );
+ typedef
+ NTSTATUS
+ (*PGPE_CONNECT_VECTOR)(
+     PDEVICE_OBJECT Context,
+     ULONG GpeNumber,
+     KINTERRUPT_MODE Mode,
+     BOOLEAN Shareable,
+     PGPE_SERVICE_ROUTINE ServiceRoutine,
+     PVOID ServiceContext,
+     PVOID *ObjectContext
+ );
+ typedef
+ NTSTATUS
+ (*PGPE_DISCONNECT_VECTOR)(
+     PDEVICE_OBJECT Context,
+     PVOID ObjectContext
+ );
+ typedef
+ NTSTATUS
+ (*PGPE_ENABLE_EVENT)(
+     PDEVICE_OBJECT Context,
+     PVOID ObjectContext
+ );
+ typedef
+ NTSTATUS
+ (*PGPE_DISABLE_EVENT)(
+     PDEVICE_OBJECT Context,
+     PVOID ObjectContext
+ );
+ typedef
+ NTSTATUS
+ (*PGPE_CLEAR_STATUS)(
+     PDEVICE_OBJECT Context,
+     PVOID ObjectContext
+ );
+ typedef
+ VOID
+ (*PDEVICE_NOTIFY_CALLBACK)(
+     PVOID NotificationContext,
+     ULONG NotifyCode
+ );
+ typedef
+ NTSTATUS
+ (*PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
+     PDEVICE_OBJECT Context,
+     PDEVICE_NOTIFY_CALLBACK NotificationHandler,
+     PVOID NotificationContext
+ );
+ typedef
+ VOID
+ (*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
+     PDEVICE_OBJECT Context,
+     PDEVICE_NOTIFY_CALLBACK NotificationHandler
+ );
+ typedef struct
+ {
+     USHORT Size;
+     USHORT Version;
+     PVOID Context;
+     PINTERFACE_REFERENCE InterfaceReference;
+     PINTERFACE_DEREFERENCE InterfaceDereference;
+     PGPE_CONNECT_VECTOR GpeConnectVector;
+     PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
+     PGPE_ENABLE_EVENT GpeEnableEvent;
+     PGPE_DISABLE_EVENT GpeDisableEvent;
+     PGPE_CLEAR_STATUS GpeClearStatus;
+     PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
+     PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
+ } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
+ typedef struct _DEVICE_CAPABILITIES {
+   USHORT  Size;
+   USHORT  Version;
+   ULONG  DeviceD1 : 1;
+   ULONG  DeviceD2 : 1;
+   ULONG  LockSupported : 1;
+   ULONG  EjectSupported : 1;
+   ULONG  Removable : 1;
+   ULONG  DockDevice : 1;
+   ULONG  UniqueID : 1;
+   ULONG  SilentInstall : 1;
+   ULONG  RawDeviceOK : 1;
+   ULONG  SurpriseRemovalOK : 1;
+   ULONG  WakeFromD0 : 1;
+   ULONG  WakeFromD1 : 1;
+   ULONG  WakeFromD2 : 1;
+   ULONG  WakeFromD3 : 1;
+   ULONG  HardwareDisabled : 1;
+   ULONG  NonDynamic : 1;
+   ULONG  WarmEjectSupported : 1;
+   ULONG  NoDisplayInUI : 1;
+   ULONG  Reserved : 14;
+   ULONG  Address;
+   ULONG  UINumber;
+   DEVICE_POWER_STATE  DeviceState[PowerSystemMaximum];
+   SYSTEM_POWER_STATE  SystemWake;
+   DEVICE_POWER_STATE  DeviceWake;
+   ULONG  D1Latency;
+   ULONG  D2Latency;
+   ULONG  D3Latency;
+ } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
+ typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
+   USHORT  Version;
+   USHORT  Size;
+   GUID  Event;
+   GUID  InterfaceClassGuid;
+   PUNICODE_STRING  SymbolicLinkName;
+ } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
+ typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
+   USHORT  Version;
+   USHORT  Size;
+   GUID  Event;
+ } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
+ #undef INTERFACE
+ typedef struct _INTERFACE {
+   USHORT  Size;
+   USHORT  Version;
+   PVOID  Context;
+   PINTERFACE_REFERENCE  InterfaceReference;
+   PINTERFACE_DEREFERENCE  InterfaceDereference;
+ } INTERFACE, *PINTERFACE;
+ typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
+   USHORT  Version;
+   USHORT  Size;
+   GUID  Event;
+ } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
+ typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
+ /* PNP_DEVICE_STATE */
+ #define PNP_DEVICE_DISABLED                      0x00000001
+ #define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
+ #define PNP_DEVICE_FAILED                        0x00000004
+ #define PNP_DEVICE_REMOVED                       0x00000008
+ #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
+ #define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
+ typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
+   USHORT  Version;
+   USHORT  Size;
+   GUID  Event;
+   struct _FILE_OBJECT  *FileObject;
+   LONG  NameBufferOffset;
+   UCHAR  CustomDataBuffer[1];
+ } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
+ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
+   USHORT  Version;
+   USHORT  Size;
+   GUID  Event;
+   struct _FILE_OBJECT  *FileObject;
+ } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
+ typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
+   DeviceUsageTypeUndefined,
+   DeviceUsageTypePaging,
+   DeviceUsageTypeHibernation,
+   DeviceUsageTypeDumpFile
+ } DEVICE_USAGE_NOTIFICATION_TYPE;
+ typedef struct _POWER_SEQUENCE {
+   ULONG  SequenceD1;
+   ULONG  SequenceD2;
+   ULONG  SequenceD3;
+ } POWER_SEQUENCE, *PPOWER_SEQUENCE;
+ typedef enum {
+   DevicePropertyDeviceDescription = 0x0,
+   DevicePropertyHardwareID = 0x1,
+   DevicePropertyCompatibleIDs = 0x2,
+   DevicePropertyBootConfiguration = 0x3,
+   DevicePropertyBootConfigurationTranslated = 0x4,
+   DevicePropertyClassName = 0x5,
+   DevicePropertyClassGuid = 0x6,
+   DevicePropertyDriverKeyName = 0x7,
+   DevicePropertyManufacturer = 0x8,
+   DevicePropertyFriendlyName = 0x9,
+   DevicePropertyLocationInformation = 0xa,
+   DevicePropertyPhysicalDeviceObjectName = 0xb,
+   DevicePropertyBusTypeGuid = 0xc,
+   DevicePropertyLegacyBusType = 0xd,
+   DevicePropertyBusNumber = 0xe,
+   DevicePropertyEnumeratorName = 0xf,
+   DevicePropertyAddress = 0x10,
+   DevicePropertyUINumber = 0x11,
+   DevicePropertyInstallState = 0x12,
+   DevicePropertyRemovalPolicy = 0x13,
+   DevicePropertyResourceRequirements = 0x14,
+   DevicePropertyAllocatedResources = 0x15,
+   DevicePropertyContainerID = 0x16
+ } DEVICE_REGISTRY_PROPERTY;
+ typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
+   EventCategoryReserved,
+   EventCategoryHardwareProfileChange,
+   EventCategoryDeviceInterfaceChange,
+   EventCategoryTargetDeviceChange
+ } IO_NOTIFICATION_EVENT_CATEGORY;
+ #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
+ typedef NTSTATUS
+ (DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
+   IN PVOID NotificationStructure,
+   IN PVOID Context);
+ typedef VOID
+ (DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
+   IN PVOID Context);
+ typedef enum _FILE_INFORMATION_CLASS {
+   FileDirectoryInformation = 1,
+   FileFullDirectoryInformation,
+   FileBothDirectoryInformation,
+   FileBasicInformation,
+   FileStandardInformation,
+   FileInternalInformation,
+   FileEaInformation,
+   FileAccessInformation,
+   FileNameInformation,
+   FileRenameInformation,
+   FileLinkInformation,
+   FileNamesInformation,
+   FileDispositionInformation,
+   FilePositionInformation,
+   FileFullEaInformation,
+   FileModeInformation,
+   FileAlignmentInformation,
+   FileAllInformation,
+   FileAllocationInformation,
+   FileEndOfFileInformation,
+   FileAlternateNameInformation,
+   FileStreamInformation,
+   FilePipeInformation,
+   FilePipeLocalInformation,
+   FilePipeRemoteInformation,
+   FileMailslotQueryInformation,
+   FileMailslotSetInformation,
+   FileCompressionInformation,
+   FileObjectIdInformation,
+   FileCompletionInformation,
+   FileMoveClusterInformation,
+   FileQuotaInformation,
+   FileReparsePointInformation,
+   FileNetworkOpenInformation,
+   FileAttributeTagInformation,
+   FileTrackingInformation,
+   FileIdBothDirectoryInformation,
+   FileIdFullDirectoryInformation,
+   FileValidDataLengthInformation,
+   FileShortNameInformation,
+   FileIoCompletionNotificationInformation,
+   FileIoStatusBlockRangeInformation,
+   FileIoPriorityHintInformation,
+   FileSfioReserveInformation,
+   FileSfioVolumeInformation,
+   FileHardLinkInformation,
+   FileProcessIdsUsingFileInformation,
+   FileNormalizedNameInformation,
+   FileNetworkPhysicalNameInformation,
+   FileIdGlobalTxDirectoryInformation,
+   FileIsRemoteDeviceInformation,
+   FileAttributeCacheInformation,
+   FileNumaNodeInformation,
+   FileStandardLinkInformation,
+   FileRemoteProtocolInformation,
+   FileMaximumInformation
+ } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+ typedef struct _FILE_POSITION_INFORMATION {
+   LARGE_INTEGER  CurrentByteOffset;
+ } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
+ #include <pshpack8.h>
+ typedef struct _FILE_BASIC_INFORMATION {
+   LARGE_INTEGER  CreationTime;
+   LARGE_INTEGER  LastAccessTime;
+   LARGE_INTEGER  LastWriteTime;
+   LARGE_INTEGER  ChangeTime;
+   ULONG  FileAttributes;
+ } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
+ #include <poppack.h>
+ typedef struct _FILE_STANDARD_INFORMATION {
+   LARGE_INTEGER  AllocationSize;
+   LARGE_INTEGER  EndOfFile;
+   ULONG  NumberOfLinks;
+   BOOLEAN  DeletePending;
+   BOOLEAN  Directory;
+ } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
+ typedef struct _FILE_NETWORK_OPEN_INFORMATION {
+   LARGE_INTEGER  CreationTime;
+   LARGE_INTEGER  LastAccessTime;
+   LARGE_INTEGER  LastWriteTime;
+   LARGE_INTEGER  ChangeTime;
+   LARGE_INTEGER  AllocationSize;
+   LARGE_INTEGER  EndOfFile;
+   ULONG  FileAttributes;
+ } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
+ typedef enum _FSINFOCLASS {
+   FileFsVolumeInformation = 1,
+   FileFsLabelInformation,
+   FileFsSizeInformation,
+   FileFsDeviceInformation,
+   FileFsAttributeInformation,
+   FileFsControlInformation,
+   FileFsFullSizeInformation,
+   FileFsObjectIdInformation,
+   FileFsDriverPathInformation,
+   FileFsVolumeFlagsInformation,
+   FileFsMaximumInformation
+ } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
+ typedef struct _FILE_FS_DEVICE_INFORMATION {
+   DEVICE_TYPE  DeviceType;
+   ULONG  Characteristics;
+ } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
+ typedef struct _FILE_FULL_EA_INFORMATION {
+   ULONG  NextEntryOffset;
+   UCHAR  Flags;
+   UCHAR  EaNameLength;
+   USHORT  EaValueLength;
+   CHAR  EaName[1];
+ } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
+ #define FM_LOCK_BIT             (0x1)
+ #define FM_LOCK_BIT_V           (0x0)
+ #define FM_LOCK_WAITER_WOKEN    (0x2)
+ #define FM_LOCK_WAITER_INC      (0x4)
+ typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
+ typedef struct _OWNER_ENTRY {
+     ERESOURCE_THREAD OwnerThread;
+     _ANONYMOUS_UNION union {
+         LONG OwnerCount;
+         ULONG TableSize;
+     } DUMMYUNIONNAME;
+ } OWNER_ENTRY, *POWNER_ENTRY;
+ typedef struct _ERESOURCE
+ {
+     LIST_ENTRY SystemResourcesList;
+     POWNER_ENTRY OwnerTable;
+     SHORT ActiveCount;
+     USHORT Flag;
+     volatile PKSEMAPHORE SharedWaiters;
+     volatile PKEVENT ExclusiveWaiters;
+     OWNER_ENTRY OwnerEntry;
+     ULONG ActiveEntries;
+     ULONG ContentionCount;
+     ULONG NumberOfSharedWaiters;
+     ULONG NumberOfExclusiveWaiters;
+     __GNU_EXTENSION union
+     {
+         PVOID Address;
+         ULONG_PTR CreatorBackTraceIndex;
+     };
+     KSPIN_LOCK SpinLock;
+ } ERESOURCE, *PERESOURCE;
+ /* ERESOURCE.Flag */
+ #define ResourceNeverExclusive            0x0010
+ #define ResourceReleaseByOtherThread      0x0020
+ #define ResourceOwnedExclusive            0x0080
+ #define RESOURCE_HASH_TABLE_SIZE          64
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN ULONG  Length,
+   IN BOOLEAN  Wait,
+   IN ULONG  LockKey,
+   IN BOOLEAN  CheckForReadOperation,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_READ)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN ULONG  Length,
+   IN BOOLEAN  Wait,
+   IN ULONG  LockKey,
+   OUT PVOID  Buffer,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_WRITE)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN ULONG  Length,
+   IN BOOLEAN  Wait,
+   IN ULONG  LockKey,
+   IN PVOID  Buffer,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN BOOLEAN  Wait,
+   OUT PFILE_BASIC_INFORMATION  Buffer,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN BOOLEAN  Wait,
+   OUT PFILE_STANDARD_INFORMATION  Buffer,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_LOCK)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN PLARGE_INTEGER  Length,
+   PEPROCESS  ProcessId,
+   ULONG  Key,
+   BOOLEAN  FailImmediately,
+   BOOLEAN  ExclusiveLock,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN PLARGE_INTEGER  Length,
+   PEPROCESS  ProcessId,
+   ULONG  Key,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_UNLOCK_ALL)(
+   IN struct _FILE_OBJECT  *FileObject,
+   PEPROCESS  ProcessId,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
+   IN struct _FILE_OBJECT  *FileObject,
+   PVOID  ProcessId,
+   ULONG  Key,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_DEVICE_CONTROL)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN BOOLEAN  Wait,
+   IN PVOID  InputBuffer  OPTIONAL,
+   IN ULONG  InputBufferLength,
+   OUT PVOID  OutputBuffer  OPTIONAL,
+   IN ULONG  OutputBufferLength,
+   IN ULONG  IoControlCode,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef VOID
+ (DDKAPI *PFAST_IO_ACQUIRE_FILE)(
+   IN struct _FILE_OBJECT  *FileObject);
+ typedef VOID
+ (DDKAPI *PFAST_IO_RELEASE_FILE)(
+   IN struct _FILE_OBJECT  *FileObject);
+ typedef VOID
+ (DDKAPI *PFAST_IO_DETACH_DEVICE)(
+   IN struct _DEVICE_OBJECT  *SourceDevice,
+   IN struct _DEVICE_OBJECT  *TargetDevice);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN BOOLEAN  Wait,
+   OUT struct _FILE_NETWORK_OPEN_INFORMATION  *Buffer,
+   OUT struct _IO_STATUS_BLOCK  *IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef NTSTATUS
+ (DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  EndingOffset,
+   OUT struct _ERESOURCE  **ResourceToRelease,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_MDL_READ)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN ULONG  Length,
+   IN ULONG  LockKey,
+   OUT PMDL  *MdlChain,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
+   IN struct _FILE_OBJECT *FileObject,
+   IN PMDL MdlChain,
+   IN struct _DEVICE_OBJECT *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN ULONG  Length,
+   IN ULONG  LockKey,
+   OUT PMDL  *MdlChain,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN PMDL  MdlChain,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_READ_COMPRESSED)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN ULONG  Length,
+   IN ULONG  LockKey,
+   OUT PVOID  Buffer,
+   OUT PMDL  *MdlChain,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   OUT struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
+   IN ULONG  CompressedDataInfoLength,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN ULONG  Length,
+   IN ULONG  LockKey,
+   IN PVOID  Buffer,
+   OUT PMDL  *MdlChain,
+   OUT PIO_STATUS_BLOCK  IoStatus,
+   IN struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
+   IN ULONG  CompressedDataInfoLength,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PMDL  MdlChain,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN PLARGE_INTEGER  FileOffset,
+   IN PMDL  MdlChain,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef BOOLEAN
+ (DDKAPI *PFAST_IO_QUERY_OPEN)(
+   IN struct _IRP  *Irp,
+   OUT PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef NTSTATUS
+ (DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN struct _ERESOURCE  *ResourceToRelease,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef NTSTATUS
+ (DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
+   IN struct _FILE_OBJECT  *FileObject,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef NTSTATUS
+ (DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
+   IN struct _FILE_OBJECT  *FileObject,
+   IN struct _DEVICE_OBJECT  *DeviceObject);
+ typedef struct _FAST_IO_DISPATCH {
+   ULONG  SizeOfFastIoDispatch;
+   PFAST_IO_CHECK_IF_POSSIBLE  FastIoCheckIfPossible;
+   PFAST_IO_READ  FastIoRead;
+   PFAST_IO_WRITE  FastIoWrite;
+   PFAST_IO_QUERY_BASIC_INFO  FastIoQueryBasicInfo;
+   PFAST_IO_QUERY_STANDARD_INFO  FastIoQueryStandardInfo;
+   PFAST_IO_LOCK  FastIoLock;
+   PFAST_IO_UNLOCK_SINGLE  FastIoUnlockSingle;
+   PFAST_IO_UNLOCK_ALL  FastIoUnlockAll;
+   PFAST_IO_UNLOCK_ALL_BY_KEY  FastIoUnlockAllByKey;
+   PFAST_IO_DEVICE_CONTROL  FastIoDeviceControl;
+   PFAST_IO_ACQUIRE_FILE  AcquireFileForNtCreateSection;
+   PFAST_IO_RELEASE_FILE  ReleaseFileForNtCreateSection;
+   PFAST_IO_DETACH_DEVICE  FastIoDetachDevice;
+   PFAST_IO_QUERY_NETWORK_OPEN_INFO  FastIoQueryNetworkOpenInfo;
+   PFAST_IO_ACQUIRE_FOR_MOD_WRITE  AcquireForModWrite;
+   PFAST_IO_MDL_READ  MdlRead;
+   PFAST_IO_MDL_READ_COMPLETE  MdlReadComplete;
+   PFAST_IO_PREPARE_MDL_WRITE  PrepareMdlWrite;
+   PFAST_IO_MDL_WRITE_COMPLETE  MdlWriteComplete;
+   PFAST_IO_READ_COMPRESSED  FastIoReadCompressed;
+   PFAST_IO_WRITE_COMPRESSED  FastIoWriteCompressed;
+   PFAST_IO_MDL_READ_COMPLETE_COMPRESSED  MdlReadCompleteCompressed;
+   PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED  MdlWriteCompleteCompressed;
+   PFAST_IO_QUERY_OPEN  FastIoQueryOpen;
+   PFAST_IO_RELEASE_FOR_MOD_WRITE  ReleaseForModWrite;
+   PFAST_IO_ACQUIRE_FOR_CCFLUSH  AcquireForCcFlush;
+   PFAST_IO_RELEASE_FOR_CCFLUSH  ReleaseForCcFlush;
+ } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
+ typedef struct _SECTION_OBJECT_POINTERS {
+   PVOID  DataSectionObject;
+   PVOID  SharedCacheMap;
+   PVOID  ImageSectionObject;
+ } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
+ typedef struct _IO_COMPLETION_CONTEXT {
+   PVOID  Port;
+   PVOID  Key;
+ } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
+ /* FILE_OBJECT.Flags */
+ #define FO_FILE_OPEN                 0x00000001
+ #define FO_SYNCHRONOUS_IO            0x00000002
+ #define FO_ALERTABLE_IO              0x00000004
+ #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
+ #define FO_WRITE_THROUGH             0x00000010
+ #define FO_SEQUENTIAL_ONLY           0x00000020
+ #define FO_CACHE_SUPPORTED           0x00000040
+ #define FO_NAMED_PIPE                0x00000080
+ #define FO_STREAM_FILE               0x00000100
+ #define FO_MAILSLOT                  0x00000200
+ #define FO_GENERATE_AUDIT_ON_CLOSE   0x00000400
+ #define FO_QUEUE_IRP_TO_THREAD       0x00000400
+ #define FO_DIRECT_DEVICE_OPEN        0x00000800
+ #define FO_FILE_MODIFIED             0x00001000
+ #define FO_FILE_SIZE_CHANGED         0x00002000
+ #define FO_CLEANUP_COMPLETE          0x00004000
+ #define FO_TEMPORARY_FILE            0x00008000
+ #define FO_DELETE_ON_CLOSE           0x00010000
+ #define FO_OPENED_CASE_SENSITIVE     0x00020000
+ #define FO_HANDLE_CREATED            0x00040000
+ #define FO_FILE_FAST_IO_READ         0x00080000
+ #define FO_RANDOM_ACCESS             0x00100000
+ #define FO_FILE_OPEN_CANCELLED       0x00200000
+ #define FO_VOLUME_OPEN               0x00400000
+ #define FO_REMOTE_ORIGIN             0x01000000
+ #define FO_DISALLOW_EXCLUSIVE        0x02000000
+ #define FO_SKIP_COMPLETION_PORT      0x02000000
+ #define FO_SKIP_SET_EVENT            0x04000000
+ #define FO_SKIP_SET_FAST_IO          0x08000000
+ /* VPB.Flags */
+ #define VPB_MOUNTED                       0x0001
+ #define VPB_LOCKED                        0x0002
+ #define VPB_PERSISTENT                    0x0004
+ #define VPB_REMOVE_PENDING                0x0008
+ #define VPB_RAW_MOUNT                     0x0010
+ #define VPB_DIRECT_WRITES_ALLOWED         0x0020
+ /* IRP.Flags */
+ #define SL_FORCE_ACCESS_CHECK             0x01
+ #define SL_OPEN_PAGING_FILE               0x02
+ #define SL_OPEN_TARGET_DIRECTORY          0x04
+ #define SL_CASE_SENSITIVE                 0x80
+ #define SL_KEY_SPECIFIED                  0x01
+ #define SL_OVERRIDE_VERIFY_VOLUME         0x02
+ #define SL_WRITE_THROUGH                  0x04
+ #define SL_FT_SEQUENTIAL_WRITE            0x08
+ #define SL_FAIL_IMMEDIATELY               0x01
+ #define SL_EXCLUSIVE_LOCK                 0x02
+ #define SL_RESTART_SCAN                   0x01
+ #define SL_RETURN_SINGLE_ENTRY            0x02
+ #define SL_INDEX_SPECIFIED                0x04
+ #define SL_WATCH_TREE                     0x01
+ #define SL_ALLOW_RAW_MOUNT                0x01
+ #define CTL_CODE(DeviceType, Function, Method, Access) \
+   (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
+ #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
+ #define IRP_NOCACHE                     0x00000001
+ #define IRP_PAGING_IO                   0x00000002
+ #define IRP_MOUNT_COMPLETION            0x00000002
+ #define IRP_SYNCHRONOUS_API             0x00000004
+ #define IRP_ASSOCIATED_IRP              0x00000008
+ #define IRP_BUFFERED_IO                 0x00000010
+ #define IRP_DEALLOCATE_BUFFER           0x00000020
+ #define IRP_INPUT_OPERATION             0x00000040
+ #define IRP_SYNCHRONOUS_PAGING_IO       0x00000040
+ #define IRP_CREATE_OPERATION            0x00000080
+ #define IRP_READ_OPERATION              0x00000100
+ #define IRP_WRITE_OPERATION             0x00000200
+ #define IRP_CLOSE_OPERATION             0x00000400
+ #define IRP_DEFER_IO_COMPLETION         0x00000800
+ #define IRP_OB_QUERY_NAME               0x00001000
+ #define IRP_HOLD_DEVICE_QUEUE           0x00002000
+ #define IRP_QUOTA_CHARGED                 0x01
+ #define IRP_ALLOCATED_MUST_SUCCEED        0x02
+ #define IRP_ALLOCATED_FIXED_SIZE          0x04
+ #define IRP_LOOKASIDE_ALLOCATION          0x08
+ /*
+ ** IRP function codes
+ */
+ #define IRP_MJ_CREATE                     0x00
+ #define IRP_MJ_CREATE_NAMED_PIPE          0x01
+ #define IRP_MJ_CLOSE                      0x02
+ #define IRP_MJ_READ                       0x03
+ #define IRP_MJ_WRITE                      0x04
+ #define IRP_MJ_QUERY_INFORMATION          0x05
+ #define IRP_MJ_SET_INFORMATION            0x06
+ #define IRP_MJ_QUERY_EA                   0x07
+ #define IRP_MJ_SET_EA                     0x08
+ #define IRP_MJ_FLUSH_BUFFERS              0x09
+ #define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
+ #define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
+ #define IRP_MJ_DIRECTORY_CONTROL          0x0c
+ #define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
+ #define IRP_MJ_DEVICE_CONTROL             0x0e
+ #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
+ #define IRP_MJ_SCSI                       0x0f
+ #define IRP_MJ_SHUTDOWN                   0x10
+ #define IRP_MJ_LOCK_CONTROL               0x11
+ #define IRP_MJ_CLEANUP                    0x12
+ #define IRP_MJ_CREATE_MAILSLOT            0x13
+ #define IRP_MJ_QUERY_SECURITY             0x14
+ #define IRP_MJ_SET_SECURITY               0x15
+ #define IRP_MJ_POWER                      0x16
+ #define IRP_MJ_SYSTEM_CONTROL             0x17
+ #define IRP_MJ_DEVICE_CHANGE              0x18
+ #define IRP_MJ_QUERY_QUOTA                0x19
+ #define IRP_MJ_SET_QUOTA                  0x1a
+ #define IRP_MJ_PNP                        0x1b
+ #define IRP_MJ_PNP_POWER                  0x1b
+ #define IRP_MJ_MAXIMUM_FUNCTION           0x1b
+ #define IRP_MN_SCSI_CLASS                 0x01
+ #define IRP_MN_START_DEVICE               0x00
+ #define IRP_MN_QUERY_REMOVE_DEVICE        0x01
+ #define IRP_MN_REMOVE_DEVICE              0x02
+ #define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
+ #define IRP_MN_STOP_DEVICE                0x04
+ #define IRP_MN_QUERY_STOP_DEVICE          0x05
+ #define IRP_MN_CANCEL_STOP_DEVICE         0x06
+ #define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
+ #define IRP_MN_QUERY_INTERFACE              0x08
+ #define IRP_MN_QUERY_CAPABILITIES           0x09
+ #define IRP_MN_QUERY_RESOURCES              0x0A
+ #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
+ #define IRP_MN_QUERY_DEVICE_TEXT            0x0C
+ #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
+ #define IRP_MN_READ_CONFIG                  0x0F
+ #define IRP_MN_WRITE_CONFIG                 0x10
+ #define IRP_MN_EJECT                        0x11
+ #define IRP_MN_SET_LOCK                     0x12
+ #define IRP_MN_QUERY_ID                     0x13
+ #define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
+ #define IRP_MN_QUERY_BUS_INFORMATION        0x15
+ #define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
+ #define IRP_MN_SURPRISE_REMOVAL             0x17
+ #define IRP_MN_WAIT_WAKE                  0x00
+ #define IRP_MN_POWER_SEQUENCE             0x01
+ #define IRP_MN_SET_POWER                  0x02
+ #define IRP_MN_QUERY_POWER                0x03
+ #define IRP_MN_QUERY_ALL_DATA             0x00
+ #define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
+ #define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
+ #define IRP_MN_CHANGE_SINGLE_ITEM         0x03
+ #define IRP_MN_ENABLE_EVENTS              0x04
+ #define IRP_MN_DISABLE_EVENTS             0x05
+ #define IRP_MN_ENABLE_COLLECTION          0x06
+ #define IRP_MN_DISABLE_COLLECTION         0x07
+ #define IRP_MN_REGINFO                    0x08
+ #define IRP_MN_EXECUTE_METHOD             0x09
+ #define IRP_MN_REGINFO_EX                 0x0b
+ typedef struct _FILE_OBJECT
+ {
+     CSHORT Type;
+     CSHORT Size;
+     PDEVICE_OBJECT DeviceObject;
+     PVPB Vpb;
+     PVOID FsContext;
+     PVOID FsContext2;
+     PSECTION_OBJECT_POINTERS SectionObjectPointer;
+     PVOID PrivateCacheMap;
+     NTSTATUS FinalStatus;
+     struct _FILE_OBJECT *RelatedFileObject;
+     BOOLEAN LockOperation;
+     BOOLEAN DeletePending;
+     BOOLEAN ReadAccess;
+     BOOLEAN WriteAccess;
+     BOOLEAN DeleteAccess;
+     BOOLEAN SharedRead;
+     BOOLEAN SharedWrite;
+     BOOLEAN SharedDelete;
+     ULONG Flags;
+     UNICODE_STRING FileName;
+     LARGE_INTEGER CurrentByteOffset;
+     volatile ULONG Waiters;
+     volatile ULONG Busy;
+     PVOID LastLock;
+     KEVENT Lock;
+     KEVENT Event;
+     volatile PIO_COMPLETION_CONTEXT CompletionContext;
+     KSPIN_LOCK IrpListLock;
+     LIST_ENTRY IrpList;
+     volatile PVOID FileObjectExtension;
+ } FILE_OBJECT, *PFILE_OBJECT;
+ typedef struct _IO_ERROR_LOG_PACKET {
+   UCHAR  MajorFunctionCode;
+   UCHAR  RetryCount;
+   USHORT  DumpDataSize;
+   USHORT  NumberOfStrings;
+   USHORT  StringOffset;
+   USHORT  EventCategory;
+   NTSTATUS  ErrorCode;
+   ULONG  UniqueErrorValue;
+   NTSTATUS  FinalStatus;
+   ULONG  SequenceNumber;
+   ULONG  IoControlCode;
+   LARGE_INTEGER  DeviceOffset;
+   ULONG  DumpData[1];
+ } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
+ typedef struct _IO_ERROR_LOG_MESSAGE {
+   USHORT  Type;
+   USHORT  Size;
+   USHORT  DriverNameLength;
+   LARGE_INTEGER  TimeStamp;
+   ULONG  DriverNameOffset;
+   IO_ERROR_LOG_PACKET  EntryData;
+ } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
+ #define ERROR_LOG_LIMIT_SIZE               240
+ #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
+                                             sizeof(IO_ERROR_LOG_PACKET) + \
+                                             (sizeof(WCHAR) * 40))
+ #define ERROR_LOG_MESSAGE_LIMIT_SIZE                                          \
+     (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
+ #define IO_ERROR_LOG_MESSAGE_LENGTH                                           \
+     ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ?           \
+         ERROR_LOG_MESSAGE_LIMIT_SIZE :                                        \
+         PORT_MAXIMUM_MESSAGE_LENGTH)
+ #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH -                 \
+                                 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
+ typedef enum _DMA_WIDTH {
+   Width8Bits,
+   Width16Bits,
+   Width32Bits,
+   MaximumDmaWidth
+ } DMA_WIDTH, *PDMA_WIDTH;
+ typedef enum _DMA_SPEED {
+   Compatible,
+   TypeA,
+   TypeB,
+   TypeC,
+   TypeF,
+   MaximumDmaSpeed
+ } DMA_SPEED, *PDMA_SPEED;
+ /* DEVICE_DESCRIPTION.Version */
+ #define DEVICE_DESCRIPTION_VERSION        0x0000
+ #define DEVICE_DESCRIPTION_VERSION1       0x0001
+ #define DEVICE_DESCRIPTION_VERSION2       0x0002
+ typedef struct _DEVICE_DESCRIPTION {
+   ULONG  Version;
+   BOOLEAN  Master;
+   BOOLEAN  ScatterGather;
+   BOOLEAN  DemandMode;
+   BOOLEAN  AutoInitialize;
+   BOOLEAN  Dma32BitAddresses;
+   BOOLEAN  IgnoreCount;
+   BOOLEAN  Reserved1;
+   BOOLEAN  Dma64BitAddresses;
+   ULONG  BusNumber;
+   ULONG  DmaChannel;
+   INTERFACE_TYPE  InterfaceType;
+   DMA_WIDTH  DmaWidth;
+   DMA_SPEED  DmaSpeed;
+   ULONG  MaximumLength;
+   ULONG  DmaPort;
+ } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
+ typedef enum _DEVICE_RELATION_TYPE {
+   BusRelations,
+   EjectionRelations,
+   PowerRelations,
+   RemovalRelations,
+   TargetDeviceRelation,
+   SingleBusRelations,
+   TransportRelations
+ } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
+ typedef struct _DEVICE_RELATIONS {
+   ULONG  Count;
+   PDEVICE_OBJECT Objects[1];
+ } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
+ typedef struct _DEVOBJ_EXTENSION
+ {
+     CSHORT Type;
+     USHORT Size;
+     PDEVICE_OBJECT DeviceObject;
+ } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
+ typedef struct _SCATTER_GATHER_ELEMENT {
+   PHYSICAL_ADDRESS  Address;
+   ULONG  Length;
+   ULONG_PTR  Reserved;
+ } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
+ #if defined(_MSC_EXTENSIONS)
+ #if _MSC_VER >= 1200
+ #pragma warning(push)
+ #endif
+ #pragma warning(disable:4200)
+ typedef struct _SCATTER_GATHER_LIST {
+   ULONG  NumberOfElements;
+   ULONG_PTR  Reserved;
+   SCATTER_GATHER_ELEMENT  Elements[1];
+ } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
+ #if _MSC_VER >= 1200
+ #pragma warning(pop)
+ #else
+ #pragma warning(default:4200)
+ #endif
+ #else
+ struct _SCATTER_GATHER_LIST;
+ typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
+ #endif
+ typedef NTSTATUS
+ (DDKAPI DRIVER_ADD_DEVICE)(
+   IN struct _DRIVER_OBJECT  *DriverObject,
+   IN struct _DEVICE_OBJECT  *PhysicalDeviceObject);
+ typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
+ typedef struct _DRIVER_EXTENSION {
+   struct _DRIVER_OBJECT  *DriverObject;
+   PDRIVER_ADD_DEVICE  AddDevice;
+   ULONG  Count;
+   UNICODE_STRING  ServiceKeyName;
+ } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
+ #define DRVO_UNLOAD_INVOKED               0x00000001
+ #define DRVO_LEGACY_DRIVER                0x00000002
+ #define DRVO_BUILTIN_DRIVER               0x00000004
+ typedef NTSTATUS
+ (DDKAPI DRIVER_INITIALIZE)(
+   IN struct _DRIVER_OBJECT  *DriverObject,
+   IN PUNICODE_STRING  RegistryPath);
+ typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
+ typedef VOID
+ (DDKAPI DRIVER_STARTIO)(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN struct _IRP  *Irp);
+ typedef DRIVER_STARTIO *PDRIVER_STARTIO;
+ typedef VOID
+ (DDKAPI DRIVER_UNLOAD)(
+   IN struct _DRIVER_OBJECT  *DriverObject);
+ typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
+ typedef NTSTATUS
+ (DDKAPI DRIVER_DISPATCH)(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN struct _IRP  *Irp);
+ typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
+ typedef struct _DRIVER_OBJECT {
+   CSHORT  Type;
+   CSHORT  Size;
+   PDEVICE_OBJECT  DeviceObject;
+   ULONG  Flags;
+   PVOID  DriverStart;
+   ULONG  DriverSize;
+   PVOID  DriverSection;
+   PDRIVER_EXTENSION  DriverExtension;
+   UNICODE_STRING  DriverName;
+   PUNICODE_STRING  HardwareDatabase;
+   struct _FAST_IO_DISPATCH *FastIoDispatch;
+   PDRIVER_INITIALIZE  DriverInit;
+   PDRIVER_STARTIO  DriverStartIo;
+   PDRIVER_UNLOAD  DriverUnload;
+   PDRIVER_DISPATCH  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
+ } DRIVER_OBJECT;
+ typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
+ typedef struct _DMA_ADAPTER {
+   USHORT  Version;
+   USHORT  Size;
+   struct _DMA_OPERATIONS*  DmaOperations;
+ } DMA_ADAPTER, *PDMA_ADAPTER;
+ typedef VOID
+ (DDKAPI *PPUT_DMA_ADAPTER)(
+   IN PDMA_ADAPTER  DmaAdapter);
+ typedef PVOID
+ (DDKAPI *PALLOCATE_COMMON_BUFFER)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN ULONG  Length,
+   OUT PPHYSICAL_ADDRESS  LogicalAddress,
+   IN BOOLEAN  CacheEnabled);
+ typedef VOID
+ (DDKAPI *PFREE_COMMON_BUFFER)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN ULONG  Length,
+   IN PHYSICAL_ADDRESS  LogicalAddress,
+   IN PVOID  VirtualAddress,
+   IN BOOLEAN  CacheEnabled);
+ typedef NTSTATUS
+ (DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN ULONG  NumberOfMapRegisters,
+   IN PDRIVER_CONTROL  ExecutionRoutine,
+   IN PVOID  Context);
+ typedef BOOLEAN
+ (DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PMDL  Mdl,
+   IN PVOID  MapRegisterBase,
+   IN PVOID  CurrentVa,
+   IN ULONG  Length,
+   IN BOOLEAN  WriteToDevice);
+ typedef VOID
+ (DDKAPI *PFREE_ADAPTER_CHANNEL)(
+   IN PDMA_ADAPTER  DmaAdapter);
+ typedef VOID
+ (DDKAPI *PFREE_MAP_REGISTERS)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   PVOID  MapRegisterBase,
+   ULONG  NumberOfMapRegisters);
+ typedef PHYSICAL_ADDRESS
+ (DDKAPI *PMAP_TRANSFER)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PMDL  Mdl,
+   IN PVOID  MapRegisterBase,
+   IN PVOID  CurrentVa,
+   IN OUT PULONG  Length,
+   IN BOOLEAN  WriteToDevice);
+ typedef ULONG
+ (DDKAPI *PGET_DMA_ALIGNMENT)(
+   IN PDMA_ADAPTER  DmaAdapter);
+ typedef ULONG
+ (DDKAPI *PREAD_DMA_COUNTER)(
+   IN PDMA_ADAPTER  DmaAdapter);
+ typedef VOID
+ (DDKAPI *PDRIVER_LIST_CONTROL)(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN struct _IRP  *Irp,
+   IN struct _SCATTER_GATHER_LIST  *ScatterGather,
+   IN PVOID  Context);
+ typedef NTSTATUS
+ (DDKAPI *PGET_SCATTER_GATHER_LIST)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PMDL  Mdl,
+   IN PVOID  CurrentVa,
+   IN ULONG  Length,
+   IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
+   IN PVOID  Context,
+   IN BOOLEAN  WriteToDevice);
+ typedef VOID
+ (DDKAPI *PPUT_SCATTER_GATHER_LIST)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PSCATTER_GATHER_LIST  ScatterGather,
+   IN BOOLEAN  WriteToDevice);
+ typedef NTSTATUS
+ (DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PMDL  Mdl  OPTIONAL,
+   IN PVOID  CurrentVa,
+   IN ULONG  Length,
+   OUT PULONG  ScatterGatherListSize,
+   OUT PULONG  pNumberOfMapRegisters  OPTIONAL);
+ typedef NTSTATUS
+ (DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PMDL  Mdl,
+   IN PVOID  CurrentVa,
+   IN ULONG  Length,
+   IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
+   IN PVOID  Context,
+   IN BOOLEAN  WriteToDevice,
+   IN PVOID  ScatterGatherBuffer,
+   IN ULONG  ScatterGatherLength);
+ typedef NTSTATUS
+ (DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
+   IN PDMA_ADAPTER  DmaAdapter,
+   IN PSCATTER_GATHER_LIST  ScatterGather,
+   IN PMDL  OriginalMdl,
+   OUT PMDL  *TargetMdl);
+ typedef struct _DMA_OPERATIONS {
+   ULONG  Size;
+   PPUT_DMA_ADAPTER  PutDmaAdapter;
+   PALLOCATE_COMMON_BUFFER  AllocateCommonBuffer;
+   PFREE_COMMON_BUFFER  FreeCommonBuffer;
+   PALLOCATE_ADAPTER_CHANNEL  AllocateAdapterChannel;
+   PFLUSH_ADAPTER_BUFFERS  FlushAdapterBuffers;
+   PFREE_ADAPTER_CHANNEL  FreeAdapterChannel;
+   PFREE_MAP_REGISTERS  FreeMapRegisters;
+   PMAP_TRANSFER  MapTransfer;
+   PGET_DMA_ALIGNMENT  GetDmaAlignment;
+   PREAD_DMA_COUNTER  ReadDmaCounter;
+   PGET_SCATTER_GATHER_LIST  GetScatterGatherList;
+   PPUT_SCATTER_GATHER_LIST  PutScatterGatherList;
+   PCALCULATE_SCATTER_GATHER_LIST_SIZE  CalculateScatterGatherList;
+   PBUILD_SCATTER_GATHER_LIST  BuildScatterGatherList;
+   PBUILD_MDL_FROM_SCATTER_GATHER_LIST  BuildMdlFromScatterGatherList;
+ } DMA_OPERATIONS, *PDMA_OPERATIONS;
+ typedef struct _IO_RESOURCE_DESCRIPTOR {
+   UCHAR  Option;
+   UCHAR  Type;
+   UCHAR  ShareDisposition;
+   UCHAR  Spare1;
+   USHORT  Flags;
+   USHORT  Spare2;
+   union {
+     struct {
+       ULONG  Length;
+       ULONG  Alignment;
+       PHYSICAL_ADDRESS  MinimumAddress;
+       PHYSICAL_ADDRESS  MaximumAddress;
+     } Port;
+     struct {
+       ULONG  Length;
+       ULONG  Alignment;
+       PHYSICAL_ADDRESS  MinimumAddress;
+       PHYSICAL_ADDRESS  MaximumAddress;
+     } Memory;
+     struct {
+       ULONG  MinimumVector;
+       ULONG  MaximumVector;
+     } Interrupt;
+     struct {
+       ULONG  MinimumChannel;
+       ULONG  MaximumChannel;
+     } Dma;
+     struct {
+       ULONG  Length;
+       ULONG  Alignment;
+       PHYSICAL_ADDRESS  MinimumAddress;
+       PHYSICAL_ADDRESS  MaximumAddress;
+     } Generic;
+     struct {
+       ULONG  Data[3];
+     } DevicePrivate;
+     struct {
+       ULONG  Length;
+       ULONG  MinBusNumber;
+       ULONG  MaxBusNumber;
+       ULONG  Reserved;
+     } BusNumber;
+     struct {
+       ULONG  Priority;
+       ULONG  Reserved1;
+       ULONG  Reserved2;
+     } ConfigData;
+   } u;
+ } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
+ typedef struct _IO_RESOURCE_LIST {
+   USHORT  Version;
+   USHORT  Revision;
+   ULONG  Count;
+   IO_RESOURCE_DESCRIPTOR  Descriptors[1];
+ } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
+ typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
+   ULONG  ListSize;
+   INTERFACE_TYPE  InterfaceType;
+   ULONG  BusNumber;
+   ULONG  SlotNumber;
+   ULONG  Reserved[3];
+   ULONG  AlternativeLists;
+   IO_RESOURCE_LIST  List[1];
+ } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
+ typedef VOID
+ (DDKAPI DRIVER_CANCEL)(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN struct _IRP  *Irp);
+ typedef DRIVER_CANCEL *PDRIVER_CANCEL;
+ typedef struct _IRP {
+   CSHORT  Type;
+   USHORT  Size;
+   struct _MDL  *MdlAddress;
+   ULONG  Flags;
+   union {
+     struct _IRP  *MasterIrp;
+     volatile LONG  IrpCount;
+     PVOID  SystemBuffer;
+   } AssociatedIrp;
+   LIST_ENTRY  ThreadListEntry;
+   IO_STATUS_BLOCK  IoStatus;
+   KPROCESSOR_MODE  RequestorMode;
+   BOOLEAN  PendingReturned;
+   CHAR  StackCount;
+   CHAR  CurrentLocation;
+   BOOLEAN  Cancel;
+   KIRQL  CancelIrql;
+   CCHAR  ApcEnvironment;
+   UCHAR  AllocationFlags;
+   PIO_STATUS_BLOCK  UserIosb;
+   PKEVENT  UserEvent;
+   union {
+     struct {
+       _ANONYMOUS_UNION union {      
+         PIO_APC_ROUTINE  UserApcRoutine;
+         PVOID IssuingProcess;
+       } DUMMYUNIONNAME;
+       PVOID  UserApcContext;
+     } AsynchronousParameters;
+     LARGE_INTEGER  AllocationSize;
+   } Overlay;
+   volatile PDRIVER_CANCEL  CancelRoutine;
+   PVOID  UserBuffer;
+   union {
+     struct {
+       _ANONYMOUS_UNION union {
+         KDEVICE_QUEUE_ENTRY  DeviceQueueEntry;
+         _ANONYMOUS_STRUCT struct {
+           PVOID  DriverContext[4];
+         } DUMMYSTRUCTNAME;
+       } DUMMYUNIONNAME;
+       PETHREAD  Thread;
+       PCHAR  AuxiliaryBuffer;
+       _ANONYMOUS_STRUCT struct {
+         LIST_ENTRY  ListEntry;
+         _ANONYMOUS_UNION union {
+           struct _IO_STACK_LOCATION  *CurrentStackLocation;
+           ULONG  PacketType;
+         } DUMMYUNIONNAME;
+       } DUMMYSTRUCTNAME;
+       struct _FILE_OBJECT  *OriginalFileObject;
+     } Overlay;
+     KAPC  Apc;
+     PVOID  CompletionKey;
+   } Tail;
+ } IRP;
+ typedef struct _IRP *PIRP;
+ typedef enum _IO_PAGING_PRIORITY {
+   IoPagingPriorityInvalid,
+   IoPagingPriorityNormal,
+   IoPagingPriorityHigh,
+   IoPagingPriorityReserved1,
+   IoPagingPriorityReserved2
+ } IO_PAGING_PRIORITY;
+ typedef NTSTATUS
+ (DDKAPI IO_COMPLETION_ROUTINE)(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN struct _IRP  *Irp,
+   IN PVOID  Context);
+ typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
+ typedef VOID
+ (DDKAPI *PIO_DPC_ROUTINE)(
+   IN struct _KDPC  *Dpc,
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN struct _IRP  *Irp,
+   IN PVOID  Context);
+ typedef NTSTATUS
+ (DDKAPI *PMM_DLL_INITIALIZE)(
+   IN PUNICODE_STRING  RegistryPath);
+ typedef NTSTATUS
+ (DDKAPI *PMM_DLL_UNLOAD)(
+   VOID);
+ typedef BOOLEAN
+ (DDKAPI KSERVICE_ROUTINE)(
+   IN struct _KINTERRUPT  *Interrupt,
+   IN PVOID  ServiceContext);
+ typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
+ typedef VOID
+ (DDKAPI *PIO_TIMER_ROUTINE)(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN PVOID  Context);
+ typedef struct _IO_SECURITY_CONTEXT {
+   PSECURITY_QUALITY_OF_SERVICE  SecurityQos;
+   PACCESS_STATE  AccessState;
+   ACCESS_MASK  DesiredAccess;
+   ULONG  FullCreateOptions;
+ } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
+ struct _IO_CSQ;
+ typedef struct _IO_CSQ_IRP_CONTEXT {
+   ULONG  Type;
+   struct _IRP  *Irp;
+   struct _IO_CSQ  *Csq;
+ } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
+ typedef VOID
+ (DDKAPI *PIO_CSQ_INSERT_IRP)(
+   IN struct _IO_CSQ  *Csq,
+   IN PIRP  Irp);
+ typedef VOID
+ (DDKAPI *PIO_CSQ_REMOVE_IRP)(
+   IN struct _IO_CSQ  *Csq,
+   IN PIRP  Irp);
+ typedef PIRP
+ (DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
+   IN struct _IO_CSQ  *Csq,
+   IN PIRP  Irp,
+   IN PVOID  PeekContext);
+ typedef VOID
+ (DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
+   IN  struct _IO_CSQ  *Csq,
+   OUT PKIRQL  Irql);
+ typedef VOID
+ (DDKAPI *PIO_CSQ_RELEASE_LOCK)(
+   IN struct _IO_CSQ  *Csq,
+   IN KIRQL  Irql);
+ typedef VOID
+ (DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
+   IN  struct _IO_CSQ  *Csq,
+   IN  PIRP  Irp);
+ typedef struct _IO_CSQ {
+   ULONG  Type;
+   PIO_CSQ_INSERT_IRP  CsqInsertIrp;
+   PIO_CSQ_REMOVE_IRP  CsqRemoveIrp;
+   PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp;
+   PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock;
+   PIO_CSQ_RELEASE_LOCK  CsqReleaseLock;
+   PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
+   PVOID  ReservePointer;
+ } IO_CSQ, *PIO_CSQ;
+ typedef enum _BUS_QUERY_ID_TYPE {
+   BusQueryDeviceID,
+   BusQueryHardwareIDs,
+   BusQueryCompatibleIDs,
+   BusQueryInstanceID,
+   BusQueryDeviceSerialNumber
+ } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
+ typedef enum _DEVICE_TEXT_TYPE {
+   DeviceTextDescription,
+   DeviceTextLocationInformation
+ } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
+ typedef enum _WORK_QUEUE_TYPE {
+   CriticalWorkQueue,
+   DelayedWorkQueue,
+   HyperCriticalWorkQueue,
+   MaximumWorkQueue
+ } WORK_QUEUE_TYPE;
+ #if !defined(_AMD64_) && !defined(_IA64_)
+ #include <pshpack4.h>
+ #endif
+ typedef struct _IO_STACK_LOCATION {
+   UCHAR  MajorFunction;
+   UCHAR  MinorFunction;
+   UCHAR  Flags;
+   UCHAR  Control;
+   union {
+     struct {
+       PIO_SECURITY_CONTEXT  SecurityContext;
+       ULONG  Options;
+       USHORT POINTER_ALIGNMENT  FileAttributes;
+       USHORT  ShareAccess;
+       ULONG POINTER_ALIGNMENT  EaLength;
+     } Create;
+     struct {
+       ULONG  Length;
+       ULONG POINTER_ALIGNMENT  Key;
+       LARGE_INTEGER  ByteOffset;
+     } Read;
+     struct {
+       ULONG  Length;
+       ULONG POINTER_ALIGNMENT  Key;
+       LARGE_INTEGER  ByteOffset;
+     } Write;
+     struct {
+       ULONG  Length;
+       PUNICODE_STRING  FileName;
+       FILE_INFORMATION_CLASS  FileInformationClass;
+       ULONG  FileIndex;
+     } QueryDirectory;
+     struct {
+       ULONG  Length;
+       ULONG  CompletionFilter;
+     } NotifyDirectory;
+     struct {
+       ULONG  Length;
+       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
+     } QueryFile;
+     struct {
+       ULONG  Length;
+       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
+       PFILE_OBJECT  FileObject;
+       _ANONYMOUS_UNION union {
+         _ANONYMOUS_STRUCT struct {
+           BOOLEAN  ReplaceIfExists;
+           BOOLEAN  AdvanceOnly;
+         } DUMMYSTRUCTNAME;
+         ULONG  ClusterCount;
+         HANDLE  DeleteHandle;
+       } DUMMYUNIONNAME;
+     } SetFile;
+     struct {
+       ULONG  Length;
+       PVOID  EaList;
+       ULONG  EaListLength;
+       ULONG  EaIndex;
+     } QueryEa;
+     struct {
+       ULONG  Length;
+     } SetEa;
+     struct {
+       ULONG  Length;
+       FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
+     } QueryVolume;
+     struct {
+       ULONG  Length;
+       FS_INFORMATION_CLASS  FsInformationClass;
+     } SetVolume;
+     struct {
+       ULONG  OutputBufferLength;
+       ULONG  InputBufferLength;
+       ULONG  FsControlCode;
+       PVOID  Type3InputBuffer;
+     } FileSystemControl;
+     struct {
+       PLARGE_INTEGER  Length;
+       ULONG  Key;
+       LARGE_INTEGER  ByteOffset;
+     } LockControl;
+     struct {
+       ULONG  OutputBufferLength;
+       ULONG POINTER_ALIGNMENT  InputBufferLength;
+       ULONG POINTER_ALIGNMENT  IoControlCode;
+       PVOID  Type3InputBuffer;
+     } DeviceIoControl;
+     struct {
+       SECURITY_INFORMATION  SecurityInformation;
+       ULONG POINTER_ALIGNMENT  Length;
+     } QuerySecurity;
+     struct {
+       SECURITY_INFORMATION  SecurityInformation;
+       PSECURITY_DESCRIPTOR  SecurityDescriptor;
+     } SetSecurity;
+     struct {
+       PVPB  Vpb;
+       PDEVICE_OBJECT  DeviceObject;
+     } MountVolume;
+     struct {
+       PVPB  Vpb;
+       PDEVICE_OBJECT  DeviceObject;
+     } VerifyVolume;
+     struct {
+       struct _SCSI_REQUEST_BLOCK  *Srb;
+     } Scsi;
+     struct {
+       ULONG  Length;
+       PSID  StartSid;
+       struct _FILE_GET_QUOTA_INFORMATION  *SidList;
+       ULONG  SidListLength;
+     } QueryQuota;
+     struct {
+       ULONG  Length;
+     } SetQuota;
+     struct {
+       DEVICE_RELATION_TYPE  Type;
+     } QueryDeviceRelations;
+     struct {
+       CONST GUID  *InterfaceType;
+       USHORT  Size;
+       USHORT  Version;
+       PINTERFACE  Interface;
+       PVOID  InterfaceSpecificData;
+     } QueryInterface;
+     struct {
+       PDEVICE_CAPABILITIES  Capabilities;
+     } DeviceCapabilities;
+     struct {
+       PIO_RESOURCE_REQUIREMENTS_LIST  IoResourceRequirementList;
+     } FilterResourceRequirements;
+     struct {
+       ULONG  WhichSpace;
+       PVOID  Buffer;
+       ULONG  Offset;
+       ULONG POINTER_ALIGNMENT  Length;
+     } ReadWriteConfig;
+     struct {
+       BOOLEAN  Lock;
+     } SetLock;
+     struct {
+       BUS_QUERY_ID_TYPE  IdType;
+     } QueryId;
+     struct {
+       DEVICE_TEXT_TYPE  DeviceTextType;
+       LCID POINTER_ALIGNMENT  LocaleId;
+     } QueryDeviceText;
+     struct {
+       BOOLEAN  InPath;
+       BOOLEAN  Reserved[3];
+       DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT  Type;
+     } UsageNotification;
+     struct {
+       SYSTEM_POWER_STATE  PowerState;
+     } WaitWake;
+     struct {
+       PPOWER_SEQUENCE  PowerSequence;
+     } PowerSequence;
+     struct {
+       ULONG  SystemContext;
+       POWER_STATE_TYPE POINTER_ALIGNMENT  Type;
+       POWER_STATE POINTER_ALIGNMENT  State;
+       POWER_ACTION POINTER_ALIGNMENT  ShutdownType;
+     } Power;
+     struct {
+       PCM_RESOURCE_LIST  AllocatedResources;
+       PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
+     } StartDevice;
+     struct {
+       ULONG_PTR  ProviderId;
+       PVOID  DataPath;
+       ULONG  BufferSize;
+       PVOID  Buffer;
+     } WMI;
+     struct {
+       PVOID  Argument1;
+       PVOID  Argument2;
+       PVOID  Argument3;
+       PVOID  Argument4;
+     } Others;
+   } Parameters;
+   PDEVICE_OBJECT  DeviceObject;
+   PFILE_OBJECT  FileObject;
+   PIO_COMPLETION_ROUTINE  CompletionRoutine;
+   PVOID  Context;
+ } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
+ #if !defined(_AMD64_) && !defined(_IA64_)
+ #include <poppack.h>
+ #endif
+ /* IO_STACK_LOCATION.Control */
+ #define SL_PENDING_RETURNED               0x01
+ #define SL_ERROR_RETURNED                 0x02
+ #define SL_INVOKE_ON_CANCEL               0x20
+ #define SL_INVOKE_ON_SUCCESS              0x40
+ #define SL_INVOKE_ON_ERROR                0x80
+ /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
+ #define PCI_WHICHSPACE_CONFIG             0x0
+ #define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
+ #define METHOD_BUFFERED                   0
+ #define METHOD_IN_DIRECT                  1
+ #define METHOD_OUT_DIRECT                 2
+ #define METHOD_NEITHER                    3
+ #define FILE_SUPERSEDED                   0x00000000
+ #define FILE_OPENED                       0x00000001
+ #define FILE_CREATED                      0x00000002
+ #define FILE_OVERWRITTEN                  0x00000003
+ #define FILE_EXISTS                       0x00000004
+ #define FILE_DOES_NOT_EXIST               0x00000005
+ #define FILE_USE_FILE_POINTER_POSITION    0xfffffffe
+ #define FILE_WRITE_TO_END_OF_FILE         0xffffffff
+ /* also in winnt.h */
+ #define FILE_LIST_DIRECTORY               0x00000001
+ #define FILE_READ_DATA                    0x00000001
+ #define FILE_ADD_FILE                     0x00000002
+ #define FILE_WRITE_DATA                   0x00000002
+ #define FILE_ADD_SUBDIRECTORY             0x00000004
+ #define FILE_APPEND_DATA                  0x00000004
+ #define FILE_CREATE_PIPE_INSTANCE         0x00000004
+ #define FILE_READ_EA                      0x00000008
+ #define FILE_WRITE_EA                     0x00000010
+ #define FILE_EXECUTE                      0x00000020
+ #define FILE_TRAVERSE                     0x00000020
+ #define FILE_DELETE_CHILD                 0x00000040
+ #define FILE_READ_ATTRIBUTES              0x00000080
+ #define FILE_WRITE_ATTRIBUTES             0x00000100
+ #define FILE_SHARE_READ                   0x00000001
+ #define FILE_SHARE_WRITE                  0x00000002
+ #define FILE_SHARE_DELETE                 0x00000004
+ #define FILE_SHARE_VALID_FLAGS            0x00000007
+ #define FILE_ATTRIBUTE_READONLY           0x00000001
+ #define FILE_ATTRIBUTE_HIDDEN             0x00000002
+ #define FILE_ATTRIBUTE_SYSTEM             0x00000004
+ #define FILE_ATTRIBUTE_DIRECTORY          0x00000010
+ #define FILE_ATTRIBUTE_ARCHIVE            0x00000020
+ #define FILE_ATTRIBUTE_DEVICE             0x00000040
+ #define FILE_ATTRIBUTE_NORMAL             0x00000080
+ #define FILE_ATTRIBUTE_TEMPORARY          0x00000100
+ #define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
+ #define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
+ #define FILE_ATTRIBUTE_COMPRESSED         0x00000800
+ #define FILE_ATTRIBUTE_OFFLINE            0x00001000
+ #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
+ #define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
+ #define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
+ #define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
+ #define FILE_VALID_OPTION_FLAGS           0x00ffffff
+ #define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
+ #define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
+ #define FILE_VALID_SET_FLAGS              0x00000036
+ #define FILE_SUPERSEDE                    0x00000000
+ #define FILE_OPEN                         0x00000001
+ #define FILE_CREATE                       0x00000002
+ #define FILE_OPEN_IF                      0x00000003
+ #define FILE_OVERWRITE                    0x00000004
+ #define FILE_OVERWRITE_IF                 0x00000005
+ #define FILE_MAXIMUM_DISPOSITION          0x00000005
+ #define FILE_DIRECTORY_FILE               0x00000001
+ #define FILE_WRITE_THROUGH                0x00000002
+ #define FILE_SEQUENTIAL_ONLY              0x00000004
+ #define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
+ #define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
+ #define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
+ #define FILE_NON_DIRECTORY_FILE           0x00000040
+ #define FILE_CREATE_TREE_CONNECTION       0x00000080
+ #define FILE_COMPLETE_IF_OPLOCKED         0x00000100
+ #define FILE_NO_EA_KNOWLEDGE              0x00000200
+ #define FILE_OPEN_REMOTE_INSTANCE         0x00000400
+ #define FILE_RANDOM_ACCESS                0x00000800
+ #define FILE_DELETE_ON_CLOSE              0x00001000
+ #define FILE_OPEN_BY_FILE_ID              0x00002000
+ #define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
+ #define FILE_NO_COMPRESSION               0x00008000
+ #define FILE_RESERVE_OPFILTER             0x00100000
+ #define FILE_OPEN_REPARSE_POINT           0x00200000
+ #define FILE_OPEN_NO_RECALL               0x00400000
+ #define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
+ #define FILE_ANY_ACCESS                   0x00000000
+ #define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
+ #define FILE_READ_ACCESS                  0x00000001
+ #define FILE_WRITE_ACCESS                 0x00000002
+ #define FILE_ALL_ACCESS \
+   (STANDARD_RIGHTS_REQUIRED | \
+    SYNCHRONIZE | \
+    0x1FF)
+ #define FILE_GENERIC_EXECUTE \
+   (STANDARD_RIGHTS_EXECUTE | \
+    FILE_READ_ATTRIBUTES | \
+    FILE_EXECUTE | \
+    SYNCHRONIZE)
+ #define FILE_GENERIC_READ \
+   (STANDARD_RIGHTS_READ | \
+    FILE_READ_DATA | \
+    FILE_READ_ATTRIBUTES | \
+    FILE_READ_EA | \
+    SYNCHRONIZE)
+ #define FILE_GENERIC_WRITE \
+   (STANDARD_RIGHTS_WRITE | \
+    FILE_WRITE_DATA | \
+    FILE_WRITE_ATTRIBUTES | \
+    FILE_WRITE_EA | \
+    FILE_APPEND_DATA | \
+    SYNCHRONIZE)
+ /* end winnt.h */
+ /******************************************************************************
+  *                            Object Manager Types                            *
+  ******************************************************************************/
+ typedef struct _OBJECT_NAME_INFORMATION {
+   UNICODE_STRING  Name;
+ } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
+ /* Exported object types */
+ extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
+ extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
+ extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
+ extern POBJECT_TYPE NTSYSAPI PsThreadType;
+ extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
+ extern POBJECT_TYPE NTSYSAPI PsProcessType;
+ /******************************************************************************
+  *                           Process Manager Types                            *
+  ******************************************************************************/
+ #define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
+ #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
+ #define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
+ #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
+ #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
+ /* Process Qoutas */
+ typedef struct _QUOTA_LIMITS {
+     SIZE_T PagedPoolLimit;
+     SIZE_T NonPagedPoolLimit;
+     SIZE_T MinimumWorkingSetSize;
+     SIZE_T MaximumWorkingSetSize;
+     SIZE_T PagefileLimit;
+     LARGE_INTEGER TimeLimit;
+ } QUOTA_LIMITS, *PQUOTA_LIMITS;
+ /* Thread Access Rights */
+ #define THREAD_TERMINATE                 0x0001
+ #define THREAD_SUSPEND_RESUME            0x0002
+ #define THREAD_ALERT                     0x0004
+ #define THREAD_GET_CONTEXT               0x0008
+ #define THREAD_SET_CONTEXT               0x0010
+ #define THREAD_SET_INFORMATION           0x0020
+ #define THREAD_SET_LIMITED_INFORMATION   0x0400
+ #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
+ #define PROCESS_DUP_HANDLE                 (0x0040)
+ #if (NTDDI_VERSION >= NTDDI_VISTA)
+ #define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
+ #else
+ #define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
+ #endif
+ #if (NTDDI_VERSION >= NTDDI_VISTA)
+ #define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
+ #else
+ #define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
+ #endif
+ #define ES_SYSTEM_REQUIRED                0x00000001
+ #define ES_DISPLAY_REQUIRED               0x00000002
+ #define ES_USER_PRESENT                   0x00000004
+ #define ES_CONTINUOUS                     0x80000000
+ #define LOW_PRIORITY                      0
+ #define LOW_REALTIME_PRIORITY             16
+ #define HIGH_PRIORITY                     31
+ #define MAXIMUM_PRIORITY                  32
+ #ifdef _X86_
+ /** Kernel definitions for x86 **/
+ /* Interrupt request levels */
+ #define PASSIVE_LEVEL           0
+ #define LOW_LEVEL               0
+ #define APC_LEVEL               1
+ #define DISPATCH_LEVEL          2
+ #define CMCI_LEVEL              5
+ #define PROFILE_LEVEL           27
+ #define CLOCK1_LEVEL            28
+ #define CLOCK2_LEVEL            28
+ #define IPI_LEVEL               29
+ #define POWER_LEVEL             30
+ #define HIGH_LEVEL              31
+ #define CLOCK_LEVEL             (CLOCK2_LEVEL)
+ #define KIP0PCRADDRESS          0xffdff000  
+ #define KI_USER_SHARED_DATA     0xffdf0000
+ #define SharedUserData          ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
+ #define PAGE_SIZE               0x1000
+ #define PAGE_SHIFT              12L
+ #define KeGetDcacheFillSize()   1L
+ #define EFLAG_SIGN              0x8000
+ #define EFLAG_ZERO              0x4000
+ #define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
+ #define RESULT_NEGATIVE         ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
+ #define RESULT_ZERO             ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
+ #define RESULT_POSITIVE         ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
+ typedef struct _KFLOATING_SAVE {
+   ULONG  ControlWord;
+   ULONG  StatusWord;
+   ULONG  ErrorOffset;
+   ULONG  ErrorSelector;
+   ULONG  DataOffset;
+   ULONG  DataSelector;
+   ULONG  Cr0NpxState;
+   ULONG  Spare1;
+ } KFLOATING_SAVE, *PKFLOATING_SAVE;
+ extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
+ #define YieldProcessor _mm_pause
+ FORCEINLINE
+ VOID
+ KeMemoryBarrier(
+   VOID)
+ {
+   volatile LONG Barrier;
+ #if defined(__GNUC__)
+   __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
+ #elif defined(_MSC_VER)
+   __asm xchg [Barrier], eax
+ #endif
+ }
+ NTHALAPI
+ VOID
+ FASTCALL
+ KfLowerIrql(
+   IN KIRQL  NewIrql);
+ #define KeLowerIrql(a) KfLowerIrql(a)
+ NTHALAPI
+ KIRQL
+ FASTCALL
+ KfRaiseIrql(
+   IN KIRQL  NewIrql);
+ #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
+ NTHALAPI
+ KIRQL
+ DDKAPI
+ KeRaiseIrqlToDpcLevel(
+   VOID);
+ NTHALAPI
+ KIRQL
+ DDKAPI
+ KeRaiseIrqlToSynchLevel(
+     VOID);
+ NTHALAPI
+ KIRQL
+ FASTCALL
+ KfAcquireSpinLock(
+   IN PKSPIN_LOCK SpinLock);
+ #define KeAcquireSpinLock(a,b)  *(b) = KfAcquireSpinLock(a)
+ NTHALAPI
+ VOID
+ FASTCALL
+ KfReleaseSpinLock(
+   IN PKSPIN_LOCK SpinLock,
+   IN KIRQL NewIrql);
+ #define KeReleaseSpinLock(a,b)  KfReleaseSpinLock(a,b)
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ KefAcquireSpinLockAtDpcLevel(
+   IN PKSPIN_LOCK  SpinLock);
+ #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ KefReleaseSpinLockFromDpcLevel(
+   IN PKSPIN_LOCK  SpinLock);
+ #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
+ NTSYSAPI
+ PKTHREAD
+ NTAPI
+ KeGetCurrentThread(
+   VOID);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ KeSaveFloatingPointState(
+   OUT PKFLOATING_SAVE  FloatSave);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ KeRestoreFloatingPointState(
+   IN PKFLOATING_SAVE  FloatSave);
+ /* VOID
+  * KeFlushIoBuffers(
+  *   IN PMDL Mdl,
+  *   IN BOOLEAN ReadOperation,
+  *   IN BOOLEAN DmaOperation)
+  */
+ #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
+ /* x86 and x64 performs a 0x2C interrupt */
+ #define DbgRaiseAssertionFailure __int2c
+ FORCEINLINE
+ VOID
+ _KeQueryTickCount(
+   OUT PLARGE_INTEGER CurrentCount)
+ {
+     for (;;)
+     {
+         CurrentCount->HighPart = KeTickCount.High1Time;
+         CurrentCount->LowPart = KeTickCount.LowPart;
+         if (CurrentCount->HighPart == KeTickCount.High2Time) break;
+         YieldProcessor();
+     }
+ }
+ #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
+ #endif /* _X86_ */
+ /******************************************************************************
+  *                         Runtime Library Functions                          *
+  ******************************************************************************/
+ FORCEINLINE
+ VOID
+ InitializeListHead(
+   OUT PLIST_ENTRY ListHead)
+ {
+   ListHead->Flink = ListHead->Blink = ListHead;
+ }
+ FORCEINLINE
+ VOID
+ InsertHeadList(
+   IN OUT PLIST_ENTRY  ListHead,
+   IN OUT PLIST_ENTRY  Entry)
+ {
+   PLIST_ENTRY OldFlink;
+   OldFlink = ListHead->Flink;
+   Entry->Flink = OldFlink;
+   Entry->Blink = ListHead;
+   OldFlink->Blink = Entry;
+   ListHead->Flink = Entry;
+ }
+ FORCEINLINE
+ VOID
+ InsertTailList(
+   IN OUT PLIST_ENTRY  ListHead,
+   IN OUT PLIST_ENTRY  Entry)
+ {
+   PLIST_ENTRY OldBlink;
+   OldBlink = ListHead->Blink;
+   Entry->Flink = ListHead;
+   Entry->Blink = OldBlink;
+   OldBlink->Flink = Entry;
+   ListHead->Blink = Entry;
+ }
+ BOOLEAN
+ FORCEINLINE
+ IsListEmpty(
+   IN CONST LIST_ENTRY * ListHead)
+ {
+   return (BOOLEAN)(ListHead->Flink == ListHead);
+ }
+ FORCEINLINE
+ PSINGLE_LIST_ENTRY
+ PopEntryList(
+   IN OUT PSINGLE_LIST_ENTRY ListHead)
+ {
+   PSINGLE_LIST_ENTRY FirstEntry;
+   FirstEntry = ListHead->Next;
+   if (FirstEntry != NULL) {
+     ListHead->Next = FirstEntry->Next;
+   }
+   return FirstEntry;
+ }
+ FORCEINLINE
+ VOID
+ PushEntryList(
+   IN OUT PSINGLE_LIST_ENTRY ListHead,
+   IN OUT PSINGLE_LIST_ENTRY Entry)
+ {
+   Entry->Next = ListHead->Next;
+   ListHead->Next = Entry;
+ }
+ FORCEINLINE
+ BOOLEAN
+ RemoveEntryList(
+   IN PLIST_ENTRY  Entry)
+ {
+   PLIST_ENTRY OldFlink;
+   PLIST_ENTRY OldBlink;
+   OldFlink = Entry->Flink;
+   OldBlink = Entry->Blink;
+   OldFlink->Blink = OldBlink;
+   OldBlink->Flink = OldFlink;
+   return (BOOLEAN)(OldFlink == OldBlink);
+ }
+ FORCEINLINE
+ PLIST_ENTRY
+ RemoveHeadList(
+   IN OUT PLIST_ENTRY  ListHead)
+ {
+   PLIST_ENTRY Flink;
+   PLIST_ENTRY Entry;
+   Entry = ListHead->Flink;
+   Flink = Entry->Flink;
+   ListHead->Flink = Flink;
+   Flink->Blink = ListHead;
+   return Entry;
+ }
+ FORCEINLINE
+ PLIST_ENTRY
+ RemoveTailList(
+   IN OUT PLIST_ENTRY  ListHead)
+ {
+   PLIST_ENTRY Blink;
+   PLIST_ENTRY Entry;
+   Entry = ListHead->Blink;
+   Blink = Entry->Blink;
+   ListHead->Blink = Blink;
+   Blink->Flink = ListHead;
+   return Entry;
+ }
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlAssert(
+     IN PVOID FailedAssertion,
+     IN PVOID FileName,
+     IN ULONG LineNumber,
+     IN PSTR Message);
+ /* VOID
+  * RtlCopyMemory(
+  *     IN VOID UNALIGNED *Destination,
+  *     IN CONST VOID UNALIGNED *Source,
+  *     IN SIZE_T Length)
+  */
+ #define RtlCopyMemory(Destination, Source, Length) \
+     memcpy(Destination, Source, Length)
+ #define RtlCopyBytes RtlCopyMemory
+ #if defined(_M_AMD64)
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlCopyMemoryNonTemporal(
+     VOID UNALIGNED *Destination,
+     CONST VOID UNALIGNED *Source,
+     SIZE_T Length);
+ #else
+ #define RtlCopyMemoryNonTemporal RtlCopyMemory
+ #endif
+ /* BOOLEAN
+  * RtlEqualLuid(
+  *     IN PLUID Luid1,
+  *     IN PLUID Luid2)
+  */
+ #define RtlEqualLuid(Luid1, Luid2) \
+     (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
+ /* ULONG
+  * RtlEqualMemory(
+  *     IN VOID UNALIGNED *Destination,
+  *     IN CONST VOID UNALIGNED *Source,
+  *     IN SIZE_T Length)
+  */
+ #define RtlEqualMemory(Destination, Source, Length) \
+     (!memcmp(Destination, Source, Length))
+ /* VOID
+  * RtlFillMemory(
+  *     IN VOID UNALIGNED *Destination,
+  *     IN SIZE_T Length,
+  *     IN UCHAR Fill)
+  */
+ #define RtlFillMemory(Destination, Length, Fill) \
+     memset(Destination, Fill, Length)
+ #define RtlFillBytes RtlFillMemory
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlFreeUnicodeString(
+     IN OUT PUNICODE_STRING UnicodeString);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlGUIDFromString(
+     IN PUNICODE_STRING GuidString,
+     OUT GUID *Guid);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlInitUnicodeString(
+     IN OUT PUNICODE_STRING DestinationString,
+     IN PCWSTR SourceString OPTIONAL);
+ /* VOID
+  * RtlMoveMemory(
+  *    IN VOID UNALIGNED *Destination,
+  *    IN CONST VOID UNALIGNED *Source,
+  *    IN SIZE_T Length)
+  */
+ #define RtlMoveMemory(Destination, Source, Length) \
+     memmove(Destination, Source, Length)
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlStringFromGUID(
+     IN REFGUID Guid,
+     OUT PUNICODE_STRING GuidString);
+ /* VOID
+  * RtlZeroMemory(
+  *     IN VOID UNALIGNED *Destination,
+  *     IN SIZE_T Length)
+  */
+ #define RtlZeroMemory(Destination, Length) \
+     memset(Destination, 0, Length)
+ #define RtlZeroBytes RtlZeroMemory
+ #if (NTDDI_VERSION >= NTDDI_WIN2K)
+ NTSYSAPI
+ BOOLEAN
+ NTAPI
+ RtlAreBitsClear(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG StartingIndex,
+     IN ULONG Length);
+ NTSYSAPI
+ BOOLEAN
+ NTAPI
+ RtlAreBitsSet(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG StartingIndex,
+     IN ULONG Length);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlAnsiStringToUnicodeString(
+     IN OUT PUNICODE_STRING DestinationString,
+     IN PANSI_STRING SourceString,
+     IN BOOLEAN AllocateDestinationString);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlxAnsiStringToUnicodeSize(
+     IN PCANSI_STRING AnsiString);
+ #define RtlAnsiStringToUnicodeSize(String) (               \
+   NLS_MB_CODE_PAGE_TAG ?                                   \
+   RtlxAnsiStringToUnicodeSize(String) :                    \
+   ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
+ )
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlAppendUnicodeStringToString(
+     IN OUT PUNICODE_STRING Destination,
+     IN PCUNICODE_STRING Source);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlAppendUnicodeToString(
+     IN OUT PUNICODE_STRING Destination,
+     IN PCWSTR Source);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlCheckRegistryKey(
+     IN ULONG RelativeTo,
+     IN PWSTR Path);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlClearAllBits(
+     IN PRTL_BITMAP BitMapHeader);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlClearBits(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG StartingIndex,
+     IN ULONG NumberToClear);
+ NTSYSAPI
+ SIZE_T
+ NTAPI
+ RtlCompareMemory(
+     IN CONST VOID *Source1,
+     IN CONST VOID *Source2,
+     IN SIZE_T Length);
+ NTSYSAPI
+ LONG
+ NTAPI
+ RtlCompareUnicodeString(
+     IN PCUNICODE_STRING String1,
+     IN PCUNICODE_STRING String2,
+     IN BOOLEAN CaseInSensitive);
+ NTSYSAPI
+ LONG
+ NTAPI
+ RtlCompareUnicodeStrings(
+     IN PCWCH String1,
+     IN SIZE_T String1Length,
+     IN PCWCH String2,
+     IN SIZE_T String2Length,
+     IN BOOLEAN CaseInSensitive);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlCopyUnicodeString(
+   IN OUT PUNICODE_STRING  DestinationString,
+   IN PCUNICODE_STRING  SourceString);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlCreateRegistryKey(
+     IN ULONG RelativeTo,
+     IN PWSTR Path);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlCreateSecurityDescriptor(
+     IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+     IN ULONG Revision);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlDeleteRegistryValue(
+     IN ULONG RelativeTo,
+     IN PCWSTR Path,
+     IN PCWSTR ValueName);
+ NTSYSAPI
+ BOOLEAN
+ NTAPI
+ RtlEqualUnicodeString(
+     IN CONST UNICODE_STRING *String1,
+     IN CONST UNICODE_STRING *String2,
+     IN BOOLEAN CaseInSensitive);
+ #if !defined(_AMD64_) && !defined(_IA64_)
+ NTSYSAPI
+ LARGE_INTEGER
+ NTAPI
+ RtlExtendedIntegerMultiply(
+     IN LARGE_INTEGER Multiplicand,
+     IN LONG Multiplier);
+ NTSYSAPI
+ LARGE_INTEGER
+ NTAPI
+ RtlExtendedLargeIntegerDivide(
+   IN LARGE_INTEGER Dividend,
+   IN ULONG Divisor,
+   IN OUT PULONG Remainder);
+ #endif
+ #if defined(_X86_) || defined(_IA64_)
+ NTSYSAPI
+ LARGE_INTEGER
+ NTAPI
+ RtlExtendedMagicDivide(
+     IN LARGE_INTEGER Dividend,
+     IN LARGE_INTEGER MagicDivisor,
+     IN CCHAR  ShiftCount);
+ #endif
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlFreeAnsiString(
+     IN PANSI_STRING AnsiString);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindClearBits(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG NumberToFind,
+     IN ULONG HintIndex);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindClearBitsAndSet(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG NumberToFind,
+     IN ULONG HintIndex);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindFirstRunClear(
+     IN PRTL_BITMAP BitMapHeader,
+     OUT PULONG StartingIndex);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindClearRuns(
+     IN PRTL_BITMAP BitMapHeader,
+     OUT PRTL_BITMAP_RUN RunArray,
+     IN ULONG SizeOfRunArray,
+     IN BOOLEAN LocateLongestRuns);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindLastBackwardRunClear(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG FromIndex,
+     OUT PULONG StartingRunIndex);
+ NTSYSAPI
+ CCHAR
+ NTAPI
+ RtlFindLeastSignificantBit(
+     IN ULONGLONG Set);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindLongestRunClear(
+     IN PRTL_BITMAP BitMapHeader,
+     OUT PULONG StartingIndex);
+ NTSYSAPI
+ CCHAR
+ NTAPI
+ RtlFindMostSignificantBit(
+     IN ULONGLONG Set);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindNextForwardRunClear(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG FromIndex,
+     OUT PULONG StartingRunIndex);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindSetBits(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG NumberToFind,
+     IN ULONG HintIndex);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlFindSetBitsAndClear(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG NumberToFind,
+     IN ULONG HintIndex);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlHashUnicodeString(
+     IN CONST UNICODE_STRING *String,
+     IN BOOLEAN CaseInSensitive,
+     IN ULONG HashAlgorithm,
+     OUT PULONG HashValue);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlInitAnsiString(
+     IN OUT PANSI_STRING DestinationString,
+     IN PCSZ SourceString);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlInitializeBitMap(
+     IN PRTL_BITMAP BitMapHeader,
+     IN PULONG BitMapBuffer,
+     IN ULONG SizeOfBitMap);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlInitString(
+     IN OUT PSTRING DestinationString,
+     IN PCSZ SourceString);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlIntegerToUnicodeString(
+     IN ULONG Value,
+     IN ULONG Base OPTIONAL,
+     IN OUT PUNICODE_STRING String);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlInt64ToUnicodeString(
+     IN ULONGLONG Value,
+     IN ULONG Base OPTIONAL,
+     IN OUT PUNICODE_STRING String);
+ #ifdef _WIN64
+ #define RtlIntPtrToUnicodeString(Value, Base, String) \
+     RtlInt64ToUnicodeString(Value, Base, String)
+ #else
+ #define RtlIntPtrToUnicodeString(Value, Base, String) \
+     RtlIntegerToUnicodeString(Value, Base, String)
+ #endif
+ /* BOOLEAN
+  * RtlIsZeroLuid(
+  *     IN PLUID L1);
+  */
+ #define RtlIsZeroLuid(_L1) \
+     ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlLengthSecurityDescriptor(
+     IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlNumberOfClearBits(
+     IN PRTL_BITMAP BitMapHeader);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlNumberOfSetBits(
+     IN PRTL_BITMAP BitMapHeader);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlQueryRegistryValues(
+     IN ULONG RelativeTo,
+     IN PCWSTR Path,
+     IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
+     IN PVOID Context,
+     IN PVOID Environment OPTIONAL);
+ #define LONG_SIZE (sizeof(LONG))
+ #define LONG_MASK (LONG_SIZE - 1)
+ /* VOID
+  * RtlRetrieveUlong(
+  *      PULONG DestinationAddress,
+  *      PULONG SourceAddress);
+  */
+ #if defined(_AMD64_)
+ #define RtlRetrieveUlong(DestAddress,SrcAddress) \
+     *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
+ #else
+ #define RtlRetrieveUlong(DestAddress,SrcAddress) \
+     if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
+     { \
+         ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
+         ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
+         ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
+         ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
+     } \
+     else \
+     { \
+         *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
+     }
+ #endif
+ /* VOID
+  * RtlRetrieveUshort(
+  *      PUSHORT DestinationAddress,
+  *      PUSHORT SourceAddress);
+  */
+ #if defined(_AMD64_)
+ #define RtlRetrieveUshort(DestAddress,SrcAddress) \
+     *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
+ #else
+ #define RtlRetrieveUshort(DestAddress,SrcAddress) \
+     if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
+     { \
+         ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
+         ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
+     } \
+     else \
+     { \
+         *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
+     }
+ #endif
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlSetAllBits(
+     IN PRTL_BITMAP BitMapHeader);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlSetBits(
+     IN PRTL_BITMAP BitMapHeader,
+     IN ULONG StartingIndex,
+     IN ULONG NumberToSet);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlSetDaclSecurityDescriptor(
+     IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+     IN BOOLEAN DaclPresent,
+     IN PACL Dacl OPTIONAL,
+     IN BOOLEAN DaclDefaulted OPTIONAL);
+ /* VOID
+  * RtlStoreUlong(
+  *     IN PULONG Address,
+  *     IN ULONG Value);
+  */
+ #if defined(_AMD64_)
+ #define RtlStoreUlong(Address,Value) \
+     *(ULONG UNALIGNED *)(Address) = (Value)
+ #else
+ #define RtlStoreUlong(Address,Value)                      \
+     if ((ULONG_PTR)(Address) & LONG_MASK) { \
+         ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT]    = (UCHAR)(FIRSTBYTE(Value)); \
+         ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
+         ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
+         ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT]     = (UCHAR)(FOURTHBYTE(Value)); \
+     } \
+     else { \
+         *((PULONG)(Address)) = (ULONG) (Value); \
+     }
+ #endif
+ /* VOID
+  * RtlStoreUlonglong(
+  *     IN OUT PULONGLONG Address,
+  *     ULONGLONG Value);
+  */
+ #if defined(_AMD64_)
+ #define RtlStoreUlonglong(Address,Value) \
+     *(ULONGLONG UNALIGNED *)(Address) = (Value)
+ #else
+ #define RtlStoreUlonglong(Address,Value) \
+     if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
+         RtlStoreUlong((ULONG_PTR)(Address), \
+                       (ULONGLONG)(Value) & 0xFFFFFFFF); \
+         RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
+                       (ULONGLONG)(Value) >> 32); \
+     } else { \
+         *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
+     }
+ #endif
+ /* VOID
+  * RtlStoreUlongPtr(
+  *     IN OUT PULONG_PTR Address,
+  *     IN ULONG_PTR Value);
+  */
+ #ifdef _WIN64
+ #define RtlStoreUlongPtr(Address,Value)                         \
+     RtlStoreUlonglong(Address,Value)
+ #else
+ #define RtlStoreUlongPtr(Address,Value)                         \
+     RtlStoreUlong(Address,Value)
+ #endif
+ /* VOID
+  * RtlStoreUshort(
+  *     IN PUSHORT Address,
+  *     IN USHORT Value);
+  */
+ #if defined(_AMD64_)
+ #define RtlStoreUshort(Address,Value) \
+     *(USHORT UNALIGNED *)(Address) = (Value)
+ #else
+ #define RtlStoreUshort(Address,Value) \
+     if ((ULONG_PTR)(Address) & SHORT_MASK) { \
+         ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
+         ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
+     } \
+     else { \
+         *((PUSHORT) (Address)) = (USHORT)Value; \
+     }
+ #endif
+ NTSYSAPI
+ BOOLEAN
+ NTAPI
+ RtlTimeFieldsToTime(
+     IN PTIME_FIELDS TimeFields,
+     IN PLARGE_INTEGER Time);
+ NTSYSAPI
+ VOID
+ NTAPI
+ RtlTimeToTimeFields(
+     IN PLARGE_INTEGER Time,
+     IN PTIME_FIELDS TimeFields);
+ NTSYSAPI
+ ULONG
+ FASTCALL
+ RtlUlongByteSwap(
+     IN ULONG Source);
+ NTSYSAPI
+ ULONGLONG
+ FASTCALL
+ RtlUlonglongByteSwap(
+     IN ULONGLONG Source);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlUnicodeStringToAnsiString(
+     IN OUT PANSI_STRING DestinationString,
+     IN PCUNICODE_STRING SourceString,
+     IN BOOLEAN AllocateDestinationString);
+ NTSYSAPI
+ ULONG
+ NTAPI
+ RtlxUnicodeStringToAnsiSize(
+     IN PCUNICODE_STRING UnicodeString);
+ #define RtlUnicodeStringToAnsiSize(String) (                  \
+     NLS_MB_CODE_PAGE_TAG ?                                    \
+     RtlxUnicodeStringToAnsiSize(String) :                     \
+     ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+ )
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlUnicodeStringToInteger(
+     IN PCUNICODE_STRING String,
+     IN ULONG Base OPTIONAL,
+     OUT PULONG Value);
+ NTSYSAPI
+ WCHAR
+ NTAPI
+ RtlUpcaseUnicodeChar(
+     IN WCHAR SourceCharacter);
+ NTSYSAPI
+ USHORT
+ FASTCALL
+ RtlUshortByteSwap(
+     IN USHORT Source);
+ NTSYSAPI
+ BOOLEAN
+ NTAPI
+ RtlValidRelativeSecurityDescriptor(
+     IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
+     IN ULONG SecurityDescriptorLength,
+     IN SECURITY_INFORMATION RequiredInformation);
+ NTSYSAPI
+ BOOLEAN
+ NTAPI
+ RtlValidSecurityDescriptor(
+     IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+ NTSYSAPI
+ NTSTATUS
+ NTAPI
+ RtlWriteRegistryValue(
+     IN ULONG RelativeTo,
+     IN PCWSTR Path,
+     IN PCWSTR ValueName,
+     IN ULONG ValueType,
+     IN PVOID ValueData,
+     IN ULONG ValueLength);
+ #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
+ #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
+ NTSYSAPI
+ VOID
+ FASTCALL
+ RtlPrefetchMemoryNonTemporal(
      IN PVOID Source,
      IN SIZE_T Length);
  #endif
  
- #if (NTDDI_VERSION >= NTDDI_WINXP)
- NTSYSAPI
+ #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);
++                               WriteToDevice );
+ }
+ FORCEINLINE
+ VOID
+ NTAPI
+ IoFreeAdapterChannel(
+     IN PDMA_ADAPTER DmaAdapter)
+ {
+     PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
+     FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
+     ASSERT(FreeAdapterChannel);
+     FreeAdapterChannel(DmaAdapter);
+ }
+ FORCEINLINE
+ VOID
+ NTAPI
+ IoFreeMapRegisters(
+     IN PDMA_ADAPTER DmaAdapter,
+     IN PVOID MapRegisterBase,
+     IN ULONG NumberOfMapRegisters)
+ {
+     PFREE_MAP_REGISTERS FreeMapRegisters;
+     FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
+     ASSERT(FreeMapRegisters);
+     FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
+ }
+ FORCEINLINE
+ PHYSICAL_ADDRESS
+ NTAPI
+ IoMapTransfer(
+     IN PDMA_ADAPTER DmaAdapter,
+     IN PMDL Mdl,
+     IN PVOID MapRegisterBase,
+     IN PVOID CurrentVa,
+     IN OUT PULONG Length,
+     IN BOOLEAN WriteToDevice)
+ {
+     PMAP_TRANSFER MapTransfer;
+     MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
+     ASSERT(MapTransfer);
+     return MapTransfer(DmaAdapter,
+                        Mdl,
+                        MapRegisterBase,
+                        CurrentVa,
+                        Length,
+                        WriteToDevice);
+ }
+ #endif
+ #if (NTDDI_VERSION >= NTDDI_WIN2K)
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoAcquireCancelSpinLock(
+   OUT PKIRQL  Irql);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoAcquireRemoveLockEx(
+   IN PIO_REMOVE_LOCK  RemoveLock,
+   IN PVOID  Tag  OPTIONAL,
+   IN PCSTR  File,
+   IN ULONG  Line,
+   IN ULONG  RemlockSize);
+ #endif
+ /*
+  * NTSTATUS
+  * IoAcquireRemoveLock(
+  *   IN PIO_REMOVE_LOCK  RemoveLock,
+  *   IN OPTIONAL PVOID  Tag)
+  */
+ #if DBG
+ #define IoAcquireRemoveLock(RemoveLock, Tag) \
+   IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
+ #else
+ #define IoAcquireRemoveLock(RemoveLock, Tag) \
+   IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
+ #endif
+ /*
+  * VOID
+  * IoAdjustPagingPathCount(
+  *   IN PLONG  Count,
+  *   IN BOOLEAN  Increment)
+  */
+ #define IoAdjustPagingPathCount(_Count, \
+                                 _Increment) \
+ { \
+   if (_Increment) \
+     { \
+       InterlockedIncrement(_Count); \
+     } \
+   else \
+     { \
+       InterlockedDecrement(_Count); \
+     } \
+ }
+ #if (NTDDI_VERSION >= NTDDI_WIN2K)
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoAllocateDriverObjectExtension(
+   IN PDRIVER_OBJECT  DriverObject,
+   IN PVOID  ClientIdentificationAddress,
+   IN ULONG  DriverObjectExtensionSize,
+   OUT PVOID  *DriverObjectExtension);
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ IoAllocateErrorLogEntry(
+   IN PVOID  IoObject,
+   IN UCHAR  EntrySize);
+ NTKERNELAPI
+ PIRP
+ NTAPI
+ IoAllocateIrp(
+   IN CCHAR  StackSize,
+   IN BOOLEAN  ChargeQuota);
+ NTKERNELAPI
+ PMDL
+ NTAPI
+ IoAllocateMdl(
+   IN PVOID  VirtualAddress OPTIONAL,
+   IN ULONG  Length,
+   IN BOOLEAN  SecondaryBuffer,
+   IN BOOLEAN  ChargeQuota,
+   IN OUT PIRP  Irp  OPTIONAL);
+ NTKERNELAPI
+ PIO_WORKITEM
+ NTAPI
+ IoAllocateWorkItem(
+   IN PDEVICE_OBJECT  DeviceObject);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoAttachDevice(
+   IN PDEVICE_OBJECT  SourceDevice,
+   IN PUNICODE_STRING  TargetDevice,
+   OUT PDEVICE_OBJECT  *AttachedDevice);
+ NTKERNELAPI
+ PDEVICE_OBJECT
+ NTAPI
+ IoAttachDeviceToDeviceStack(
+   IN PDEVICE_OBJECT  SourceDevice,
+   IN PDEVICE_OBJECT  TargetDevice);
+ NTKERNELAPI
+ PIRP
+ NTAPI
+ IoBuildAsynchronousFsdRequest(
+   IN ULONG  MajorFunction,
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN OUT PVOID  Buffer  OPTIONAL,
+   IN ULONG  Length  OPTIONAL,
+   IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
+   IN PIO_STATUS_BLOCK  IoStatusBlock  OPTIONAL);
+ NTKERNELAPI
+ PIRP
+ NTAPI
+ IoBuildDeviceIoControlRequest(
+   IN ULONG  IoControlCode,
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PVOID  InputBuffer  OPTIONAL,
+   IN ULONG  InputBufferLength,
+   OUT PVOID  OutputBuffer  OPTIONAL,
+   IN ULONG  OutputBufferLength,
+   IN BOOLEAN  InternalDeviceIoControl,
+   IN PKEVENT  Event,
+   OUT PIO_STATUS_BLOCK  IoStatusBlock);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoBuildPartialMdl(
+   IN PMDL  SourceMdl,
+   IN OUT PMDL  TargetMdl,
+   IN PVOID  VirtualAddress,
+   IN ULONG  Length);
+ NTKERNELAPI
+ PIRP
+ NTAPI
+ IoBuildSynchronousFsdRequest(
+   IN ULONG  MajorFunction,
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN OUT PVOID  Buffer  OPTIONAL,
+   IN ULONG  Length  OPTIONAL,
+   IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
+   IN PKEVENT  Event,
+   OUT PIO_STATUS_BLOCK  IoStatusBlock);
+ NTKERNELAPI
+ NTSTATUS
+ FASTCALL
+ IofCallDriver(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN OUT PIRP  Irp);
+ #define IoCallDriver IofCallDriver
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ IofCompleteRequest(
+   IN PIRP Irp,
+   IN CCHAR PriorityBoost);
+ #define IoCompleteRequest IofCompleteRequest
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ IoCancelIrp(
+   IN PIRP  Irp);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoCheckShareAccess(
+   IN ACCESS_MASK  DesiredAccess,
+   IN ULONG  DesiredShareAccess,
+   IN OUT PFILE_OBJECT  FileObject,
+   IN OUT PSHARE_ACCESS  ShareAccess,
+   IN BOOLEAN  Update);
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ IofCompleteRequest(
+   IN PIRP  Irp,
+   IN CCHAR  PriorityBoost);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoConnectInterrupt(
+   OUT PKINTERRUPT  *InterruptObject,
+   IN PKSERVICE_ROUTINE  ServiceRoutine,
+   IN PVOID  ServiceContext OPTIONAL,
+   IN PKSPIN_LOCK  SpinLock  OPTIONAL,
+   IN ULONG  Vector,
+   IN KIRQL  Irql,
+   IN KIRQL  SynchronizeIrql,
+   IN KINTERRUPT_MODE    InterruptMode,
+   IN BOOLEAN  ShareVector,
+   IN KAFFINITY  ProcessorEnableMask,
+   IN BOOLEAN  FloatingSave);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoCreateDevice(
+   IN PDRIVER_OBJECT  DriverObject,
+   IN ULONG  DeviceExtensionSize,
+   IN PUNICODE_STRING  DeviceName  OPTIONAL,
+   IN DEVICE_TYPE  DeviceType,
+   IN ULONG  DeviceCharacteristics,
+   IN BOOLEAN  Exclusive,
+   OUT PDEVICE_OBJECT  *DeviceObject);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoCreateFile(
+   OUT PHANDLE FileHandle,
+   IN ACCESS_MASK DesiredAccess,
+   IN POBJECT_ATTRIBUTES ObjectAttributes,
+   OUT PIO_STATUS_BLOCK IoStatusBlock,
+   IN PLARGE_INTEGER AllocationSize OPTIONAL,
+   IN ULONG FileAttributes,
+   IN ULONG ShareAccess,
+   IN ULONG Disposition,
+   IN ULONG CreateOptions,
+   IN PVOID EaBuffer OPTIONAL,
+   IN ULONG EaLength,
+   IN CREATE_FILE_TYPE CreateFileType,
+   IN PVOID InternalParameters OPTIONAL,
+   IN ULONG Options);
+ NTKERNELAPI
+ PKEVENT
+ NTAPI
+ IoCreateNotificationEvent(
+   IN PUNICODE_STRING  EventName,
+   OUT PHANDLE  EventHandle);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoCreateSymbolicLink(
+   IN PUNICODE_STRING  SymbolicLinkName,
+   IN PUNICODE_STRING  DeviceName);
+ NTKERNELAPI
+ PKEVENT
+ NTAPI
+ IoCreateSynchronizationEvent(
+   IN PUNICODE_STRING  EventName,
+   OUT PHANDLE  EventHandle);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoCreateUnprotectedSymbolicLink(
+   IN PUNICODE_STRING  SymbolicLinkName,
+   IN PUNICODE_STRING  DeviceName);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoDeleteDevice(
+   IN PDEVICE_OBJECT  DeviceObject);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoDeleteSymbolicLink(
+   IN PUNICODE_STRING  SymbolicLinkName);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoDetachDevice(
+   IN OUT PDEVICE_OBJECT  TargetDevice);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoDisconnectInterrupt(
+   IN PKINTERRUPT  InterruptObject);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoFreeIrp(
+   IN PIRP Irp);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoFreeMdl(
+   IN PMDL Mdl);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoFreeWorkItem(
+   IN PIO_WORKITEM IoWorkItem);
+ NTKERNELAPI
+ PDEVICE_OBJECT
+ NTAPI
+ IoGetAttachedDevice(
+   IN PDEVICE_OBJECT DeviceObject);
+ NTKERNELAPI
+ PDEVICE_OBJECT
+ NTAPI
+ IoGetAttachedDeviceReference(
+   IN PDEVICE_OBJECT  DeviceObject);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoGetBootDiskInformation(
+   IN OUT PBOOTDISK_INFORMATION  BootDiskInformation,
+   IN ULONG  Size);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoGetDeviceInterfaceAlias(
+   IN PUNICODE_STRING  SymbolicLinkName,
+   IN CONST GUID  *AliasInterfaceClassGuid,
+   OUT PUNICODE_STRING  AliasSymbolicLinkName);
+ NTKERNELAPI
+ PEPROCESS
+ NTAPI
+ IoGetCurrentProcess(
+   VOID);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoGetDeviceInterfaces(
+   IN CONST GUID  *InterfaceClassGuid,
+   IN PDEVICE_OBJECT  PhysicalDeviceObject  OPTIONAL,
+   IN ULONG  Flags,
+   OUT PWSTR  *SymbolicLinkList);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoGetDeviceObjectPointer(
+   IN PUNICODE_STRING  ObjectName,
+   IN ACCESS_MASK  DesiredAccess,
+   OUT PFILE_OBJECT  *FileObject,
+   OUT PDEVICE_OBJECT  *DeviceObject);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoGetDeviceProperty(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN DEVICE_REGISTRY_PROPERTY  DeviceProperty,
+   IN ULONG  BufferLength,
+   OUT PVOID  PropertyBuffer,
+   OUT PULONG  ResultLength);
+ NTKERNELAPI
+ PDMA_ADAPTER
+ NTAPI
+ IoGetDmaAdapter(
+   IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
+   IN PDEVICE_DESCRIPTION  DeviceDescription,
+   IN OUT PULONG  NumberOfMapRegisters);
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ IoGetDriverObjectExtension(
+   IN PDRIVER_OBJECT  DriverObject,
+   IN PVOID  ClientIdentificationAddress);
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ IoGetInitialStack(
+   VOID);
+ NTKERNELAPI
+ PDEVICE_OBJECT
+ NTAPI
+ IoGetRelatedDeviceObject(
+   IN PFILE_OBJECT  FileObject);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoQueueWorkItem(
+   IN PIO_WORKITEM  IoWorkItem,
+   IN PIO_WORKITEM_ROUTINE  WorkerRoutine,
+   IN WORK_QUEUE_TYPE  QueueType,
+   IN PVOID  Context OPTIONAL);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoInitializeIrp(
+   IN OUT PIRP  Irp,
+   IN USHORT  PacketSize,
+   IN CCHAR  StackSize);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoInitializeRemoveLockEx(
+   IN  PIO_REMOVE_LOCK Lock,
+   IN  ULONG   AllocateTag,
+   IN  ULONG   MaxLockedMinutes,
+   IN  ULONG   HighWatermark,
+   IN  ULONG   RemlockSize);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoInitializeTimer(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PIO_TIMER_ROUTINE  TimerRoutine,
+   IN PVOID  Context OPTIONAL);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoInvalidateDeviceRelations(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN DEVICE_RELATION_TYPE  Type);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoInvalidateDeviceState(
+   IN PDEVICE_OBJECT  PhysicalDeviceObject);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ IoIsWdmVersionAvailable(
+   IN UCHAR  MajorVersion,
+   IN UCHAR  MinorVersion);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoOpenDeviceInterfaceRegistryKey(
+   IN PUNICODE_STRING  SymbolicLinkName,
+   IN ACCESS_MASK  DesiredAccess,
+   OUT PHANDLE  DeviceInterfaceKey);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoOpenDeviceRegistryKey(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN ULONG  DevInstKeyType,
+   IN ACCESS_MASK  DesiredAccess,
+   OUT PHANDLE  DevInstRegKey);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoRegisterDeviceInterface(
+   IN PDEVICE_OBJECT  PhysicalDeviceObject,
+   IN CONST GUID  *InterfaceClassGuid,
+   IN PUNICODE_STRING  ReferenceString  OPTIONAL,
+   OUT PUNICODE_STRING  SymbolicLinkName);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoRegisterPlugPlayNotification(
+   IN IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
+   IN ULONG  EventCategoryFlags,
+   IN PVOID  EventCategoryData  OPTIONAL,
+   IN PDRIVER_OBJECT  DriverObject,
+   IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
+   IN OUT PVOID  Context OPTIONAL,
+   OUT PVOID  *NotificationEntry);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoRegisterShutdownNotification(
+   IN PDEVICE_OBJECT  DeviceObject);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoReleaseCancelSpinLock(
+   IN KIRQL  Irql);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoReleaseRemoveLockAndWaitEx(
+   IN PIO_REMOVE_LOCK  RemoveLock,
+   IN PVOID  Tag OPTIONAL,
+   IN ULONG  RemlockSize);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoReleaseRemoveLockEx(
+   IN PIO_REMOVE_LOCK  RemoveLock,
+   IN PVOID  Tag OPTIONAL,
+   IN ULONG  RemlockSize);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoRemoveShareAccess(
+   IN PFILE_OBJECT  FileObject,
+   IN OUT PSHARE_ACCESS  ShareAccess);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoReportTargetDeviceChange(
+   IN PDEVICE_OBJECT  PhysicalDeviceObject,
+   IN PVOID  NotificationStructure);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoReportTargetDeviceChangeAsynchronous(
+   IN PDEVICE_OBJECT  PhysicalDeviceObject,
+   IN PVOID  NotificationStructure,
+   IN PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  OPTIONAL,
+   IN PVOID  Context  OPTIONAL);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoRequestDeviceEject(
+   IN PDEVICE_OBJECT  PhysicalDeviceObject);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoReuseIrp(
+   IN OUT PIRP  Irp,
+   IN NTSTATUS  Status);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoSetDeviceInterfaceState(
+   IN PUNICODE_STRING  SymbolicLinkName,
+   IN BOOLEAN  Enable);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoSetShareAccess(
+   IN ACCESS_MASK  DesiredAccess,
+   IN ULONG  DesiredShareAccess,
+   IN OUT PFILE_OBJECT  FileObject,
+   OUT PSHARE_ACCESS  ShareAccess);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoStartNextPacket(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN BOOLEAN  Cancelable);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoStartNextPacketByKey(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN BOOLEAN  Cancelable,
+   IN ULONG  Key);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoStartPacket(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PIRP  Irp,
+   IN PULONG  Key  OPTIONAL,
+   IN PDRIVER_CANCEL  CancelFunction  OPTIONAL);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoStartTimer(
+   IN PDEVICE_OBJECT  DeviceObject);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoStopTimer(
+   IN PDEVICE_OBJECT  DeviceObject);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoUnregisterPlugPlayNotification(
+   IN PVOID  NotificationEntry);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoUnregisterShutdownNotification(
+   IN PDEVICE_OBJECT  DeviceObject);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoUpdateShareAccess(
+   IN PFILE_OBJECT  FileObject,
+   IN OUT PSHARE_ACCESS  ShareAccess);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIAllocateInstanceIds(
+   IN GUID  *Guid,
+   IN ULONG  InstanceCount,
+   OUT ULONG  *FirstInstanceId);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIQuerySingleInstanceMultiple(
+   IN PVOID  *DataBlockObjectList,
+   IN PUNICODE_STRING  InstanceNames,
+   IN ULONG  ObjectCount,
+   IN OUT ULONG  *InOutBufferSize,
+   OUT PVOID  OutBuffer);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIRegistrationControl(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN ULONG  Action);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMISuggestInstanceName(
+   IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
+   IN PUNICODE_STRING  SymbolicLinkName OPTIONAL,
+   IN BOOLEAN  CombineNames,
+   OUT PUNICODE_STRING  SuggestedInstanceName);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIWriteEvent(
+   IN PVOID  WnodeEventItem);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoWriteErrorLogEntry(
+   IN PVOID  ElEntry);
+ #endif
+ #if (NTDDI_VERSION >= NTDDI_WINXP)
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoCsqInitialize(
+   IN PIO_CSQ Csq,
+   IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
+   IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
+   IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
+   IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
+   IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
+   IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoCsqInsertIrp(
+   IN PIO_CSQ Csq,
+   IN PIRP Irp,
+   IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
+ NTKERNELAPI
+ PIRP
+ NTAPI
+ IoCsqRemoveIrp(
+   IN PIO_CSQ Csq,
+   IN PIO_CSQ_IRP_CONTEXT Context);
+ NTKERNELAPI
+ PIRP
+ NTAPI
+ IoCsqRemoveNextIrp(
+   IN PIO_CSQ  Csq,
+   IN PVOID  PeekContext);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ IoForwardIrpSynchronously(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PIRP  Irp);
+ #define IoForwardAndCatchIrp IoForwardIrpSynchronously
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoFreeErrorLogEntry(
+   PVOID  ElEntry);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoSetCompletionRoutineEx(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN PIRP  Irp,
+   IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
+   IN PVOID  Context,
+   IN BOOLEAN  InvokeOnSuccess,
+   IN BOOLEAN  InvokeOnError,
+   IN BOOLEAN  InvokeOnCancel);
+ VOID
+ NTAPI
+ IoSetStartIoAttributes(
+   IN PDEVICE_OBJECT  DeviceObject,
+   IN BOOLEAN  DeferredStartIo,
+   IN BOOLEAN  NonCancelable);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIDeviceObjectToInstanceName(
+   IN PVOID  DataBlockObject,
+   IN PDEVICE_OBJECT  DeviceObject,
+   OUT PUNICODE_STRING  InstanceName);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIExecuteMethod(
+   IN PVOID  DataBlockObject,
+   IN PUNICODE_STRING  InstanceName,
+   IN ULONG  MethodId,
+   IN ULONG  InBufferSize,
+   IN OUT PULONG  OutBufferSize,
+   IN OUT  PUCHAR  InOutBuffer);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIHandleToInstanceName(
+   IN PVOID  DataBlockObject,
+   IN HANDLE  FileHandle,
+   OUT PUNICODE_STRING  InstanceName);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIOpenBlock(
+   IN GUID  *DataBlockGuid,
+   IN ULONG  DesiredAccess,
+   OUT PVOID  *DataBlockObject);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIQueryAllData(
+   IN PVOID  DataBlockObject,
+   IN OUT ULONG  *InOutBufferSize,
+   OUT PVOID  OutBuffer);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIQueryAllDataMultiple(
+   IN PVOID  *DataBlockObjectList,
+   IN ULONG  ObjectCount,
+   IN OUT ULONG  *InOutBufferSize,
+   OUT PVOID  OutBuffer);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMIQuerySingleInstance(
+   IN PVOID  DataBlockObject,
+   IN PUNICODE_STRING  InstanceName,
+   IN OUT ULONG  *InOutBufferSize,
+   OUT PVOID OutBuffer);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMISetNotificationCallback(
+   IN OUT PVOID  Object,
+   IN WMI_NOTIFICATION_CALLBACK  Callback,
+   IN PVOID  Context OPTIONAL);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMISetSingleInstance(
+   IN PVOID  DataBlockObject,
+   IN PUNICODE_STRING  InstanceName,
+   IN ULONG  Version,
+   IN ULONG  ValueBufferSize,
+   IN PVOID  ValueBuffer);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ IoWMISetSingleItem(
+   IN PVOID  DataBlockObject,
+   IN PUNICODE_STRING  InstanceName,
+   IN ULONG  DataItemId,
+   IN ULONG  Version,
+   IN ULONG  ValueBufferSize,
+   IN PVOID  ValueBuffer);
+ #endif
+ #if defined(_WIN64)
+ NTKERNELAPI
+ ULONG
+ NTAPI
+ IoWMIDeviceObjectToProviderId(
+   IN PDEVICE_OBJECT DeviceObject);
+ #else
+ #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
+ #endif
+ /*
+  * USHORT
+  * IoSizeOfIrp(
+  *   IN CCHAR  StackSize)
+  */
+ #define IoSizeOfIrp(_StackSize) \
+   ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
+ FORCEINLINE
+ VOID
+ IoSkipCurrentIrpStackLocation (
+   IN OUT PIRP Irp)
+ {
+   ASSERT(Irp->CurrentLocation <= Irp->StackCount);
+   Irp->CurrentLocation++;
+   Irp->Tail.Overlay.CurrentStackLocation++;
+ }
+ FORCEINLINE
+ VOID
+ IoSetNextIrpStackLocation (
+   IN OUT PIRP Irp)
+ {
+   ASSERT(Irp->CurrentLocation > 0);
+   Irp->CurrentLocation--;
+   Irp->Tail.Overlay.CurrentStackLocation--;
+ }
+ FORCEINLINE
+ PIO_STACK_LOCATION
+ IoGetNextIrpStackLocation(
+   IN PIRP Irp)
+ {
+   ASSERT(Irp->CurrentLocation > 0);
+   return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
+ }
+ FORCEINLINE
+ VOID
+ IoSetCompletionRoutine(
+   IN PIRP Irp,
+   IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
+   IN PVOID Context OPTIONAL,
+   IN BOOLEAN InvokeOnSuccess,
+   IN BOOLEAN InvokeOnError,
+   IN BOOLEAN InvokeOnCancel)
+ {
+   PIO_STACK_LOCATION irpSp;
+   ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
+   irpSp = IoGetNextIrpStackLocation(Irp);
+   irpSp->CompletionRoutine = CompletionRoutine;
+   irpSp->Context = Context;
+   irpSp->Control = 0;
+   if (InvokeOnSuccess) {
+     irpSp->Control = SL_INVOKE_ON_SUCCESS;
+   }
+   if (InvokeOnError) {
+     irpSp->Control |= SL_INVOKE_ON_ERROR;
+   }
+   if (InvokeOnCancel) {
+     irpSp->Control |= SL_INVOKE_ON_CANCEL;
+   }
+ }
+ /*
+  * PDRIVER_CANCEL
+  * IoSetCancelRoutine(
+  *   IN PIRP  Irp,
+  *   IN PDRIVER_CANCEL  CancelRoutine)
+  */
+ #define IoSetCancelRoutine(_Irp, \
+                            _CancelRoutine) \
+   ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
+     (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
+ /*
+  * VOID
+  * IoRequestDpc(
+  *   IN PDEVICE_OBJECT  DeviceObject,
+  *   IN PIRP  Irp,
+  *   IN PVOID  Context);
+  */
+ #define IoRequestDpc(DeviceObject, Irp, Context)( \
+   KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
+ /*
+  * VOID
+  * IoReleaseRemoveLock(
+  *   IN PIO_REMOVE_LOCK  RemoveLock,
+  *   IN PVOID  Tag)
+  */
+ #define IoReleaseRemoveLock(_RemoveLock, \
+                             _Tag) \
+   IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
+ /*
+  * VOID
+  * IoReleaseRemoveLockAndWait(
+  *   IN PIO_REMOVE_LOCK  RemoveLock,
+  *   IN PVOID  Tag)
+  */
+ #define IoReleaseRemoveLockAndWait(_RemoveLock, \
+                                    _Tag) \
+   IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
+ #if defined(_WIN64)
+ NTKERNELAPI
+ BOOLEAN
+ IoIs32bitProcess(
+   IN PIRP  Irp  OPTIONAL);
+ #endif
+ #define PLUGPLAY_REGKEY_DEVICE                            1
+ #define PLUGPLAY_REGKEY_DRIVER                            2
+ #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE                 4
+ FORCEINLINE
+ PIO_STACK_LOCATION
+ IoGetCurrentIrpStackLocation(
+   IN PIRP Irp)
+ {
+   ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
+   return Irp->Tail.Overlay.CurrentStackLocation;
+ }
+ FORCEINLINE
+ VOID
+ IoMarkIrpPending(
+   IN OUT PIRP Irp)
+ {
+   IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
+ }
+ /*
+  * BOOLEAN
+  * IoIsErrorUserInduced(
+  *   IN NTSTATUS  Status);
+  */
+ #define IoIsErrorUserInduced(Status) \
+    ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
+    ((Status) == STATUS_IO_TIMEOUT) || \
+    ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
+    ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
+    ((Status) == STATUS_VERIFY_REQUIRED) || \
+    ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
+    ((Status) == STATUS_WRONG_VOLUME)))
+ /* VOID
+  * IoInitializeRemoveLock(
+  *   IN PIO_REMOVE_LOCK  Lock,
+  *   IN ULONG  AllocateTag,
+  *   IN ULONG  MaxLockedMinutes,
+  *   IN ULONG  HighWatermark)
+  */
+ #define IoInitializeRemoveLock( \
+   Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
+   IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
+     HighWatermark, sizeof(IO_REMOVE_LOCK))
+ VOID
+ FORCEINLINE
+ IoInitializeDpcRequest(
+   IN PDEVICE_OBJECT DeviceObject,
+   IN PIO_DPC_ROUTINE DpcRoutine)
+ {
+   KeInitializeDpc( &DeviceObject->Dpc,
+                    (PKDEFERRED_ROUTINE) DpcRoutine,
+                    DeviceObject );
+ }
+ #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
+ /*
+  * ULONG
+  * IoGetFunctionCodeFromCtlCode(
+  *   IN ULONG  ControlCode)
+  */
+ #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
+   (((_ControlCode) >> 2) & 0x00000FFF)
+ FORCEINLINE
+ VOID
+ IoCopyCurrentIrpStackLocationToNext(
+   IN PIRP Irp)
+ {
+   PIO_STACK_LOCATION irpSp;
+   PIO_STACK_LOCATION nextIrpSp;
+   irpSp = IoGetCurrentIrpStackLocation(Irp);
+   nextIrpSp = IoGetNextIrpStackLocation(Irp);
+   RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
+   nextIrpSp->Control = 0;
+ }
+ NTKERNELAPI
+ VOID
+ NTAPI
+ IoGetStackLimits(
+   OUT PULONG_PTR  LowLimit,
+   OUT PULONG_PTR  HighLimit);
+ FORCEINLINE
+ ULONG_PTR
+ IoGetRemainingStackSize(
+   VOID)
+ {
+   ULONG_PTR End, Begin;
+   ULONG_PTR Result;
+   IoGetStackLimits(&Begin, &End);
+   Result = (ULONG_PTR)(&End) - Begin;
+   return Result;
+ }
+ /******************************************************************************
+  *                     Power Management Support Functions                     *
+  ******************************************************************************/
+ #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
+ #if (NTDDI_VERSION >= NTDDI_WIN2K)
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoCallDriver(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN OUT struct _IRP  *Irp);
+ NTKERNELAPI
+ PULONG
+ NTAPI
+ PoRegisterDeviceForIdleDetection(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN ULONG  ConservationIdleTime,
+   IN ULONG  PerformanceIdleTime,
+   IN DEVICE_POWER_STATE  State);
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ PoRegisterSystemState(
+   IN OUT PVOID StateHandle OPTIONAL,
+   IN EXECUTION_STATE Flags);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoRequestPowerIrp(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN UCHAR  MinorFunction,
+   IN POWER_STATE  PowerState,
+   IN PREQUEST_POWER_COMPLETE  CompletionFunction OPTIONAL,
+   IN PVOID  Context OPTIONAL,
+   OUT struct _IRP  **Irp OPTIONAL);
+ NTKERNELAPI
+ POWER_STATE
+ NTAPI
+ PoSetPowerState(
+   IN struct _DEVICE_OBJECT  *DeviceObject,
+   IN POWER_STATE_TYPE  Type,
+   IN POWER_STATE  State);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoSetSystemState(
+   IN EXECUTION_STATE  Flags);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoStartNextPowerIrp(
+   IN OUT struct _IRP *Irp);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoUnregisterSystemState(
+   IN OUT PVOID StateHandle);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoRequestShutdownEvent(
+   OUT PVOID *Event);
+ #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+ #if (NTDDI_VERSION >= NTDDI_VISTA)
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoSetSystemWake(
+   IN OUT struct _IRP *Irp);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ PoGetSystemWake(
+   IN struct _IRP *Irp);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoRegisterPowerSettingCallback(
+   IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+   IN LPCGUID SettingGuid,
+   IN PPOWER_SETTING_CALLBACK Callback,
+   IN PVOID Context OPTIONAL,
+   OUT PVOID *Handle OPTIONAL);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoUnregisterPowerSettingCallback(
+   IN OUT PVOID Handle);
+ #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+ #if (NTDDI_VERSION >= NTDDI_VISTASP1)
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoSetDeviceBusyEx(
+   IN OUT PULONG IdlePointer);
+ #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
+ #if (NTDDI_VERSION >= NTDDI_WIN7)
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoStartDeviceBusy(
+   IN OUT PULONG IdlePointer);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoEndDeviceBusy(
+   IN OUT PULONG IdlePointer);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ PoQueryWatchdogTime(
+   IN PDEVICE_OBJECT Pdo,
+   OUT PULONG SecondsRemaining);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ PoDeletePowerRequest(
+   IN OUT PVOID PowerRequest);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoSetPowerRequest(
+   IN OUT PVOID PowerRequest,
+   IN POWER_REQUEST_TYPE Type);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoClearPowerRequest(
+   IN OUT PVOID PowerRequest,
+   IN POWER_REQUEST_TYPE Type);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ PoCreatePowerRequest(
+   OUT PVOID *PowerRequest,
+   IN PDEVICE_OBJECT DeviceObject,
+   IN PCOUNTED_REASON_CONTEXT Context);
+ #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+ /******************************************************************************
+  *                          Executive Functions                               *
+  ******************************************************************************/
+ #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
+ #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
+ #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
+ #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
+ #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
+ #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
+ #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
+ #define ExInitializeSListHead InitializeSListHead
+ #if defined(_X86_)
+ #if defined(_NTHAL_)
+ #define ExAcquireFastMutex ExiAcquireFastMutex
+ #define ExReleaseFastMutex ExiReleaseFastMutex
+ #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
+ #endif
+ #define ExInterlockedAddUlong ExfInterlockedAddUlong
+ #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
+ #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
+ #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
+ #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
+ #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
+ #endif
+ #if defined(_WIN64)
+ #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
+     defined(_NTHAL_) || defined(_NTOSP_)
+ NTKERNELAPI
+ USHORT
+ ExQueryDepthSList(IN PSLIST_HEADER ListHead);
+ #else
+ FORCEINLINE
+ USHORT
+ ExQueryDepthSList(IN PSLIST_HEADER ListHead)
+ {
+     return (USHORT)(ListHead->Alignment & 0xffff);
+ }
+ #endif
+ NTKERNELAPI
+ PSLIST_ENTRY
+ ExpInterlockedFlushSList(
+     PSLIST_HEADER ListHead);
+ NTKERNELAPI
+ PSLIST_ENTRY
+ ExpInterlockedPopEntrySList(
+     PSLIST_HEADER ListHead);
+ NTKERNELAPI
+ PSLIST_ENTRY
+ ExpInterlockedPushEntrySList(
+     PSLIST_HEADER ListHead,
+     PSLIST_ENTRY ListEntry);
+ #define ExInterlockedFlushSList(Head) \
+     ExpInterlockedFlushSList(Head)
+ #define ExInterlockedPopEntrySList(Head, Lock) \
+     ExpInterlockedPopEntrySList(Head)
+ #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
+     ExpInterlockedPushEntrySList(Head, Entry)
+ #else // !defined(_WIN64)
+ #define ExQueryDepthSList(listhead) (listhead)->Depth
+ NTKERNELAPI
+ PSINGLE_LIST_ENTRY
+ FASTCALL
+ ExInterlockedFlushSList(
+     IN PSLIST_HEADER ListHead);
+ #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
+ NTKERNELAPI
+ PSINGLE_LIST_ENTRY 
+ FASTCALL
+ ExInterlockedPopEntrySList(
+     IN PSLIST_HEADER ListHead,
+     IN PKSPIN_LOCK Lock);
+ NTKERNELAPI
+ PSINGLE_LIST_ENTRY 
+ FASTCALL
+ ExInterlockedPushEntrySList(
+     IN PSLIST_HEADER ListHead,
+     IN PSINGLE_LIST_ENTRY ListEntry,
+     IN PKSPIN_LOCK Lock);
+ #else
+ #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
+     InterlockedPopEntrySList(_ListHead)
+ #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
+     InterlockedPushEntrySList(_ListHead, _ListEntry)
+ #endif // _WIN2K_COMPAT_SLIST_USAGE
+ #endif // !defined(_WIN64)
+ /* ERESOURCE_THREAD
+  * ExGetCurrentResourceThread(
+  *     VOID);
+  */
+ #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
+ #define ExReleaseResource(R) (ExReleaseResourceLite(R))
+ /* VOID
+  * ExInitializeWorkItem(
+  *     IN PWORK_QUEUE_ITEM Item,
+  *     IN PWORKER_THREAD_ROUTINE Routine,
+  *     IN PVOID Context)
+  */
+ #define ExInitializeWorkItem(Item, Routine, Context) \
+ { \
+   (Item)->WorkerRoutine = Routine; \
+   (Item)->Parameter = Context; \
+   (Item)->List.Flink = NULL; \
+ }
+ FORCEINLINE
+ VOID
+ ExInitializeFastMutex(
+   OUT PFAST_MUTEX FastMutex)
+ {
+   FastMutex->Count = FM_LOCK_BIT;
+   FastMutex->Owner = NULL;
+   FastMutex->Contention = 0;
+   KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
+   return;
+ }
+ #if (NTDDI_VERSION >= NTDDI_WIN2K)
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExAcquireFastMutex(
+     IN OUT PFAST_MUTEX FastMutex);
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExReleaseFastMutex(
+     IN OUT PFAST_MUTEX FastMutex);
+ NTKERNELAPI
+ BOOLEAN
+ FASTCALL
+ ExTryToAcquireFastMutex(
+     IN OUT PFAST_MUTEX FastMutex);
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExAcquireFastMutexUnsafe(
+     IN OUT PFAST_MUTEX FastMutex);
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExReleaseFastMutexUnsafe(
+     IN OUT PFAST_MUTEX FastMutex);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ ExAcquireResourceExclusiveLite(
+     IN PERESOURCE Resource,
+     IN BOOLEAN Wait);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ ExAcquireResourceSharedLite(
+     IN PERESOURCE Resource,
+     IN BOOLEAN Wait);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ ExAcquireSharedStarveExclusive(
+     IN PERESOURCE Resource,
+     IN BOOLEAN Wait);
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ ExAcquireSharedWaitForExclusive(
+     IN PERESOURCE Resource,
+     IN BOOLEAN Wait);
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ ExAllocatePool(
+     IN POOL_TYPE PoolType,
+     IN SIZE_T NumberOfBytes);
+ #ifdef POOL_TAGGING
+ #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
+ #endif /* POOL_TAGGING */
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ ExAllocatePoolWithQuota(
+     IN POOL_TYPE PoolType,
+     IN SIZE_T NumberOfBytes);
+ #ifdef POOL_TAGGING
+ #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
+ #endif /* POOL_TAGGING */
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ ExAllocatePoolWithQuotaTag(
+   IN POOL_TYPE  PoolType,
+   IN SIZE_T  NumberOfBytes,
+   IN ULONG  Tag);
+ #ifndef POOL_TAGGING
+ #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
+ #endif /* POOL_TAGGING */
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ ExAllocatePoolWithTag(
+     IN POOL_TYPE PoolType,
+     IN SIZE_T NumberOfBytes,
+     IN ULONG Tag);
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ ExAllocatePoolWithTagPriority(
+     IN POOL_TYPE PoolType,
+     IN SIZE_T NumberOfBytes,
+     IN ULONG Tag,
+     IN EX_POOL_PRIORITY Priority);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExConvertExclusiveToSharedLite(
+     IN PERESOURCE Resource);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ ExCreateCallback(
+     OUT PCALLBACK_OBJECT *CallbackObject,
+     IN POBJECT_ATTRIBUTES ObjectAttributes,
+     IN BOOLEAN Create,
+     IN BOOLEAN AllowMultipleCallbacks);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExDeleteNPagedLookasideList(
+     IN PNPAGED_LOOKASIDE_LIST Lookaside);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExDeletePagedLookasideList(
+     IN PPAGED_LOOKASIDE_LIST Lookaside);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ ExDeleteResourceLite(
+     IN PERESOURCE Resource);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExFreePool(
+     IN PVOID P);
+ #ifdef POOL_TAGGING
+ #define ExFreePool(P) ExFreePoolWithTag(P, 0)
+ #endif
+ NTKERNELAPI
  VOID
  NTAPI
- RtlClearBit(
-     PRTL_BITMAP BitMapHeader,
-     ULONG BitNumber);
+ ExFreePoolWithTag(
+     IN PVOID P,
+     IN ULONG Tag);
+ NTKERNELAPI
+ ULONG
+ NTAPI
+ ExGetExclusiveWaiterCount(
+     IN PERESOURCE Resource);
+ NTKERNELAPI
+ KPROCESSOR_MODE
+ NTAPI
+ ExGetPreviousMode(
+     VOID);
+ NTKERNELAPI
+ ULONG
+ NTAPI
+ ExGetSharedWaiterCount(
+     IN PERESOURCE Resource);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExInitializeNPagedLookasideList(
+     IN PNPAGED_LOOKASIDE_LIST Lookaside,
+     IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+     IN PFREE_FUNCTION Free OPTIONAL,
+     IN ULONG Flags,
+     IN SIZE_T Size,
+     IN ULONG Tag,
+     IN USHORT Depth);
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExInitializePagedLookasideList(
+     IN PPAGED_LOOKASIDE_LIST Lookaside,
+     IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+     IN PFREE_FUNCTION Free OPTIONAL,
+     IN ULONG Flags,
+     IN SIZE_T Size,
+     IN ULONG Tag,
+     IN USHORT Depth);
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ ExInitializeResourceLite(
+     IN PERESOURCE Resource);
+ NTKERNELAPI
+ LARGE_INTEGER
+ NTAPI
+ ExInterlockedAddLargeInteger(
+     IN PLARGE_INTEGER Addend,
+     IN LARGE_INTEGER Increment,
+     IN PKSPIN_LOCK Lock);
+ #if defined(_WIN64)
+ #define ExInterlockedAddLargeStatistic(Addend, Increment) \
+     (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
+ #else
+ #define ExInterlockedAddLargeStatistic(Addend, Increment) \
+     _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
+ #endif
+ NTKERNELAPI
+ ULONG
+ FASTCALL
+ ExInterlockedAddUlong(
+     IN PULONG Addend,
+     IN ULONG Increment,
+     PKSPIN_LOCK Lock);
+ #if defined(_AMD64_) || defined(_IA64_)
+ #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
+     InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
+ #elif defined(_X86_)
+ NTKERNELAPI
+ LONGLONG
+ FASTCALL
+ ExfInterlockedCompareExchange64(
+     IN OUT LONGLONG volatile *Destination,
+     IN PLONGLONG Exchange,
+     IN PLONGLONG Comperand);
+ #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
+     ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
+ #else
+ NTKERNELAPI
+ LONGLONG
+ FASTCALL
+ ExInterlockedCompareExchange64(
+     IN OUT LONGLONG volatile *Destination,
+     IN PLONGLONG Exchange,
+     IN PLONGLONG Comparand,
+     IN PKSPIN_LOCK Lock);
+ #endif
+ NTKERNELAPI
+ PLIST_ENTRY
+ FASTCALL
+ ExInterlockedInsertHeadList(
+     IN PLIST_ENTRY ListHead,
+     IN PLIST_ENTRY ListEntry,
+     IN PKSPIN_LOCK Lock);
+ NTKERNELAPI
+ PLIST_ENTRY
+ FASTCALL
+ ExInterlockedInsertTailList(
+     IN PLIST_ENTRY ListHead,
+     IN PLIST_ENTRY ListEntry,
+     IN PKSPIN_LOCK Lock);
+ NTKERNELAPI
+ PSINGLE_LIST_ENTRY
+ FASTCALL
+ ExInterlockedPopEntryList(
+     IN PSINGLE_LIST_ENTRY ListHead,
+     IN PKSPIN_LOCK Lock);
+ NTKERNELAPI
+ PSINGLE_LIST_ENTRY
+ FASTCALL
+ ExInterlockedPushEntryList(
+     IN PSINGLE_LIST_ENTRY ListHead,
+     IN PSINGLE_LIST_ENTRY ListEntry,
+     IN PKSPIN_LOCK Lock);
  
- NTSYSAPI
- WCHAR
- NTAPI
- RtlDowncaseUnicodeChar(
-     IN WCHAR SourceCharacter);
+ NTKERNELAPI
+ PLIST_ENTRY
+ FASTCALL
+ ExInterlockedRemoveHeadList(
+     IN PLIST_ENTRY ListHead,
+     IN PKSPIN_LOCK Lock);
  
- NTSYSAPI
- VOID
+ NTKERNELAPI
+ BOOLEAN
  NTAPI
- RtlSetBit(
-     PRTL_BITMAP BitMapHeader,
-     ULONG BitNumber);
+ ExIsProcessorFeaturePresent(
+     IN ULONG ProcessorFeature);
  
- NTSYSAPI
+ NTKERNELAPI
  BOOLEAN
  NTAPI
- RtlTestBit(
-     IN PRTL_BITMAP BitMapHeader,
-     IN ULONG BitNumber);
- #endif // (NTDDI_VERSION >= NTDDI_WINXP)
+ ExIsResourceAcquiredExclusiveLite(
+     IN PERESOURCE Resource);
  
- #if (NTDDI_VERSION >= NTDDI_VISTA)
- NTSYSAPI
+ NTKERNELAPI
  ULONG
  NTAPI
RtlNumberOfSetBitsUlongPtr(
-     IN ULONG_PTR Target);
ExIsResourceAcquiredSharedLite(
+     IN PERESOURCE Resource);
  
- NTSYSAPI
- ULONGLONG
- NTAPI
- RtlIoDecodeMemIoResource (
-     IN PIO_RESOURCE_DESCRIPTOR Descriptor,
-     OUT PULONGLONG Alignment OPTIONAL,
-     OUT PULONGLONG MinimumAddress OPTIONAL,
-     OUT PULONGLONG MaximumAddress OPTIONAL);
+ #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
  
- NTSYSAPI
- NTSTATUS
+ NTKERNELAPI
+ VOID
  NTAPI
- RtlIoEncodeMemIoResource(
-     IN PIO_RESOURCE_DESCRIPTOR Descriptor,
-     IN UCHAR Type,
-     IN ULONGLONG Length,
-     IN ULONGLONG Alignment,
-     IN ULONGLONG MinimumAddress,
-     IN ULONGLONG MaximumAddress);
+ ExLocalTimeToSystemTime(
+     IN PLARGE_INTEGER LocalTime,
+     OUT PLARGE_INTEGER SystemTime);
  
- NTSYSAPI
- ULONGLONG
+ NTKERNELAPI
+ VOID
  NTAPI
- RtlCmDecodeMemIoResource(
-     IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
-     OUT PULONGLONG Start OPTIONAL);
+ ExNotifyCallback(
+     IN PCALLBACK_OBJECT CallbackObject,
+     IN PVOID Argument1,
+     IN PVOID Argument2);
  
- NTSYSAPI
- NTSTATUS
+ NTKERNELAPI
+ VOID
  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;
- }
+ ExQueueWorkItem(
+     IN PWORK_QUEUE_ITEM WorkItem,
+     IN WORK_QUEUE_TYPE QueueType);
  
- //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);
- }
+ NTKERNELAPI
+ DECLSPEC_NORETURN
+ VOID
+ NTAPI
+ ExRaiseStatus(
+     IN NTSTATUS Status);
  
- //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;
- }
+ NTKERNELAPI
+ PVOID
+ NTAPI
+ ExRegisterCallback(
+     IN PCALLBACK_OBJECT CallbackObject,
+     IN PCALLBACK_FUNCTION CallbackFunction,
+     IN PVOID CallbackContext);
  
- //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;
- }
+ NTKERNELAPI
+ NTSTATUS
+ NTAPI
+ ExReinitializeResourceLite(
+     IN PERESOURCE Resource);
  
- FORCEINLINE
+ NTKERNELAPI
  VOID
- RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
-                        IN PCHAR Buffer,
-                        IN USHORT BufferSize)
- {
-     AnsiString->Length = 0;
-     AnsiString->MaximumLength = BufferSize;
-     AnsiString->Buffer = Buffer;
- }
+ NTAPI
+ ExReleaseResourceForThreadLite(
+     IN PERESOURCE Resource,
+     IN ERESOURCE_THREAD ResourceThreadId);
  
- FORCEINLINE
+ NTKERNELAPI
  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_)
+ FASTCALL
+ ExReleaseResourceLite(
+     IN PERESOURCE Resource);
  
- #define MultiplyHigh __mulh
- #define UnsignedMultiplyHigh __umulh
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExSetResourceOwnerPointer(
+     IN PERESOURCE Resource,
+     IN PVOID OwnerPointer);
  
- //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
+ NTKERNELAPI
+ ULONG
+ NTAPI
+ ExSetTimerResolution(
+     IN ULONG DesiredTime,
+     IN BOOLEAN SetResolution);
  
- //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;
- }
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExSystemTimeToLocalTime(
+     IN PLARGE_INTEGER SystemTime,
+     OUT PLARGE_INTEGER LocalTime);
  
- /* 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
+ NTKERNELAPI
+ VOID
+ NTAPI
+ ExUnregisterCallback(
+     IN PVOID CbRegistration);
  
- //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)))
+ #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
  
- 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 (NTDDI_VERSION >= NTDDI_WINXP)
+ NTKERNELAPI
+ BOOLEAN
+ FASTCALL
+ ExAcquireRundownProtection(
+     IN OUT PEX_RUNDOWN_REF RunRef);
  
- #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)
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExInitializeRundownProtection(
+     OUT PEX_RUNDOWN_REF RunRef);
  
- #endif // !defined(MIDL_PASS)
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExReInitializeRundownProtection(
+     OUT PEX_RUNDOWN_REF RunRef);
  
- //
- // 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__)))
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExReleaseRundownProtection(
+     IN OUT PEX_RUNDOWN_REF RunRef);
  
- #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
- #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
- #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExRundownCompleted(
+     OUT PEX_RUNDOWN_REF RunRef);
  
- #endif
+ NTKERNELAPI
+ BOOLEAN
+ NTAPI
+ ExVerifySuite(
+     IN SUITE_TYPE SuiteType);
  
- /******************************************************************************
-  *                         Memory manager Types                               *
-  ******************************************************************************/
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExWaitForRundownProtectionRelease(
+     IN OUT PEX_RUNDOWN_REF RunRef);
  
- typedef struct _MDL {
-     struct _MDL *Next;
-     CSHORT Size;
-     CSHORT MdlFlags;
-     struct _EPROCESS *Process;
-     PVOID MappedSystemVa;
-     PVOID StartVa;
-     ULONG ByteCount;
-     ULONG ByteOffset;
- } MDL, *PMDL;
+ #endif // (NTDDI_VERSION >= NTDDI_WINXP)
  
+ #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+ NTKERNELAPI
+ BOOLEAN
+ FASTCALL
+ ExAcquireRundownProtectionEx(
+     IN OUT PEX_RUNDOWN_REF RunRef,
+     IN ULONG Count);
  
- /******************************************************************************
-  *                       Memory manager Functions                             *
-  ******************************************************************************/
+ NTKERNELAPI
+ VOID
+ FASTCALL
+ ExReleaseRundownProtectionEx(
+     IN OUT PEX_RUNDOWN_REF RunRef,
+     IN ULONG Count);
+ #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
  
- /* 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)))
+ #if (NTDDI_VERSION >= NTDDI_WS03SP1)
+ NTKERNELAPI
+ PEX_RUNDOWN_REF_CACHE_AWARE
+ NTAPI
+ ExAllocateCacheAwareRundownProtection(
+     IN POOL_TYPE PoolType,
+     IN ULONG PoolTag);
  
- /* 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)))
+ NTKERNELAPI
+ SIZE_T
+ NTAPI
+ ExSizeOfRundownProtectionCacheAware(VOID);
+ #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
  
- #if (NTDDI_VERSION >= NTDDI_WIN2K)
+ #if (NTDDI_VERSION >= NTDDI_VISTA)
  NTKERNELAPI
- PMDL
+ NTSTATUS
  NTAPI
- MmCreateMdl(
-   IN PMDL  MemoryDescriptorList  OPTIONAL,
-   IN PVOID  Base,
-   IN SIZE_T  Length);
+ ExInitializeLookasideListEx(
+     OUT PLOOKASIDE_LIST_EX Lookaside,
+     IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
+     IN PFREE_FUNCTION_EX Free OPTIONAL,
+     IN POOL_TYPE PoolType,
+     IN ULONG Flags,
+     IN SIZE_T Size,
+     IN ULONG Tag,
+     IN USHORT Depth);
+ #endif
+ #if !defined(MIDL_PASS)
+ static __inline PVOID
+ ExAllocateFromNPagedLookasideList(
+     IN PNPAGED_LOOKASIDE_LIST Lookaside)
+ {
+     PVOID Entry;
+     Lookaside->L.TotalAllocates++;
+     Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
+     if (Entry == NULL) {
+         Lookaside->L.AllocateMisses++;
+         Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
+                                         Lookaside->L.Size,
+