/*
 * winddk.h
 *
 * Windows Device Driver Kit
 *
 * This file is part of the w32api package.
 *
 * Contributors:
 *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
 *
 * THIS SOFTWARE IS NOT COPYRIGHTED
 *
 * This source code is offered for use in the public domain. You may
 * use, modify or distribute it freely.
 *
 * This code is distributed in the hope that it will be useful but
 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 * DISCLAIMED. This includes but is not limited to warranties of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#ifndef __WINDDK_H
#define __WINDDK_H

#if __GNUC__ >= 3
#pragma GCC system_header
#endif

#ifdef __cplusplus
extern "C" {
#endif

/*
** Definitions specific to this Device Driver Kit
*/
#define DDKAPI __stdcall
#define DDKFASTAPI __fastcall
#define DDKCDECLAPI __cdecl

#if defined(_NTOSKRNL_)
#ifndef NTOSAPI
#define NTOSAPI DECL_EXPORT
#endif
#define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
#define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
#else
#ifndef NTOSAPI
#define NTOSAPI DECL_IMPORT
#endif
#define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
#define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
#endif

/* Pseudo modifiers for parameters 
   We don't use these unnecessary defines in the w32api headers. Define
   them by default since that is what people expect, but allow users
   to avoid the pollution.  */
#ifndef _NO_W32_PSEUDO_MODIFIERS
#define IN
#define OUT
#define OPTIONAL
#define UNALLIGNED
#endif

#define CONST const
#define VOLATILE volatile

#define RESTRICTED_POINTER
#define POINTER_ALIGNMENT

#ifdef NONAMELESSUNION
# define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
# define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
#else
# define _DDK_DUMMYUNION_MEMBER(name) name
# define _DDK_DUMMYUNION_N_MEMBER(n, name) name
#endif

/*
** Forward declarations
*/

struct _IRP;
struct _MDL;
struct _KAPC;
struct _KDPC;
struct _KPCR;
struct _KPRCB;
struct _KTSS;
struct _FILE_OBJECT;
struct _DMA_ADAPTER;
struct _DEVICE_OBJECT;
struct _DRIVER_OBJECT;
struct _SECTION_OBJECT;
struct _IO_STATUS_BLOCK;
struct _DEVICE_DESCRIPTION;
struct _SCATTER_GATHER_LIST;

DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK)
DECLARE_INTERNAL_OBJECT(SECTION_OBJECT)

#if 1
/* FIXME: Unknown definitions */
struct _SET_PARTITION_INFORMATION_EX;
typedef ULONG WAIT_TYPE;
typedef HANDLE TRACEHANDLE;
typedef PVOID PWMILIB_CONTEXT;
typedef PVOID PSYSCTL_IRP_DISPOSITION;
typedef ULONG LOGICAL;
#endif

/*
** Routines specific to this DDK
*/

#define TAG(_a, _b, _c, _d) (ULONG) \
	(((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24))

#ifdef __GNUC__
static __inline struct _KPCR * KeGetCurrentKPCR(
  VOID)
{
  ULONG Value;

  __asm__ __volatile__ (
#if (__GNUC__ >= 3)
    /* support -masm=intel */
    "mov{l} {%%fs:0x18, %0|%0, %%fs:0x18}\n\t"
#else
    "movl %%fs:0x18, %0\n\t"
#endif
     : "=r" (Value)
     : /* no inputs */
  );
  return (struct _KPCR *) Value;
}

#elif defined( __WATCOMC__ )

extern struct _KPCR * KeGetCurrentKPCR( void );
#pragma aux KeGetCurrentKPCR = \
  "mov eax, fs:[0x18]" \
  value [ eax ];

#endif

/*
** Simple structures
*/

typedef LONG KPRIORITY;
typedef UCHAR KIRQL, *PKIRQL;
typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
typedef CCHAR KPROCESSOR_MODE;

typedef enum _MODE {
  KernelMode,
  UserMode,
  MaximumMode
} MODE;


/* Structures not exposed to drivers */
typedef struct _IO_TIMER *PIO_TIMER;
typedef struct _EPROCESS *PEPROCESS;
typedef struct _ETHREAD *PETHREAD;
typedef struct _KINTERRUPT *PKINTERRUPT;
typedef struct _OBJECT_TYPE *POBJECT_TYPE;
typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION;
typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX;

/* Constants */
#define	MAXIMUM_PROCESSORS                32

#define MAXIMUM_WAIT_OBJECTS              64

#define METHOD_BUFFERED                   0
#define METHOD_IN_DIRECT                  1
#define METHOD_OUT_DIRECT                 2
#define METHOD_NEITHER                    3

#define LOW_PRIORITY                      0
#define LOW_REALTIME_PRIORITY             16
#define HIGH_PRIORITY                     31
#define MAXIMUM_PRIORITY                  32

#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

/* 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_COPY_STRUCTURED_STORAGE      0x00000041
#define FILE_STRUCTURED_STORAGE           0x00000441

#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_FOR_RECOVERY            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 */

#define DIRECTORY_QUERY (0x0001)
#define DIRECTORY_TRAVERSE (0x0002)
#define DIRECTORY_CREATE_OBJECT (0x0004)
#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
  
/* Exported object types */
extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
extern NTOSAPI POBJECT_TYPE ExEventObjectType;
extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType;
extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType;
extern NTOSAPI POBJECT_TYPE IoAdapterObjectType;
extern NTOSAPI ULONG IoDeviceHandlerObjectSize;
extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
extern NTOSAPI POBJECT_TYPE IoFileObjectType;
extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
extern NTOSAPI POBJECT_TYPE SeTokenObjectType;

extern NTOSAPI CCHAR KeNumberProcessors;
extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable;
extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable;


/*
** 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_QUERY_DIRECTORY            0x01
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02

#define IRP_MN_USER_FS_REQUEST            0x00
#define IRP_MN_MOUNT_VOLUME               0x01
#define IRP_MN_VERIFY_VOLUME              0x02
#define IRP_MN_LOAD_FILE_SYSTEM           0x03
#define IRP_MN_TRACK_LINK                 0x04
#define IRP_MN_KERNEL_CALL                0x04

#define IRP_MN_LOCK                       0x01
#define IRP_MN_UNLOCK_SINGLE              0x02
#define IRP_MN_UNLOCK_ALL                 0x03
#define IRP_MN_UNLOCK_ALL_BY_KEY          0x04

#define IRP_MN_NORMAL                     0x00
#define IRP_MN_DPC                        0x01
#define IRP_MN_MDL                        0x02
#define IRP_MN_COMPLETE                   0x04
#define IRP_MN_COMPRESSED                 0x08

#define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
#define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
#define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)

#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_QUERY_LEGACY_BUS_INFORMATION 0x18

#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 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 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 *PDRIVER_ADD_DEVICE)(
  /*IN*/ struct _DRIVER_OBJECT  *DriverObject,
  /*IN*/ struct _DEVICE_OBJECT  *PhysicalDeviceObject);

typedef NTSTATUS
(DDKAPI *PIO_COMPLETION_ROUTINE)(
  /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
  /*IN*/ struct _IRP  *Irp,
  /*IN*/ PVOID  Context);

typedef VOID
(DDKAPI *PDRIVER_CANCEL)(
  /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
  /*IN*/ struct _IRP  *Irp);

typedef VOID
(DDKAPI *PKDEFERRED_ROUTINE)(
  /*IN*/ struct _KDPC  *Dpc,
  /*IN*/ PVOID  DeferredContext,
  /*IN*/ PVOID  SystemArgument1,
  /*IN*/ PVOID  SystemArgument2);

typedef NTSTATUS
(DDKAPI *PDRIVER_DISPATCH)(
  /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
  /*IN*/ struct _IRP  *Irp);

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 NTSTATUS
(DDKAPI *PDRIVER_ENTRY)( 
  /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
  /*IN*/ PUNICODE_STRING  RegistryPath); 

typedef NTSTATUS
(DDKAPI *PDRIVER_INITIALIZE)(
  /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
  /*IN*/ PUNICODE_STRING  RegistryPath);

typedef BOOLEAN
(DDKAPI *PKSERVICE_ROUTINE)(
  /*IN*/ struct _KINTERRUPT  *Interrupt,
  /*IN*/ PVOID  ServiceContext);

typedef VOID
(DDKAPI *PIO_TIMER_ROUTINE)(
  /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
  /*IN*/ PVOID  Context);

typedef VOID
(DDKAPI *PDRIVER_REINITIALIZE)( 
  /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
  /*IN*/ PVOID  Context, 
  /*IN*/ ULONG  Count); 

typedef NTSTATUS
(DDKAPI *PDRIVER_STARTIO)(
  /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
  /*IN*/ struct _IRP  *Irp);

typedef BOOLEAN
(DDKAPI *PKSYNCHRONIZE_ROUTINE)(
  /*IN*/ PVOID  SynchronizeContext);

typedef VOID
(DDKAPI *PDRIVER_UNLOAD)( 
  /*IN*/ struct _DRIVER_OBJECT  *DriverObject); 



/*
** 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);

typedef union _POWER_STATE {
  SYSTEM_POWER_STATE  SystemState;
  DEVICE_POWER_STATE  DeviceState;
} POWER_STATE, *PPOWER_STATE;

typedef enum _POWER_STATE_TYPE {
  SystemPowerState,
  DevicePowerState
} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;

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 _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 _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 _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,
  DevicePropertyHardwareID,
  DevicePropertyCompatibleIDs,
  DevicePropertyBootConfiguration,
  DevicePropertyBootConfigurationTranslated,
  DevicePropertyClassName,
  DevicePropertyClassGuid,
  DevicePropertyDriverKeyName,
  DevicePropertyManufacturer,
  DevicePropertyFriendlyName,
  DevicePropertyLocationInformation,
  DevicePropertyPhysicalDeviceObjectName,
  DevicePropertyBusTypeGuid,
  DevicePropertyLegacyBusType,
  DevicePropertyBusNumber,
  DevicePropertyEnumeratorName,
  DevicePropertyAddress,
  DevicePropertyUINumber,
  DevicePropertyInstallState,
  DevicePropertyRemovalPolicy
} 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);



/*
** System structures
*/

#define SYMBOLIC_LINK_QUERY               0x0001
#define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)

/* also in winnt,h */
#define DUPLICATE_CLOSE_SOURCE            0x00000001
#define DUPLICATE_SAME_ACCESS             0x00000002
#define DUPLICATE_SAME_ATTRIBUTES         0x00000004
/* end winnt.h */

typedef struct _OBJECT_NAME_INFORMATION {               
  UNICODE_STRING  Name;                                
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;   

typedef VOID DDKAPI
(*PIO_APC_ROUTINE)(
  /*IN*/ PVOID ApcContext,
  /*IN*/ PIO_STATUS_BLOCK IoStatusBlock,
  /*IN*/ ULONG Reserved);

typedef struct _IO_STATUS_BLOCK {
  _ANONYMOUS_UNION union {
    NTSTATUS  Status;
    PVOID  Pointer;
  } DUMMYUNIONNAME;
  ULONG_PTR  Information;
} IO_STATUS_BLOCK;

typedef VOID DDKAPI
(*PKNORMAL_ROUTINE)(
  /*IN*/ PVOID  NormalContext,
  /*IN*/ PVOID  SystemArgument1,
  /*IN*/ PVOID  SystemArgument2);

typedef VOID DDKAPI
(*PKKERNEL_ROUTINE)(
  /*IN*/ struct _KAPC  *Apc,
  /*IN OUT*/ PKNORMAL_ROUTINE  *NormalRoutine,
  /*IN OUT*/ PVOID  *NormalContext,
  /*IN OUT*/ PVOID  *SystemArgument1,
  /*IN OUT*/ PVOID  *SystemArgument2);

typedef VOID DDKAPI
(*PKRUNDOWN_ROUTINE)(
  /*IN*/ struct _KAPC  *Apc);

typedef BOOLEAN DDKAPI
(*PKTRANSFER_ROUTINE)(
  VOID);

typedef struct _KAPC {
  CSHORT  Type;
  CSHORT  Size;
  ULONG  Spare0;
  struct _KTHREAD  *Thread;
  LIST_ENTRY  ApcListEntry;
  PKKERNEL_ROUTINE  KernelRoutine;
  PKRUNDOWN_ROUTINE  RundownRoutine;
  PKNORMAL_ROUTINE  NormalRoutine;
  PVOID  NormalContext;
  PVOID  SystemArgument1;
  PVOID  SystemArgument2;
  CCHAR  ApcStateIndex;
  KPROCESSOR_MODE  ApcMode;
  BOOLEAN  Inserted;
} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;

typedef struct _KDEVICE_QUEUE {
  CSHORT  Type;
  CSHORT  Size;
  LIST_ENTRY  DeviceListHead;
  KSPIN_LOCK  Lock;
  BOOLEAN  Busy;
} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;

typedef struct _KDEVICE_QUEUE_ENTRY {
  LIST_ENTRY  DeviceListEntry;
  ULONG  SortKey;
  BOOLEAN  Inserted;
} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;

#define LOCK_QUEUE_WAIT                   1
#define LOCK_QUEUE_OWNER                  2

typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
  LockQueueDispatcherLock,
  LockQueueContextSwapLock,
  LockQueuePfnLock,
  LockQueueSystemSpaceLock,
  LockQueueVacbLock,
  LockQueueMasterLock,
  LockQueueNonPagedPoolLock,
  LockQueueIoCancelLock,
  LockQueueWorkQueueLock,
  LockQueueIoVpbLock,
  LockQueueIoDatabaseLock,
  LockQueueIoCompletionLock,
  LockQueueNtfsStructLock,
  LockQueueAfdWorkQueueLock,
  LockQueueBcbLock,
  LockQueueMaximumLock
} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;

typedef struct _KSPIN_LOCK_QUEUE {
  struct _KSPIN_LOCK_QUEUE  *VOLATILE Next;
  PKSPIN_LOCK VOLATILE  Lock;
} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;

typedef struct _KLOCK_QUEUE_HANDLE {
  KSPIN_LOCK_QUEUE  LockQueue;
  KIRQL  OldIrql;
} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;

typedef struct _KDPC {
  CSHORT  Type;
  UCHAR  Number;
  UCHAR  Importance;
  LIST_ENTRY  DpcListEntry;
  PKDEFERRED_ROUTINE  DeferredRoutine;
  PVOID  DeferredContext;
  PVOID  SystemArgument1;
  PVOID  SystemArgument2;
  PULONG_PTR  Lock;
} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;

typedef struct _WAIT_CONTEXT_BLOCK {
  KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
  struct _DRIVER_CONTROL  *DeviceRoutine;
  PVOID  DeviceContext;
  ULONG  NumberOfMapRegisters;
  PVOID  DeviceObject;
  PVOID  CurrentIrp;
  PKDPC  BufferChainingDpc;
} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;

typedef struct _DISPATCHER_HEADER {
  UCHAR  Type;
  UCHAR  Absolute;
  UCHAR  Size;
  UCHAR  Inserted;
  LONG  SignalState;
  LIST_ENTRY  WaitListHead;
} DISPATCHER_HEADER, *PDISPATCHER_HEADER;

typedef struct _KEVENT {
  DISPATCHER_HEADER  Header;
} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;

typedef struct _KSEMAPHORE {
    DISPATCHER_HEADER Header;
    LONG Limit;
} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;

typedef struct _FAST_MUTEX {
  LONG  Count;
  struct _KTHREAD  *Owner;
  ULONG  Contention;
  KEVENT  Event;
  ULONG  OldIrql;
} FAST_MUTEX, *PFAST_MUTEX;

typedef struct _KTIMER {
  DISPATCHER_HEADER  Header;
  ULARGE_INTEGER  DueTime;
  LIST_ENTRY  TimerListEntry;
  struct _KDPC  *Dpc;
  LONG  Period;
} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;

typedef struct _KMUTANT {
  DISPATCHER_HEADER  Header;
  LIST_ENTRY  MutantListEntry;
  struct _KTHREAD  *RESTRICTED_POINTER OwnerThread;
  BOOLEAN  Abandoned;
  UCHAR  ApcDisable;
} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;

typedef enum _TIMER_TYPE {
  NotificationTimer,
  SynchronizationTimer
} TIMER_TYPE;

#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

typedef struct _IRP {
  CSHORT  Type;
  USHORT  Size;
  struct _MDL  *MdlAddress;
  ULONG  Flags;
  union {
    struct _IRP  *MasterIrp;
    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 {
      PIO_APC_ROUTINE  UserApcRoutine;
      PVOID  UserApcContext;
    } AsynchronousParameters;
    LARGE_INTEGER  AllocationSize;
  } Overlay;
  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;

/* 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)

enum
{
   IRP_NOCACHE = 0x1,
   IRP_PAGING_IO = 0x2,
   IRP_MOUNT_COMPLETION = 0x2,
   IRP_SYNCHRONOUS_API = 0x4,
   IRP_ASSOCIATED_IRP = 0x8,
   IRP_BUFFERED_IO = 0x10,
   IRP_DEALLOCATE_BUFFER = 0x20,
   IRP_INPUT_OPERATION = 0x40,
   IRP_SYNCHRONOUS_PAGING_IO = 0x40,
   IRP_CREATE_OPERATION = 0x80,
   IRP_READ_OPERATION = 0x100,
   IRP_WRITE_OPERATION = 0x200,
   IRP_CLOSE_OPERATION = 0x400,
   IRP_DEFER_IO_COMPLETION = 0x800,
   IRP_OB_QUERY_NAME = 0x1000,
   IRP_HOLD_DEVICE_QUEUE = 0x2000,
   IRP_RETRY_IO_COMPLETION = 0x4000
};


typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
  ULONG  Signature;
} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;

typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
  GUID  DiskId;
  LARGE_INTEGER  StartingUsableOffset;
  LARGE_INTEGER  UsableLength;
  ULONG  MaxPartitionCount;
} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;

typedef struct _PARTITION_INFORMATION_MBR {
  UCHAR  PartitionType;
  BOOLEAN  BootIndicator;
  BOOLEAN  RecognizedPartition;
  ULONG  HiddenSectors;
} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;


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

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;

typedef enum _INTERFACE_TYPE {
  InterfaceTypeUndefined = -1,
  Internal,
  Isa,
  Eisa,
  MicroChannel,
  TurboChannel,
  PCIBus,
  VMEBus,
  NuBus,
  PCMCIABus,
  CBus,
  MPIBus,
  MPSABus,
  ProcessorInternal,
  InternalPowerBus,
  PNPISABus,
  PNPBus,
  MaximumInterfaceType
} INTERFACE_TYPE, *PINTERFACE_TYPE;

typedef struct _PNP_BUS_INFORMATION {
  GUID  BusTypeGuid;
  INTERFACE_TYPE  LegacyBusType;
  ULONG  BusNumber;
} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;

#include <pshpack1.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 {
      ULONG Level;
      ULONG Vector;
      ULONG Affinity;
    } Interrupt;
    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;
  } u;
} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;

/* 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 CmResourceTypeMaximum             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

/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */

#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
#define CM_RESOURCE_INTERRUPT_LATCHED         0x0001

/* 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_PREFETCHABLE   0x0004
#define CM_RESOURCE_MEMORY_COMBINEDWRITE  0x0008
#define CM_RESOURCE_MEMORY_24             0x0010
#define CM_RESOURCE_MEMORY_CACHEABLE      0x0020

/* 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;

typedef struct _CM_INT13_DRIVE_PARAMETER {
  USHORT  DriveSelect;
  ULONG  MaxCylinders;
  USHORT  SectorsPerTrack;
  USHORT  MaxHeads;
  USHORT  NumberDrives;
} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
#include <poppack.h>

typedef struct _CM_KEYBOARD_DEVICE_DATA {
  USHORT  Version;
  USHORT  Revision;
  UCHAR  Type;
  UCHAR  Subtype;
  USHORT  KeyboardFlags;
} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;

#define KEYBOARD_INSERT_ON                0x80
#define KEYBOARD_CAPS_LOCK_ON             0x40
#define KEYBOARD_NUM_LOCK_ON              0x20
#define KEYBOARD_SCROLL_LOCK_ON           0x10
#define KEYBOARD_ALT_KEY_DOWN             0x08
#define KEYBOARD_CTRL_KEY_DOWN            0x04
#define KEYBOARD_LEFT_SHIFT_DOWN          0x02
#define KEYBOARD_RIGHT_SHIFT_DOWN         0x01

typedef struct _CM_MCA_POS_DATA {
  USHORT  AdapterId;
  UCHAR  PosData1;
  UCHAR  PosData2;
  UCHAR  PosData3;
  UCHAR  PosData4;
} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;

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];
} 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

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;

/* IO_RESOURCE_DESCRIPTOR.Option */

#define IO_RESOURCE_PREFERRED             0x01
#define IO_RESOURCE_DEFAULT               0x02
#define IO_RESOURCE_ALTERNATIVE           0x08

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 struct _CONTROLLER_OBJECT {
  CSHORT  Type;
  CSHORT  Size;
  PVOID  ControllerExtension;
  KDEVICE_QUEUE  DeviceWaitQueue;
  ULONG  Spare1;
  LARGE_INTEGER  Spare2;
} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;

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;

/* 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 MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))

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;

/* 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_HAS_NAME                0x00000040      
#define DO_DEVICE_INITIALIZING            0x00000080      
#define DO_SYSTEM_BOOT_PARTITION          0x00000100      
#define DO_LONG_TERM_REQUESTS             0x00000200      
#define DO_NEVER_LAST_DEVICE              0x00000400      
#define DO_SHUTDOWN_REGISTERED            0x00000800      
#define DO_BUS_ENUMERATED_DEVICE          0x00001000      
#define DO_POWER_PAGABLE                  0x00002000      
#define DO_POWER_INRUSH                   0x00004000      
#define DO_LOW_PRIORITY_FILESYSTEM        0x00010000      

/* 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

/* 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

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;
  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;
typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;

typedef enum _DEVICE_RELATION_TYPE {
  BusRelations,
  EjectionRelations,
  PowerRelations,
  RemovalRelations,
  TargetDeviceRelation,
  SingleBusRelations
} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;

typedef struct _DEVICE_RELATIONS {
  ULONG  Count;
  PDEVICE_OBJECT Objects[1];
} DEVICE_RELATIONS, *PDEVICE_RELATIONS;

typedef struct _SCATTER_GATHER_ELEMENT {
  PHYSICAL_ADDRESS  Address;   
  ULONG  Length;          
  ULONG_PTR  Reserved;
} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;

typedef struct _SCATTER_GATHER_LIST {
  ULONG  NumberOfElements;
  ULONG_PTR  Reserved;
  SCATTER_GATHER_ELEMENT  Elements[0];
} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;

typedef struct _MDL {
  struct _MDL  *Next;
  CSHORT  Size;
  CSHORT  MdlFlags;
  struct _EPROCESS  *Process;
  PVOID  MappedSystemVa;
  PVOID  StartVa;
  ULONG  ByteCount;
  ULONG  ByteOffset;
} MDL, *PMDL;

#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_IO_SPACE                      0x0800
#define MDL_NETWORK_HEADER                0x1000
#define MDL_MAPPING_CAN_FAIL              0x2000
#define MDL_ALLOCATED_MUST_SUCCEED        0x4000

#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)

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 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 _DMA_ADAPTER {
  USHORT  Version;
  USHORT  Size;
  PDMA_OPERATIONS  DmaOperations;
} DMA_ADAPTER;

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,
  FileMaximumInformation
} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;

typedef struct _FILE_POSITION_INFORMATION {                 
  LARGE_INTEGER  CurrentByteOffset;                        
} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;   

typedef struct _FILE_ALIGNMENT_INFORMATION {
  ULONG  AlignmentRequirement;
} FILE_ALIGNMENT_INFORMATION;

typedef struct _FILE_NAME_INFORMATION {                     
  ULONG  FileNameLength;                                   
  WCHAR  FileName[1];                                      
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;           

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;

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 struct _FILE_ATTRIBUTE_TAG_INFORMATION {               
  ULONG  FileAttributes;                                       
  ULONG  ReparseTag;                                           
} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;

typedef struct _FILE_DISPOSITION_INFORMATION {                  
  BOOLEAN  DoDeleteFile;                                         
} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; 
                                                                
typedef struct _FILE_END_OF_FILE_INFORMATION {                  
  LARGE_INTEGER  EndOfFile;                                    
} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; 
                                                                
typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {                                    
  LARGE_INTEGER  ValidDataLength;                                                      
} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;             

typedef enum _FSINFOCLASS {
  FileFsVolumeInformation = 1,
  FileFsLabelInformation,
  FileFsSizeInformation,
  FileFsDeviceInformation,
  FileFsAttributeInformation,
  FileFsControlInformation,
  FileFsFullSizeInformation,
  FileFsObjectIdInformation,
  FileFsDriverPathInformation,
  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;

typedef ULONG_PTR ERESOURCE_THREAD;
typedef ERESOURCE_THREAD *PERESOURCE_THREAD;

typedef struct _OWNER_ENTRY {
  ERESOURCE_THREAD  OwnerThread;
  _ANONYMOUS_UNION union {
      LONG  OwnerCount;
      ULONG  TableSize;
  } DUMMYUNIONNAME;
} OWNER_ENTRY, *POWNER_ENTRY;

/* ERESOURCE.Flag */

#define ResourceNeverExclusive            0x0010
#define ResourceReleaseByOtherThread      0x0020
#define ResourceOwnedExclusive            0x0080

#define RESOURCE_HASH_TABLE_SIZE          64

typedef struct _ERESOURCE {
  LIST_ENTRY  SystemResourcesList;
  POWNER_ENTRY  OwnerTable;
  SHORT  ActiveCount;
  USHORT  Flag;
  PKSEMAPHORE  SharedWaiters;
  PKEVENT  ExclusiveWaiters;
  OWNER_ENTRY  OwnerThreads[2];
  ULONG  ContentionCount;
  USHORT  NumberOfSharedWaiters;
  USHORT  NumberOfExclusiveWaiters;
  _ANONYMOUS_UNION union {
    PVOID  Address;
    ULONG_PTR  CreatorBackTraceIndex;
  } DUMMYUNIONNAME;
  KSPIN_LOCK  SpinLock;
} ERESOURCE, *PERESOURCE;

/* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
typedef struct _DRIVER_EXTENSION {
  struct _DRIVER_OBJECT  *DriverObject;
  PVOID  AddDevice;
  ULONG  Count;
  UNICODE_STRING  ServiceKeyName;
} DRIVER_EXTENSION, *PDRIVER_EXTENSION;

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 _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;
  PFAST_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 _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_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_FILE_OBJECT_HAS_EXTENSION      0x00800000
#define FO_REMOTE_ORIGIN                  0x01000000

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;
  ULONG  Waiters;
  ULONG  Busy;
  PVOID  LastLock;
  KEVENT  Lock;
  KEVENT  Event;
  PIO_COMPLETION_CONTEXT  CompletionContext;
} FILE_OBJECT;
typedef struct _FILE_OBJECT *PFILE_OBJECT;

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;

typedef struct _SECURITY_SUBJECT_CONTEXT {
  PACCESS_TOKEN  ClientToken;
  SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
  PACCESS_TOKEN  PrimaryToken;
  PVOID  ProcessAuditId;
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;

#include <pshpack4.h>
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;
#include <poppack.h>

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;

#include <pshpack4.h>
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;
      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;
      FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
    } QueryVolume;
    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 {
      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;
#include <poppack.h>

/* IO_STACK_LOCATION.Control */

#define SL_PENDING_RETURNED               0x01
#define SL_INVOKE_ON_CANCEL               0x20
#define SL_INVOKE_ON_SUCCESS              0x40
#define SL_INVOKE_ON_ERROR                0x80

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;

/* 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

#define PCI_TYPE0_ADDRESSES               6
#define PCI_TYPE1_ADDRESSES               2
#define PCI_TYPE2_ADDRESSES               5

typedef struct _PCI_COMMON_CONFIG {
  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;
  UCHAR  DeviceSpecific[192];
} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;

/* 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

/* PCI_COMMON_CONFIG.Status */

#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)

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 enum _POOL_TYPE {
  NonPagedPool,
  PagedPool,
  NonPagedPoolMustSucceed,
  DontUseThisType,
  NonPagedPoolCacheAligned,
  PagedPoolCacheAligned,
  NonPagedPoolCacheAlignedMustS,
	MaxPoolType,
	NonPagedPoolSession = 32,
	PagedPoolSession,
	NonPagedPoolMustSucceedSession,
	DontUseThisTypeSession,
	NonPagedPoolCacheAlignedSession,
	PagedPoolCacheAlignedSession,
	NonPagedPoolCacheAlignedMustSSession
} POOL_TYPE;

typedef enum _EX_POOL_PRIORITY {
  LowPoolPriority,
  LowPoolPrioritySpecialPoolOverrun = 8,
  LowPoolPrioritySpecialPoolUnderrun = 9,
  NormalPoolPriority = 16,
  NormalPoolPrioritySpecialPoolOverrun = 24,
  NormalPoolPrioritySpecialPoolUnderrun = 25,
  HighPoolPriority = 32,
  HighPoolPrioritySpecialPoolOverrun = 40,
  HighPoolPrioritySpecialPoolUnderrun = 41
} EX_POOL_PRIORITY;

/* PRIVILEGE_SET.Control */

#define PRIVILEGE_SET_ALL_NECESSARY       1

typedef struct _RTL_OSVERSIONINFOW {
  ULONG  dwOSVersionInfoSize;
  ULONG  dwMajorVersion;
  ULONG  dwMinorVersion;
  ULONG  dwBuildNumber;
  ULONG  dwPlatformId;
  WCHAR  szCSDVersion[128];
} RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;

typedef struct _RTL_OSVERSIONINFOEXW {
  ULONG  dwOSVersionInfoSize;
  ULONG  dwMajorVersion;
  ULONG  dwMinorVersion;
  ULONG  dwBuildNumber;
  ULONG  dwPlatformId;
  WCHAR  szCSDVersion[128];
  USHORT  wServicePackMajor;
  USHORT  wServicePackMinor;
  USHORT  wSuiteMask;
  UCHAR  wProductType;
  UCHAR  wReserved;
} RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;

NTOSAPI
ULONGLONG
DDKAPI
VerSetConditionMask(
  /*IN*/ ULONGLONG  ConditionMask,
  /*IN*/ ULONG  TypeMask,
  /*IN*/ UCHAR  Condition);

#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType)  \
        ((ConditionMask) = VerSetConditionMask((ConditionMask), \
        (TypeBitMask), (ComparisonType)))

/* RtlVerifyVersionInfo() TypeMask */

#define VER_MINORVERSION                  0x0000001
#define VER_MAJORVERSION                  0x0000002
#define VER_BUILDNUMBER                   0x0000004
#define VER_PLATFORMID                    0x0000008
#define VER_SERVICEPACKMINOR              0x0000010
#define VER_SERVICEPACKMAJOR              0x0000020
#define VER_SUITENAME                     0x0000040
#define VER_PRODUCT_TYPE                  0x0000080

/* RtlVerifyVersionInfo() ComparisonType */

#define VER_EQUAL                       1
#define VER_GREATER                     2
#define VER_GREATER_EQUAL               3
#define VER_LESS                        4
#define VER_LESS_EQUAL                  5
#define VER_AND                         6
#define VER_OR                          7

#define VER_CONDITION_MASK              7
#define VER_NUM_BITS_PER_CONDITION_MASK 3

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);

#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

/* 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

typedef struct _RTL_QUERY_REGISTRY_TABLE {
  PRTL_QUERY_REGISTRY_ROUTINE  QueryRoutine;
  ULONG  Flags;
  PWSTR  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;

typedef PVOID DDKAPI
(*PALLOCATE_FUNCTION)(
  /*IN*/ POOL_TYPE  PoolType,
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ ULONG  Tag);

typedef VOID DDKAPI
(*PFREE_FUNCTION)(
  /*IN*/ PVOID  Buffer);

#define GENERAL_LOOKASIDE_S \
  SLIST_HEADER  ListHead; \
  USHORT  Depth; \
  USHORT  MaximumDepth; \
  ULONG  TotalAllocates; \
  _ANONYMOUS_UNION union { \
    ULONG  AllocateMisses; \
    ULONG  AllocateHits; \
  } DUMMYUNIONNAME; \
  ULONG  TotalFrees; \
  _ANONYMOUS_UNION union { \
    ULONG  FreeMisses; \
    ULONG  FreeHits; \
  } DUMMYUNIONNAME2; \
  POOL_TYPE  Type; \
  ULONG  Tag; \
  ULONG  Size; \
  PALLOCATE_FUNCTION  Allocate; \
  PFREE_FUNCTION  Free; \
  LIST_ENTRY  ListEntry; \
  ULONG  LastTotalAllocates; \
  _ANONYMOUS_UNION union { \
    ULONG  LastAllocateMisses; \
    ULONG  LastAllocateHits; \
  } DUMMYUNIONNAME3; \
  ULONG Future[2];

typedef struct _GENERAL_LOOKASIDE {
  GENERAL_LOOKASIDE_S
} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;

typedef struct _NPAGED_LOOKASIDE_LIST {
  GENERAL_LOOKASIDE_S
  KSPIN_LOCK  Obsoleted;
} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;

typedef struct _PAGED_LOOKASIDE_LIST {
  GENERAL_LOOKASIDE_S
  FAST_MUTEX  Obsoleted;
} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;

typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;

typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
  /*IN*/ PVOID  CallbackContext,
  /*IN*/ PVOID  Argument1,
  /*IN*/ PVOID  Argument2);

typedef enum _EVENT_TYPE {
  NotificationEvent,
  SynchronizationEvent
} EVENT_TYPE;

typedef enum _KWAIT_REASON {
  Executive,
  FreePage,
  PageIn,
  PoolAllocation,
  DelayExecution,
  Suspended,
  UserRequest,
  WrExecutive,
  WrFreePage,
  WrPageIn,
  WrPoolAllocation,
  WrDelayExecution,
  WrSuspended,
  WrUserRequest,
  WrEventPair,
  WrQueue,
  WrLpcReceive,
  WrLpcReply,
  WrVirtualMemory,
  WrPageOut,
  WrRendezvous,
  Spare2,
  Spare3,
  Spare4,
  Spare5,
  Spare6,
  WrKernel,
  MaximumWaitReason
} KWAIT_REASON;

typedef struct _KWAIT_BLOCK {
  LIST_ENTRY  WaitListEntry;
  struct _KTHREAD * RESTRICTED_POINTER  Thread;
  PVOID  Object;
  struct _KWAIT_BLOCK * RESTRICTED_POINTER  NextWaitBlock;
  USHORT  WaitKey;
  USHORT  WaitType;
} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;

typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;

typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
  BOOLEAN  Removed;
  BOOLEAN  Reserved[3];
  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;
  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;
#ifdef DBG
  IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
#endif
} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;

typedef struct _IO_WORKITEM *PIO_WORKITEM;

typedef VOID DDKAPI
(*PIO_WORKITEM_ROUTINE)(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PVOID  Context);

typedef struct _SHARE_ACCESS {
  ULONG  OpenCount;
  ULONG  Readers;
  ULONG  Writers;
  ULONG  Deleters;
  ULONG  SharedRead;
  ULONG  SharedWrite;
  ULONG  SharedDelete;
} SHARE_ACCESS, *PSHARE_ACCESS;

typedef enum _KINTERRUPT_MODE {
  LevelSensitive,
  Latched
} KINTERRUPT_MODE;

typedef VOID DDKAPI
(*PKINTERRUPT_ROUTINE)(
  VOID);

typedef enum _KPROFILE_SOURCE {
  ProfileTime,
  ProfileAlignmentFixup,
  ProfileTotalIssues,
  ProfilePipelineDry,
  ProfileLoadInstructions,
  ProfilePipelineFrozen,
  ProfileBranchInstructions,
  ProfileTotalNonissues,
  ProfileDcacheMisses,
  ProfileIcacheMisses,
  ProfileCacheMisses,
  ProfileBranchMispredictions,
  ProfileStoreInstructions,
  ProfileFpInstructions,
  ProfileIntegerInstructions,
  Profile2Issue,
  Profile3Issue,
  Profile4Issue,
  ProfileSpecialInstructions,
  ProfileTotalCycles,
  ProfileIcacheIssues,
  ProfileDcacheAccesses,
  ProfileMemoryBarrierCycles,
  ProfileLoadLinkedIssues,
  ProfileMaximum
} KPROFILE_SOURCE;

typedef enum _CREATE_FILE_TYPE {
  CreateFileTypeNone,
  CreateFileTypeNamedPipe,
  CreateFileTypeMailslot
} CREATE_FILE_TYPE;

typedef struct _CONFIGURATION_INFORMATION {
  ULONG  DiskCount;
  ULONG  FloppyCount;
  ULONG  CdRomCount;
  ULONG  TapeCount;
  ULONG  ScsiPortCount;
  ULONG  SerialCount;
  ULONG  ParallelCount;
  BOOLEAN  AtDiskPrimaryAddressClaimed;
  BOOLEAN  AtDiskSecondaryAddressClaimed;
  ULONG  Version;
  ULONG  MediumChangerCount;
} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;

typedef enum _CONFIGURATION_TYPE {
  ArcSystem,
  CentralProcessor,
  FloatingPointProcessor,
  PrimaryIcache,
  PrimaryDcache,
  SecondaryIcache,
  SecondaryDcache,
  SecondaryCache,
  EisaAdapter,
  TcAdapter,
  ScsiAdapter,
  DtiAdapter,
  MultiFunctionAdapter,
  DiskController,
  TapeController,
  CdromController,
  WormController,
  SerialController,
  NetworkController,
  DisplayController,
  ParallelController,
  PointerController,
  KeyboardController,
  AudioController,
  OtherController,
  DiskPeripheral,
  FloppyDiskPeripheral,
  TapePeripheral,
  ModemPeripheral,
  MonitorPeripheral,
  PrinterPeripheral,
  PointerPeripheral,
  KeyboardPeripheral,
  TerminalPeripheral,
  OtherPeripheral,
  LinePeripheral,
  NetworkPeripheral,
  SystemMemory,
  DockingInformation,
  RealModeIrqRoutingTable,
  MaximumType
} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;

typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
  /*IN*/ PVOID  Context,
  /*IN*/ PUNICODE_STRING  PathName,
  /*IN*/ INTERFACE_TYPE  BusType,
  /*IN*/ ULONG  BusNumber,
  /*IN*/ PKEY_VALUE_FULL_INFORMATION  *BusInformation,
  /*IN*/ CONFIGURATION_TYPE  ControllerType,
  /*IN*/ ULONG  ControllerNumber,
  /*IN*/ PKEY_VALUE_FULL_INFORMATION  *ControllerInformation,
  /*IN*/ CONFIGURATION_TYPE  PeripheralType,
  /*IN*/ ULONG  PeripheralNumber,
  /*IN*/ PKEY_VALUE_FULL_INFORMATION  *PeripheralInformation);

typedef enum _WORK_QUEUE_TYPE {
  CriticalWorkQueue,
  DelayedWorkQueue,
  HyperCriticalWorkQueue,
  MaximumWorkQueue
} WORK_QUEUE_TYPE;

typedef VOID DDKAPI
(*PWORKER_THREAD_ROUTINE)(
  /*IN*/ PVOID Parameter);

typedef struct _WORK_QUEUE_ITEM {
  LIST_ENTRY  List;
  PWORKER_THREAD_ROUTINE  WorkerRoutine;
  PVOID  Parameter;
} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;

typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
    BufferEmpty,
    BufferInserted,
    BufferStarted,
    BufferFinished,
    BufferIncomplete
} KBUGCHECK_BUFFER_DUMP_STATE;

typedef VOID DDKAPI
(*PKBUGCHECK_CALLBACK_ROUTINE)(
  /*IN*/ PVOID  Buffer,
  /*IN*/ ULONG  Length);

typedef struct _KBUGCHECK_CALLBACK_RECORD {
  LIST_ENTRY  Entry;
  PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine;
  PVOID  Buffer;
  ULONG  Length;
  PUCHAR  Component;
  ULONG_PTR  Checksum;
  UCHAR  State;
} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;

/*
 * VOID
 * KeInitializeCallbackRecord(
 * IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
 */
#define KeInitializeCallbackRecord(CallbackRecord) \
  CallbackRecord->State = BufferEmpty;

typedef enum _KDPC_IMPORTANCE {
  LowImportance,
  MediumImportance,
  HighImportance
} KDPC_IMPORTANCE;

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_SYSTEM_SIZE;

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 VOID DDKAPI
(*PCREATE_PROCESS_NOTIFY_ROUTINE)(
  /*IN*/ HANDLE  ParentId,
  /*IN*/ HANDLE  ProcessId,
  /*IN*/ BOOLEAN  Create);

typedef VOID DDKAPI
(*PCREATE_THREAD_NOTIFY_ROUTINE)(
  /*IN*/ HANDLE  ProcessId,
  /*IN*/ HANDLE  ThreadId,
  /*IN*/ BOOLEAN  Create);

typedef struct _IMAGE_INFO {
  _ANONYMOUS_UNION union {
    ULONG  Properties;
    _ANONYMOUS_STRUCT struct {
      ULONG  ImageAddressingMode  : 8;
      ULONG  SystemModeImage      : 1;
      ULONG  ImageMappedToAllPids : 1;
      ULONG  Reserved             : 22;
    } DUMMYSTRUCTNAME;
  } DUMMYUNIONNAME;
  PVOID  ImageBase;
  ULONG  ImageSelector;
  SIZE_T  ImageSize;
  ULONG  ImageSectionNumber;
} IMAGE_INFO, *PIMAGE_INFO;

#define IMAGE_ADDRESSING_MODE_32BIT       3

typedef VOID DDKAPI
(*PLOAD_IMAGE_NOTIFY_ROUTINE)(
  /*IN*/ PUNICODE_STRING  FullImageName,
  /*IN*/ HANDLE  ProcessId,
  /*IN*/ PIMAGE_INFO  ImageInfo);

typedef enum _PROCESSINFOCLASS {
  ProcessBasicInformation,
  ProcessQuotaLimits,
  ProcessIoCounters,
  ProcessVmCounters,
  ProcessTimes,
  ProcessBasePriority,
  ProcessRaisePriority,
  ProcessDebugPort,
  ProcessExceptionPort,
  ProcessAccessToken,
  ProcessLdtInformation,
  ProcessLdtSize,
  ProcessDefaultHardErrorMode,
  ProcessIoPortHandlers,
  ProcessPooledUsageAndLimits,
  ProcessWorkingSetWatch,
  ProcessUserModeIOPL,
  ProcessEnableAlignmentFaultFixup,
  ProcessPriorityClass,
  ProcessWx86Information,
  ProcessHandleCount,
  ProcessAffinityMask,
  ProcessPriorityBoost,
  ProcessDeviceMap,
  ProcessSessionInformation,
  ProcessForegroundInformation,
  ProcessWow64Information,
  ProcessImageFileName,
  ProcessLUIDDeviceMapsEnabled,
  ProcessBreakOnTermination,
  ProcessDebugObjectHandle,
  ProcessDebugFlags,
  ProcessHandleTracing,
  MaxProcessInfoClass
} PROCESSINFOCLASS;

typedef enum _THREADINFOCLASS {
  ThreadBasicInformation,
  ThreadTimes,
  ThreadPriority,
  ThreadBasePriority,
  ThreadAffinityMask,
  ThreadImpersonationToken,
  ThreadDescriptorTableEntry,
  ThreadEnableAlignmentFaultFixup,
  ThreadEventPair_Reusable,
  ThreadQuerySetWin32StartAddress,
  ThreadZeroTlsCell,
  ThreadPerformanceCount,
  ThreadAmILastThread,
  ThreadIdealProcessor,
  ThreadPriorityBoost,
  ThreadSetTlsArrayAddress,
  ThreadIsIoPending,
  ThreadHideFromDebugger,
  ThreadBreakOnTermination,
  MaxThreadInfoClass
} THREADINFOCLASS;

#define ES_SYSTEM_REQUIRED                0x00000001
#define ES_DISPLAY_REQUIRED               0x00000002
#define ES_USER_PRESENT                   0x00000004
#define ES_CONTINUOUS                     0x80000000

typedef ULONG EXECUTION_STATE;

typedef VOID DDKAPI
(*PREQUEST_POWER_COMPLETE)(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ UCHAR  MinorFunction,
  /*IN*/ POWER_STATE  PowerState,
  /*IN*/ PVOID  Context,
  /*IN*/ PIO_STATUS_BLOCK  IoStatus);

typedef enum _TRACE_INFORMATION_CLASS {
  TraceIdClass,
  TraceHandleClass,
  TraceEnableFlagsClass,
  TraceEnableLevelClass,
  GlobalLoggerHandleClass,
  EventLoggerHandleClass,
  AllLoggerHandlesClass,
  TraceHandleByNameClass
} TRACE_INFORMATION_CLASS;

typedef NTSTATUS DDKAPI
(*PEX_CALLBACK_FUNCTION)(
  /*IN*/ PVOID  CallbackContext,
  /*IN*/ PVOID  Argument1,
  /*IN*/ PVOID  Argument2);



/*
** Storage structures
*/
typedef enum _PARTITION_STYLE {
  PARTITION_STYLE_MBR,
  PARTITION_STYLE_GPT
} PARTITION_STYLE;

typedef struct _CREATE_DISK_MBR {
  ULONG  Signature;
} CREATE_DISK_MBR, *PCREATE_DISK_MBR;

typedef struct _CREATE_DISK_GPT {
  GUID  DiskId;
  ULONG  MaxPartitionCount;
} CREATE_DISK_GPT, *PCREATE_DISK_GPT;

typedef struct _CREATE_DISK {
  PARTITION_STYLE  PartitionStyle;
  _ANONYMOUS_UNION union {
    CREATE_DISK_MBR  Mbr;
    CREATE_DISK_GPT  Gpt;
  } DUMMYUNIONNAME;
} CREATE_DISK, *PCREATE_DISK;

typedef struct _DISK_SIGNATURE {
  ULONG  PartitionStyle;
  _ANONYMOUS_UNION union {
    struct {
      ULONG  Signature;
      ULONG  CheckSum;
    } Mbr;
    struct {
      GUID  DiskId;
    } Gpt;
  } DUMMYUNIONNAME;
} DISK_SIGNATURE, *PDISK_SIGNATURE;

typedef VOID DDKFASTAPI
(*PTIME_UPDATE_NOTIFY_ROUTINE)(
  /*IN*/ HANDLE  ThreadId,
  /*IN*/ KPROCESSOR_MODE  Mode);

#define DBG_STATUS_CONTROL_C              1
#define DBG_STATUS_SYSRQ                  2
#define DBG_STATUS_BUGCHECK_FIRST         3
#define DBG_STATUS_BUGCHECK_SECOND        4
#define DBG_STATUS_FATAL                  5
#define DBG_STATUS_DEBUG_CONTROL          6
#define DBG_STATUS_WORKER                 7

typedef struct _PHYSICAL_MEMORY_RANGE {
  PHYSICAL_ADDRESS  BaseAddress;
  LARGE_INTEGER  NumberOfBytes;
} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;

typedef ULONG_PTR
(*PDRIVER_VERIFIER_THUNK_ROUTINE)(
  /*IN*/ PVOID  Context);

typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
  PDRIVER_VERIFIER_THUNK_ROUTINE  PristineRoutine;
  PDRIVER_VERIFIER_THUNK_ROUTINE  NewRoutine;
} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;

#define DRIVER_VERIFIER_SPECIAL_POOLING             0x0001
#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING         0x0002
#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES  0x0004
#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
#define DRIVER_VERIFIER_IO_CHECKING                 0x0010

#define RTL_RANGE_LIST_ADD_IF_CONFLICT    0x00000001
#define RTL_RANGE_LIST_ADD_SHARED         0x00000002

#define RTL_RANGE_LIST_SHARED_OK          0x00000001
#define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002

#define RTL_RANGE_LIST_SHARED_OK          0x00000001
#define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002

#define RTL_RANGE_LIST_MERGE_IF_CONFLICT  RTL_RANGE_LIST_ADD_IF_CONFLICT

typedef struct _RTL_RANGE {
  ULONGLONG  Start;
  ULONGLONG  End;
  PVOID  UserData;
  PVOID  Owner;
  UCHAR  Attributes;
  UCHAR  Flags;
} RTL_RANGE, *PRTL_RANGE;

#define RTL_RANGE_SHARED                  0x01
#define RTL_RANGE_CONFLICT                0x02

typedef struct _RTL_RANGE_LIST {
  LIST_ENTRY  ListHead;
  ULONG  Flags;
  ULONG  Count;
  ULONG  Stamp;
} RTL_RANGE_LIST, *PRTL_RANGE_LIST;

typedef struct _RANGE_LIST_ITERATOR {
  PLIST_ENTRY  RangeListHead;
  PLIST_ENTRY  MergedHead;
  PVOID  Current;
  ULONG  Stamp;
} RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;

typedef BOOLEAN
(*PRTL_CONFLICT_RANGE_CALLBACK)(
  /*IN*/ PVOID  Context,
  /*IN*/ PRTL_RANGE  Range);

#define HASH_STRING_ALGORITHM_DEFAULT     0
#define HASH_STRING_ALGORITHM_X65599      1
#define HASH_STRING_ALGORITHM_INVALID     0xffffffff

typedef enum _SUITE_TYPE {
  SmallBusiness,
  Enterprise,
  BackOffice,
  CommunicationServer,
  TerminalServer,
  SmallBusinessRestricted,
  EmbeddedNT,
  DataCenter,
  SingleUserTS,
  Personal,
  Blade,
  MaxSuiteType
} SUITE_TYPE;

typedef VOID DDKAPI
(*PTIMER_APC_ROUTINE)(
  /*IN*/ PVOID  TimerContext,
  /*IN*/ ULONG  TimerLowValue,
  /*IN*/ LONG  TimerHighValue);



/*
** WMI structures
*/

typedef VOID DDKAPI
(*WMI_NOTIFICATION_CALLBACK)(
  PVOID  Wnode,
  PVOID  Context);


/*
** Architecture specific structures
*/

#ifdef _X86_

typedef ULONG PFN_NUMBER, *PPFN_NUMBER;

#define PASSIVE_LEVEL                      0
#define LOW_LEVEL                          0
#define APC_LEVEL                          1
#define DISPATCH_LEVEL                     2
#define SYNCH_LEVEL                       27
#define PROFILE_LEVEL                     27
#define CLOCK1_LEVEL                      28
#define CLOCK2_LEVEL                      28
#define IPI_LEVEL                         29
#define POWER_LEVEL                       30
#define HIGH_LEVEL                        31

typedef struct _KPCR_TIB {
  PVOID  ExceptionList;         /* 00 */
  PVOID  StackBase;             /* 04 */
  PVOID  StackLimit;            /* 08 */
  PVOID  SubSystemTib;          /* 0C */
  _ANONYMOUS_UNION union {
    PVOID  FiberData;           /* 10 */
    DWORD  Version;             /* 10 */
  } DUMMYUNIONNAME;
  PVOID  ArbitraryUserPointer;  /* 14 */
  struct _NT_TIB *Self;         /* 18 */
} KPCR_TIB, *PKPCR_TIB;         /* 1C */

#define PCR_MINOR_VERSION 1
#define PCR_MAJOR_VERSION 1

typedef struct _KPCR {
  KPCR_TIB  Tib;                /* 00 */
  struct _KPCR  *Self;          /* 1C */
  struct _KPRCB  *PCRCB;        /* 20 */
  KIRQL  Irql;                  /* 24 */
  ULONG  IRR;                   /* 28 */
  ULONG  IrrActive;             /* 2C */
  ULONG  IDR;                   /* 30 */
  PVOID  KdVersionBlock;        /* 34 */
  PUSHORT  IDT;                 /* 38 */
  PUSHORT  GDT;                 /* 3C */
  struct _KTSS  *TSS;           /* 40 */
  USHORT  MajorVersion;         /* 44 */
  USHORT  MinorVersion;         /* 46 */
  KAFFINITY  SetMember;         /* 48 */
  ULONG  StallScaleFactor;      /* 4C */
  UCHAR  SpareUnused;           /* 50 */
  UCHAR  Number;                /* 51 */
} KPCR, *PKPCR;                 /* 54 */

typedef struct _KFLOATING_SAVE {
  ULONG  ControlWord;
  ULONG  StatusWord;
  ULONG  ErrorOffset;
  ULONG  ErrorSelector;
  ULONG  DataOffset;
  ULONG  DataSelector;
  ULONG  Cr0NpxState;
  ULONG  Spare1;
} KFLOATING_SAVE, *PKFLOATING_SAVE;

#define PAGE_SIZE                         0x1000
#define PAGE_SHIFT                        12L

extern NTOSAPI PVOID *MmHighestUserAddress;
extern NTOSAPI PVOID *MmSystemRangeStart;
extern NTOSAPI ULONG *MmUserProbeAddress;

#define MM_HIGHEST_USER_ADDRESS           *MmHighestUserAddress
#define MM_SYSTEM_RANGE_START             *MmSystemRangeStart
#define MM_USER_PROBE_ADDRESS             *MmUserProbeAddress
#define MM_LOWEST_USER_ADDRESS            (PVOID)0x10000
#define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC0C00000

#define KI_USER_SHARED_DATA               0xffdf0000
#define SharedUserData                    ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)

#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 enum _INTERLOCKED_RESULT {
  ResultNegative = RESULT_NEGATIVE,
  ResultZero = RESULT_ZERO,
  ResultPositive = RESULT_POSITIVE
} INTERLOCKED_RESULT;

NTOSAPI
KIRQL
DDKAPI
KeGetCurrentIrql(
  VOID);

/*
 * ULONG
 * KeGetCurrentProcessorNumber(
 *   VOID)
 */
#define KeGetCurrentProcessorNumber() \
  ((ULONG)KeGetCurrentKPCR()->ProcessorNumber)


#if  __USE_NTOSKRNL__
/* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions,
   but are also exported from kernel32.dll and declared in winbase.h as
   __stdcall */
#if !defined(__INTERLOCKED_DECLARED)
#define __INTERLOCKED_DECLARED

NTOSAPI
LONG
DDKFASTAPI
InterlockedIncrement(
  /*IN*/ PLONG  VOLATILE  Addend);

NTOSAPI
LONG
DDKFASTAPI
InterlockedDecrement(
  /*IN*/ PLONG  VOLATILE  Addend);

NTOSAPI
LONG
DDKFASTAPI
InterlockedCompareExchange(
  /*IN OUT*/ PLONG  VOLATILE  Destination,
  /*IN*/ LONG  Exchange,
  /*IN*/ LONG  Comparand);

NTOSAPI
LONG
DDKFASTAPI
InterlockedExchange(
  /*IN OUT*/ PLONG  VOLATILE  Target,
  /*IN*/ LONG Value);

NTOSAPI
LONG
DDKFASTAPI
InterlockedExchangeAdd(
  /*IN OUT*/ PLONG VOLATILE  Addend,
  /*IN*/ LONG  Value);

/*
 * PVOID
 * InterlockedExchangePointer(
 * IN OUT PVOID VOLATILE  *Target,
 * IN PVOID  Value)
 */
#define InterlockedExchangePointer(Target, Value) \
  ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))

/*
 * PVOID
 * InterlockedCompareExchangePointer(
 * IN OUT PVOID  *Destination,
 * IN PVOID  Exchange,
 * IN PVOID  Comparand)
 */
#define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
  ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))

#if  (_WIN32_WINNT >= 0x0501)
PSLIST_ENTRY
DDKFASTAPI
InterlockedPopEntrySList(
  /*IN*/ PSLIST_HEADER  ListHead);

NTOSAPI
PSLIST_ENTRY
DDKFASTAPI
InterlockedPushEntrySList(
  /*IN*/ PSLIST_HEADER  ListHead,
  /*IN*/ PSLIST_ENTRY  ListEntry);
#endif /* _WIN32_WINNT >= 0x0501 */

#endif /* !__INTERLOCKED_DECLARED */
#endif /*  __USE_NTOSKRNL__ */

NTOSAPI
VOID
DDKFASTAPI
KefAcquireSpinLockAtDpcLevel(
  /*IN*/ PKSPIN_LOCK  SpinLock);

NTOSAPI
VOID
DDKFASTAPI
KefReleaseSpinLockFromDpcLevel(
  /*IN*/ PKSPIN_LOCK  SpinLock);

#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)

#define RtlCopyMemoryNonTemporal RtlCopyMemory

#define KeGetDcacheFillSize() 1L

#endif /* _X86_ */



/*
** Utillity functions
*/

#define ARGUMENT_PRESENT(ArgumentPointer) \
  ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))

/*
 * 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) \
  ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))

/*
 * PCHAR
 * CONTAINING_RECORD(
 * IN PCHAR  Address,
 * IN TYPE  Type,
 * IN PCHAR  Field);
 */
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(Address, Type, Field) \
  ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
#endif

/* LONG
 * FIELD_OFFSET(
 * IN TYPE  Type,
 * IN PCHAR  Field);
 */
#ifndef FIELD_OFFSET
#define FIELD_OFFSET(Type, Field) \
  ((LONG) (&(((Type *) 0)->Field)))
#endif

/*
 * 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) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))

NTOSAPI
VOID
DDKAPI
RtlAssert(
  /*IN*/ PVOID  FailedAssertion,
  /*IN*/ PVOID  FileName,
  /*IN*/ ULONG  LineNumber,
  /*IN*/ PCHAR  Message);

#ifdef DBG

#define ASSERT(exp) \
  ((!(exp)) ? \
    (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)

#define ASSERTMSG(msg, exp) \
  ((!(exp)) ? \
    (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)

#define RTL_SOFT_ASSERT(exp) \
  ((!(_exp)) ? \
    (DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)

#define RTL_SOFT_ASSERTMSG(msg, exp) \
  ((!(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) ASSERT(msg, exp)

#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)

#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)

#endif /* DBG */


/*
** Driver support routines
*/

/** Runtime library routines **/

/*
 * VOID
 * InitializeListHead(
 * IN PLIST_ENTRY  ListHead)
 */
#define InitializeListHead(_ListHead) \
{ \
  (_ListHead)->Flink = (_ListHead); \
  (_ListHead)->Blink = (_ListHead); \
}

/*
 * VOID
 * InsertHeadList(
 * IN PLIST_ENTRY  ListHead,
 * IN PLIST_ENTRY  Entry)
 */
#define InsertHeadList(_ListHead, \
                       _Entry) \
{ \
  PLIST_ENTRY _OldFlink; \
  _OldFlink = (_ListHead)->Flink; \
  (_Entry)->Flink = _OldFlink; \
  (_Entry)->Blink = (_ListHead); \
  _OldFlink->Blink = (_Entry); \
  (_ListHead)->Flink = (_Entry); \
}

/*
 * VOID
 * InsertTailList(
 * IN PLIST_ENTRY  ListHead,
 * IN PLIST_ENTRY  Entry)
 */
#define InsertTailList(_ListHead, \
                       _Entry) \
{ \
	PLIST_ENTRY _OldBlink; \
	_OldBlink = (_ListHead)->Blink; \
	(_Entry)->Flink = (_ListHead); \
	(_Entry)->Blink = _OldBlink; \
	_OldBlink->Flink = (_Entry); \
	(_ListHead)->Blink = (_Entry); \
}

/*
 * BOOLEAN
 * IsListEmpty(
 * IN PLIST_ENTRY  ListHead)
 */
#define IsListEmpty(_ListHead) \
  ((_ListHead)->Flink == (_ListHead))

static __inline PSINGLE_LIST_ENTRY 
PopEntryList(
  /*IN*/ PSINGLE_LIST_ENTRY  ListHead)
{
	PSINGLE_LIST_ENTRY Entry;

	Entry = ListHead->Next;
	if (Entry != NULL)
	{
		ListHead->Next = Entry->Next;
	}
  return Entry;
}

/*
 * VOID
 * PushEntryList(
 * IN PSINGLE_LIST_ENTRY  ListHead,
 * IN PSINGLE_LIST_ENTRY  Entry)
 */
#define PushEntryList(_ListHead, \
                      _Entry) \
{ \
	(_Entry)->Next = (_ListHead)->Next; \
	(_ListHead)->Next = (_Entry); \
}

/*
 * VOID
 * RemoveEntryList(
 * IN PLIST_ENTRY  Entry)
 */
#define RemoveEntryList(_Entry) \
{ \
	PLIST_ENTRY _OldFlink; \
	PLIST_ENTRY _OldBlink; \
	_OldFlink = (_Entry)->Flink; \
	_OldBlink = (_Entry)->Blink; \
	_OldFlink->Blink = _OldBlink; \
	_OldBlink->Flink = _OldFlink; \
  (_Entry)->Flink = NULL; \
  (_Entry)->Blink = NULL; \
}

static __inline PLIST_ENTRY 
RemoveHeadList(
  /*IN*/ PLIST_ENTRY  ListHead)
{
	PLIST_ENTRY OldFlink;
	PLIST_ENTRY OldBlink;
	PLIST_ENTRY Entry;

	Entry = ListHead->Flink;
	OldFlink = ListHead->Flink->Flink;
	OldBlink = ListHead->Flink->Blink;
	OldFlink->Blink = OldBlink;
	OldBlink->Flink = OldFlink;

  if (Entry != ListHead)
  {
    Entry->Flink = NULL;
    Entry->Blink = NULL;
  }

	return Entry;
}

static __inline PLIST_ENTRY
RemoveTailList(
  /*IN*/ PLIST_ENTRY  ListHead)
{
	PLIST_ENTRY OldFlink;
	PLIST_ENTRY OldBlink;
	PLIST_ENTRY Entry;

	Entry = ListHead->Blink;
	OldFlink = ListHead->Blink->Flink;
	OldBlink = ListHead->Blink->Blink;
	OldFlink->Blink = OldBlink;
	OldBlink->Flink = OldFlink;

  if (Entry != ListHead)
  {
    Entry->Flink = NULL;
    Entry->Blink = NULL;
  }
   
  return Entry;
}

/*
 * USHORT
 * QueryDepthSList(
 * IN PSLIST_HEADER  SListHead)
 */
#define QueryDepthSList(_SListHead) \
  ((USHORT) ((_SListHead)->Alignment & 0xffff))

#define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)

NTOSAPI
ULONG
DDKAPI
RtlAnsiStringToUnicodeSize(
  /*IN*/ PANSI_STRING  AnsiString);

NTOSAPI
NTSTATUS
DDKAPI
RtlAddRange(
  /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
  /*IN*/ ULONGLONG  Start,
  /*IN*/ ULONGLONG  End,
  /*IN*/ UCHAR  Attributes,
  /*IN*/ ULONG  Flags,
  /*IN*/ PVOID  UserData  /*OPTIONAL*/,
  /*IN*/ PVOID  Owner  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
RtlAnsiStringToUnicodeString(
  /*IN OUT*/ PUNICODE_STRING  DestinationString,
  /*IN*/ PANSI_STRING  SourceString,
  /*IN*/ BOOLEAN  AllocateDestinationString);

NTOSAPI
NTSTATUS
DDKAPI
RtlAppendUnicodeStringToString(
  /*IN OUT*/ PUNICODE_STRING  Destination,
  /*IN*/ PUNICODE_STRING  Source);

NTOSAPI
NTSTATUS
DDKAPI
RtlAppendUnicodeToString(
  /*IN OUT*/ PUNICODE_STRING  Destination,
  /*IN*/ PCWSTR  Source);

NTOSAPI
BOOLEAN
DDKAPI
RtlAreBitsClear(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  StartingIndex,
  /*IN*/ ULONG  Length); 

NTOSAPI
BOOLEAN
DDKAPI
RtlAreBitsSet(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  StartingIndex,
  /*IN*/ ULONG  Length); 

NTOSAPI
NTSTATUS
DDKAPI
RtlCharToInteger(
  /*IN*/ PCSZ  String,
  /*IN*/ ULONG  Base  /*OPTIONAL*/,
  /*IN OUT*/ PULONG  Value);

NTOSAPI
ULONG
DDKAPI
RtlCheckBit(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  BitPosition); 

NTOSAPI
NTSTATUS
DDKAPI
RtlCheckRegistryKey(
  /*IN*/ ULONG  RelativeTo,
  /*IN*/ PWSTR  Path);

NTOSAPI
VOID
DDKAPI
RtlClearAllBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader); 

NTOSAPI
VOID
DDKAPI
RtlClearBit(
  PRTL_BITMAP  BitMapHeader,
  ULONG  BitNumber);

NTOSAPI
VOID
DDKAPI
RtlClearBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  StartingIndex,
  /*IN*/ ULONG  NumberToClear); 

NTOSAPI
SIZE_T
DDKAPI
RtlCompareMemory(
  /*IN*/ CONST VOID  *Source1,
  /*IN*/ CONST VOID  *Source2,
  /*IN*/ SIZE_T  Length);

NTOSAPI
LONG
DDKAPI
RtlCompareString(
  /*IN*/ PSTRING  String1,
  /*IN*/ PSTRING  String2,
  BOOLEAN  CaseInSensitive);

NTOSAPI
LONG
DDKAPI
RtlCompareUnicodeString(
  /*IN*/ PUNICODE_STRING  String1,
  /*IN*/ PUNICODE_STRING  String2,
  /*IN*/ BOOLEAN  CaseInSensitive);

NTOSAPI
LARGE_INTEGER
DDKAPI
RtlConvertLongToLargeInteger(
  /*IN*/ LONG  SignedInteger);

NTOSAPI
LUID
DDKAPI
RtlConvertLongToLuid(
  /*IN*/ LONG  Long);

NTOSAPI
LARGE_INTEGER
DDKAPI
RtlConvertUlongToLargeInteger(
  /*IN*/ ULONG  UnsignedInteger);

NTOSAPI
LUID
DDKAPI
RtlConvertUlongToLuid(
  ULONG  Ulong);

/*
 * VOID
 * RtlCopyMemory(
 * IN VOID UNALIGNED  *Destination,
 * IN CONST VOID UNALIGNED  *Source,
 * IN SIZE_T  Length)
 */
#ifndef RtlCopyMemory
#define RtlCopyMemory(Destination, Source, Length) \
  memcpy(Destination, Source, Length);
#endif

#ifndef RtlCopyBytes
#define RtlCopyBytes RtlCopyMemory
#endif

NTOSAPI
VOID
DDKAPI
RtlCopyMemory32(
  /*IN*/ VOID UNALIGNED  *Destination,
  /*IN*/ CONST VOID UNALIGNED  *Source,
  /*IN*/ ULONG  Length);

NTOSAPI
NTSTATUS
DDKAPI
RtlCopyRangeList(
  /*OUT*/ PRTL_RANGE_LIST  CopyRangeList,
  /*IN*/ PRTL_RANGE_LIST  RangeList);

NTOSAPI
VOID
DDKAPI
RtlCopyString(
  /*IN OUT*/ PSTRING  DestinationString,
  /*IN*/ PSTRING  SourceString  /*OPTIONAL*/);

NTOSAPI
VOID
DDKAPI
RtlCopyUnicodeString(
  /*IN OUT*/ PUNICODE_STRING  DestinationString,
  /*IN*/ PUNICODE_STRING  SourceString);

NTOSAPI
NTSTATUS
DDKAPI
RtlCreateRegistryKey(
  /*IN*/ ULONG  RelativeTo,
  /*IN*/ PWSTR  Path);

NTOSAPI
NTSTATUS
DDKAPI
RtlCreateSecurityDescriptor(
  /*IN OUT*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
  /*IN*/ ULONG  Revision);

NTOSAPI
NTSTATUS
DDKAPI
RtlDeleteOwnersRanges(
  /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
  /*IN*/ PVOID  Owner);

NTOSAPI
NTSTATUS
DDKAPI
RtlDeleteRange(
  /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
  /*IN*/ ULONGLONG  Start,
  /*IN*/ ULONGLONG  End,
  /*IN*/ PVOID  Owner);

NTOSAPI
NTSTATUS
DDKAPI
RtlDeleteRegistryValue(
  /*IN*/ ULONG  RelativeTo,
  /*IN*/ PCWSTR  Path,
  /*IN*/ PCWSTR  ValueName);

NTOSAPI
BOOL
DDKAPI
RtlDosPathNameToNtPathName_U(
  /*IN*/ PCWSTR  DosPathName,
  /*OUT*/ PUNICODE_STRING  NtPathName,
  /*OUT*/ PCWSTR  *NtFileNamePart,
  /*OUT*/ VOID  *DirectoryInfo);

/*
 * BOOLEAN
 * RtlEqualLuid( 
 * IN LUID  Luid1,
 * IN LUID  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))

NTOSAPI
BOOLEAN
DDKAPI
RtlEqualString(
  /*IN*/ PSTRING  String1,
  /*IN*/ PSTRING  String2,
  /*IN*/ BOOLEAN  CaseInSensitive);

NTOSAPI
BOOLEAN
DDKAPI
RtlEqualUnicodeString(
  /*IN*/ CONST UNICODE_STRING  *String1,
  /*IN*/ CONST UNICODE_STRING  *String2,
  /*IN*/ BOOLEAN  CaseInSensitive);

/*
 * VOID
 * RtlFillMemory(
 * IN VOID UNALIGNED  *Destination,
 * IN SIZE_T  Length,
 * IN UCHAR  Fill)
 */
#ifndef RtlFillMemory
#define RtlFillMemory(Destination, Length, Fill) \
  memset(Destination, Fill, Length)
#endif

#ifndef RtlFillBytes
#define RtlFillBytes RtlFillMemory
#endif

NTOSAPI
ULONG
DDKAPI
RtlFindClearBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  NumberToFind,
  /*IN*/ ULONG  HintIndex); 

NTOSAPI
ULONG
DDKAPI
RtlFindClearBitsAndSet(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  NumberToFind,
  /*IN*/ ULONG  HintIndex); 

NTOSAPI
ULONG
DDKAPI
RtlFindClearRuns( 
  /*IN*/ PRTL_BITMAP  BitMapHeader, 
  /*OUT*/ PRTL_BITMAP_RUN  RunArray, 
  /*IN*/ ULONG  SizeOfRunArray, 
  /*IN*/ BOOLEAN  LocateLongestRuns);

NTOSAPI
ULONG
DDKAPI
RtlFindFirstRunClear(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*OUT*/ PULONG  StartingIndex);

NTOSAPI
ULONG
DDKAPI
RtlFindLastBackwardRunClear(
  /*IN*/ PRTL_BITMAP  BitMapHeader, 
  /*IN*/ ULONG  FromIndex, 
  /*OUT*/ PULONG  StartingRunIndex); 

NTOSAPI
CCHAR
DDKAPI
RtlFindLeastSignificantBit(
  /*IN*/ ULONGLONG  Set);

NTOSAPI
ULONG
DDKAPI
RtlFindLongestRunClear(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*OUT*/ PULONG  StartingIndex); 

NTOSAPI
CCHAR
DDKAPI
RtlFindMostSignificantBit(
  /*IN*/ ULONGLONG  Set);

NTOSAPI
ULONG
DDKAPI
RtlFindNextForwardRunClear(
  /*IN*/ PRTL_BITMAP  BitMapHeader, 
  /*IN*/ ULONG  FromIndex, 
  /*OUT*/ PULONG  StartingRunIndex);

NTOSAPI
NTSTATUS
DDKAPI
RtlFindRange(
  /*IN*/ PRTL_RANGE_LIST  RangeList,
  /*IN*/ ULONGLONG  Minimum,
  /*IN*/ ULONGLONG  Maximum,
  /*IN*/ ULONG  Length,
  /*IN*/ ULONG  Alignment,
  /*IN*/ ULONG  Flags,
  /*IN*/ UCHAR  AttributeAvailableMask,
  /*IN*/ PVOID  Context  /*OPTIONAL*/,
  /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK  Callback  /*OPTIONAL*/,
  /*OUT*/ PULONGLONG  Start);

NTOSAPI
ULONG
DDKAPI
RtlFindSetBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  NumberToFind,
  /*IN*/ ULONG  HintIndex); 

NTOSAPI
ULONG
DDKAPI
RtlFindSetBitsAndClear(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  NumberToFind,
  /*IN*/ ULONG  HintIndex); 

NTOSAPI
VOID
DDKAPI
RtlFreeAnsiString(
  /*IN*/ PANSI_STRING  AnsiString);

NTOSAPI
VOID
DDKAPI
RtlFreeRangeList(
  /*IN*/ PRTL_RANGE_LIST  RangeList);

NTOSAPI
VOID
DDKAPI
RtlFreeUnicodeString(
  /*IN*/ PUNICODE_STRING  UnicodeString);

NTOSAPI
VOID
DDKAPI
RtlGetCallersAddress(
  /*OUT*/ PVOID  *CallersAddress,
  /*OUT*/ PVOID  *CallersCaller);

NTOSAPI
NTSTATUS
DDKAPI
RtlGetVersion(
  /*IN OUT*/ PRTL_OSVERSIONINFOW  lpVersionInformation);

NTOSAPI
NTSTATUS
DDKAPI
RtlGetFirstRange(
  /*IN*/ PRTL_RANGE_LIST  RangeList,
  /*OUT*/ PRTL_RANGE_LIST_ITERATOR  Iterator,
  /*OUT*/ PRTL_RANGE  *Range);

NTOSAPI
NTSTATUS
DDKAPI
RtlGetNextRange(
  /*IN OUT*/  PRTL_RANGE_LIST_ITERATOR  Iterator,
  /*OUT*/ PRTL_RANGE  *Range,
  /*IN*/ BOOLEAN  MoveForwards);

#define FOR_ALL_RANGES(RangeList, Iterator, Current)          \
  for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
    (Current) != NULL;                                        \
    RtlGetNextRange((Iterator), &(Current), TRUE))

#define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
  for (RtlGetLastRange((RangeList), (Iterator), &(Current));   \
    (Current) != NULL;                                         \
    RtlGetNextRange((Iterator), &(Current), FALSE))

NTOSAPI
NTSTATUS
DDKAPI
RtlGUIDFromString( 
  /*IN*/ PUNICODE_STRING  GuidString, 
  /*OUT*/ GUID  *Guid);

NTOSAPI
NTSTATUS
DDKAPI
RtlHashUnicodeString(
  /*IN*/ CONST UNICODE_STRING  *String,
  /*IN*/ BOOLEAN  CaseInSensitive,
  /*IN*/ ULONG  HashAlgorithm,
  /*OUT*/ PULONG  HashValue);

NTOSAPI
VOID
DDKAPI
RtlInitAnsiString(
  /*IN OUT*/ PANSI_STRING  DestinationString,
  /*IN*/ PCSZ  SourceString);

NTOSAPI
VOID
DDKAPI
RtlInitializeBitMap(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ PULONG  BitMapBuffer,
  /*IN*/ ULONG  SizeOfBitMap); 

NTOSAPI
VOID
DDKAPI
RtlInitializeRangeList(
  /*IN OUT*/ PRTL_RANGE_LIST  RangeList);

NTOSAPI
VOID
DDKAPI
RtlInitString(
  /*IN OUT*/ PSTRING  DestinationString,
  /*IN*/ PCSZ  SourceString);

NTOSAPI
VOID
DDKAPI
RtlInitUnicodeString(
  /*IN OUT*/ PUNICODE_STRING  DestinationString,
  /*IN*/ PCWSTR  SourceString);

NTOSAPI
NTSTATUS
DDKAPI
RtlInt64ToUnicodeString(
  /*IN*/ ULONGLONG  Value,
  /*IN*/ ULONG  Base /*OPTIONAL*/,
  /*IN OUT*/ PUNICODE_STRING  String);

NTOSAPI
NTSTATUS
DDKAPI
RtlIntegerToUnicodeString(
  /*IN*/ ULONG  Value,
  /*IN*/ ULONG  Base  /*OPTIONAL*/,
  /*IN OUT*/ PUNICODE_STRING  String);

NTOSAPI
NTSTATUS
DDKAPI
RtlIntPtrToUnicodeString(
  PLONG  Value,
  ULONG  Base  /*OPTIONAL*/,
  PUNICODE_STRING  String);

NTOSAPI
NTSTATUS
DDKAPI
RtlInvertRangeList(
  /*OUT*/ PRTL_RANGE_LIST  InvertedRangeList,
  /*IN*/ PRTL_RANGE_LIST  RangeList);

NTOSAPI
NTSTATUS
DDKAPI
RtlIsRangeAvailable(
  /*IN*/ PRTL_RANGE_LIST  RangeList,
  /*IN*/ ULONGLONG  Start,
  /*IN*/ ULONGLONG  End,
  /*IN*/ ULONG  Flags,
  /*IN*/ UCHAR  AttributeAvailableMask,
  /*IN*/ PVOID  Context  /*OPTIONAL*/,
  /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK  Callback  /*OPTIONAL*/,
  /*OUT*/ PBOOLEAN  Available);

/*
 * BOOLEAN
 * RtlIsZeroLuid(
 * IN PLUID  L1)
 */
#define RtlIsZeroLuid(_L1) \
  ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))

NTOSAPI
ULONG
DDKAPI
RtlLengthSecurityDescriptor(
  /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);

NTOSAPI
VOID
DDKAPI
RtlMapGenericMask(
  /*IN OUT*/ PACCESS_MASK  AccessMask,
  /*IN*/ PGENERIC_MAPPING  GenericMapping);

NTOSAPI
NTSTATUS
DDKAPI
RtlMergeRangeLists(
  /*OUT*/ PRTL_RANGE_LIST  MergedRangeList,
  /*IN*/ PRTL_RANGE_LIST  RangeList1,
  /*IN*/ PRTL_RANGE_LIST  RangeList2,
  /*IN*/ ULONG  Flags);

/*
 * VOID
 * RtlMoveMemory(
 * IN VOID UNALIGNED  *Destination,
 * IN CONST VOID UNALIGNED  *Source,
 * IN SIZE_T  Length)
 */
#define RtlMoveMemory memmove

NTOSAPI
ULONG
DDKAPI
RtlNumberOfClearBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader);

NTOSAPI
ULONG
DDKAPI
RtlNumberOfSetBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader); 

NTOSAPI
VOID
DDKFASTAPI
RtlPrefetchMemoryNonTemporal(
  /*IN*/ PVOID  Source,
  /*IN*/ SIZE_T  Length);

NTOSAPI
BOOLEAN
DDKAPI
RtlPrefixUnicodeString( 
  /*IN*/ PUNICODE_STRING  String1, 
  /*IN*/ PUNICODE_STRING  String2, 
  /*IN*/ BOOLEAN  CaseInSensitive);

NTOSAPI
NTSTATUS
DDKAPI
RtlQueryRegistryValues(
  /*IN*/ ULONG  RelativeTo,
  /*IN*/ PCWSTR  Path,
  /*IN*/ PRTL_QUERY_REGISTRY_TABLE  QueryTable,
  /*IN*/ PVOID  Context,
  /*IN*/ PVOID  Environment  /*OPTIONAL*/);

NTOSAPI
VOID
DDKAPI
RtlRetrieveUlong(
  /*IN OUT*/ PULONG  DestinationAddress,
  /*IN*/ PULONG  SourceAddress);

NTOSAPI
VOID
DDKAPI
RtlRetrieveUshort(
  /*IN OUT*/ PUSHORT  DestinationAddress,
  /*IN*/ PUSHORT  SourceAddress);

NTOSAPI
VOID
DDKAPI
RtlSetAllBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader); 

NTOSAPI
VOID
DDKAPI
RtlSetBit(
  PRTL_BITMAP  BitMapHeader,
  ULONG  BitNumber);

NTOSAPI
VOID
DDKAPI
RtlSetBits(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  StartingIndex,
  /*IN*/ ULONG  NumberToSet); 

NTOSAPI
NTSTATUS
DDKAPI
RtlSetDaclSecurityDescriptor(
  /*IN OUT*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
  /*IN*/ BOOLEAN  DaclPresent,
  /*IN*/ PACL  Dacl  /*OPTIONAL*/,
  /*IN*/ BOOLEAN  DaclDefaulted  /*OPTIONAL*/);

NTOSAPI
VOID
DDKAPI
RtlStoreUlong(
  /*IN*/ PULONG  Address,
  /*IN*/ ULONG  Value);

NTOSAPI
VOID
DDKAPI
RtlStoreUlonglong(
  /*IN OUT*/ PULONGLONG  Address,
  ULONGLONG  Value);

NTOSAPI
VOID
DDKAPI
RtlStoreUlongPtr(
  /*IN OUT*/ PULONG_PTR  Address,
  /*IN*/ ULONG_PTR  Value);

NTOSAPI
VOID
DDKAPI
RtlStoreUshort(
  /*IN*/ PUSHORT  Address,
  /*IN*/ USHORT  Value);

NTOSAPI
NTSTATUS
DDKAPI
RtlStringFromGUID( 
  /*IN*/ REFGUID  Guid, 
  /*OUT*/ PUNICODE_STRING  GuidString);

NTOSAPI
BOOLEAN
DDKAPI
RtlTestBit(
  /*IN*/ PRTL_BITMAP  BitMapHeader,
  /*IN*/ ULONG  BitNumber);

NTOSAPI
BOOLEAN
DDKAPI
RtlTimeFieldsToTime(
  /*IN*/ PTIME_FIELDS  TimeFields,
  /*IN*/ PLARGE_INTEGER  Time);

NTOSAPI
VOID
DDKAPI
RtlTimeToTimeFields(
  /*IN*/ PLARGE_INTEGER  Time,
  /*IN*/ PTIME_FIELDS  TimeFields);

NTOSAPI
ULONG
DDKFASTAPI
RtlUlongByteSwap(
  /*IN*/ ULONG  Source);

NTOSAPI
ULONGLONG
DDKFASTAPI
RtlUlonglongByteSwap(
  /*IN*/ ULONGLONG  Source);

NTOSAPI
ULONG
DDKAPI
RtlUnicodeStringToAnsiSize(
  /*IN*/ PUNICODE_STRING  UnicodeString);

NTOSAPI
NTSTATUS
DDKAPI
RtlUnicodeStringToAnsiString(
  /*IN OUT*/ PANSI_STRING  DestinationString,
  /*IN*/ PUNICODE_STRING  SourceString,
  /*IN*/ BOOLEAN  AllocateDestinationString);

NTOSAPI
NTSTATUS
DDKAPI
RtlUnicodeStringToInteger(
  /*IN*/ PUNICODE_STRING  String,
  /*IN*/ ULONG  Base  /*OPTIONAL*/,
  /*OUT*/ PULONG  Value);

NTOSAPI
WCHAR
DDKAPI
RtlUpcaseUnicodeChar( 
  /*IN*/ WCHAR  SourceCharacter);

NTOSAPI
NTSTATUS
DDKAPI
RtlUpcaseUnicodeString(
  /*IN OUT*/ PUNICODE_STRING  DestinationString  /*OPTIONAL*/,
  /*IN*/ PCUNICODE_STRING  SourceString,
  /*IN*/ BOOLEAN  AllocateDestinationString);

NTOSAPI
CHAR
DDKAPI
RtlUpperChar( 
  /*IN*/ CHAR Character);

NTOSAPI
VOID
DDKAPI
RtlUpperString(
  /*IN OUT*/ PSTRING  DestinationString,
  /*IN*/ PSTRING  SourceString);

NTOSAPI
USHORT
DDKFASTAPI
RtlUshortByteSwap(
  /*IN*/ USHORT  Source);

NTOSAPI
BOOLEAN
DDKAPI
RtlValidRelativeSecurityDescriptor(
  /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptorInput,
  /*IN*/ ULONG  SecurityDescriptorLength,
  /*IN*/ SECURITY_INFORMATION  RequiredInformation);

NTOSAPI
BOOLEAN
DDKAPI
RtlValidSecurityDescriptor(
  /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);

NTOSAPI
NTSTATUS
DDKAPI
RtlVerifyVersionInfo(
  /*IN*/ PRTL_OSVERSIONINFOEXW  VersionInfo,
  /*IN*/ ULONG  TypeMask,
  /*IN*/ ULONGLONG  ConditionMask);

NTOSAPI
NTSTATUS
DDKAPI
RtlVolumeDeviceToDosName(
  /*IN*/ PVOID  VolumeDeviceObject,
  /*OUT*/ PUNICODE_STRING  DosName);

NTOSAPI
ULONG
DDKAPI
RtlWalkFrameChain(
  /*OUT*/ PVOID  *Callers,
  /*IN*/ ULONG  Count,
  /*IN*/ ULONG  Flags);

NTOSAPI
NTSTATUS
DDKAPI
RtlWriteRegistryValue(
  /*IN*/ ULONG  RelativeTo,
  /*IN*/ PCWSTR  Path,
  /*IN*/ PCWSTR  ValueName,
  /*IN*/ ULONG  ValueType,
  /*IN*/ PVOID  ValueData,
  /*IN*/ ULONG  ValueLength);

NTOSAPI
ULONG
DDKAPI
RtlxUnicodeStringToAnsiSize(
  /*IN*/ PUNICODE_STRING  UnicodeString);

/*
 * VOID
 * RtlZeroMemory(
 * IN VOID UNALIGNED  *Destination,
 * IN SIZE_T  Length)
 */
#ifndef RtlZeroMemory
#define RtlZeroMemory(Destination, Length) \
  memset(Destination, 0, Length)
#endif

#ifndef RtlZeroBytes
#define RtlZeroBytes RtlZeroMemory
#endif


/** Executive support routines **/

NTOSAPI
VOID
DDKFASTAPI
ExAcquireFastMutex(
  /*IN*/ PFAST_MUTEX  FastMutex);

NTOSAPI
VOID
DDKFASTAPI
ExAcquireFastMutexUnsafe(
  /*IN*/ PFAST_MUTEX  FastMutex);

NTOSAPI
BOOLEAN
DDKAPI
ExAcquireResourceExclusiveLite(
  /*IN*/ PERESOURCE  Resource,
  /*IN*/ BOOLEAN  Wait);

NTOSAPI
BOOLEAN
DDKAPI
ExAcquireResourceSharedLite(
  /*IN*/ PERESOURCE  Resource,
  /*IN*/ BOOLEAN  Wait);

NTOSAPI
BOOLEAN
DDKAPI
ExAcquireSharedStarveExclusive(
  /*IN*/ PERESOURCE  Resource,
  /*IN*/ BOOLEAN  Wait);

NTOSAPI
BOOLEAN
DDKAPI
ExAcquireSharedWaitForExclusive(
  /*IN*/ PERESOURCE  Resource,
  /*IN*/ BOOLEAN  Wait);


NTOSAPI
PSINGLE_LIST_ENTRY
DDKFASTAPI
ExInterlockedPopEntrySList(
  /*IN*/ PSLIST_HEADER  ListHead,
  /*IN*/ PKSPIN_LOCK  Lock);


NTOSAPI
PSINGLE_LIST_ENTRY
DDKFASTAPI
ExInterlockedPushEntrySList(
  /*IN*/ PSLIST_HEADER  ListHead,
  /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
  /*IN*/ PKSPIN_LOCK  Lock);


#if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
#define ExInterlockedPopEntrySList(_ListHead, \
                                   _Lock) \
  InterlockedPopEntrySList(_ListHead)

#define ExInterlockedPushEntrySList(_ListHead, \
                                    _ListEntry, \
                                    _Lock) \
  InterlockedPushEntrySList(_ListHead, _ListEntry)
#endif /*  __USE_NTOSKRNL__ */

#define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)

static __inline PVOID
ExAllocateFromNPagedLookasideList(
  /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside)
{
  PVOID Entry;

  Lookaside->TotalAllocates++;
  Entry = ExInterlockedPopEntrySList(&Lookaside->ListHead,
				     &Lookaside->Obsoleted);
  if (Entry == NULL) {
    Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
    Entry = (Lookaside->Allocate)(Lookaside->Type,
				  Lookaside->Size,
				  Lookaside->Tag);
  }
  return Entry;
}

static __inline VOID
ExFreeToNPagedLookasideList(
  /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside,
  /*IN*/ PVOID  Entry)
{
  Lookaside->TotalFrees++;
  if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
    Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
    (Lookaside->Free)(Entry);
  } else {
    ExInterlockedPushEntrySList(&Lookaside->ListHead,
				(PSLIST_ENTRY)Entry,
				&Lookaside->Obsoleted);
  }
}

#if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)

static __inline PVOID
ExAllocateFromPagedLookasideList(
  /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside)
{
  PVOID Entry;

  Lookaside->TotalAllocates++;
  Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
  if (Entry == NULL) {
    Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
    Entry = (Lookaside->Allocate)(Lookaside->Type,
				  Lookaside->Size,
				  Lookaside->Tag);
  }
  return Entry;
}

static __inline VOID
ExFreeToPagedLookasideList(
  /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
  /*IN*/ PVOID  Entry)
{
  Lookaside->TotalFrees++;
  if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
    Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
    (Lookaside->Free)(Entry);
  } else {
    InterlockedPushEntrySList(&Lookaside->ListHead,
			      (PSLIST_ENTRY)Entry);
  }
}

#else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */

NTOSAPI
PVOID
DDKAPI
ExAllocateFromPagedLookasideList(
  /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside);

NTOSAPI
VOID
DDKAPI
ExFreeToPagedLookasideList(
  /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
  /*IN*/ PVOID  Entry);

#endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */

NTOSAPI
PVOID
DDKAPI
ExAllocatePoolWithQuotaTag(
  /*IN*/ POOL_TYPE  PoolType,
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ ULONG  Tag);

NTOSAPI
PVOID
DDKAPI
ExAllocatePoolWithTag(
  /*IN*/ POOL_TYPE  PoolType,
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ ULONG  Tag);

#ifdef POOL_TAGGING

#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')

#else /* !POOL_TAGGING */

NTOSAPI
PVOID
DDKAPI
ExAllocatePool(
  /*IN*/ POOL_TYPE  PoolType,
  /*IN*/ SIZE_T  NumberOfBytes);

NTOSAPI
PVOID
DDKAPI
ExAllocatePoolWithQuota(
  /*IN*/ POOL_TYPE  PoolType,
  /*IN*/ SIZE_T  NumberOfBytes);

#endif /* POOL_TAGGING */

NTOSAPI
PVOID
DDKAPI
ExAllocatePoolWithTagPriority(
  /*IN*/ POOL_TYPE  PoolType,
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ ULONG  Tag,
  /*IN*/ EX_POOL_PRIORITY  Priority);

NTOSAPI
VOID
DDKAPI
ExConvertExclusiveToSharedLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
NTSTATUS
DDKAPI
ExCreateCallback(
  /*OUT*/ PCALLBACK_OBJECT  *CallbackObject,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*IN*/ BOOLEAN  Create,
  /*IN*/ BOOLEAN  AllowMultipleCallbacks);

NTOSAPI
VOID
DDKAPI
ExDeleteNPagedLookasideList(
  /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside);

NTOSAPI
VOID
DDKAPI
ExDeletePagedLookasideList(
  /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside);

NTOSAPI
NTSTATUS
DDKAPI
ExDeleteResourceLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
VOID
DDKAPI
ExFreePool(
  /*IN*/ PVOID  P);

#define PROTECTED_POOL                    0x80000000

#ifdef POOL_TAGGING
#define ExFreePool(P) ExFreePoolWithTag(P, 0)
#endif

NTOSAPI
VOID
DDKAPI
ExFreePoolWithTag(
  /*IN*/ PVOID  P,
  /*IN*/ ULONG  Tag);

/*
 * ERESOURCE_THREAD
 * ExGetCurrentResourceThread(
 *   VOID);
 */
#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())

NTOSAPI
ULONG
DDKAPI
ExGetExclusiveWaiterCount(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
KPROCESSOR_MODE
DDKAPI
ExGetPreviousMode( 
  VOID);

NTOSAPI
ULONG
DDKAPI
ExGetSharedWaiterCount(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
VOID
DDKAPI
KeInitializeEvent(
  /*IN*/ PRKEVENT  Event,
  /*IN*/ EVENT_TYPE  Type,
  /*IN*/ BOOLEAN  State);

/*
 * VOID DDKAPI
 * ExInitializeFastMutex(
 * IN PFAST_MUTEX  FastMutex)
 */
#define ExInitializeFastMutex(_FastMutex) \
{ \
  (_FastMutex)->Count = 1; \
  (_FastMutex)->Owner = NULL; \
  (_FastMutex)->Contention = 0; \
  KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
}

NTOSAPI
VOID
DDKAPI
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);

NTOSAPI
VOID
DDKAPI
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);

NTOSAPI
NTSTATUS
DDKAPI
ExInitializeResourceLite(
  /*IN*/ PERESOURCE  Resource);

/*
 * VOID
 * InitializeSListHead(
 * IN PSLIST_HEADER  SListHead)
 */
#define InitializeSListHead(_SListHead) \
	(_SListHead)->Alignment = 0

#define ExInitializeSListHead InitializeSListHead

NTOSAPI
LARGE_INTEGER
DDKAPI
ExInterlockedAddLargeInteger(
  /*IN*/ PLARGE_INTEGER  Addend,
  /*IN*/ LARGE_INTEGER  Increment,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
VOID
DDKFASTAPI
ExInterlockedAddLargeStatistic(
  /*IN*/ PLARGE_INTEGER  Addend,
  /*IN*/ ULONG  Increment);

NTOSAPI
ULONG
DDKAPI
ExInterlockedAddUlong(
  /*IN*/ PULONG  Addend,
  /*IN*/ ULONG  Increment,
  PKSPIN_LOCK  Lock);

NTOSAPI
ULONG
DDKFASTAPI
ExfInterlockedAddUlong(
  /*IN*/ PULONG  Addend,
  /*IN*/ ULONG  Increment,
  PKSPIN_LOCK  Lock);


NTOSAPI
LONGLONG
DDKFASTAPI
ExInterlockedCompareExchange64(
  /*IN OUT*/ PLONGLONG  Destination,
  /*IN*/ PLONGLONG  Exchange,
  /*IN*/ PLONGLONG  Comparand,
  /*IN*/ PKSPIN_LOCK  Lock); 

NTOSAPI
PSINGLE_LIST_ENTRY
DDKFASTAPI
ExInterlockedFlushSList(
  /*IN*/ PSLIST_HEADER  ListHead);

NTOSAPI
PLIST_ENTRY
DDKAPI
ExInterlockedInsertHeadList(
  /*IN*/ PLIST_ENTRY  ListHead,
  /*IN*/ PLIST_ENTRY  ListEntry,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
PLIST_ENTRY
DDKFASTAPI
ExfInterlockedInsertHeadList(
  /*IN*/ PLIST_ENTRY  ListHead,
  /*IN*/ PLIST_ENTRY  ListEntry,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
PLIST_ENTRY
DDKAPI
ExInterlockedInsertTailList(
  /*IN*/ PLIST_ENTRY  ListHead,
  /*IN*/ PLIST_ENTRY  ListEntry,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
PLIST_ENTRY
DDKFASTAPI
ExfInterlockedInsertTailList(
  /*IN*/ PLIST_ENTRY  ListHead,
  /*IN*/ PLIST_ENTRY  ListEntry,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
PSINGLE_LIST_ENTRY
DDKAPI
ExInterlockedPopEntryList(
  /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
PSINGLE_LIST_ENTRY
DDKFASTAPI
ExfInterlockedPopEntryList(
  /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
  /*IN*/ PKSPIN_LOCK  Lock);


NTOSAPI
PSINGLE_LIST_ENTRY
DDKAPI
ExInterlockedPushEntryList(
  /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
  /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
PSINGLE_LIST_ENTRY
DDKFASTAPI
ExfInterlockedPushEntryList(
  /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
  /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
  /*IN*/ PKSPIN_LOCK  Lock);


NTOSAPI
PLIST_ENTRY
DDKAPI
ExInterlockedRemoveHeadList(
  /*IN*/ PLIST_ENTRY  ListHead,
  /*IN*/ PKSPIN_LOCK  Lock);

NTOSAPI
PLIST_ENTRY
DDKFASTAPI
ExfInterlockedRemoveHeadList(
  /*IN*/ PLIST_ENTRY  ListHead,
  /*IN*/ PKSPIN_LOCK  Lock);


NTOSAPI
BOOLEAN
DDKAPI
ExIsProcessorFeaturePresent(
  /*IN*/ ULONG  ProcessorFeature);

NTOSAPI
BOOLEAN
DDKAPI
ExIsResourceAcquiredExclusiveLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
USHORT
DDKAPI
ExIsResourceAcquiredLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
USHORT
DDKAPI
ExIsResourceAcquiredSharedLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
VOID
DDKAPI
ExLocalTimeToSystemTime(
  /*IN*/ PLARGE_INTEGER  LocalTime,
  /*OUT*/ PLARGE_INTEGER  SystemTime);

NTOSAPI
VOID
DDKAPI
ExNotifyCallback(
  /*IN*/ PCALLBACK_OBJECT  CallbackObject,
  /*IN*/ PVOID  Argument1,
  /*IN*/ PVOID  Argument2);

NTOSAPI
VOID
DDKAPI
ExRaiseAccessViolation(
  VOID);

NTOSAPI
VOID
DDKAPI
ExRaiseDatatypeMisalignment(
  VOID);

NTOSAPI
VOID
DDKAPI
ExRaiseStatus(
  /*IN*/ NTSTATUS  Status);

NTOSAPI
PVOID
DDKAPI
ExRegisterCallback(
  /*IN*/ PCALLBACK_OBJECT  CallbackObject,
  /*IN*/ PCALLBACK_FUNCTION  CallbackFunction,
  /*IN*/ PVOID  CallbackContext);

NTOSAPI
VOID
DDKAPI
ExReinitializeResourceLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
VOID
DDKFASTAPI
ExReleaseFastMutex(
  /*IN*/ PFAST_MUTEX  FastMutex);

NTOSAPI
VOID
DDKFASTAPI
ExReleaseFastMutexUnsafe(
  /*IN*/ PFAST_MUTEX  FastMutex);

NTOSAPI
VOID
DDKAPI
ExReleaseResourceForThreadLite(
  /*IN*/ PERESOURCE  Resource,
  /*IN*/ ERESOURCE_THREAD  ResourceThreadId);

NTOSAPI
VOID
DDKFASTAPI
ExReleaseResourceLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
VOID
DDKAPI
ExSetResourceOwnerPointer( 
  /*IN*/ PERESOURCE  Resource,
  /*IN*/ PVOID  OwnerPointer);

NTOSAPI
ULONG
DDKAPI
ExSetTimerResolution(
  /*IN*/ ULONG  DesiredTime,
  /*IN*/ BOOLEAN  SetResolution);

NTOSAPI
VOID
DDKAPI
ExSystemTimeToLocalTime(
  /*IN*/ PLARGE_INTEGER  SystemTime,
  /*OUT*/ PLARGE_INTEGER  LocalTime);

NTOSAPI
BOOLEAN
DDKFASTAPI
ExTryToAcquireFastMutex(
  /*IN*/ PFAST_MUTEX  FastMutex);

NTOSAPI
BOOLEAN
DDKAPI
ExTryToAcquireResourceExclusiveLite(
  /*IN*/ PERESOURCE  Resource);

NTOSAPI
VOID
DDKAPI
ExUnregisterCallback(
  /*IN*/ PVOID  CbRegistration);

NTOSAPI
NTSTATUS
DDKAPI
ExUuidCreate(
  /*OUT*/ UUID  *Uuid);

NTOSAPI
BOOLEAN
DDKAPI
ExVerifySuite(
  /*IN*/ SUITE_TYPE  SuiteType);

#ifdef DBG

#define PAGED_CODE() { \
  if (KeGetCurrentIrql() > APC_LEVEL) { \
    KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
    ASSERT(FALSE); \
  } \
}

#else

#define PAGED_CODE()

#endif

NTOSAPI
VOID
DDKAPI
ProbeForRead(
  /*IN*/ CONST VOID  *Address,
  /*IN*/ ULONG  Length,
  /*IN*/ ULONG  Alignment);

NTOSAPI
VOID
DDKAPI
ProbeForWrite(
  /*IN*/ CONST VOID  *Address,
  /*IN*/ ULONG  Length,
  /*IN*/ ULONG  Alignment);



/** Configuration manager routines **/

NTOSAPI
NTSTATUS
DDKAPI
CmRegisterCallback(
  /*IN*/ PEX_CALLBACK_FUNCTION  Function,
  /*IN*/ PVOID  Context,
  /*IN OUT*/ PLARGE_INTEGER  Cookie);

NTOSAPI
NTSTATUS
DDKAPI
CmUnRegisterCallback(
  /*IN*/ LARGE_INTEGER  Cookie);



/** Filesystem runtime library routines **/

NTOSAPI
BOOLEAN
DDKAPI
FsRtlIsTotalDeviceFailure(
  /*IN*/ NTSTATUS  Status);



/** Hardware abstraction layer routines **/

NTOSAPI
VOID
DDKFASTAPI
HalExamineMBR(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ ULONG  SectorSize,
  /*IN*/ ULONG  MBRTypeIdentifier,
  /*OUT*/ PVOID  Buffer);

NTOSAPI
VOID
DDKAPI
READ_PORT_BUFFER_UCHAR(
  /*IN*/ PUCHAR  Port,
  /*IN*/ PUCHAR  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
READ_PORT_BUFFER_ULONG(
  /*IN*/ PULONG  Port,
  /*IN*/ PULONG  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
READ_PORT_BUFFER_USHORT(
  /*IN*/ PUSHORT  Port,
  /*IN*/ PUSHORT  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
UCHAR
DDKAPI
READ_PORT_UCHAR(
  /*IN*/ PUCHAR  Port);

NTOSAPI
ULONG
DDKAPI
READ_PORT_ULONG(
  /*IN*/ PULONG  Port);

NTOSAPI
USHORT
DDKAPI
READ_PORT_USHORT(
  /*IN*/ PUSHORT  Port);

NTOSAPI
VOID
DDKAPI
READ_REGISTER_BUFFER_UCHAR(
  /*IN*/ PUCHAR  Register,
  /*IN*/ PUCHAR  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
READ_REGISTER_BUFFER_ULONG(
  /*IN*/ PULONG  Register,
  /*IN*/ PULONG  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
READ_REGISTER_BUFFER_USHORT(
  /*IN*/ PUSHORT  Register,
  /*IN*/ PUSHORT  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
UCHAR
DDKAPI
READ_REGISTER_UCHAR(
  /*IN*/ PUCHAR  Register);

NTOSAPI
ULONG
DDKAPI
READ_REGISTER_ULONG(
  /*IN*/ PULONG  Register);

NTOSAPI
USHORT
DDKAPI
READ_REGISTER_USHORT(
  /*IN*/ PUSHORT  Register);

NTOSAPI
VOID
DDKAPI
WRITE_PORT_BUFFER_UCHAR(
  /*IN*/ PUCHAR  Port,
  /*IN*/ PUCHAR  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
WRITE_PORT_BUFFER_ULONG(
  /*IN*/ PULONG  Port,
  /*IN*/ PULONG  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
WRITE_PORT_BUFFER_USHORT(
  /*IN*/ PUSHORT  Port,
  /*IN*/ PUSHORT  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
WRITE_PORT_UCHAR(
  /*IN*/ PUCHAR  Port,
  /*IN*/ UCHAR  Value);

NTOSAPI
VOID
DDKAPI
WRITE_PORT_ULONG(
  /*IN*/ PULONG  Port,
  /*IN*/ ULONG  Value);

NTOSAPI
VOID
DDKAPI
WRITE_PORT_USHORT(
  /*IN*/ PUSHORT  Port,
  /*IN*/ USHORT  Value);

NTOSAPI
VOID
DDKAPI
WRITE_REGISTER_BUFFER_UCHAR(
  /*IN*/ PUCHAR  Register,
  /*IN*/ PUCHAR  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
WRITE_REGISTER_BUFFER_ULONG(
  /*IN*/ PULONG  Register,
  /*IN*/ PULONG  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
WRITE_REGISTER_BUFFER_USHORT(
  /*IN*/ PUSHORT  Register,
  /*IN*/ PUSHORT  Buffer,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
WRITE_REGISTER_UCHAR(
  /*IN*/ PUCHAR  Register,
  /*IN*/ UCHAR  Value);

NTOSAPI
VOID
DDKAPI
WRITE_REGISTER_ULONG(
  /*IN*/ PULONG  Register,
  /*IN*/ ULONG  Value);

NTOSAPI
VOID
DDKAPI
WRITE_REGISTER_USHORT(
  /*IN*/ PUSHORT  Register,
  /*IN*/ USHORT  Value);

/** I/O manager routines **/

NTOSAPI
VOID
DDKAPI
IoAcquireCancelSpinLock(
  /*OUT*/ PKIRQL  Irql);

NTOSAPI
NTSTATUS
DDKAPI
IoAcquireRemoveLockEx(
  /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
  /*IN*/ PVOID  Tag  /*OPTIONAL*/,
  /*IN*/ PCSTR  File,
  /*IN*/ ULONG  Line,
  /*IN*/ ULONG  RemlockSize);

/*
 * NTSTATUS
 * IoAcquireRemoveLock(
 * IN PIO_REMOVE_LOCK  RemoveLock,
 * IN PVOID  Tag OPTIONAL)
 */
#define IoAcquireRemoveLock(_RemoveLock, \
                            _Tag) \
  IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))

/*
 * VOID
 * IoAdjustPagingPathCount(
 * IN PLONG  Count,
 * IN BOOLEAN  Increment)
 */
#define IoAdjustPagingPathCount(_Count, \
                                _Increment) \
{ \
  if (_Increment) \
    { \
      InterlockedIncrement(_Count); \
    } \
  else \
    { \
      InterlockedDecrement(_Count); \
    } \
}

NTOSAPI
VOID
DDKAPI
IoAllocateController(
  /*IN*/ PCONTROLLER_OBJECT  ControllerObject,
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PDRIVER_CONTROL  ExecutionRoutine,
  /*IN*/ PVOID  Context);

NTOSAPI
NTSTATUS
DDKAPI
IoAllocateDriverObjectExtension(
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ PVOID  ClientIdentificationAddress,
  /*IN*/ ULONG  DriverObjectExtensionSize,
  /*OUT*/ PVOID  *DriverObjectExtension);

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; 

NTOSAPI
PVOID
DDKAPI
IoAllocateErrorLogEntry(
  /*IN*/ PVOID  IoObject,
  /*IN*/ UCHAR  EntrySize);

NTOSAPI
PIRP
DDKAPI
IoAllocateIrp(
  /*IN*/ CCHAR  StackSize,
  /*IN*/ BOOLEAN  ChargeQuota);

NTOSAPI
PMDL
DDKAPI
IoAllocateMdl(
  /*IN*/ PVOID  VirtualAddress,
  /*IN*/ ULONG  Length,
  /*IN*/ BOOLEAN  SecondaryBuffer,
  /*IN*/ BOOLEAN  ChargeQuota,
  /*IN OUT*/ PIRP  Irp  /*OPTIONAL*/);

NTOSAPI
PIO_WORKITEM
DDKAPI
IoAllocateWorkItem(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

/*
 * VOID IoAssignArcName(
 * IN PUNICODE_STRING  ArcName,
 * IN PUNICODE_STRING  DeviceName);
 */
#define IoAssignArcName(_ArcName, _DeviceName) ( \
  IoCreateSymbolicLink((_ArcName), (_DeviceName)))

NTOSAPI
NTSTATUS
DDKAPI
IoAttachDevice(
  /*IN*/ PDEVICE_OBJECT  SourceDevice,
  /*IN*/ PUNICODE_STRING  TargetDevice,
  /*OUT*/ PDEVICE_OBJECT  *AttachedDevice);

NTOSAPI
PDEVICE_OBJECT
DDKAPI
IoAttachDeviceToDeviceStack(
  /*IN*/ PDEVICE_OBJECT  SourceDevice,
  /*IN*/ PDEVICE_OBJECT  TargetDevice);

NTOSAPI
PIRP
DDKAPI
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*/);

NTOSAPI
PIRP
DDKAPI
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);

NTOSAPI
VOID
DDKAPI
IoBuildPartialMdl(
  /*IN*/ PMDL  SourceMdl,
  /*IN OUT*/ PMDL  TargetMdl,
  /*IN*/ PVOID  VirtualAddress,
  /*IN*/ ULONG  Length);

NTOSAPI
PIRP
DDKAPI
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);

NTOSAPI
NTSTATUS
DDKFASTAPI
IofCallDriver(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN OUT*/ PIRP  Irp);

/*
 * NTSTATUS
 * IoCallDriver(
 * IN PDEVICE_OBJECT  DeviceObject,
 * IN OUT PIRP  Irp)
 */
#define IoCallDriver IofCallDriver

NTOSAPI
VOID
DDKAPI
IoCancelFileOpen(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PFILE_OBJECT  FileObject);

NTOSAPI
BOOLEAN
DDKAPI
IoCancelIrp(
  /*IN*/ PIRP  Irp);

NTOSAPI
NTSTATUS
DDKAPI
IoCheckShareAccess(
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ ULONG  DesiredShareAccess,
  /*IN OUT*/ PFILE_OBJECT  FileObject,
  /*IN OUT*/ PSHARE_ACCESS  ShareAccess,
  /*IN*/ BOOLEAN  Update);

NTOSAPI
VOID
DDKFASTAPI
IofCompleteRequest(
  /*IN*/ PIRP  Irp,
  /*IN*/ CCHAR  PriorityBoost);

/*
 * VOID
 * IoCompleteRequest(
 * IN PIRP  Irp,
 * IN CCHAR  PriorityBoost)
 */
#define IoCompleteRequest IofCompleteRequest

NTOSAPI
NTSTATUS
DDKAPI
IoConnectInterrupt(
  /*OUT*/ PKINTERRUPT  *InterruptObject,
  /*IN*/ PKSERVICE_ROUTINE  ServiceRoutine,
  /*IN*/ PVOID  ServiceContext,
  /*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);

/*
 * PIO_STACK_LOCATION
 * IoGetCurrentIrpStackLocation(
 * IN PIRP  Irp)
 */
#define IoGetCurrentIrpStackLocation(_Irp) \
  ((_Irp)->Tail.Overlay.CurrentStackLocation)

/*
 * PIO_STACK_LOCATION
 * IoGetNextIrpStackLocation(
 * IN PIRP  Irp)
 */
#define IoGetNextIrpStackLocation(_Irp) \
  ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)

/*
 * VOID
 * IoCopyCurrentIrpStackLocationToNext(
 * IN PIRP  Irp)
 */
#define IoCopyCurrentIrpStackLocationToNext(_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; \
}

NTOSAPI
PCONTROLLER_OBJECT
DDKAPI
IoCreateController(
  /*IN*/ ULONG  Size);

NTOSAPI
NTSTATUS
DDKAPI
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);

NTOSAPI
NTSTATUS
DDKAPI
IoCreateDisk(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PCREATE_DISK  Disk);

NTOSAPI
NTSTATUS
DDKAPI
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 ExtraCreateParameters /*OPTIONAL*/,
  /*IN*/ ULONG Options);

NTOSAPI
PKEVENT
DDKAPI
IoCreateNotificationEvent(
  /*IN*/ PUNICODE_STRING  EventName,
  /*OUT*/ PHANDLE  EventHandle);

NTOSAPI
NTSTATUS
DDKAPI
IoCreateSymbolicLink(
  /*IN*/ PUNICODE_STRING  SymbolicLinkName,
  /*IN*/ PUNICODE_STRING  DeviceName);

NTOSAPI
PKEVENT
DDKAPI
IoCreateSynchronizationEvent(
  /*IN*/ PUNICODE_STRING  EventName,
  /*OUT*/ PHANDLE  EventHandle);

NTOSAPI
NTSTATUS
DDKAPI
IoCreateUnprotectedSymbolicLink(
  /*IN*/ PUNICODE_STRING  SymbolicLinkName,
  /*IN*/ PUNICODE_STRING  DeviceName);

NTOSAPI
VOID
DDKAPI
IoCsqInitialize(
  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);

NTOSAPI
VOID
DDKAPI
IoCsqInsertIrp(
  /*IN*/ PIO_CSQ  Csq,
  /*IN*/ PIRP  Irp,
  /*IN*/ PIO_CSQ_IRP_CONTEXT  Context);

NTOSAPI
PIRP
DDKAPI
IoCsqRemoveIrp(
  /*IN*/ PIO_CSQ  Csq,
  /*IN*/ PIO_CSQ_IRP_CONTEXT  Context);

NTOSAPI
PIRP
DDKAPI
IoCsqRemoveNextIrp(
  /*IN*/ PIO_CSQ  Csq,
  /*IN*/ PVOID  PeekContext);

NTOSAPI
VOID
DDKAPI
IoDeleteController(
  /*IN*/ PCONTROLLER_OBJECT  ControllerObject);

NTOSAPI
VOID
DDKAPI
IoDeleteDevice(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
NTSTATUS
DDKAPI
IoDeleteSymbolicLink(
  /*IN*/ PUNICODE_STRING  SymbolicLinkName);

/*
 * VOID
 * IoDeassignArcName(
 * IN PUNICODE_STRING  ArcName)
 */
#define IoDeassignArcName IoDeleteSymbolicLink

NTOSAPI
VOID
DDKAPI
IoDetachDevice(
  /*IN OUT*/ PDEVICE_OBJECT  TargetDevice);

NTOSAPI
VOID
DDKAPI
IoDisconnectInterrupt(
  /*IN*/ PKINTERRUPT  InterruptObject);

NTOSAPI
BOOLEAN
DDKAPI
IoForwardIrpSynchronously(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PIRP  Irp);

#define IoForwardAndCatchIrp IoForwardIrpSynchronously

NTOSAPI
VOID
DDKAPI
IoFreeController(
  /*IN*/ PCONTROLLER_OBJECT  ControllerObject);

NTOSAPI
VOID
DDKAPI
IoFreeErrorLogEntry(
  PVOID  ElEntry);

NTOSAPI
VOID
DDKAPI
IoFreeIrp(
  /*IN*/ PIRP  Irp);

NTOSAPI
VOID
DDKAPI
IoFreeMdl(
  /*IN*/ PMDL  Mdl);

NTOSAPI
VOID
DDKAPI
IoFreeWorkItem(
  /*IN*/ PIO_WORKITEM  pIOWorkItem);

NTOSAPI
PDEVICE_OBJECT
DDKAPI
IoGetAttachedDevice(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
PDEVICE_OBJECT
DDKAPI
IoGetAttachedDeviceReference(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
NTSTATUS
DDKAPI
IoGetBootDiskInformation(
  /*IN OUT*/ PBOOTDISK_INFORMATION  BootDiskInformation,
  /*IN*/ ULONG  Size);

NTOSAPI
PCONFIGURATION_INFORMATION
DDKAPI
IoGetConfigurationInformation( 
  VOID);

NTOSAPI
PEPROCESS
DDKAPI
IoGetCurrentProcess(
  VOID);

NTOSAPI
NTSTATUS
DDKAPI
IoGetDeviceInterfaceAlias(
  /*IN*/ PUNICODE_STRING  SymbolicLinkName,
  /*IN*/ CONST GUID  *AliasInterfaceClassGuid,
  /*OUT*/ PUNICODE_STRING  AliasSymbolicLinkName);

NTOSAPI
NTSTATUS
DDKAPI
IoGetDeviceInterfaces(
  /*IN*/ CONST GUID  *InterfaceClassGuid,
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject  /*OPTIONAL*/,
  /*IN*/ ULONG  Flags,
  /*OUT*/ PWSTR  *SymbolicLinkList);

NTOSAPI
NTSTATUS
DDKAPI
IoGetDeviceObjectPointer(
  /*IN*/ PUNICODE_STRING  ObjectName,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*OUT*/ PFILE_OBJECT  *FileObject,
  /*OUT*/ PDEVICE_OBJECT  *DeviceObject);

NTOSAPI
NTSTATUS
DDKAPI
IoGetDeviceProperty(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ DEVICE_REGISTRY_PROPERTY  DeviceProperty,
  /*IN*/ ULONG  BufferLength,
  /*OUT*/ PVOID  PropertyBuffer,
  /*OUT*/ PULONG  ResultLength);

NTOSAPI
PDEVICE_OBJECT
DDKAPI
IoGetDeviceToVerify(
  /*IN*/ PETHREAD  Thread);

NTOSAPI
PDMA_ADAPTER
DDKAPI
IoGetDmaAdapter(
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
  /*IN*/ PDEVICE_DESCRIPTION  DeviceDescription,
  /*IN OUT*/ PULONG  NumberOfMapRegisters);

NTOSAPI
PVOID
DDKAPI
IoGetDriverObjectExtension(
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ PVOID  ClientIdentificationAddress);

NTOSAPI
PGENERIC_MAPPING
DDKAPI
IoGetFileObjectGenericMapping(
  VOID);

/*
 * ULONG
 * IoGetFunctionCodeFromCtlCode(
 * IN ULONG  ControlCode)
 */
#define IoGetFunctionCodeFromCtlCode(_ControlCode) \
  (((_ControlCode) >> 2) & 0x00000FFF)

NTOSAPI
PVOID
DDKAPI
IoGetInitialStack(
  VOID);

NTOSAPI
PDEVICE_OBJECT
DDKAPI
IoGetRelatedDeviceObject(
  /*IN*/ PFILE_OBJECT  FileObject);

NTOSAPI
ULONG
DDKAPI
IoGetRemainingStackSize(
  VOID);

NTOSAPI
VOID
DDKAPI
IoGetStackLimits(
  /*OUT*/ PULONG_PTR  LowLimit,
  /*OUT*/ PULONG_PTR  HighLimit);

NTOSAPI
VOID
DDKAPI
KeInitializeDpc(
  /*IN*/ PRKDPC  Dpc,
  /*IN*/ PKDEFERRED_ROUTINE  DeferredRoutine,
  /*IN*/ PVOID  DeferredContext);

/*
 * VOID
 * IoInitializeDpcRequest(
 * IN PDEVICE_OBJECT DeviceObject,
 * IN PIO_DPC_ROUTINE DpcRoutine)
 */
#define IoInitializeDpcRequest(_DeviceObject, \
                               _DpcRoutine) \
  KeInitializeDpc(&(_DeviceObject)->Dpc, \
    (PKDEFERRED_ROUTINE) (_DpcRoutine), \
    _DeviceObject)

NTOSAPI
VOID
DDKAPI
IoInitializeIrp(
  /*IN OUT*/ PIRP  Irp,
  /*IN*/ USHORT  PacketSize,
  /*IN*/ CCHAR  StackSize);

NTOSAPI
VOID
DDKAPI
IoInitializeRemoveLockEx(
  /*IN*/ PIO_REMOVE_LOCK Lock,
  /*IN*/ ULONG   AllocateTag,
  /*IN*/ ULONG   MaxLockedMinutes,
  /*IN*/ ULONG   HighWatermark,
  /*IN*/ ULONG   RemlockSize);

/* 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))

NTOSAPI
NTSTATUS
DDKAPI
IoInitializeTimer(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PIO_TIMER_ROUTINE  TimerRoutine,
  /*IN*/ PVOID  Context);

NTOSAPI
VOID
DDKAPI
IoInvalidateDeviceRelations(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ DEVICE_RELATION_TYPE  Type);

NTOSAPI
VOID
DDKAPI
IoInvalidateDeviceState(
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject);

NTOSAPI
BOOLEAN
DDKAPI
IoIs32bitProcess(
  /*IN*/ PIRP  Irp  /*OPTIONAL*/);

/*
 * 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)))

NTOSAPI
BOOLEAN
DDKAPI
IoIsWdmVersionAvailable(
  /*IN*/ UCHAR  MajorVersion,
  /*IN*/ UCHAR  MinorVersion);

NTOSAPI
PIRP
DDKAPI
IoMakeAssociatedIrp(
  /*IN*/ PIRP  Irp,
  /*IN*/ CCHAR  StackSize);

/*
 * VOID
 * IoMarkIrpPending(
 * IN OUT PIRP  Irp)
 */
#define IoMarkIrpPending(_Irp) \
  (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)

NTOSAPI
NTSTATUS
DDKAPI
IoOpenDeviceInterfaceRegistryKey(
  /*IN*/ PUNICODE_STRING  SymbolicLinkName,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*OUT*/ PHANDLE  DeviceInterfaceKey);

NTOSAPI
NTSTATUS
DDKAPI
IoOpenDeviceRegistryKey(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ ULONG  DevInstKeyType,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*OUT*/ PHANDLE  DevInstRegKey);

NTOSAPI
NTSTATUS
DDKAPI
IoQueryDeviceDescription(
  /*IN*/ PINTERFACE_TYPE  BusType  /*OPTIONAL*/,
  /*IN*/ PULONG  BusNumber  /*OPTIONAL*/,
  /*IN*/ PCONFIGURATION_TYPE  ControllerType  /*OPTIONAL*/,
  /*IN*/ PULONG  ControllerNumber  /*OPTIONAL*/,
  /*IN*/ PCONFIGURATION_TYPE  PeripheralType  /*OPTIONAL*/,
  /*IN*/ PULONG  PeripheralNumber  /*OPTIONAL*/,
  /*IN*/ PIO_QUERY_DEVICE_ROUTINE  CalloutRoutine,
  /*IN*/ PVOID  Context);

NTOSAPI
VOID
DDKAPI
IoQueueWorkItem(
  /*IN*/ PIO_WORKITEM  pIOWorkItem,
  /*IN*/ PIO_WORKITEM_ROUTINE  Routine,
  /*IN*/ WORK_QUEUE_TYPE  QueueType,
  /*IN*/ PVOID  Context);

NTOSAPI
VOID
DDKAPI
IoRaiseHardError(
  /*IN*/ PIRP  Irp,
  /*IN*/ PVPB  Vpb  /*OPTIONAL*/,
  /*IN*/ PDEVICE_OBJECT  RealDeviceObject);

NTOSAPI
BOOLEAN
DDKAPI
IoRaiseInformationalHardError(
  /*IN*/ NTSTATUS  ErrorStatus,
  /*IN*/ PUNICODE_STRING  String  /*OPTIONAL*/,
  /*IN*/ PKTHREAD  Thread  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
IoReadDiskSignature(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ ULONG  BytesPerSector,
  /*OUT*/ PDISK_SIGNATURE  Signature);

NTOSAPI
NTSTATUS
DDKAPI
IoReadPartitionTableEx(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX  **PartitionBuffer);

NTOSAPI
VOID
DDKAPI
IoRegisterBootDriverReinitialization(
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
  /*IN*/ PVOID  Context);

NTOSAPI
VOID
DDKAPI
IoRegisterBootDriverReinitialization(
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
  /*IN*/ PVOID  Context);

NTOSAPI
NTSTATUS
DDKAPI
IoRegisterDeviceInterface(
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
  /*IN*/ CONST GUID  *InterfaceClassGuid,
  /*IN*/ PUNICODE_STRING  ReferenceString  /*OPTIONAL*/,
  /*OUT*/ PUNICODE_STRING  SymbolicLinkName);

NTOSAPI
VOID
DDKAPI
IoRegisterDriverReinitialization(
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
  /*IN*/ PVOID  Context);

NTOSAPI
NTSTATUS
DDKAPI
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*/ PVOID  Context,
  /*OUT*/ PVOID  *NotificationEntry);

NTOSAPI
NTSTATUS
DDKAPI
IoRegisterShutdownNotification(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
VOID
DDKAPI
IoReleaseCancelSpinLock(
  /*IN*/ KIRQL  Irql);

NTOSAPI
VOID
DDKAPI
IoReleaseRemoveLockAndWaitEx(
  /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
  /*IN*/ PVOID  Tag,
  /*IN*/ ULONG  RemlockSize);

/*
 * VOID
 * IoReleaseRemoveLockAndWait(
 * IN PIO_REMOVE_LOCK  RemoveLock,
 * IN PVOID  Tag)
 */
#define IoReleaseRemoveLockAndWait(_RemoveLock, \
                                   _Tag) \
  IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))

NTOSAPI
VOID
DDKAPI
IoReleaseRemoveLockEx(
  /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
  /*IN*/ PVOID  Tag,
  /*IN*/ ULONG  RemlockSize);

/*
 * VOID
 * IoReleaseRemoveLock(
 * IN PIO_REMOVE_LOCK  RemoveLock,
 * IN PVOID  Tag)
 */
#define IoReleaseRemoveLock(_RemoveLock, \
                                   _Tag) \
  IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))

NTOSAPI
VOID
DDKAPI
IoRemoveShareAccess(
  /*IN*/ PFILE_OBJECT  FileObject,
  /*IN OUT*/ PSHARE_ACCESS  ShareAccess);

NTOSAPI
NTSTATUS
DDKAPI
IoReportDetectedDevice(
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ INTERFACE_TYPE  LegacyBusType,
  /*IN*/ ULONG  BusNumber,
  /*IN*/ ULONG  SlotNumber,
  /*IN*/ PCM_RESOURCE_LIST  ResourceList,
  /*IN*/ PIO_RESOURCE_REQUIREMENTS_LIST  ResourceRequirements  /*OPTIONAL*/,
  /*IN*/ BOOLEAN  ResourceAssigned,
  /*IN OUT*/ PDEVICE_OBJECT  *DeviceObject);

NTOSAPI
NTSTATUS
DDKAPI
IoReportResourceForDetection(
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ PCM_RESOURCE_LIST  DriverList  /*OPTIONAL*/,
  /*IN*/ ULONG  DriverListSize  /*OPTIONAL*/,
  /*IN*/ PDEVICE_OBJECT  DeviceObject  /*OPTIONAL*/,
  /*IN*/ PCM_RESOURCE_LIST  DeviceList  /*OPTIONAL*/,
  /*IN*/ ULONG  DeviceListSize  /*OPTIONAL*/,
  /*OUT*/ PBOOLEAN  ConflictDetected);

NTOSAPI
NTSTATUS
DDKAPI
IoReportResourceUsage(
  /*IN*/ PUNICODE_STRING  DriverClassName  /*OPTIONAL*/,
  /*IN*/ PDRIVER_OBJECT  DriverObject,
  /*IN*/ PCM_RESOURCE_LIST  DriverList  /*OPTIONAL*/,
  /*IN*/ ULONG  DriverListSize  /*OPTIONAL*/,
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PCM_RESOURCE_LIST  DeviceList  /*OPTIONAL*/,
  /*IN*/ ULONG  DeviceListSize  /*OPTIONAL*/,
  /*IN*/ BOOLEAN  OverrideConflict,
  /*OUT*/ PBOOLEAN  ConflictDetected);

NTOSAPI
NTSTATUS
DDKAPI
IoReportTargetDeviceChange(
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
  /*IN*/ PVOID  NotificationStructure);

NTOSAPI
NTSTATUS
DDKAPI
IoReportTargetDeviceChangeAsynchronous(
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
  /*IN*/ PVOID  NotificationStructure,
  /*IN*/ PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  /*OPTIONAL*/,
  /*IN*/ PVOID  Context  /*OPTIONAL*/);

NTOSAPI
VOID
DDKAPI
IoRequestDeviceEject(
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject);

/*
 * VOID
 * IoRequestDpc(
 * IN PDEVICE_OBJECT  DeviceObject,
 * IN PIRP  Irp,
 * IN PVOID  Context);
 */
#define IoRequestDpc(DeviceObject, Irp, Context)( \
  KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))

NTOSAPI
VOID
DDKAPI
IoReuseIrp(
  /*IN OUT*/ PIRP  Irp,
  /*IN*/ NTSTATUS  Status);

/*
 * PDRIVER_CANCEL
 * IoSetCancelRoutine(
 * IN PIRP  Irp,
 * IN PDRIVER_CANCEL  CancelRoutine)
 */
#define IoSetCancelRoutine(_Irp, \
                           _CancelRoutine) \
  ((PDRIVER_CANCEL) InterlockedExchangePointer( \
    (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))

/*
 * VOID
 * IoSetCompletionRoutine(
 * IN PIRP  Irp,
 * IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
 * IN PVOID  Context,
 * IN BOOLEAN  InvokeOnSuccess,
 * IN BOOLEAN  InvokeOnError,
 * IN BOOLEAN  InvokeOnCancel)
 */
#define IoSetCompletionRoutine(_Irp, \
                               _CompletionRoutine, \
                               _Context, \
                               _InvokeOnSuccess, \
                               _InvokeOnError, \
                               _InvokeOnCancel) \
{ \
  PIO_STACK_LOCATION _IrpSp; \
  ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
    _CompletionRoutine != NULL : TRUE); \
  _IrpSp = IoGetNextIrpStackLocation(_Irp); \
  _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_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; \
}

NTOSAPI
VOID
DDKAPI
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);

NTOSAPI
NTSTATUS
DDKAPI
IoSetDeviceInterfaceState(
  /*IN*/ PUNICODE_STRING  SymbolicLinkName,
  /*IN*/ BOOLEAN  Enable);

NTOSAPI
VOID
DDKAPI
IoSetHardErrorOrVerifyDevice(
  /*IN*/ PIRP  Irp,
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

/*
 * VOID
 * IoSetNextIrpStackLocation(
 * IN OUT PIRP  Irp)
 */
#define IoSetNextIrpStackLocation(_Irp) \
{ \
  (_Irp)->CurrentLocation--; \
  (_Irp)->Tail.Overlay.CurrentStackLocation--; \
}

NTOSAPI
NTSTATUS
DDKAPI
IoSetPartitionInformationEx(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ ULONG  PartitionNumber,
  /*IN*/ struct _SET_PARTITION_INFORMATION_EX  *PartitionInfo);

NTOSAPI
VOID
DDKAPI
IoSetShareAccess(
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ ULONG  DesiredShareAccess,
  /*IN OUT*/ PFILE_OBJECT  FileObject,
  /*OUT*/ PSHARE_ACCESS  ShareAccess);

NTOSAPI
VOID
DDKAPI
IoSetStartIoAttributes(
  /*IN*/ PDEVICE_OBJECT  DeviceObject, 
  /*IN*/ BOOLEAN  DeferredStartIo, 
  /*IN*/ BOOLEAN  NonCancelable); 

NTOSAPI
NTSTATUS
DDKAPI
IoSetSystemPartition(
  /*IN*/ PUNICODE_STRING  VolumeNameString);

NTOSAPI
BOOLEAN
DDKAPI
IoSetThreadHardErrorMode(
  /*IN*/ BOOLEAN  EnableHardErrors);

/*
 * USHORT
 * IoSizeOfIrp(
 * IN CCHAR  StackSize)
 */
#define IoSizeOfIrp(_StackSize) \
  ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))

/*
 * VOID
 * IoSkipCurrentIrpStackLocation(
 * IN PIRP  Irp)
 */
#define IoSkipCurrentIrpStackLocation(_Irp) \
{ \
  (_Irp)->CurrentLocation++; \
  (_Irp)->Tail.Overlay.CurrentStackLocation++; \
}

NTOSAPI
VOID
DDKAPI
IoStartNextPacket(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ BOOLEAN  Cancelable);

NTOSAPI
VOID
DDKAPI
IoStartNextPacketByKey(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ BOOLEAN  Cancelable,
  /*IN*/ ULONG  Key);

NTOSAPI
VOID
DDKAPI
IoStartPacket(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PIRP  Irp,
  /*IN*/ PULONG  Key  /*OPTIONAL*/,
  /*IN*/ PDRIVER_CANCEL  CancelFunction  /*OPTIONAL*/);

NTOSAPI
VOID
DDKAPI
IoStartTimer(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
VOID
DDKAPI
IoStopTimer(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
NTSTATUS
DDKAPI
IoUnregisterPlugPlayNotification(
  /*IN*/ PVOID  NotificationEntry);

NTOSAPI
VOID
DDKAPI
IoUnregisterShutdownNotification(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
VOID
DDKAPI
IoUpdateShareAccess(
  /*IN*/ PFILE_OBJECT  FileObject,
  /*IN OUT*/ PSHARE_ACCESS  ShareAccess);

NTOSAPI
NTSTATUS
DDKAPI
IoVerifyPartitionTable(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ BOOLEAN  FixErrors);

NTOSAPI
NTSTATUS
DDKAPI
IoVolumeDeviceToDosName(
  /*IN*/ PVOID  VolumeDeviceObject,
  /*OUT*/ PUNICODE_STRING  DosName);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIAllocateInstanceIds(
  /*IN*/ GUID  *Guid,
  /*IN*/ ULONG  InstanceCount,
  /*OUT*/ ULONG  *FirstInstanceId);

NTOSAPI
ULONG
DDKAPI
IoWMIDeviceObjectToProviderId(
  /*IN*/ PDEVICE_OBJECT  DeviceObject);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIDeviceObjectToInstanceName(
  /*IN*/ PVOID  DataBlockObject,
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*OUT*/ PUNICODE_STRING  InstanceName);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIExecuteMethod(
  /*IN*/ PVOID  DataBlockObject,
  /*IN*/ PUNICODE_STRING  InstanceName,
  /*IN*/ ULONG  MethodId,
  /*IN*/ ULONG  InBufferSize,
  /*IN OUT*/ PULONG  OutBufferSize,
  /*IN OUT*/  PUCHAR  InOutBuffer);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIHandleToInstanceName(
  /*IN*/ PVOID  DataBlockObject,
  /*IN*/ HANDLE  FileHandle,
  /*OUT*/ PUNICODE_STRING  InstanceName);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIOpenBlock(
  /*IN*/ GUID  *DataBlockGuid,
  /*IN*/ ULONG  DesiredAccess,
  /*OUT*/ PVOID  *DataBlockObject);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIQueryAllData(
  /*IN*/ PVOID  DataBlockObject,
  /*IN OUT*/ ULONG  *InOutBufferSize,
  /*OUT*/ PVOID  OutBuffer);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIQueryAllDataMultiple(
  /*IN*/ PVOID  *DataBlockObjectList,
  /*IN*/ ULONG  ObjectCount,
  /*IN OUT*/ ULONG  *InOutBufferSize,
  /*OUT*/ PVOID  OutBuffer);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIQuerySingleInstance(
  /*IN*/ PVOID  DataBlockObject,
  /*IN*/ PUNICODE_STRING  InstanceName,
  /*IN OUT*/ ULONG  *InOutBufferSize,
  /*OUT*/ PVOID OutBuffer);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIQuerySingleInstanceMultiple(
  /*IN*/ PVOID  *DataBlockObjectList,
  /*IN*/ PUNICODE_STRING  InstanceNames,
  /*IN*/ ULONG  ObjectCount,
  /*IN OUT*/ ULONG  *InOutBufferSize,
  /*OUT*/ PVOID  OutBuffer);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIRegistrationControl(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ ULONG  Action);

NTOSAPI
NTSTATUS
DDKAPI
IoWMISetNotificationCallback(
  /*IN*/ PVOID  Object,
  /*IN*/ WMI_NOTIFICATION_CALLBACK  Callback,
  /*IN*/ PVOID  Context);

NTOSAPI
NTSTATUS
DDKAPI
IoWMISetSingleInstance(
  /*IN*/ PVOID  DataBlockObject,
  /*IN*/ PUNICODE_STRING  InstanceName,
  /*IN*/ ULONG  Version,
  /*IN*/ ULONG  ValueBufferSize,
  /*IN*/ PVOID  ValueBuffer);

NTOSAPI
NTSTATUS
DDKAPI
IoWMISetSingleItem(
  /*IN*/ PVOID  DataBlockObject,
  /*IN*/ PUNICODE_STRING  InstanceName,
  /*IN*/ ULONG  DataItemId,
  /*IN*/ ULONG  Version,
  /*IN*/ ULONG  ValueBufferSize,
  /*IN*/ PVOID  ValueBuffer);

NTOSAPI
NTSTATUS
DDKAPI
IoWMISuggestInstanceName(
  /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject /*OPTIONAL*/,
  /*IN*/ PUNICODE_STRING  SymbolicLinkName /*OPTIONAL*/,
  /*IN*/ BOOLEAN  CombineNames,
  /*OUT*/ PUNICODE_STRING  SuggestedInstanceName);

NTOSAPI
NTSTATUS
DDKAPI
IoWMIWriteEvent(
  /*IN*/ PVOID  WnodeEventItem);

NTOSAPI
VOID
DDKAPI
IoWriteErrorLogEntry(
  /*IN*/ PVOID  ElEntry);

NTOSAPI
NTSTATUS
DDKAPI
IoWritePartitionTableEx(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX  *PartitionBuffer);



/** Kernel routines **/

NTOSAPI
VOID
DDKFASTAPI
KeAcquireInStackQueuedSpinLock(
  /*IN*/ PKSPIN_LOCK  SpinLock,
  /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);

NTOSAPI
VOID
DDKFASTAPI
KeAcquireInStackQueuedSpinLockAtDpcLevel(
  /*IN*/ PKSPIN_LOCK  SpinLock,
  /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);

NTOSAPI
KIRQL
DDKAPI
KeAcquireInterruptSpinLock(
  /*IN*/ PKINTERRUPT  Interrupt);

NTOSAPI
VOID
DDKAPI
KeAcquireSpinLock(
  /*IN*/ PKSPIN_LOCK  SpinLock,
  /*OUT*/ PKIRQL  OldIrql);

/* System Service Dispatch Table */
typedef PVOID (NTAPI * SSDT)(VOID);
typedef SSDT * PSSDT;

/* System Service Parameters Table */
typedef UCHAR SSPT, * PSSPT;

typedef struct _SSDT_ENTRY {
	PSSDT  SSDT;
	PULONG  ServiceCounterTable;
	ULONG  NumberOfServices;
	PSSPT  SSPT;
} SSDT_ENTRY, *PSSDT_ENTRY;

NTOSAPI
BOOLEAN
DDKAPI
KeAddSystemServiceTable(
  /*IN*/ PSSDT  SSDT,
  /*IN*/ PULONG  ServiceCounterTable,
  /*IN*/ ULONG  NumberOfServices,
  /*IN*/ PSSPT  SSPT,
  /*IN*/ ULONG  TableIndex);

NTOSAPI
BOOLEAN
DDKAPI
KeAreApcsDisabled(
  VOID);

NTOSAPI
VOID
DDKAPI
KeAttachProcess(
  /*IN*/ PEPROCESS  Process);

NTOSAPI
VOID
DDKAPI
KeBugCheck(
  /*IN*/ ULONG  BugCheckCode);

NTOSAPI
VOID
DDKAPI
KeBugCheckEx(
  /*IN*/ ULONG  BugCheckCode,
  /*IN*/ ULONG_PTR  BugCheckParameter1,
  /*IN*/ ULONG_PTR  BugCheckParameter2,
  /*IN*/ ULONG_PTR  BugCheckParameter3,
  /*IN*/ ULONG_PTR  BugCheckParameter4);

NTOSAPI
BOOLEAN
DDKAPI
KeCancelTimer(
  /*IN*/ PKTIMER  Timer);

NTOSAPI
VOID
DDKAPI
KeClearEvent(
  /*IN*/ PRKEVENT  Event);

NTOSAPI
NTSTATUS
DDKAPI
KeDelayExecutionThread(
  /*IN*/ KPROCESSOR_MODE  WaitMode,
  /*IN*/ BOOLEAN  Alertable,
  /*IN*/ PLARGE_INTEGER  Interval);

NTOSAPI
BOOLEAN
DDKAPI
KeDeregisterBugCheckCallback(
  /*IN*/ PKBUGCHECK_CALLBACK_RECORD  CallbackRecord);

NTOSAPI
VOID
DDKAPI
KeDetachProcess(
  VOID);

NTOSAPI
VOID
DDKAPI
KeEnterCriticalRegion(
  VOID);

/*
 * VOID
 * KeFlushIoBuffers(
 * IN PMDL  Mdl,
 * IN BOOLEAN  ReadOperation,
 * IN BOOLEAN  DmaOperation)
 */
#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)

NTOSAPI
PRKTHREAD
DDKAPI
KeGetCurrentThread(
  VOID);

NTOSAPI
KPROCESSOR_MODE
DDKAPI
KeGetPreviousMode(
  VOID);

NTOSAPI
ULONG
DDKAPI
KeGetRecommendedSharedDataAlignment(
  VOID);

NTOSAPI
VOID
DDKAPI
KeInitializeApc(
  /*IN*/ PKAPC  Apc,
  /*IN*/ PKTHREAD  Thread,
  /*IN*/ UCHAR  StateIndex,
  /*IN*/ PKKERNEL_ROUTINE  KernelRoutine,
  /*IN*/ PKRUNDOWN_ROUTINE  RundownRoutine,
  /*IN*/ PKNORMAL_ROUTINE  NormalRoutine,
  /*IN*/ UCHAR  Mode,
  /*IN*/ PVOID  Context);

NTOSAPI
VOID
DDKAPI
KeInitializeDeviceQueue(
  /*IN*/ PKDEVICE_QUEUE  DeviceQueue);

NTOSAPI
VOID
DDKAPI
KeInitializeMutex(
  /*IN*/ PRKMUTEX  Mutex,
  /*IN*/ ULONG  Level);

NTOSAPI
VOID
DDKAPI
KeInitializeSemaphore(
  /*IN*/ PRKSEMAPHORE  Semaphore,
  /*IN*/ LONG  Count,
  /*IN*/ LONG  Limit);

NTOSAPI
VOID
DDKAPI
KeInitializeSpinLock(
  /*IN*/ PKSPIN_LOCK  SpinLock);

NTOSAPI
VOID
DDKAPI
KeInitializeTimer(
  /*IN*/ PKTIMER  Timer);

NTOSAPI
VOID
DDKAPI
KeInitializeTimerEx(
  /*IN*/ PKTIMER  Timer,
  /*IN*/ TIMER_TYPE  Type);

NTOSAPI
BOOLEAN
DDKAPI
KeInsertByKeyDeviceQueue(
  /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
  /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry,
  /*IN*/ ULONG  SortKey);

NTOSAPI
BOOLEAN
DDKAPI
KeInsertDeviceQueue(
  /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
  /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);

NTOSAPI
BOOLEAN
DDKAPI
KeInsertQueueDpc(
  /*IN*/ PRKDPC  Dpc,
  /*IN*/ PVOID  SystemArgument1,
  /*IN*/ PVOID  SystemArgument2);

NTOSAPI
VOID
DDKAPI
KeLeaveCriticalRegion(
  VOID);

NTOSAPI
NTSTATUS
DDKAPI
KePulseEvent(
  /*IN*/ PRKEVENT  Event,
  /*IN*/ KPRIORITY  Increment,
  /*IN*/ BOOLEAN  Wait);

NTOSAPI
ULONGLONG
DDKAPI
KeQueryInterruptTime(
  VOID);

NTOSAPI
LARGE_INTEGER
DDKAPI
KeQueryPerformanceCounter(
  /*OUT*/ PLARGE_INTEGER  PerformanceFrequency  /*OPTIONAL*/);

NTOSAPI
KPRIORITY
DDKAPI
KeQueryPriorityThread(
  /*IN*/ PRKTHREAD  Thread);

NTOSAPI
VOID
DDKAPI
KeQuerySystemTime(
  /*OUT*/ PLARGE_INTEGER  CurrentTime);

NTOSAPI
VOID
DDKAPI
KeQueryTickCount(
  /*OUT*/ PLARGE_INTEGER  TickCount);

NTOSAPI
ULONG
DDKAPI
KeQueryTimeIncrement(
  VOID);

NTOSAPI
LONG
DDKAPI
KeReadStateEvent(
  /*IN*/ PRKEVENT  Event);

NTOSAPI
LONG
DDKAPI
KeReadStateMutex(
  /*IN*/ PRKMUTEX  Mutex);

NTOSAPI
LONG
DDKAPI
KeReadStateSemaphore(
  /*IN*/ PRKSEMAPHORE  Semaphore);

NTOSAPI
BOOLEAN
DDKAPI
KeReadStateTimer(
  /*IN*/ PKTIMER  Timer);

NTOSAPI
BOOLEAN
DDKAPI
KeRegisterBugCheckCallback(
  /*IN*/ PKBUGCHECK_CALLBACK_RECORD  CallbackRecord,
  /*IN*/ PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine,
  /*IN*/ PVOID  Buffer,
  /*IN*/ ULONG  Length,
  /*IN*/ PUCHAR  Component);

NTOSAPI
VOID
DDKFASTAPI
KeReleaseInStackQueuedSpinLock(
  /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);

NTOSAPI
VOID
DDKFASTAPI
KeReleaseInStackQueuedSpinLockFromDpcLevel(
  /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);

NTOSAPI
VOID
DDKAPI
KeReleaseInterruptSpinLock(
  /*IN*/ PKINTERRUPT  Interrupt,
  /*IN*/ KIRQL  OldIrql);

NTOSAPI
LONG
DDKAPI
KeReleaseMutex(
  /*IN*/ PRKMUTEX  Mutex,
  /*IN*/ BOOLEAN  Wait);

NTOSAPI
LONG
DDKAPI
KeReleaseSemaphore(
  /*IN*/ PRKSEMAPHORE  Semaphore,
  /*IN*/ KPRIORITY  Increment,
  /*IN*/ LONG  Adjustment,
  /*IN*/ BOOLEAN  Wait);

NTOSAPI
VOID
DDKAPI
KeReleaseSpinLock(
  /*IN*/ PKSPIN_LOCK  SpinLock,
  /*IN*/ KIRQL  NewIrql);

NTOSAPI
PKDEVICE_QUEUE_ENTRY
DDKAPI 
KeRemoveByKeyDeviceQueue(
  /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
  /*IN*/ ULONG  SortKey);

NTOSAPI
PKDEVICE_QUEUE_ENTRY
DDKAPI
KeRemoveDeviceQueue(
  /*IN*/ PKDEVICE_QUEUE  DeviceQueue);

NTOSAPI
BOOLEAN
DDKAPI
KeRemoveEntryDeviceQueue(
  /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
  /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);

NTOSAPI
BOOLEAN
DDKAPI
KeRemoveQueueDpc(
  /*IN*/ PRKDPC  Dpc);

NTOSAPI
LONG
DDKAPI
KeResetEvent(
  /*IN*/ PRKEVENT  Event);

NTOSAPI
NTSTATUS
DDKAPI
KeRestoreFloatingPointState(
  /*IN*/ PKFLOATING_SAVE  FloatSave);

NTOSAPI
NTSTATUS
DDKAPI
KeSaveFloatingPointState(
  /*OUT*/ PKFLOATING_SAVE  FloatSave);

NTOSAPI
LONG
DDKAPI
KeSetBasePriorityThread(
  /*IN*/ PRKTHREAD  Thread,
  /*IN*/ LONG  Increment);

NTOSAPI
LONG
DDKAPI
KeSetEvent(
  /*IN*/ PRKEVENT  Event,
  /*IN*/ KPRIORITY  Increment,
  /*IN*/ BOOLEAN  Wait);

NTOSAPI
VOID
DDKAPI
KeSetImportanceDpc(
  /*IN*/ PRKDPC  Dpc,
  /*IN*/ KDPC_IMPORTANCE  Importance);

NTOSAPI
KPRIORITY
DDKAPI
KeSetPriorityThread(
  /*IN*/ PKTHREAD  Thread,
  /*IN*/ KPRIORITY  Priority);

NTOSAPI
VOID
DDKAPI
KeSetTargetProcessorDpc(
  /*IN*/ PRKDPC  Dpc,
  /*IN*/ CCHAR  Number);

NTOSAPI
BOOLEAN
DDKAPI
KeSetTimer(
  /*IN*/ PKTIMER  Timer,
  /*IN*/ LARGE_INTEGER  DueTime,
  /*IN*/ PKDPC  Dpc  /*OPTIONAL*/);

NTOSAPI
BOOLEAN
DDKAPI
KeSetTimerEx(
  /*IN*/ PKTIMER  Timer,
  /*IN*/ LARGE_INTEGER  DueTime,
  /*IN*/ LONG  Period  /*OPTIONAL*/,
  /*IN*/ PKDPC  Dpc  /*OPTIONAL*/);

NTOSAPI
VOID
DDKFASTAPI
KeSetTimeUpdateNotifyRoutine(
  /*IN*/ PTIME_UPDATE_NOTIFY_ROUTINE  NotifyRoutine);

NTOSAPI
VOID
DDKAPI
KeStallExecutionProcessor(
  /*IN*/ ULONG  MicroSeconds);

NTOSAPI
BOOLEAN
DDKAPI
KeSynchronizeExecution(
  /*IN*/ PKINTERRUPT    Interrupt,
  /*IN*/ PKSYNCHRONIZE_ROUTINE  SynchronizeRoutine,
  /*IN*/ PVOID  SynchronizeContext);

NTOSAPI
NTSTATUS
DDKAPI
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 */,
  /*IN*/ PKWAIT_BLOCK  WaitBlockArray  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
KeWaitForMutexObject(
  /*IN*/ PRKMUTEX  Mutex,
  /*IN*/ KWAIT_REASON  WaitReason,
  /*IN*/ KPROCESSOR_MODE  WaitMode,
  /*IN*/ BOOLEAN  Alertable,
  /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
KeWaitForSingleObject(
  /*IN*/ PVOID  Object,
  /*IN*/ KWAIT_REASON  WaitReason,
  /*IN*/ KPROCESSOR_MODE  WaitMode,
  /*IN*/ BOOLEAN  Alertable,
  /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL*/);

#if defined(_X86_)

NTOSAPI
VOID
FASTCALL
KfLowerIrql(
  /*IN*/ KIRQL  NewIrql);

NTOSAPI
KIRQL
FASTCALL
KfRaiseIrql(
  /*IN*/ KIRQL  NewIrql);

#define KeLowerIrql(a) KfLowerIrql(a)
#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)

#else

NTOSAPI
VOID
DDKAPI
KeLowerIrql(
  /*IN*/ KIRQL  NewIrql);

NTOSAPI
KIRQL
DDKAPI
KeRaiseIrql(
  /*IN*/ KIRQL  NewIrql);

#endif

NTOSAPI
KIRQL
DDKAPI
KeRaiseIrqlToDpcLevel(
  VOID);

/** Memory manager routines **/

NTOSAPI
NTSTATUS
DDKAPI
MmAdvanceMdl(
  /*IN*/ PMDL  Mdl,
  /*IN*/ ULONG  NumberOfBytes);

NTOSAPI
PVOID
DDKAPI
MmAllocateContiguousMemory(
  /*IN*/ ULONG  NumberOfBytes,
  /*IN*/ PHYSICAL_ADDRESS  HighestAcceptableAddress);

NTOSAPI
PVOID
DDKAPI
MmAllocateContiguousMemorySpecifyCache(
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ PHYSICAL_ADDRESS  LowestAcceptableAddress,
  /*IN*/ PHYSICAL_ADDRESS  HighestAcceptableAddress,
  /*IN*/ PHYSICAL_ADDRESS  BoundaryAddressMultiple  /*OPTIONAL*/,
  /*IN*/ MEMORY_CACHING_TYPE  CacheType);

NTOSAPI
PVOID
DDKAPI
MmAllocateMappingAddress(
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ ULONG  PoolTag);

NTOSAPI
PVOID
DDKAPI
MmAllocateNonCachedMemory(
  /*IN*/ ULONG  NumberOfBytes);

NTOSAPI
PMDL
DDKAPI
MmAllocatePagesForMdl(
  /*IN*/ PHYSICAL_ADDRESS  LowAddress,
  /*IN*/ PHYSICAL_ADDRESS  HighAddress,
  /*IN*/ PHYSICAL_ADDRESS  SkipBytes,
  /*IN*/ SIZE_T  TotalBytes);

NTOSAPI
VOID
DDKAPI
MmBuildMdlForNonPagedPool(
  /*IN OUT*/ PMDL  MemoryDescriptorList);

NTOSAPI
NTSTATUS
DDKAPI
MmCreateSection(
  /*OUT*/ PSECTION_OBJECT  *SectionObject,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
  /*IN*/ PLARGE_INTEGER  MaximumSize,
  /*IN*/ ULONG  SectionPageProtection,
  /*IN*/ ULONG  AllocationAttributes,
  /*IN*/ HANDLE  FileHandle  /*OPTIONAL*/,
  /*IN*/ PFILE_OBJECT  File  /*OPTIONAL*/);

typedef enum _MMFLUSH_TYPE {
  MmFlushForDelete,
  MmFlushForWrite
} MMFLUSH_TYPE;

NTOSAPI
BOOLEAN
DDKAPI
MmFlushImageSection(
  /*IN*/ PSECTION_OBJECT_POINTERS  SectionObjectPointer,
  /*IN*/ MMFLUSH_TYPE  FlushType);

NTOSAPI
VOID
DDKAPI
MmFreeContiguousMemory(
  /*IN*/ PVOID  BaseAddress);

NTOSAPI
VOID
DDKAPI
MmFreeContiguousMemorySpecifyCache(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ MEMORY_CACHING_TYPE  CacheType);

NTOSAPI
VOID
DDKAPI
MmFreeMappingAddress(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ ULONG  PoolTag);

NTOSAPI
VOID
DDKAPI
MmFreeNonCachedMemory(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ SIZE_T  NumberOfBytes);

NTOSAPI
VOID
DDKAPI
MmFreePagesFromMdl(
  /*IN*/ PMDL  MemoryDescriptorList);

/*
 * 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))

NTOSAPI
PHYSICAL_ADDRESS
DDKAPI
MmGetPhysicalAddress(
  /*IN*/ PVOID  BaseAddress);

NTOSAPI
PPHYSICAL_MEMORY_RANGE
DDKAPI
MmGetPhysicalMemoryRanges(
  VOID);

NTOSAPI
PVOID
DDKAPI
MmGetVirtualForPhysical(
  /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress);

NTOSAPI
PVOID
DDKAPI
MmMapLockedPagesSpecifyCache(
  /*IN*/ PMDL  MemoryDescriptorList,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*IN*/ MEMORY_CACHING_TYPE  CacheType,
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ ULONG  BugCheckOnFailure,
  /*IN*/ MM_PAGE_PRIORITY  Priority);

NTOSAPI
PVOID
DDKAPI
MmMapLockedPagesWithReservedMapping(
  /*IN*/ PVOID  MappingAddress,
  /*IN*/ ULONG  PoolTag,
  /*IN*/ PMDL  MemoryDescriptorList,
  /*IN*/ MEMORY_CACHING_TYPE  CacheType);

NTOSAPI
NTSTATUS
DDKAPI
MmMapUserAddressesToPage(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ PVOID  PageAddress);

NTOSAPI
PVOID
DDKAPI
MmMapVideoDisplay(
  /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress,
  /*IN*/ SIZE_T  NumberOfBytes,
  /*IN*/ MEMORY_CACHING_TYPE  CacheType);

NTOSAPI
NTSTATUS
DDKAPI
MmMapViewInSessionSpace(
  /*IN*/ PVOID  Section,
  /*OUT*/ PVOID  *MappedBase,
  /*IN OUT*/ PSIZE_T  ViewSize);

NTOSAPI
NTSTATUS
DDKAPI
MmMapViewInSystemSpace(
  /*IN*/ PVOID  Section,
  /*OUT*/ PVOID  *MappedBase,
  /*IN*/ PSIZE_T  ViewSize);

NTOSAPI
NTSTATUS
DDKAPI
MmMarkPhysicalMemoryAsBad(
  /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
  /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);

NTOSAPI
NTSTATUS
DDKAPI
MmMarkPhysicalMemoryAsGood(
  /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
  /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);

/*
 * 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)

NTOSAPI
PVOID
DDKAPI
MmGetSystemRoutineAddress(
  /*IN*/ PUNICODE_STRING  SystemRoutineName);

/*
 * 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))

/*
 * 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; \
}

NTOSAPI
BOOLEAN
DDKAPI
MmIsAddressValid(
  /*IN*/ PVOID  VirtualAddress);

NTOSAPI
LOGICAL
DDKAPI
MmIsDriverVerifying(
  /*IN*/ PDRIVER_OBJECT  DriverObject);

NTOSAPI
BOOLEAN
DDKAPI
MmIsThisAnNtAsSystem(
  VOID);

NTOSAPI
NTSTATUS
DDKAPI
MmIsVerifierEnabled(
  /*OUT*/ PULONG  VerifierFlags);

NTOSAPI
PVOID
DDKAPI
MmLockPagableDataSection(
  /*IN*/ PVOID  AddressWithinSection);

NTOSAPI
PVOID
DDKAPI
MmLockPagableImageSection(
  /*IN*/ PVOID  AddressWithinSection);

/*
 * PVOID
 * MmLockPagableCodeSection(
 * IN PVOID  AddressWithinSection)
 */
#define MmLockPagableCodeSection MmLockPagableDataSection

NTOSAPI
VOID
DDKAPI
MmLockPagableSectionByHandle(
  /*IN*/ PVOID  ImageSectionHandle);

NTOSAPI
PVOID
DDKAPI
MmMapIoSpace(
  /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress,
  /*IN*/ ULONG  NumberOfBytes,
  /*IN*/ MEMORY_CACHING_TYPE  CacheEnable);

NTOSAPI
PVOID
DDKAPI
MmMapLockedPages(
  /*IN*/ PMDL  MemoryDescriptorList,
  /*IN*/ KPROCESSOR_MODE  AccessMode);

NTOSAPI
VOID
DDKAPI
MmPageEntireDriver(
  /*IN*/ PVOID  AddressWithinSection);

NTOSAPI
VOID
DDKAPI
MmProbeAndLockProcessPages(
  /*IN OUT*/ PMDL  MemoryDescriptorList,
  /*IN*/ PEPROCESS  Process,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*IN*/ LOCK_OPERATION  Operation);

NTOSAPI
NTSTATUS
DDKAPI
MmProtectMdlSystemAddress(
  /*IN*/ PMDL  MemoryDescriptorList,
  /*IN*/ ULONG  NewProtect);

NTOSAPI
VOID
DDKAPI
MmUnmapLockedPages(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ PMDL  MemoryDescriptorList);

NTOSAPI
NTSTATUS
DDKAPI
MmUnmapViewInSessionSpace(
  /*IN*/ PVOID  MappedBase);

NTOSAPI
NTSTATUS
DDKAPI
MmUnmapViewInSystemSpace(
  /*IN*/ PVOID MappedBase);

NTOSAPI
VOID
DDKAPI
MmUnsecureVirtualMemory(
  /*IN*/ HANDLE  SecureHandle);

/*
 * 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); \
  } \
}

NTOSAPI
VOID
DDKAPI
MmProbeAndLockPages(
  /*IN OUT*/ PMDL  MemoryDescriptorList,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*IN*/ LOCK_OPERATION  Operation);

NTOSAPI
MM_SYSTEM_SIZE
DDKAPI
MmQuerySystemSize(
  VOID);

NTOSAPI
NTSTATUS
DDKAPI
MmRemovePhysicalMemory(
  /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
  /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);

NTOSAPI
VOID
DDKAPI
MmResetDriverPaging(
  /*IN*/ PVOID  AddressWithinSection);

NTOSAPI
HANDLE
DDKAPI
MmSecureVirtualMemory(
  /*IN*/ PVOID  Address,
  /*IN*/ SIZE_T  Size,
  /*IN*/ ULONG  ProbeMode);

NTOSAPI
ULONG
DDKAPI
MmSizeOfMdl(
  /*IN*/ PVOID  Base,
  /*IN*/ SIZE_T  Length);

NTOSAPI
VOID
DDKAPI
MmUnlockPagableImageSection(
  /*IN*/ PVOID  ImageSectionHandle);

NTOSAPI
VOID
DDKAPI
MmUnlockPages(
  /*IN*/ PMDL  MemoryDescriptorList);

NTOSAPI
VOID
DDKAPI
MmUnmapIoSpace(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ SIZE_T  NumberOfBytes);

NTOSAPI
VOID
DDKAPI
MmUnmapReservedMapping(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ ULONG  PoolTag,
  /*IN*/ PMDL  MemoryDescriptorList);

NTOSAPI
VOID
DDKAPI
MmUnmapVideoDisplay(
  /*IN*/ PVOID  BaseAddress,
  /*IN*/ SIZE_T  NumberOfBytes);



/** Object manager routines **/

NTOSAPI
NTSTATUS
DDKAPI
ObAssignSecurity(
  /*IN*/ PACCESS_STATE  AccessState,
  /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
  /*IN*/ PVOID  Object,
  /*IN*/ POBJECT_TYPE  Type);

NTOSAPI
VOID
DDKAPI
ObDereferenceSecurityDescriptor(
  PSECURITY_DESCRIPTOR  SecurityDescriptor,
  ULONG  Count);

NTOSAPI
VOID
DDKFASTAPI
ObfDereferenceObject(
  /*IN*/ PVOID  Object);

/*
 * VOID
 * ObDereferenceObject(
 * IN PVOID  Object)
 */
#define ObDereferenceObject ObfDereferenceObject

NTOSAPI
NTSTATUS
DDKAPI
ObGetObjectSecurity(
  /*IN*/ PVOID  Object,
  /*OUT*/ PSECURITY_DESCRIPTOR  *SecurityDescriptor,
  /*OUT*/ PBOOLEAN  MemoryAllocated); 

NTOSAPI
NTSTATUS
DDKAPI
ObInsertObject(
  /*IN*/ PVOID  Object,
  /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ ULONG  AdditionalReferences,
  /*OUT*/ PVOID*  ReferencedObject  /*OPTIONAL*/,
  /*OUT*/ PHANDLE  Handle);

NTOSAPI
VOID
DDKFASTAPI
ObfReferenceObject(
  /*IN*/ PVOID  Object);

NTOSAPI
NTSTATUS
DDKAPI
ObLogSecurityDescriptor(
  /*IN*/ PSECURITY_DESCRIPTOR  InputSecurityDescriptor,
  /*OUT*/ PSECURITY_DESCRIPTOR  *OutputSecurityDescriptor,
  /*IN*/ ULONG RefBias);
/*
 * VOID
 * ObReferenceObject(
 * IN PVOID  Object)
 */
#define ObReferenceObject ObfReferenceObject

NTOSAPI
VOID
DDKAPI
ObMakeTemporaryObject(
  /*IN*/ PVOID  Object);

NTOSAPI
NTSTATUS
DDKAPI
ObOpenObjectByName(
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*IN*/ POBJECT_TYPE  ObjectType,
  /*IN OUT*/ PVOID  ParseContext  /*OPTIONAL*/,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ PACCESS_STATE  PassedAccessState,
  /*OUT*/ PHANDLE  Handle);

NTOSAPI
NTSTATUS
DDKAPI
ObOpenObjectByPointer(
  /*IN*/ PVOID  Object,
  /*IN*/ ULONG  HandleAttributes,
  /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK  DesiredAccess  /*OPTIONAL*/,
  /*IN*/ POBJECT_TYPE  ObjectType  /*OPTIONAL*/,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*OUT*/ PHANDLE  Handle);

NTOSAPI
NTSTATUS
DDKAPI
ObQueryObjectAuditingByHandle(
  /*IN*/ HANDLE  Handle,
  /*OUT*/ PBOOLEAN  GenerateOnClose);

NTOSAPI
NTSTATUS
DDKAPI
ObReferenceObjectByHandle(
  /*IN*/ HANDLE  Handle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_TYPE  ObjectType  /*OPTIONAL*/,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*OUT*/ PVOID  *Object,
  /*OUT*/ POBJECT_HANDLE_INFORMATION  HandleInformation  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
ObReferenceObjectByName(
  /*IN*/ PUNICODE_STRING  ObjectPath,
  /*IN*/ ULONG  Attributes,
  /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
  /*IN*/ ACCESS_MASK  DesiredAccess  /*OPTIONAL*/,
  /*IN*/ POBJECT_TYPE  ObjectType,
  /*IN*/ KPROCESSOR_MODE  AccessMode,
  /*IN OUT*/ PVOID  ParseContext  /*OPTIONAL*/,
  /*OUT*/ PVOID  *Object);

NTOSAPI
NTSTATUS
DDKAPI
ObReferenceObjectByPointer(
  /*IN*/ PVOID  Object,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_TYPE  ObjectType,
  /*IN*/ KPROCESSOR_MODE  AccessMode);

NTOSAPI
VOID
DDKAPI
ObReferenceSecurityDescriptor(
  /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
  /*IN*/ ULONG  Count);

NTOSAPI
VOID
DDKAPI
ObReleaseObjectSecurity(
  /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
  /*IN*/ BOOLEAN  MemoryAllocated);



/** Process manager routines **/

NTOSAPI
NTSTATUS
DDKAPI
PsCreateSystemProcess(
  /*IN*/ PHANDLE  ProcessHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);

NTOSAPI
NTSTATUS
DDKAPI
PsCreateSystemThread(
  /*OUT*/ PHANDLE  ThreadHandle,
  /*IN*/ ULONG  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
  /*IN*/ HANDLE  ProcessHandle  /*OPTIONAL*/,
  /*OUT*/ PCLIENT_ID  ClientId  /*OPTIONAL*/,
  /*IN*/ PKSTART_ROUTINE  StartRoutine,
  /*IN*/ PVOID  StartContext);

/*
 * PEPROCESS
 * PsGetCurrentProcess(VOID)
 */
#define PsGetCurrentProcess IoGetCurrentProcess

NTOSAPI
HANDLE
DDKAPI
PsGetCurrentProcessId(
  VOID);

/*
 * PETHREAD
 * PsGetCurrentThread(VOID)
 */
#define PsGetCurrentThread() \
  ((PETHREAD) KeGetCurrentThread())

NTOSAPI
HANDLE
DDKAPI
PsGetCurrentThreadId(
  VOID);

NTOSAPI
BOOLEAN
DDKAPI
PsGetVersion(
  PULONG  MajorVersion  /*OPTIONAL*/,
  PULONG  MinorVersion  /*OPTIONAL*/,
  PULONG  BuildNumber  /*OPTIONAL*/,
  PUNICODE_STRING  CSDVersion  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
PsRemoveCreateThreadNotifyRoutine(
  /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);

NTOSAPI
NTSTATUS
DDKAPI
PsRemoveLoadImageNotifyRoutine(
  /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);

NTOSAPI
NTSTATUS
DDKAPI
PsSetCreateProcessNotifyRoutine(
  /*IN*/ PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
  /*IN*/ BOOLEAN  Remove);

NTOSAPI
NTSTATUS
DDKAPI
PsSetCreateThreadNotifyRoutine(
  /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);

NTOSAPI
NTSTATUS
DDKAPI
PsSetLoadImageNotifyRoutine(
  /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);

NTOSAPI
NTSTATUS
DDKAPI
PsTerminateSystemThread(
  /*IN*/ NTSTATUS  ExitStatus);



/** Security reference monitor routines **/

NTOSAPI
BOOLEAN
DDKAPI
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);

NTOSAPI
NTSTATUS
DDKAPI
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);

NTOSAPI
NTSTATUS
DDKAPI
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);

NTOSAPI
NTSTATUS
DDKAPI
SeDeassignSecurity(
  /*IN OUT*/ PSECURITY_DESCRIPTOR  *SecurityDescriptor);

NTOSAPI
BOOLEAN
DDKAPI
SeSinglePrivilegeCheck(
  LUID  PrivilegeValue,
  KPROCESSOR_MODE  PreviousMode);

NTOSAPI
BOOLEAN
DDKAPI
SeValidSecurityDescriptor(
  /*IN*/ ULONG  Length,
  /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);



/** NtXxx routines **/

NTOSAPI
NTSTATUS
DDKAPI
NtOpenProcess(
  /*OUT*/ PHANDLE  ProcessHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*IN*/ PCLIENT_ID  ClientId  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
NtQueryInformationProcess(
  /*IN*/ HANDLE  ProcessHandle,
  /*IN*/ PROCESSINFOCLASS  ProcessInformationClass,
  /*OUT*/ PVOID  ProcessInformation,
  /*IN*/ ULONG  ProcessInformationLength,
  /*OUT*/ PULONG  ReturnLength /*OPTIONAL*/);



/** NtXxx and ZwXxx routines **/

NTOSAPI
NTSTATUS
DDKAPI
ZwCancelTimer(
  /*IN*/ HANDLE  TimerHandle,
  /*OUT*/ PBOOLEAN  CurrentState  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
NtClose(
  /*IN*/ HANDLE  Handle);

NTOSAPI
NTSTATUS
DDKAPI
ZwClose(
  /*IN*/ HANDLE  Handle);

NTOSAPI
NTSTATUS
DDKAPI
ZwCreateDirectoryObject(
  /*OUT*/ PHANDLE  DirectoryHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);

NTOSAPI
NTSTATUS
DDKAPI
NtCreateEvent(
  /*OUT*/ PHANDLE  EventHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*IN*/ BOOLEAN  ManualReset,
  /*IN*/ BOOLEAN  InitialState);

NTOSAPI
NTSTATUS
DDKAPI
ZwCreateEvent(
  /*OUT*/ PHANDLE  EventHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*IN*/ BOOLEAN  ManualReset,
  /*IN*/ BOOLEAN  InitialState);

NTOSAPI
NTSTATUS
DDKAPI
ZwCreateFile(
  /*OUT*/ PHANDLE  FileHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*IN*/ PLARGE_INTEGER  AllocationSize  /*OPTIONAL*/,
  /*IN*/ ULONG  FileAttributes,
  /*IN*/ ULONG  ShareAccess,
  /*IN*/ ULONG  CreateDisposition,
  /*IN*/ ULONG  CreateOptions,
  /*IN*/ PVOID  EaBuffer  /*OPTIONAL*/,
  /*IN*/ ULONG  EaLength);

NTOSAPI
NTSTATUS
DDKAPI
ZwCreateKey(
  /*OUT*/ PHANDLE  KeyHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*IN*/ ULONG  TitleIndex,
  /*IN*/ PUNICODE_STRING  Class  /*OPTIONAL*/,
  /*IN*/ ULONG  CreateOptions,
  /*OUT*/ PULONG  Disposition  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
ZwCreateTimer(
  /*OUT*/ PHANDLE  TimerHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
  /*IN*/ TIMER_TYPE  TimerType);

NTOSAPI
NTSTATUS
DDKAPI
ZwDeleteKey(
  /*IN*/ HANDLE  KeyHandle);

NTOSAPI
NTSTATUS
DDKAPI
ZwDeleteValueKey(
  /*IN*/ HANDLE  KeyHandle,
  /*IN*/ PUNICODE_STRING  ValueName);

NTOSAPI
NTSTATUS
DDKAPI
NtDeviceIoControlFile(
  /*IN*/ HANDLE  DeviceHandle,
  /*IN*/ HANDLE  Event  /*OPTIONAL*/, 
  /*IN*/ PIO_APC_ROUTINE  UserApcRoutine  /*OPTIONAL*/, 
  /*IN*/ PVOID  UserApcContext  /*OPTIONAL*/, 
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock, 
  /*IN*/ ULONG  IoControlCode,
  /*IN*/ PVOID  InputBuffer, 
  /*IN*/ ULONG  InputBufferSize,
  /*OUT*/ PVOID  OutputBuffer,
  /*IN*/ ULONG  OutputBufferSize);

NTOSAPI
NTSTATUS
DDKAPI
ZwDeviceIoControlFile(
  /*IN*/ HANDLE  DeviceHandle,
  /*IN*/ HANDLE  Event  /*OPTIONAL*/, 
  /*IN*/ PIO_APC_ROUTINE  UserApcRoutine  /*OPTIONAL*/, 
  /*IN*/ PVOID  UserApcContext  /*OPTIONAL*/, 
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock, 
  /*IN*/ ULONG  IoControlCode,
  /*IN*/ PVOID  InputBuffer, 
  /*IN*/ ULONG  InputBufferSize,
  /*OUT*/ PVOID  OutputBuffer,
  /*IN*/ ULONG  OutputBufferSize);

NTOSAPI
NTSTATUS
DDKAPI
ZwEnumerateKey(
  /*IN*/ HANDLE  KeyHandle,
  /*IN*/ ULONG  Index,
  /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
  /*OUT*/ PVOID  KeyInformation,
  /*IN*/ ULONG  Length,
  /*OUT*/ PULONG  ResultLength);

NTOSAPI
NTSTATUS
DDKAPI
ZwEnumerateValueKey(
  /*IN*/ HANDLE  KeyHandle,
  /*IN*/ ULONG  Index,
  /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
  /*OUT*/ PVOID  KeyValueInformation,
  /*IN*/ ULONG  Length,
  /*OUT*/ PULONG  ResultLength);

NTOSAPI
NTSTATUS
DDKAPI
ZwFlushKey(
  /*IN*/ HANDLE  KeyHandle);

NTOSAPI
NTSTATUS
DDKAPI
ZwMakeTemporaryObject(
  /*IN*/ HANDLE  Handle);

NTOSAPI
NTSTATUS
DDKAPI
NtMapViewOfSection(
  /*IN*/ HANDLE  SectionHandle,
  /*IN*/ HANDLE  ProcessHandle,
  /*IN OUT*/ PVOID  *BaseAddress,
  /*IN*/ ULONG  ZeroBits,
  /*IN*/ ULONG  CommitSize,
  /*IN OUT*/ PLARGE_INTEGER  SectionOffset  /*OPTIONAL*/,
  /*IN OUT*/ PSIZE_T  ViewSize,
  /*IN*/ SECTION_INHERIT  InheritDisposition,
  /*IN*/ ULONG  AllocationType,
  /*IN*/ ULONG  Protect);

NTOSAPI
NTSTATUS
DDKAPI
ZwMapViewOfSection(
  /*IN*/ HANDLE  SectionHandle,
  /*IN*/ HANDLE  ProcessHandle,
  /*IN OUT*/ PVOID  *BaseAddress,
  /*IN*/ ULONG  ZeroBits,
  /*IN*/ ULONG  CommitSize,
  /*IN OUT*/ PLARGE_INTEGER  SectionOffset  /*OPTIONAL*/,
  /*IN OUT*/ PSIZE_T  ViewSize,
  /*IN*/ SECTION_INHERIT  InheritDisposition,
  /*IN*/ ULONG  AllocationType,
  /*IN*/ ULONG  Protect);

NTOSAPI
NTSTATUS
DDKAPI
NtOpenFile(
  /*OUT*/ PHANDLE  FileHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*IN*/ ULONG  ShareAccess,
  /*IN*/ ULONG  OpenOptions);

NTOSAPI
NTSTATUS
DDKAPI
ZwOpenFile(
  /*OUT*/ PHANDLE  FileHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*IN*/ ULONG  ShareAccess,
  /*IN*/ ULONG  OpenOptions);

NTOSAPI
NTSTATUS
DDKAPI
ZwOpenKey(
  /*OUT*/ PHANDLE  KeyHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);

NTOSAPI
NTSTATUS
DDKAPI
ZwOpenSection(
  /*OUT*/ PHANDLE  SectionHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);

NTOSAPI
NTSTATUS
DDKAPI
ZwOpenSymbolicLinkObject(
  /*OUT*/ PHANDLE  LinkHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);

NTOSAPI
NTSTATUS
DDKAPI
ZwOpenTimer(
  /*OUT*/ PHANDLE  TimerHandle,
  /*IN*/ ACCESS_MASK  DesiredAccess,
  /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);

NTOSAPI
NTSTATUS
DDKAPI
ZwQueryInformationFile(
  /*IN*/ HANDLE  FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*OUT*/ PVOID  FileInformation,
  /*IN*/ ULONG  Length,
  /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);

NTOSAPI
NTSTATUS
DDKAPI
ZwQueryKey(
  /*IN*/ HANDLE  KeyHandle,
  /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
  /*OUT*/ PVOID  KeyInformation,
  /*IN*/ ULONG  Length,
  /*OUT*/ PULONG  ResultLength);

NTOSAPI
NTSTATUS
DDKAPI
ZwQuerySymbolicLinkObject(
  /*IN*/ HANDLE  LinkHandle,
  /*IN OUT*/ PUNICODE_STRING  LinkTarget,
  /*OUT*/ PULONG  ReturnedLength  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
ZwQueryValueKey(
  /*IN*/ HANDLE  KeyHandle,
  /*IN*/ PUNICODE_STRING  ValueName,
  /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
  /*OUT*/ PVOID  KeyValueInformation,
  /*IN*/ ULONG  Length,
  /*OUT*/ PULONG  ResultLength);

NTOSAPI
NTSTATUS
DDKAPI
NtReadFile(
  /*IN*/ HANDLE  FileHandle,
  /*IN*/ HANDLE  Event  /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
  /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*OUT*/ PVOID  Buffer,
  /*IN*/ ULONG  Length,
  /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
  /*IN*/ PULONG  Key  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
ZwReadFile(
  /*IN*/ HANDLE  FileHandle,
  /*IN*/ HANDLE  Event  /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
  /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*OUT*/ PVOID  Buffer,
  /*IN*/ ULONG  Length,
  /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
  /*IN*/ PULONG  Key  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
NtSetEvent(
  /*IN*/ HANDLE  EventHandle,
  /*IN*/ PULONG  NumberOfThreadsReleased);

NTOSAPI
NTSTATUS
DDKAPI
ZwSetEvent(
  /*IN*/ HANDLE  EventHandle,
  /*IN*/ PULONG  NumberOfThreadsReleased);

NTOSAPI
NTSTATUS
DDKAPI
ZwSetInformationFile(
  /*IN*/ HANDLE  FileHandle,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*IN*/ PVOID  FileInformation,
  /*IN*/ ULONG  Length,
  /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);

NTOSAPI
NTSTATUS
DDKAPI
ZwSetInformationThread(
  /*IN*/ HANDLE  ThreadHandle,
  /*IN*/ THREADINFOCLASS  ThreadInformationClass,
  /*IN*/ PVOID  ThreadInformation,
  /*IN*/ ULONG  ThreadInformationLength);

NTOSAPI
NTSTATUS
DDKAPI
ZwSetTimer(
  /*IN*/ HANDLE  TimerHandle,
  /*IN*/ PLARGE_INTEGER  DueTime,
  /*IN*/ PTIMER_APC_ROUTINE  TimerApcRoutine  /*OPTIONAL*/,
  /*IN*/ PVOID  TimerContext  /*OPTIONAL*/,
  /*IN*/ BOOLEAN  WakeTimer,
  /*IN*/ LONG  Period  /*OPTIONAL*/,
  /*OUT*/ PBOOLEAN  PreviousState  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
ZwSetValueKey(
  /*IN*/ HANDLE  KeyHandle,
  /*IN*/ PUNICODE_STRING  ValueName,
  /*IN*/ ULONG  TitleIndex  /*OPTIONAL*/,
  /*IN*/ ULONG  Type,
  /*IN*/ PVOID  Data,
  /*IN*/ ULONG  DataSize);

/* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
#define AT_EXTENDABLE_FILE                0x00002000
#define SEC_NO_CHANGE                     0x00400000
#define AT_RESERVED                       0x20000000
#define AT_ROUND_TO_PAGE                  0x40000000

NTOSAPI
NTSTATUS
DDKAPI
NtUnmapViewOfSection(
  /*IN*/ HANDLE  ProcessHandle,
  /*IN*/ PVOID  BaseAddress);

NTOSAPI
NTSTATUS
DDKAPI
ZwUnmapViewOfSection(
  /*IN*/ HANDLE  ProcessHandle,
  /*IN*/ PVOID  BaseAddress);

NTOSAPI
NTSTATUS
DDKAPI
NtWaitForSingleObject(
  /*IN*/ HANDLE  Object,
  /*IN*/ BOOLEAN  Alertable,
  /*IN*/ PLARGE_INTEGER  Time);

NTOSAPI
NTSTATUS
DDKAPI
ZwWaitForSingleObject(
  /*IN*/ HANDLE  Object,
  /*IN*/ BOOLEAN  Alertable,
  /*IN*/ PLARGE_INTEGER  Time);

NTOSAPI
NTSTATUS
DDKAPI
NtWriteFile(
  /*IN*/ HANDLE  FileHandle,
  /*IN*/ HANDLE  Event  /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
  /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*IN*/ PVOID  Buffer,
  /*IN*/ ULONG  Length,
  /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
  /*IN*/ PULONG  Key  /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
ZwWriteFile(
  /*IN*/ HANDLE  FileHandle,
  /*IN*/ HANDLE  Event  /*OPTIONAL*/,
  /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
  /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
  /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
  /*IN*/ PVOID  Buffer,
  /*IN*/ ULONG  Length,
  /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
  /*IN*/ PULONG  Key  /*OPTIONAL*/);



/** Power management support routines **/

NTOSAPI
NTSTATUS
DDKAPI
PoCallDriver(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN OUT*/ PIRP  Irp);

NTOSAPI
PULONG
DDKAPI
PoRegisterDeviceForIdleDetection(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ ULONG  ConservationIdleTime,
  /*IN*/ ULONG  PerformanceIdleTime,
  /*IN*/ DEVICE_POWER_STATE  State);

NTOSAPI
PVOID
DDKAPI
PoRegisterSystemState(
  /*IN*/ PVOID  StateHandle,
  /*IN*/ EXECUTION_STATE  Flags);

NTOSAPI
NTSTATUS
DDKAPI
PoRequestPowerIrp(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ UCHAR  MinorFunction,  
  /*IN*/ POWER_STATE  PowerState,
  /*IN*/ PREQUEST_POWER_COMPLETE  CompletionFunction,
  /*IN*/ PVOID  Context,
  /*OUT*/ PIRP  *Irp /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
PoRequestShutdownEvent(
  /*OUT*/ PVOID  *Event);

NTOSAPI
VOID
DDKAPI
PoSetDeviceBusy(
  PULONG  IdlePointer); 

NTOSAPI
POWER_STATE
DDKAPI
PoSetPowerState(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ POWER_STATE_TYPE  Type,
  /*IN*/ POWER_STATE  State);

NTOSAPI
VOID
DDKAPI
PoSetSystemState(
  /*IN*/ EXECUTION_STATE  Flags);

NTOSAPI
VOID
DDKAPI
PoStartNextPowerIrp(
  /*IN*/ PIRP  Irp);

NTOSAPI
VOID
DDKAPI
PoUnregisterSystemState(
  /*IN*/ PVOID  StateHandle);



/** WMI library support routines **/

NTOSAPI
NTSTATUS
DDKAPI
WmiCompleteRequest(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PIRP  Irp,
  /*IN*/ NTSTATUS  Status,
  /*IN*/ ULONG  BufferUsed,
  /*IN*/ CCHAR  PriorityBoost);

NTOSAPI
NTSTATUS
DDKAPI
WmiFireEvent(
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ LPGUID  Guid, 
  /*IN*/ ULONG  InstanceIndex,
  /*IN*/ ULONG  EventDataSize,
  /*IN*/ PVOID  EventData); 

NTOSAPI
NTSTATUS
DDKAPI
WmiQueryTraceInformation(
  /*IN*/ TRACE_INFORMATION_CLASS  TraceInformationClass,
  /*OUT*/ PVOID  TraceInformation,
  /*IN*/ ULONG  TraceInformationLength,
  /*OUT*/ PULONG  RequiredLength /*OPTIONAL*/,
  /*IN*/ PVOID  Buffer /*OPTIONAL*/);

NTOSAPI
NTSTATUS
DDKAPI
WmiSystemControl(
  /*IN*/ PWMILIB_CONTEXT  WmiLibInfo,
  /*IN*/ PDEVICE_OBJECT  DeviceObject,
  /*IN*/ PIRP  Irp,
  /*OUT*/ PSYSCTL_IRP_DISPOSITION  IrpDisposition);

NTOSAPI
NTSTATUS
DDKCDECLAPI
WmiTraceMessage(
  /*IN*/ TRACEHANDLE  LoggerHandle,
  /*IN*/ ULONG  MessageFlags,
  /*IN*/ LPGUID  MessageGuid,
  /*IN*/ USHORT  MessageNumber,
  /*IN*/ ...);

#if 0
/* FIXME: Get va_list from where? */
NTOSAPI
NTSTATUS
DDKCDECLAPI
WmiTraceMessageVa(
  /*IN*/ TRACEHANDLE  LoggerHandle,
  /*IN*/ ULONG  MessageFlags,
  /*IN*/ LPGUID  MessageGuid,
  /*IN*/ USHORT  MessageNumber,
  /*IN*/ va_list  MessageArgList);
#endif


/** Kernel debugger routines **/

NTOSAPI
VOID
DDKAPI
KdDisableDebugger(
  VOID);

NTOSAPI
VOID
DDKAPI
KdEnableDebugger(
  VOID);

NTOSAPI
VOID
DDKAPI
DbgBreakPoint(
  VOID);

NTOSAPI
VOID
DDKAPI
DbgBreakPointWithStatus(
  /*IN*/ ULONG  Status);

NTOSAPI
ULONG
DDKCDECLAPI
DbgPrint(
  /*IN*/ PCH  Format,
  /*IN*/ ...);

NTOSAPI
ULONG
DDKCDECLAPI
DbgPrintEx(
  /*IN*/ ULONG  ComponentId,
  /*IN*/ ULONG  Level,
  /*IN*/ PCH  Format,
  /*IN*/ ...);

NTOSAPI
ULONG
DDKCDECLAPI
DbgPrintReturnControlC(
  /*IN*/ PCH  Format,
  /*IN*/ ...);

NTOSAPI
NTSTATUS
DDKAPI
DbgQueryDebugFilterState(
  /*IN*/ ULONG  ComponentId,
  /*IN*/ ULONG  Level);

NTOSAPI
NTSTATUS
DDKAPI
DbgSetDebugFilterState(
  /*IN*/ ULONG  ComponentId,
  /*IN*/ ULONG  Level,
  /*IN*/ BOOLEAN  State);

#ifdef DBG

#define KdPrint(_x_) DbgPrint _x_
#define KdPrintEx(_x_) DbgPrintEx _x_
#define KdBreakPoint() DbgBreakPoint()
#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)

#else /* !DBG */

#define KdPrint(_x_)
#define KdPrintEx(_x_)
#define KdBreakPoint()
#define KdBreakPointWithStatus(s)

#endif /* !DBG */

extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
#define KD_DEBUGGER_ENABLED     *KdDebuggerEnabled
#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent

#ifdef __cplusplus
}
#endif

#endif /* __WINDDK_H */
