home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / cwin / c.exe / $INSTDIR / include / ddk / winddk.h < prev    next >
Encoding:
C/C++ Source or Header  |  2003-12-15  |  197.3 KB  |  9,108 lines

  1. /*
  2.  * winddk.h
  3.  *
  4.  * Windows Device Driver Kit
  5.  *
  6.  * This file is part of the w32api package.
  7.  *
  8.  * Contributors:
  9.  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
  10.  *
  11.  * THIS SOFTWARE IS NOT COPYRIGHTED
  12.  *
  13.  * This source code is offered for use in the public domain. You may
  14.  * use, modify or distribute it freely.
  15.  *
  16.  * This code is distributed in the hope that it will be useful but
  17.  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
  18.  * DISCLAIMED. This includes but is not limited to warranties of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  */
  22.  
  23. #ifndef __WINDDK_H
  24. #define __WINDDK_H
  25.  
  26. #if __GNUC__ >=3
  27. #pragma GCC system_header
  28. #endif
  29.  
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33.  
  34. #pragma pack(push,4)
  35.  
  36. /*
  37. ** Definitions specific to this Device Driver Kit
  38. */
  39. #define DDKAPI __attribute__((stdcall))
  40. #define DDKFASTAPI __attribute__((fastcall))
  41. #define DDKCDECLAPI __attribute__((cdecl))
  42.  
  43. #if defined(_NTOSKRNL_)
  44. #ifndef NTOSAPI
  45. #define NTOSAPI DECL_EXPORT
  46. #endif
  47. #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
  48. #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
  49. #else
  50. #ifndef NTOSAPI
  51. #define NTOSAPI DECL_IMPORT
  52. #endif
  53. #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
  54. #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
  55. #endif
  56.  
  57. /* Pseudo modifiers for parameters */
  58. #define IN
  59. #define OUT
  60. #define OPTIONAL
  61. #define UNALLIGNED
  62.  
  63. #define CONST const
  64. #define VOLATILE volatile
  65.  
  66. #define RESTRICTED_POINTER
  67. #define POINTER_ALIGNMENT
  68.  
  69.  
  70.  
  71. /*
  72. ** Forward declarations
  73. */
  74.  
  75. struct _IRP;
  76. struct _MDL;
  77. struct _KAPC;
  78. struct _KDPC;
  79. struct _KPCR;
  80. struct _KPRCB;
  81. struct _KTSS;
  82. struct _FILE_OBJECT;
  83. struct _DMA_ADAPTER;
  84. struct _DEVICE_OBJECT;
  85. struct _DRIVER_OBJECT;
  86. struct _SECTION_OBJECT;
  87. struct _IO_STATUS_BLOCK;
  88. struct _DEVICE_DESCRIPTION;
  89. struct _SCATTER_GATHER_LIST;
  90.  
  91. DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT);
  92. DECLARE_INTERNAL_OBJECT(DMA_ADAPTER);
  93. DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK);
  94. DECLARE_INTERNAL_OBJECT(SECTION_OBJECT);
  95.  
  96. #if 1
  97. /* FIXME: Unknown definitions */
  98. struct _SET_PARTITION_INFORMATION_EX;
  99. typedef ULONG WAIT_TYPE;
  100. typedef HANDLE TRACEHANDLE;
  101. typedef PVOID PWMILIB_CONTEXT;
  102. typedef PVOID PSYSCTL_IRP_DISPOSITION;
  103. typedef ULONG LOGICAL;
  104. #endif
  105.  
  106. /*
  107. ** Routines specific to this DDK
  108. */
  109.  
  110. #define TAG(_a, _b, _c, _d) (ULONG) \
  111.     (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24))
  112.  
  113. static inline struct _KPCR * KeGetCurrentKPCR(
  114.   VOID)
  115. {
  116.   ULONG Value;
  117.  
  118.   __asm__ __volatile__ ("movl %%fs:0x18, %0\n\t"
  119.       : "=r" (Value)
  120.     : /* no inputs */
  121.   );
  122.   return (struct _KPCR *) Value;
  123. }
  124.  
  125. /*
  126. ** Simple structures
  127. */
  128.  
  129. typedef LONG KPRIORITY;
  130. typedef ULONG KIRQL, *PKIRQL;
  131. typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
  132. typedef ULONG KAFFINITY, *PKAFFINITY;
  133. typedef CCHAR KPROCESSOR_MODE;
  134.  
  135. typedef enum _MODE {
  136.   KernelMode,
  137.   UserMode,
  138.   MaximumMode
  139. } MODE;
  140.  
  141. typedef PUNICODE_STRING PCUNICODE_STRING;
  142.  
  143. typedef struct _SINGLE_LIST_ENTRY {
  144.   struct _SINGLE_LIST_ENTRY  *Next;
  145. } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
  146.  
  147. #define SLIST_ENTRY SINGLE_LIST_ENTRY
  148. #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
  149.  
  150. typedef union _SLIST_HEADER {
  151.   ULONGLONG  Alignment;
  152.   struct {
  153.     SLIST_ENTRY  Next;
  154.     USHORT  Depth;
  155.     USHORT  Sequence;
  156.   };
  157. } SLIST_HEADER, *PSLIST_HEADER;
  158.  
  159.  
  160. /* Structures not exposed to drivers */
  161. typedef struct _IO_TIMER *PIO_TIMER;
  162. typedef struct _EPROCESS *PEPROCESS;
  163. typedef struct _ETHREAD *PETHREAD;
  164. typedef struct _KINTERRUPT *PKINTERRUPT;
  165. typedef struct _OBJECT_TYPE *POBJECT_TYPE;
  166. typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
  167. typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
  168. typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
  169. typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
  170. typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION;
  171. typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX;
  172.  
  173. /* Constants */
  174. #define    MAXIMUM_PROCESSORS                32
  175.  
  176. #define MAXIMUM_WAIT_OBJECTS              64
  177.  
  178. #define METHOD_BUFFERED                   0
  179. #define METHOD_IN_DIRECT                  1
  180. #define METHOD_OUT_DIRECT                 2
  181. #define METHOD_NEITHER                    3
  182.  
  183. #define LOW_PRIORITY                      0
  184. #define LOW_REALTIME_PRIORITY             16
  185. #define HIGH_PRIORITY                     31
  186. #define MAXIMUM_PRIORITY                  32
  187.  
  188. #define FILE_LIST_DIRECTORY               0x00000001
  189. #define FILE_READ_DATA                    0x00000001
  190. #define FILE_ADD_FILE                     0x00000002
  191. #define FILE_WRITE_DATA                   0x00000002
  192. #define FILE_ADD_SUBDIRECTORY             0x00000004
  193. #define FILE_APPEND_DATA                  0x00000004
  194. #define FILE_CREATE_PIPE_INSTANCE         0x00000004
  195. #define FILE_READ_EA                      0x00000008
  196. #define FILE_WRITE_EA                     0x00000010
  197. #define FILE_EXECUTE                      0x00000020
  198. #define FILE_TRAVERSE                     0x00000020
  199. #define FILE_DELETE_CHILD                 0x00000040
  200. #define FILE_READ_ATTRIBUTES              0x00000080
  201. #define FILE_WRITE_ATTRIBUTES             0x00000100
  202.  
  203. #define FILE_SUPERSEDED                   0x00000000
  204. #define FILE_OPENED                       0x00000001
  205. #define FILE_CREATED                      0x00000002
  206. #define FILE_OVERWRITTEN                  0x00000003
  207. #define FILE_EXISTS                       0x00000004
  208. #define FILE_DOES_NOT_EXIST               0x00000005
  209.  
  210. #define FILE_SHARE_READ                   0x00000001
  211. #define FILE_SHARE_WRITE                  0x00000002
  212. #define FILE_SHARE_DELETE                 0x00000004
  213. #define FILE_SHARE_VALID_FLAGS            0x00000007
  214.  
  215. #define FILE_ATTRIBUTE_READONLY           0x00000001
  216. #define FILE_ATTRIBUTE_HIDDEN             0x00000002
  217. #define FILE_ATTRIBUTE_SYSTEM             0x00000004
  218. #define FILE_ATTRIBUTE_DIRECTORY          0x00000010
  219. #define FILE_ATTRIBUTE_ARCHIVE            0x00000020
  220. #define FILE_ATTRIBUTE_DEVICE             0x00000040
  221. #define FILE_ATTRIBUTE_NORMAL             0x00000080
  222. #define FILE_ATTRIBUTE_TEMPORARY          0x00000100
  223. #define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
  224. #define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
  225. #define FILE_ATTRIBUTE_COMPRESSED         0x00000800
  226. #define FILE_ATTRIBUTE_OFFLINE            0x00001000
  227. #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
  228. #define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
  229.  
  230. #define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
  231. #define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
  232.  
  233. #define FILE_COPY_STRUCTURED_STORAGE      0x00000041
  234. #define FILE_STRUCTURED_STORAGE           0x00000441
  235.  
  236. #define FILE_VALID_OPTION_FLAGS           0x00ffffff
  237. #define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
  238. #define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
  239. #define FILE_VALID_SET_FLAGS              0x00000036
  240.  
  241. #define FILE_SUPERSEDE                    0x00000000
  242. #define FILE_OPEN                         0x00000001
  243. #define FILE_CREATE                       0x00000002
  244. #define FILE_OPEN_IF                      0x00000003
  245. #define FILE_OVERWRITE                    0x00000004
  246. #define FILE_OVERWRITE_IF                 0x00000005
  247. #define FILE_MAXIMUM_DISPOSITION          0x00000005
  248.  
  249. #define FILE_DIRECTORY_FILE               0x00000001
  250. #define FILE_WRITE_THROUGH                0x00000002
  251. #define FILE_SEQUENTIAL_ONLY              0x00000004
  252. #define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
  253. #define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
  254. #define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
  255. #define FILE_NON_DIRECTORY_FILE           0x00000040
  256. #define FILE_CREATE_TREE_CONNECTION       0x00000080
  257. #define FILE_COMPLETE_IF_OPLOCKED         0x00000100
  258. #define FILE_NO_EA_KNOWLEDGE              0x00000200
  259. #define FILE_OPEN_FOR_RECOVERY            0x00000400
  260. #define FILE_RANDOM_ACCESS                0x00000800
  261. #define FILE_DELETE_ON_CLOSE              0x00001000
  262. #define FILE_OPEN_BY_FILE_ID              0x00002000
  263. #define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
  264. #define FILE_NO_COMPRESSION               0x00008000
  265. #define FILE_RESERVE_OPFILTER             0x00100000
  266. #define FILE_OPEN_REPARSE_POINT           0x00200000
  267. #define FILE_OPEN_NO_RECALL               0x00400000
  268. #define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
  269.  
  270. #define FILE_ANY_ACCESS                   0x00000000
  271. #define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
  272. #define FILE_READ_ACCESS                  0x00000001
  273. #define FILE_WRITE_ACCESS                 0x00000002
  274.  
  275. #define FILE_ALL_ACCESS \
  276.   (STANDARD_RIGHTS_REQUIRED | \
  277.    SYNCHRONIZE | \
  278.    0x1FF)
  279.  
  280. #define FILE_GENERIC_EXECUTE \
  281.   (STANDARD_RIGHTS_EXECUTE | \
  282.    FILE_READ_ATTRIBUTES | \
  283.    FILE_EXECUTE | \
  284.    SYNCHRONIZE)
  285.  
  286. #define FILE_GENERIC_READ \
  287.   (STANDARD_RIGHTS_READ | \
  288.    FILE_READ_DATA | \
  289.    FILE_READ_ATTRIBUTES | \
  290.    FILE_READ_EA | \
  291.    SYNCHRONIZE)
  292.  
  293. #define FILE_GENERIC_WRITE \
  294.   (STANDARD_RIGHTS_WRITE | \
  295.    FILE_WRITE_DATA | \
  296.    FILE_WRITE_ATTRIBUTES | \
  297.    FILE_WRITE_EA | \
  298.    FILE_APPEND_DATA | \
  299.    SYNCHRONIZE)
  300.  
  301. /* Exported object types */
  302. extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
  303. extern NTOSAPI POBJECT_TYPE ExEventObjectType;
  304. extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType;
  305. extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType;
  306. extern NTOSAPI POBJECT_TYPE IoAdapterObjectType;
  307. extern NTOSAPI ULONG IoDeviceHandlerObjectSize;
  308. extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
  309. extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
  310. extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
  311. extern NTOSAPI POBJECT_TYPE IoFileObjectType;
  312. extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
  313. extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
  314. extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
  315.  
  316. extern NTOSAPI CCHAR KeNumberProcessors;
  317. extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable;
  318. extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable;
  319.  
  320.  
  321. /*
  322. ** IRP function codes
  323. */
  324.  
  325. #define IRP_MJ_CREATE                     0x00
  326. #define IRP_MJ_CREATE_NAMED_PIPE          0x01
  327. #define IRP_MJ_CLOSE                      0x02
  328. #define IRP_MJ_READ                       0x03
  329. #define IRP_MJ_WRITE                      0x04
  330. #define IRP_MJ_QUERY_INFORMATION          0x05
  331. #define IRP_MJ_SET_INFORMATION            0x06
  332. #define IRP_MJ_QUERY_EA                   0x07
  333. #define IRP_MJ_SET_EA                     0x08
  334. #define IRP_MJ_FLUSH_BUFFERS              0x09
  335. #define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
  336. #define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
  337. #define IRP_MJ_DIRECTORY_CONTROL          0x0c
  338. #define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
  339. #define IRP_MJ_DEVICE_CONTROL             0x0e
  340. #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
  341. #define IRP_MJ_SCSI                       0x0f
  342. #define IRP_MJ_SHUTDOWN                   0x10
  343. #define IRP_MJ_LOCK_CONTROL               0x11
  344. #define IRP_MJ_CLEANUP                    0x12
  345. #define IRP_MJ_CREATE_MAILSLOT            0x13
  346. #define IRP_MJ_QUERY_SECURITY             0x14
  347. #define IRP_MJ_SET_SECURITY               0x15
  348. #define IRP_MJ_POWER                      0x16
  349. #define IRP_MJ_SYSTEM_CONTROL             0x17
  350. #define IRP_MJ_DEVICE_CHANGE              0x18
  351. #define IRP_MJ_QUERY_QUOTA                0x19
  352. #define IRP_MJ_SET_QUOTA                  0x1a
  353. #define IRP_MJ_PNP                        0x1b
  354. #define IRP_MJ_PNP_POWER                  0x1b
  355. #define IRP_MJ_MAXIMUM_FUNCTION           0x1b
  356.  
  357. #define IRP_MN_QUERY_DIRECTORY            0x01
  358. #define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02
  359.  
  360. #define IRP_MN_USER_FS_REQUEST            0x00
  361. #define IRP_MN_MOUNT_VOLUME               0x01
  362. #define IRP_MN_VERIFY_VOLUME              0x02
  363. #define IRP_MN_LOAD_FILE_SYSTEM           0x03
  364. #define IRP_MN_TRACK_LINK                 0x04
  365. #define IRP_MN_KERNEL_CALL                0x04
  366.  
  367. #define IRP_MN_LOCK                       0x01
  368. #define IRP_MN_UNLOCK_SINGLE              0x02
  369. #define IRP_MN_UNLOCK_ALL                 0x03
  370. #define IRP_MN_UNLOCK_ALL_BY_KEY          0x04
  371.  
  372. #define IRP_MN_NORMAL                     0x00
  373. #define IRP_MN_DPC                        0x01
  374. #define IRP_MN_MDL                        0x02
  375. #define IRP_MN_COMPLETE                   0x04
  376. #define IRP_MN_COMPRESSED                 0x08
  377.  
  378. #define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
  379. #define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
  380. #define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
  381.  
  382. #define IRP_MN_SCSI_CLASS                 0x01
  383.  
  384. #define IRP_MN_START_DEVICE               0x00
  385. #define IRP_MN_QUERY_REMOVE_DEVICE        0x01
  386. #define IRP_MN_REMOVE_DEVICE              0x02
  387. #define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
  388. #define IRP_MN_STOP_DEVICE                0x04
  389. #define IRP_MN_QUERY_STOP_DEVICE          0x05
  390. #define IRP_MN_CANCEL_STOP_DEVICE         0x06
  391.  
  392. #define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
  393. #define IRP_MN_QUERY_INTERFACE              0x08
  394. #define IRP_MN_QUERY_CAPABILITIES           0x09
  395. #define IRP_MN_QUERY_RESOURCES              0x0A
  396. #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
  397. #define IRP_MN_QUERY_DEVICE_TEXT            0x0C
  398. #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
  399.  
  400. #define IRP_MN_READ_CONFIG                  0x0F
  401. #define IRP_MN_WRITE_CONFIG                 0x10
  402. #define IRP_MN_EJECT                        0x11
  403. #define IRP_MN_SET_LOCK                     0x12
  404. #define IRP_MN_QUERY_ID                     0x13
  405. #define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
  406. #define IRP_MN_QUERY_BUS_INFORMATION        0x15
  407. #define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
  408. #define IRP_MN_SURPRISE_REMOVAL             0x17
  409. #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
  410.  
  411. #define IRP_MN_WAIT_WAKE                  0x00
  412. #define IRP_MN_POWER_SEQUENCE             0x01
  413. #define IRP_MN_SET_POWER                  0x02
  414. #define IRP_MN_QUERY_POWER                0x03
  415.  
  416. #define IRP_MN_QUERY_ALL_DATA             0x00
  417. #define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
  418. #define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
  419. #define IRP_MN_CHANGE_SINGLE_ITEM         0x03
  420. #define IRP_MN_ENABLE_EVENTS              0x04
  421. #define IRP_MN_DISABLE_EVENTS             0x05
  422. #define IRP_MN_ENABLE_COLLECTION          0x06
  423. #define IRP_MN_DISABLE_COLLECTION         0x07
  424. #define IRP_MN_REGINFO                    0x08
  425. #define IRP_MN_EXECUTE_METHOD             0x09
  426.  
  427. #define IRP_MN_REGINFO_EX                 0x0b
  428.  
  429. typedef enum _IO_ALLOCATION_ACTION {
  430.   KeepObject = 1,
  431.   DeallocateObject,
  432.   DeallocateObjectKeepRegisters
  433. } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
  434.  
  435. typedef IO_ALLOCATION_ACTION DDKAPI
  436. (*PDRIVER_CONTROL)(
  437.   IN struct _DEVICE_OBJECT  *DeviceObject,
  438.   IN struct _IRP  *Irp,
  439.   IN PVOID  MapRegisterBase,
  440.   IN PVOID  Context);
  441.  
  442. typedef VOID DDKAPI
  443. (*PDRIVER_LIST_CONTROL)(
  444.   IN struct _DEVICE_OBJECT  *DeviceObject,
  445.   IN struct _IRP  *Irp,
  446.   IN struct _SCATTER_GATHER_LIST  *ScatterGather,
  447.   IN PVOID  Context);
  448.  
  449. typedef NTSTATUS DDKAPI
  450. (*PDRIVER_ADD_DEVICE)(
  451.   IN struct _DRIVER_OBJECT  *DriverObject,
  452.   IN struct _DEVICE_OBJECT  *PhysicalDeviceObject);
  453.  
  454. typedef NTSTATUS DDKAPI
  455. (*PIO_COMPLETION_ROUTINE)(
  456.   IN struct _DEVICE_OBJECT  *DeviceObject,
  457.   IN struct _IRP  *Irp,
  458.   IN PVOID  Context);
  459.  
  460. typedef VOID DDKAPI
  461. (*PDRIVER_CANCEL)(
  462.   IN struct _DEVICE_OBJECT  *DeviceObject,
  463.   IN struct _IRP  *Irp);
  464.  
  465. typedef VOID DDKAPI
  466. (*PKDEFERRED_ROUTINE)(
  467.   IN struct _KDPC  *Dpc,
  468.   IN PVOID  DeferredContext,
  469.   IN PVOID  SystemArgument1,
  470.   IN PVOID  SystemArgument2);
  471.  
  472. typedef NTSTATUS DDKAPI
  473. (*PDRIVER_DISPATCH)(
  474.   IN struct _DEVICE_OBJECT  *DeviceObject,
  475.   IN struct _IRP  *Irp);
  476.  
  477. typedef VOID DDKAPI
  478. (*PIO_DPC_ROUTINE)(
  479.   IN struct _KDPC  *Dpc,
  480.   IN struct _DEVICE_OBJECT  *DeviceObject,
  481.   IN struct _IRP  *Irp,
  482.   IN PVOID  Context);
  483.  
  484. typedef NTSTATUS DDKAPI
  485. (*PMM_DLL_INITIALIZE)(
  486.   IN PUNICODE_STRING  RegistryPath);
  487.  
  488. typedef NTSTATUS DDKAPI
  489. (*PMM_DLL_UNLOAD)(
  490.   VOID);
  491.  
  492. typedef NTSTATUS DDKAPI
  493. (*PDRIVER_ENTRY)( 
  494.   IN struct _DRIVER_OBJECT  *DriverObject, 
  495.   IN PUNICODE_STRING  RegistryPath); 
  496.  
  497. typedef NTSTATUS DDKAPI
  498. (*PDRIVER_INITIALIZE)(
  499.   IN struct _DRIVER_OBJECT  *DriverObject, 
  500.   IN PUNICODE_STRING  RegistryPath);
  501.  
  502. typedef BOOLEAN DDKAPI
  503. (*PKSERVICE_ROUTINE)(
  504.   IN struct _KINTERRUPT  *Interrupt,
  505.   IN PVOID  ServiceContext);
  506.  
  507. typedef VOID DDKAPI
  508. (*PIO_TIMER_ROUTINE)(
  509.   IN struct _DEVICE_OBJECT  *DeviceObject,
  510.   IN PVOID  Context);
  511.  
  512. typedef VOID DDKAPI
  513. (*PDRIVER_REINITIALIZE)( 
  514.   IN struct _DRIVER_OBJECT  *DriverObject, 
  515.   IN PVOID  Context, 
  516.   IN ULONG  Count); 
  517.  
  518. typedef NTSTATUS DDKAPI
  519. (*PDRIVER_STARTIO)(
  520.   IN struct _DEVICE_OBJECT  *DeviceObject,
  521.   IN struct _IRP  *Irp);
  522.  
  523. typedef BOOLEAN DDKAPI
  524. (*PKSYNCHRONIZE_ROUTINE)(
  525.   IN PVOID  SynchronizeContext);
  526.  
  527. typedef VOID DDKAPI
  528. (*PDRIVER_UNLOAD)( 
  529.   IN struct _DRIVER_OBJECT  *DriverObject); 
  530.  
  531.  
  532.  
  533. /*
  534. ** Plug and Play structures
  535. */
  536.  
  537. typedef VOID DDKAPI
  538. (*PINTERFACE_REFERENCE)(
  539.   PVOID  Context);
  540.  
  541. typedef VOID DDKAPI
  542. (*PINTERFACE_DEREFERENCE)(
  543.   PVOID Context);
  544.  
  545. typedef BOOLEAN DDKAPI
  546. (*PTRANSLATE_BUS_ADDRESS)(
  547.   IN PVOID  Context,
  548.   IN PHYSICAL_ADDRESS  BusAddress,
  549.   IN ULONG  Length,
  550.   IN OUT PULONG  AddressSpace,
  551.   OUT PPHYSICAL_ADDRESS  TranslatedAddress);
  552.  
  553. typedef struct _DMA_ADAPTER* DDKAPI
  554. (*PGET_DMA_ADAPTER)(
  555.   IN PVOID  Context,
  556.   IN struct _DEVICE_DESCRIPTION  *DeviceDescriptor,
  557.   OUT PULONG  NumberOfMapRegisters);
  558.  
  559. typedef ULONG DDKAPI
  560. (*PGET_SET_DEVICE_DATA)(
  561.   IN PVOID  Context,
  562.   IN ULONG  DataType,
  563.   IN PVOID  Buffer,
  564.   IN ULONG  Offset,
  565.   IN ULONG  Length);
  566.  
  567. typedef enum _DEVICE_POWER_STATE {
  568.   PowerDeviceUnspecified,
  569.   PowerDeviceD0,
  570.   PowerDeviceD1,
  571.   PowerDeviceD2,
  572.   PowerDeviceD3,
  573.   PowerDeviceMaximum
  574. } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
  575.  
  576. typedef enum _SYSTEM_POWER_STATE {
  577.   PowerSystemUnspecified,
  578.   PowerSystemWorking,
  579.   PowerSystemSleeping1,
  580.   PowerSystemSleeping2,
  581.   PowerSystemSleeping3,
  582.   PowerSystemHibernate,
  583.   PowerSystemShutdown,
  584.   PowerSystemMaximum
  585. } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
  586.  
  587. typedef union _POWER_STATE {
  588.   SYSTEM_POWER_STATE  SystemState;
  589.   DEVICE_POWER_STATE  DeviceState;
  590. } POWER_STATE, *PPOWER_STATE;
  591.  
  592. typedef enum _POWER_STATE_TYPE {
  593.   SystemPowerState,
  594.   DevicePowerState
  595. } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
  596.  
  597. typedef enum {
  598.   PowerActionNone,
  599.   PowerActionReserved,
  600.   PowerActionSleep,
  601.   PowerActionHibernate,
  602.   PowerActionShutdown,
  603.   PowerActionShutdownReset,
  604.   PowerActionShutdownOff,
  605.   PowerActionWarmEject
  606. } POWER_ACTION, *PPOWER_ACTION;
  607.  
  608. typedef struct _BUS_INTERFACE_STANDARD {
  609.   USHORT  Size;
  610.   USHORT  Version;
  611.   PVOID  Context;
  612.   PINTERFACE_REFERENCE  InterfaceReference;
  613.   PINTERFACE_DEREFERENCE  InterfaceDereference;
  614.   PTRANSLATE_BUS_ADDRESS  TranslateBusAddress;
  615.   PGET_DMA_ADAPTER  GetDmaAdapter;
  616.   PGET_SET_DEVICE_DATA  SetBusData;
  617.   PGET_SET_DEVICE_DATA  GetBusData;
  618. } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
  619.  
  620. typedef struct _DEVICE_CAPABILITIES {
  621.   USHORT  Size;
  622.   USHORT  Version;
  623.   ULONG  DeviceD1 : 1;
  624.   ULONG  DeviceD2 : 1;
  625.   ULONG  LockSupported : 1;
  626.   ULONG  EjectSupported : 1;
  627.   ULONG  Removable : 1;
  628.   ULONG  DockDevice : 1;
  629.   ULONG  UniqueID : 1;
  630.   ULONG  SilentInstall : 1;
  631.   ULONG  RawDeviceOK : 1;
  632.   ULONG  SurpriseRemovalOK : 1;
  633.   ULONG  WakeFromD0 : 1;
  634.   ULONG  WakeFromD1 : 1;
  635.   ULONG  WakeFromD2 : 1;
  636.   ULONG  WakeFromD3 : 1;
  637.   ULONG  HardwareDisabled : 1;
  638.   ULONG  NonDynamic : 1;
  639.   ULONG  WarmEjectSupported : 1;
  640.   ULONG  NoDisplayInUI : 1;
  641.   ULONG  Reserved : 14;
  642.   ULONG  Address;
  643.   ULONG  UINumber;
  644.   DEVICE_POWER_STATE  DeviceState[PowerSystemMaximum];
  645.   SYSTEM_POWER_STATE  SystemWake;
  646.   DEVICE_POWER_STATE  DeviceWake;
  647.   ULONG  D1Latency;
  648.   ULONG  D2Latency;
  649.   ULONG  D3Latency;
  650. } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
  651.  
  652. typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
  653.   USHORT  Version;
  654.   USHORT  Size;
  655.   GUID  Event;
  656.   GUID  InterfaceClassGuid;
  657.   PUNICODE_STRING  SymbolicLinkName;
  658. } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
  659.  
  660. typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
  661.   USHORT  Version;
  662.   USHORT  Size;
  663.   GUID  Event;
  664. } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
  665.  
  666. #undef INTERFACE
  667.  
  668. typedef struct _INTERFACE {
  669.   USHORT  Size;
  670.   USHORT  Version;
  671.   PVOID  Context;
  672.   PINTERFACE_REFERENCE  InterfaceReference;
  673.   PINTERFACE_DEREFERENCE  InterfaceDereference;
  674. } INTERFACE, *PINTERFACE; 
  675.  
  676. typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
  677.   USHORT  Version; 
  678.   USHORT  Size; 
  679.   GUID  Event;
  680. } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
  681.  
  682. typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
  683.  
  684. /* PNP_DEVICE_STATE */
  685.  
  686. #define PNP_DEVICE_DISABLED                      0x00000001
  687. #define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
  688. #define PNP_DEVICE_FAILED                        0x00000004
  689. #define PNP_DEVICE_REMOVED                       0x00000008
  690. #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
  691. #define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
  692.  
  693. typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
  694.   USHORT  Version;
  695.   USHORT  Size;
  696.   GUID  Event;
  697.   struct _FILE_OBJECT  *FileObject;
  698.   LONG  NameBufferOffset;
  699.   UCHAR  CustomDataBuffer[1];
  700. } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
  701.  
  702. typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
  703.   USHORT  Version;
  704.   USHORT  Size;
  705.   GUID  Event;
  706.   struct _FILE_OBJECT  *FileObject;
  707. } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
  708.  
  709. typedef enum _BUS_QUERY_ID_TYPE {
  710.   BusQueryDeviceID,
  711.   BusQueryHardwareIDs,
  712.   BusQueryCompatibleIDs,
  713.   BusQueryInstanceID,
  714.   BusQueryDeviceSerialNumber
  715. } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
  716.  
  717. typedef enum _DEVICE_TEXT_TYPE {
  718.   DeviceTextDescription,
  719.   DeviceTextLocationInformation
  720. } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
  721.  
  722. typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
  723.   DeviceUsageTypeUndefined,
  724.   DeviceUsageTypePaging,
  725.   DeviceUsageTypeHibernation,
  726.   DeviceUsageTypeDumpFile
  727. } DEVICE_USAGE_NOTIFICATION_TYPE;
  728.  
  729. typedef struct _POWER_SEQUENCE {
  730.   ULONG  SequenceD1;
  731.   ULONG  SequenceD2;
  732.   ULONG  SequenceD3;
  733. } POWER_SEQUENCE, *PPOWER_SEQUENCE;
  734.  
  735. typedef enum {
  736.   DevicePropertyDeviceDescription,
  737.   DevicePropertyHardwareID,
  738.   DevicePropertyCompatibleIDs,
  739.   DevicePropertyBootConfiguration,
  740.   DevicePropertyBootConfigurationTranslated,
  741.   DevicePropertyClassName,
  742.   DevicePropertyClassGuid,
  743.   DevicePropertyDriverKeyName,
  744.   DevicePropertyManufacturer,
  745.   DevicePropertyFriendlyName,
  746.   DevicePropertyLocationInformation,
  747.   DevicePropertyPhysicalDeviceObjectName,
  748.   DevicePropertyBusTypeGuid,
  749.   DevicePropertyLegacyBusType,
  750.   DevicePropertyBusNumber,
  751.   DevicePropertyEnumeratorName,
  752.   DevicePropertyAddress,
  753.   DevicePropertyUINumber,
  754.   DevicePropertyInstallState,
  755.   DevicePropertyRemovalPolicy
  756. } DEVICE_REGISTRY_PROPERTY;
  757.  
  758. typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
  759.   EventCategoryReserved,
  760.   EventCategoryHardwareProfileChange,
  761.   EventCategoryDeviceInterfaceChange,
  762.   EventCategoryTargetDeviceChange
  763. } IO_NOTIFICATION_EVENT_CATEGORY;
  764.  
  765. #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
  766.  
  767. typedef NTSTATUS DDKAPI
  768. (*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
  769.   IN PVOID NotificationStructure,
  770.   IN PVOID Context);
  771.  
  772. typedef VOID DDKAPI
  773. (*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
  774.   IN PVOID Context);
  775.  
  776.  
  777.  
  778. /*
  779. ** System structures
  780. */
  781.  
  782. #define SYMBOLIC_LINK_QUERY               0x0001
  783. #define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
  784.  
  785. #define DUPLICATE_CLOSE_SOURCE            0x00000001
  786. #define DUPLICATE_SAME_ACCESS             0x00000002
  787. #define DUPLICATE_SAME_ATTRIBUTES         0x00000004
  788.  
  789. typedef struct _OBJECT_NAME_INFORMATION {               
  790.   UNICODE_STRING  Name;                                
  791. } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;   
  792.  
  793. typedef VOID DDKAPI
  794. (*PIO_APC_ROUTINE)(
  795.   IN PVOID ApcContext,
  796.   IN PIO_STATUS_BLOCK IoStatusBlock,
  797.   IN ULONG Reserved);
  798.  
  799. typedef struct _IO_STATUS_BLOCK {
  800.   union {
  801.     NTSTATUS  Status;
  802.     PVOID  Pointer;
  803.   };
  804.   ULONG_PTR  Information;
  805. } IO_STATUS_BLOCK;
  806.  
  807. typedef VOID DDKAPI
  808. (*PKNORMAL_ROUTINE)(
  809.   IN PVOID  NormalContext,
  810.   IN PVOID  SystemArgument1,
  811.   IN PVOID  SystemArgument2);
  812.  
  813. typedef VOID DDKAPI
  814. (*PKKERNEL_ROUTINE)(
  815.   IN struct _KAPC  *Apc,
  816.   IN OUT PKNORMAL_ROUTINE  *NormalRoutine,
  817.   IN OUT PVOID  *NormalContext,
  818.   IN OUT PVOID  *SystemArgument1,
  819.   IN OUT PVOID  *SystemArgument2);
  820.  
  821. typedef VOID DDKAPI
  822. (*PKRUNDOWN_ROUTINE)(
  823.   IN struct _KAPC  *Apc);
  824.  
  825. typedef BOOLEAN DDKAPI
  826. (*PKTRANSFER_ROUTINE)(
  827.   VOID);
  828.  
  829. typedef struct _KAPC {
  830.   CSHORT  Type;
  831.   CSHORT  Size;
  832.   ULONG  Spare0;
  833.   struct _KTHREAD  *Thread;
  834.   LIST_ENTRY  ApcListEntry;
  835.   PKKERNEL_ROUTINE  KernelRoutine;
  836.   PKRUNDOWN_ROUTINE  RundownRoutine;
  837.   PKNORMAL_ROUTINE  NormalRoutine;
  838.   PVOID  NormalContext;
  839.   PVOID  SystemArgument1;
  840.   PVOID  SystemArgument2;
  841.   CCHAR  ApcStateIndex;
  842.   KPROCESSOR_MODE  ApcMode;
  843.   BOOLEAN  Inserted;
  844. } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
  845.  
  846. typedef struct _KDEVICE_QUEUE {
  847.   CSHORT  Type;
  848.   CSHORT  Size;
  849.   LIST_ENTRY  DeviceListHead;
  850.   KSPIN_LOCK  Lock;
  851.   BOOLEAN  Busy;
  852. } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
  853.  
  854. typedef struct _KDEVICE_QUEUE_ENTRY {
  855.   LIST_ENTRY  DeviceListEntry;
  856.   ULONG  SortKey;
  857.   BOOLEAN  Inserted;
  858. } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
  859. *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
  860.  
  861. #define LOCK_QUEUE_WAIT                   1
  862. #define LOCK_QUEUE_OWNER                  2
  863.  
  864. typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
  865.   LockQueueDispatcherLock,
  866.   LockQueueContextSwapLock,
  867.   LockQueuePfnLock,
  868.   LockQueueSystemSpaceLock,
  869.   LockQueueVacbLock,
  870.   LockQueueMasterLock,
  871.   LockQueueNonPagedPoolLock,
  872.   LockQueueIoCancelLock,
  873.   LockQueueWorkQueueLock,
  874.   LockQueueIoVpbLock,
  875.   LockQueueIoDatabaseLock,
  876.   LockQueueIoCompletionLock,
  877.   LockQueueNtfsStructLock,
  878.   LockQueueAfdWorkQueueLock,
  879.   LockQueueBcbLock,
  880.   LockQueueMaximumLock
  881. } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
  882.  
  883. typedef struct _KSPIN_LOCK_QUEUE {
  884.   struct _KSPIN_LOCK_QUEUE  *VOLATILE Next;
  885.   PKSPIN_LOCK VOLATILE  Lock;
  886. } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
  887.  
  888. typedef struct _KLOCK_QUEUE_HANDLE {
  889.   KSPIN_LOCK_QUEUE  LockQueue;
  890.   KIRQL  OldIrql;
  891. } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
  892.  
  893. typedef struct _KDPC {
  894.   CSHORT  Type;
  895.   UCHAR  Number;
  896.   UCHAR  Importance;
  897.   LIST_ENTRY  DpcListEntry;
  898.   PKDEFERRED_ROUTINE  DeferredRoutine;
  899.   PVOID  DeferredContext;
  900.   PVOID  SystemArgument1;
  901.   PVOID  SystemArgument2;
  902.   PULONG_PTR  Lock;
  903. } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
  904.  
  905. typedef struct _WAIT_CONTEXT_BLOCK {
  906.   KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
  907.   struct _DRIVER_CONTROL  *DeviceRoutine;
  908.   PVOID  DeviceContext;
  909.   ULONG  NumberOfMapRegisters;
  910.   PVOID  DeviceObject;
  911.   PVOID  CurrentIrp;
  912.   PKDPC  BufferChainingDpc;
  913. } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
  914.  
  915. typedef struct _DISPATCHER_HEADER {
  916.   UCHAR  Type;
  917.   UCHAR  Absolute;
  918.   UCHAR  Size;
  919.   UCHAR  Inserted;
  920.   LONG  SignalState;
  921.   LIST_ENTRY  WaitListHead;
  922. } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
  923.  
  924. typedef struct _KEVENT {
  925.   DISPATCHER_HEADER  Header;
  926. } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
  927.  
  928. typedef struct _KSEMAPHORE {
  929.     DISPATCHER_HEADER Header;
  930.     LONG Limit;
  931. } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
  932.  
  933. typedef struct _FAST_MUTEX {
  934.   LONG  Count;
  935.   struct _KTHREAD  *Owner;
  936.   ULONG  Contention;
  937.   KEVENT  Event;
  938.   ULONG  OldIrql;
  939. } FAST_MUTEX, *PFAST_MUTEX;
  940.  
  941. typedef struct _KTIMER {
  942.   DISPATCHER_HEADER  Header;
  943.   ULARGE_INTEGER  DueTime;
  944.   LIST_ENTRY  TimerListEntry;
  945.   struct _KDPC  *Dpc;
  946.   LONG  Period;
  947. } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
  948.  
  949. typedef struct _KMUTANT {
  950.   DISPATCHER_HEADER  Header;
  951.   LIST_ENTRY  MutantListEntry;
  952.   struct _KTHREAD  *RESTRICTED_POINTER OwnerThread;
  953.   BOOLEAN  Abandoned;
  954.   UCHAR  ApcDisable;
  955. } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
  956.  
  957. typedef enum _TIMER_TYPE {
  958.   NotificationTimer,
  959.   SynchronizationTimer
  960. } TIMER_TYPE;
  961.  
  962. #define EVENT_INCREMENT                   1
  963. #define IO_NO_INCREMENT                   0
  964. #define IO_CD_ROM_INCREMENT               1
  965. #define IO_DISK_INCREMENT                 1
  966. #define IO_KEYBOARD_INCREMENT             6
  967. #define IO_MAILSLOT_INCREMENT             2
  968. #define IO_MOUSE_INCREMENT                6
  969. #define IO_NAMED_PIPE_INCREMENT           2
  970. #define IO_NETWORK_INCREMENT              2
  971. #define IO_PARALLEL_INCREMENT             1
  972. #define IO_SERIAL_INCREMENT               2
  973. #define IO_SOUND_INCREMENT                8
  974. #define IO_VIDEO_INCREMENT                1
  975. #define SEMAPHORE_INCREMENT               1
  976.  
  977. typedef struct _IRP {
  978.   CSHORT  Type;
  979.   USHORT  Size;
  980.   struct _MDL  *MdlAddress;
  981.   ULONG  Flags;
  982.   union {
  983.     struct _IRP  *MasterIrp;
  984.     LONG  IrpCount;
  985.     PVOID  SystemBuffer;
  986.   } AssociatedIrp;
  987.   LIST_ENTRY  ThreadListEntry;
  988.   IO_STATUS_BLOCK  IoStatus;
  989.   KPROCESSOR_MODE  RequestorMode;
  990.   BOOLEAN  PendingReturned;
  991.   CHAR  StackCount;
  992.   CHAR  CurrentLocation;
  993.   BOOLEAN  Cancel;
  994.   KIRQL  CancelIrql;
  995.   CCHAR  ApcEnvironment;
  996.   UCHAR  AllocationFlags;
  997.   PIO_STATUS_BLOCK  UserIosb;
  998.   PKEVENT  UserEvent;
  999.   union {
  1000.     struct {
  1001.       PIO_APC_ROUTINE  UserApcRoutine;
  1002.       PVOID  UserApcContext;
  1003.     } AsynchronousParameters;
  1004.     LARGE_INTEGER  AllocationSize;
  1005.   } Overlay;
  1006.   PDRIVER_CANCEL  CancelRoutine;
  1007.   PVOID  UserBuffer;
  1008.   union {
  1009.     struct {
  1010.       union {
  1011.         KDEVICE_QUEUE_ENTRY  DeviceQueueEntry;
  1012.         struct {
  1013.           PVOID  DriverContext[4];
  1014.         };
  1015.       };
  1016.       PETHREAD  Thread;
  1017.       PCHAR  AuxiliaryBuffer;
  1018.       struct {
  1019.         LIST_ENTRY  ListEntry;
  1020.         union {
  1021.           struct _IO_STACK_LOCATION  *CurrentStackLocation;
  1022.           ULONG  PacketType;
  1023.         };
  1024.       };
  1025.       struct _FILE_OBJECT  *OriginalFileObject;
  1026.     } Overlay;
  1027.     KAPC  Apc;
  1028.     PVOID  CompletionKey;
  1029.   } Tail;
  1030. } IRP;
  1031. typedef struct _IRP *PIRP;
  1032.  
  1033. /* IRP.Flags */
  1034.  
  1035. #define SL_FORCE_ACCESS_CHECK             0x01
  1036. #define SL_OPEN_PAGING_FILE               0x02
  1037. #define SL_OPEN_TARGET_DIRECTORY          0x04
  1038. #define SL_CASE_SENSITIVE                 0x80
  1039.  
  1040. #define SL_KEY_SPECIFIED                  0x01
  1041. #define SL_OVERRIDE_VERIFY_VOLUME         0x02
  1042. #define SL_WRITE_THROUGH                  0x04
  1043. #define SL_FT_SEQUENTIAL_WRITE            0x08
  1044.  
  1045. #define SL_FAIL_IMMEDIATELY               0x01
  1046. #define SL_EXCLUSIVE_LOCK                 0x02
  1047.  
  1048. #define SL_RESTART_SCAN                   0x01
  1049. #define SL_RETURN_SINGLE_ENTRY            0x02
  1050. #define SL_INDEX_SPECIFIED                0x04
  1051.  
  1052. #define SL_WATCH_TREE                     0x01
  1053.  
  1054. #define SL_ALLOW_RAW_MOUNT                0x01
  1055.  
  1056. #define CTL_CODE(DeviceType, Function, Method, Access)( \
  1057.   ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
  1058.  
  1059. #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
  1060.  
  1061.  
  1062. typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
  1063.   ULONG  Signature;
  1064. } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
  1065.  
  1066. typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
  1067.   GUID  DiskId;
  1068.   LARGE_INTEGER  StartingUsableOffset;
  1069.   LARGE_INTEGER  UsableLength;
  1070.   ULONG  MaxPartitionCount;
  1071. } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
  1072.  
  1073. typedef struct _PARTITION_INFORMATION_MBR {
  1074.   UCHAR  PartitionType;
  1075.   BOOLEAN  BootIndicator;
  1076.   BOOLEAN  RecognizedPartition;
  1077.   ULONG  HiddenSectors;
  1078. } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
  1079.  
  1080.  
  1081. typedef struct _BOOTDISK_INFORMATION {
  1082.   LONGLONG  BootPartitionOffset;
  1083.   LONGLONG  SystemPartitionOffset;
  1084.   ULONG  BootDeviceSignature;
  1085.   ULONG  SystemDeviceSignature;
  1086. } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
  1087.  
  1088. typedef struct _BOOTDISK_INFORMATION_EX {
  1089.   LONGLONG  BootPartitionOffset;
  1090.   LONGLONG  SystemPartitionOffset;
  1091.   ULONG  BootDeviceSignature;
  1092.   ULONG  SystemDeviceSignature;
  1093.   GUID  BootDeviceGuid;
  1094.   GUID  SystemDeviceGuid;
  1095.   BOOLEAN  BootDeviceIsGpt;
  1096.   BOOLEAN  SystemDeviceIsGpt;
  1097. } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
  1098.  
  1099. typedef struct _EISA_MEMORY_TYPE {
  1100.   UCHAR  ReadWrite : 1;
  1101.   UCHAR  Cached : 1;
  1102.   UCHAR  Reserved0 : 1;
  1103.   UCHAR  Type : 2;
  1104.   UCHAR  Shared : 1;
  1105.   UCHAR  Reserved1 : 1;
  1106.   UCHAR  MoreEntries : 1;
  1107. } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
  1108.  
  1109. typedef struct _EISA_MEMORY_CONFIGURATION {
  1110.   EISA_MEMORY_TYPE  ConfigurationByte;
  1111.   UCHAR  DataSize;
  1112.   USHORT  AddressLowWord;
  1113.   UCHAR  AddressHighByte;
  1114.   USHORT  MemorySize;
  1115. } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
  1116.  
  1117. typedef struct _EISA_IRQ_DESCRIPTOR {
  1118.   UCHAR  Interrupt : 4;
  1119.   UCHAR  Reserved : 1;
  1120.   UCHAR  LevelTriggered : 1;
  1121.   UCHAR  Shared : 1;
  1122.   UCHAR  MoreEntries : 1;
  1123. } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
  1124.  
  1125. typedef struct _EISA_IRQ_CONFIGURATION {
  1126.   EISA_IRQ_DESCRIPTOR  ConfigurationByte;
  1127.   UCHAR  Reserved;
  1128. } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
  1129.  
  1130. typedef struct _DMA_CONFIGURATION_BYTE0 {
  1131.   UCHAR Channel : 3;
  1132.   UCHAR Reserved : 3;
  1133.   UCHAR Shared : 1;
  1134.   UCHAR MoreEntries : 1;
  1135. } DMA_CONFIGURATION_BYTE0;
  1136.  
  1137. typedef struct _DMA_CONFIGURATION_BYTE1 {
  1138.   UCHAR  Reserved0 : 2;
  1139.   UCHAR  TransferSize : 2;
  1140.   UCHAR  Timing : 2;
  1141.   UCHAR  Reserved1 : 2;
  1142. } DMA_CONFIGURATION_BYTE1;
  1143.  
  1144. typedef struct _EISA_DMA_CONFIGURATION {
  1145.   DMA_CONFIGURATION_BYTE0  ConfigurationByte0;
  1146.   DMA_CONFIGURATION_BYTE1  ConfigurationByte1;
  1147. } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
  1148.  
  1149. typedef struct _EISA_PORT_DESCRIPTOR {
  1150.   UCHAR  NumberPorts : 5;
  1151.   UCHAR  Reserved : 1;
  1152.   UCHAR  Shared : 1;
  1153.   UCHAR  MoreEntries : 1;
  1154. } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
  1155.  
  1156. typedef struct _EISA_PORT_CONFIGURATION {
  1157.   EISA_PORT_DESCRIPTOR  Configuration;
  1158.   USHORT  PortAddress;
  1159. } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
  1160.  
  1161. typedef struct _CM_EISA_FUNCTION_INFORMATION {
  1162.   ULONG  CompressedId;
  1163.   UCHAR  IdSlotFlags1;
  1164.   UCHAR  IdSlotFlags2;
  1165.   UCHAR  MinorRevision;
  1166.   UCHAR  MajorRevision;
  1167.   UCHAR  Selections[26];
  1168.   UCHAR  FunctionFlags;
  1169.   UCHAR  TypeString[80];
  1170.   EISA_MEMORY_CONFIGURATION  EisaMemory[9];
  1171.   EISA_IRQ_CONFIGURATION  EisaIrq[7];
  1172.   EISA_DMA_CONFIGURATION  EisaDma[4];
  1173.   EISA_PORT_CONFIGURATION  EisaPort[20];
  1174.   UCHAR  InitializationData[60];
  1175. } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
  1176.  
  1177. /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
  1178.  
  1179. #define EISA_FUNCTION_ENABLED           0x80
  1180. #define EISA_FREE_FORM_DATA             0x40
  1181. #define EISA_HAS_PORT_INIT_ENTRY        0x20
  1182. #define EISA_HAS_PORT_RANGE             0x10
  1183. #define EISA_HAS_DMA_ENTRY              0x08
  1184. #define EISA_HAS_IRQ_ENTRY              0x04
  1185. #define EISA_HAS_MEMORY_ENTRY           0x02
  1186. #define EISA_HAS_TYPE_ENTRY             0x01
  1187. #define EISA_HAS_INFORMATION \
  1188.   EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
  1189.   + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY
  1190.  
  1191. typedef struct _CM_EISA_SLOT_INFORMATION {
  1192.   UCHAR  ReturnCode;
  1193.   UCHAR  ReturnFlags;
  1194.   UCHAR  MajorRevision;
  1195.   UCHAR  MinorRevision;
  1196.   USHORT  Checksum;
  1197.   UCHAR  NumberFunctions;
  1198.   UCHAR  FunctionInformation;
  1199.   ULONG  CompressedId;
  1200. } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
  1201.  
  1202. /* CM_EISA_SLOT_INFORMATION.ReturnCode */
  1203.  
  1204. #define EISA_INVALID_SLOT               0x80
  1205. #define EISA_INVALID_FUNCTION           0x81
  1206. #define EISA_INVALID_CONFIGURATION      0x82
  1207. #define EISA_EMPTY_SLOT                 0x83
  1208. #define EISA_INVALID_BIOS_CALL          0x86
  1209.  
  1210. typedef struct _CM_FLOPPY_DEVICE_DATA {
  1211.   USHORT  Version;
  1212.   USHORT  Revision;
  1213.   CHAR  Size[8];
  1214.   ULONG  MaxDensity;
  1215.   ULONG  MountDensity;
  1216.   UCHAR  StepRateHeadUnloadTime;
  1217.   UCHAR  HeadLoadTime;
  1218.   UCHAR  MotorOffTime;
  1219.   UCHAR  SectorLengthCode;
  1220.   UCHAR  SectorPerTrack;
  1221.   UCHAR  ReadWriteGapLength;
  1222.   UCHAR  DataTransferLength;
  1223.   UCHAR  FormatGapLength;
  1224.   UCHAR  FormatFillCharacter;
  1225.   UCHAR  HeadSettleTime;
  1226.   UCHAR  MotorSettleTime;
  1227.   UCHAR  MaximumTrackValue;
  1228.   UCHAR  DataTransferRate;
  1229. } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
  1230.  
  1231. typedef enum _INTERFACE_TYPE {
  1232.   InterfaceTypeUndefined = -1,
  1233.   Internal,
  1234.   Isa,
  1235.   Eisa,
  1236.   MicroChannel,
  1237.   TurboChannel,
  1238.   PCIBus,
  1239.   VMEBus,
  1240.   NuBus,
  1241.   PCMCIABus,
  1242.   CBus,
  1243.   MPIBus,
  1244.   MPSABus,
  1245.   ProcessorInternal,
  1246.   InternalPowerBus,
  1247.   PNPISABus,
  1248.   PNPBus,
  1249.   MaximumInterfaceType
  1250. } INTERFACE_TYPE, *PINTERFACE_TYPE;
  1251.  
  1252. typedef struct _PNP_BUS_INFORMATION {
  1253.   GUID  BusTypeGuid;
  1254.   INTERFACE_TYPE  LegacyBusType;
  1255.   ULONG  BusNumber;
  1256. } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
  1257.  
  1258. typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
  1259.   UCHAR Type;
  1260.   UCHAR ShareDisposition;
  1261.   USHORT Flags;
  1262.   union {
  1263.     struct {
  1264.       PHYSICAL_ADDRESS Start;
  1265.       ULONG Length;
  1266.     } Generic;
  1267.     struct {
  1268.       PHYSICAL_ADDRESS Start;
  1269.       ULONG Length;
  1270.     } Port;
  1271.     struct {
  1272.       ULONG Level;
  1273.       ULONG Vector;
  1274.       ULONG Affinity;
  1275.     } Interrupt;
  1276.     struct {
  1277.       PHYSICAL_ADDRESS Start;
  1278.       ULONG Length;
  1279.     } Memory;
  1280.     struct {
  1281.       ULONG Channel;
  1282.       ULONG Port;
  1283.       ULONG Reserved1;
  1284.     } Dma;
  1285.     struct {
  1286.       ULONG Data[3];
  1287.     } DevicePrivate;
  1288.     struct {
  1289.       ULONG Start;
  1290.       ULONG Length;
  1291.       ULONG Reserved;
  1292.     } BusNumber;
  1293.     struct {
  1294.       ULONG DataSize;
  1295.       ULONG Reserved1;
  1296.       ULONG Reserved2;
  1297.     } DeviceSpecificData;
  1298.   } u;
  1299. } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
  1300.  
  1301. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
  1302.  
  1303. #define CmResourceTypeNull                0
  1304. #define CmResourceTypePort                1
  1305. #define CmResourceTypeInterrupt           2
  1306. #define CmResourceTypeMemory              3
  1307. #define CmResourceTypeDma                 4
  1308. #define CmResourceTypeDeviceSpecific      5
  1309. #define CmResourceTypeBusNumber           6
  1310. #define CmResourceTypeMaximum             7
  1311. #define CmResourceTypeNonArbitrated     128
  1312. #define CmResourceTypeConfigData        128
  1313. #define CmResourceTypeDevicePrivate     129
  1314. #define CmResourceTypePcCardConfig      130
  1315. #define CmResourceTypeMfCardConfig      131
  1316.  
  1317. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
  1318.  
  1319. typedef enum _CM_SHARE_DISPOSITION {
  1320.   CmResourceShareUndetermined,
  1321.   CmResourceShareDeviceExclusive,
  1322.   CmResourceShareDriverExclusive,
  1323.   CmResourceShareShared
  1324. } CM_SHARE_DISPOSITION;
  1325.  
  1326. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
  1327.  
  1328. #define CM_RESOURCE_PORT_MEMORY           0x0000
  1329. #define CM_RESOURCE_PORT_IO               0x0001
  1330. #define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
  1331. #define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
  1332. #define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
  1333. #define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
  1334. #define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
  1335. #define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
  1336.  
  1337. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
  1338.  
  1339. #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
  1340. #define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
  1341.  
  1342. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
  1343.  
  1344. #define CM_RESOURCE_MEMORY_READ_WRITE     0x0000
  1345. #define CM_RESOURCE_MEMORY_READ_ONLY      0x0001
  1346. #define CM_RESOURCE_MEMORY_WRITE_ONLY     0x0002
  1347. #define CM_RESOURCE_MEMORY_PREFETCHABLE   0x0004
  1348. #define CM_RESOURCE_MEMORY_COMBINEDWRITE  0x0008
  1349. #define CM_RESOURCE_MEMORY_24             0x0010
  1350. #define CM_RESOURCE_MEMORY_CACHEABLE      0x0020
  1351.  
  1352. /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
  1353.  
  1354. #define CM_RESOURCE_DMA_8                 0x0000
  1355. #define CM_RESOURCE_DMA_16                0x0001
  1356. #define CM_RESOURCE_DMA_32                0x0002
  1357. #define CM_RESOURCE_DMA_8_AND_16          0x0004
  1358. #define CM_RESOURCE_DMA_BUS_MASTER        0x0008
  1359. #define CM_RESOURCE_DMA_TYPE_A            0x0010
  1360. #define CM_RESOURCE_DMA_TYPE_B            0x0020
  1361. #define CM_RESOURCE_DMA_TYPE_F            0x0040
  1362.  
  1363. typedef struct _CM_PARTIAL_RESOURCE_LIST {
  1364.   USHORT  Version;
  1365.   USHORT  Revision;
  1366.   ULONG  Count;
  1367.   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
  1368. } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
  1369.  
  1370. typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
  1371.   INTERFACE_TYPE  InterfaceType;
  1372.   ULONG  BusNumber;
  1373.   CM_PARTIAL_RESOURCE_LIST  PartialResourceList;
  1374. } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
  1375.  
  1376. typedef struct _CM_RESOURCE_LIST {
  1377.   ULONG  Count;
  1378.   CM_FULL_RESOURCE_DESCRIPTOR  List[1];
  1379. } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
  1380.  
  1381. typedef struct _CM_INT13_DRIVE_PARAMETER {
  1382.   USHORT  DriveSelect;
  1383.   ULONG  MaxCylinders;
  1384.   USHORT  SectorsPerTrack;
  1385.   USHORT  MaxHeads;
  1386.   USHORT  NumberDrives;
  1387. } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
  1388.  
  1389. typedef struct _CM_KEYBOARD_DEVICE_DATA {
  1390.   USHORT  Version;
  1391.   USHORT  Revision;
  1392.   UCHAR  Type;
  1393.   UCHAR  Subtype;
  1394.   USHORT  KeyboardFlags;
  1395. } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
  1396.  
  1397. #define KEYBOARD_INSERT_ON                0x80
  1398. #define KEYBOARD_CAPS_LOCK_ON             0x40
  1399. #define KEYBOARD_NUM_LOCK_ON              0x20
  1400. #define KEYBOARD_SCROLL_LOCK_ON           0x10
  1401. #define KEYBOARD_ALT_KEY_DOWN             0x08
  1402. #define KEYBOARD_CTRL_KEY_DOWN            0x04
  1403. #define KEYBOARD_LEFT_SHIFT_DOWN          0x02
  1404. #define KEYBOARD_RIGHT_SHIFT_DOWN         0x01
  1405.  
  1406. typedef struct _CM_MCA_POS_DATA {
  1407.   USHORT  AdapterId;
  1408.   UCHAR  PosData1;
  1409.   UCHAR  PosData2;
  1410.   UCHAR  PosData3;
  1411.   UCHAR  PosData4;
  1412. } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
  1413.  
  1414. typedef struct CM_Power_Data_s {
  1415.   ULONG  PD_Size;
  1416.   DEVICE_POWER_STATE  PD_MostRecentPowerState;
  1417.   ULONG  PD_Capabilities;
  1418.   ULONG  PD_D1Latency;
  1419.   ULONG  PD_D2Latency;
  1420.   ULONG  PD_D3Latency;
  1421.   DEVICE_POWER_STATE  PD_PowerStateMapping[PowerSystemMaximum];
  1422. } CM_POWER_DATA, *PCM_POWER_DATA;
  1423.  
  1424. #define PDCAP_D0_SUPPORTED                0x00000001
  1425. #define PDCAP_D1_SUPPORTED                0x00000002
  1426. #define PDCAP_D2_SUPPORTED                0x00000004
  1427. #define PDCAP_D3_SUPPORTED                0x00000008
  1428. #define PDCAP_WAKE_FROM_D0_SUPPORTED      0x00000010
  1429. #define PDCAP_WAKE_FROM_D1_SUPPORTED      0x00000020
  1430. #define PDCAP_WAKE_FROM_D2_SUPPORTED      0x00000040
  1431. #define PDCAP_WAKE_FROM_D3_SUPPORTED      0x00000080
  1432. #define PDCAP_WARM_EJECT_SUPPORTED        0x00000100
  1433.  
  1434. typedef struct _CM_SCSI_DEVICE_DATA {
  1435.   USHORT  Version;
  1436.   USHORT  Revision;
  1437.   UCHAR  HostIdentifier;
  1438. } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
  1439.  
  1440. typedef struct _CM_SERIAL_DEVICE_DATA {
  1441.   USHORT  Version;
  1442.   USHORT  Revision;
  1443.   ULONG  BaudClock;
  1444. } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
  1445.  
  1446. /* IO_RESOURCE_DESCRIPTOR.Option */
  1447.  
  1448. #define IO_RESOURCE_PREFERRED             0x01
  1449. #define IO_RESOURCE_DEFAULT               0x02
  1450. #define IO_RESOURCE_ALTERNATIVE           0x08
  1451.  
  1452. typedef struct _IO_RESOURCE_DESCRIPTOR {
  1453.   UCHAR  Option;
  1454.   UCHAR  Type;
  1455.   UCHAR  ShareDisposition;
  1456.   UCHAR  Spare1;
  1457.   USHORT  Flags;
  1458.   USHORT  Spare2;
  1459.   union {
  1460.     struct {
  1461.       ULONG  Length;
  1462.       ULONG  Alignment;
  1463.       PHYSICAL_ADDRESS  MinimumAddress;
  1464.       PHYSICAL_ADDRESS  MaximumAddress;
  1465.     } Port;
  1466.     struct {
  1467.       ULONG  Length;
  1468.       ULONG  Alignment;
  1469.       PHYSICAL_ADDRESS  MinimumAddress;
  1470.       PHYSICAL_ADDRESS  MaximumAddress;
  1471.     } Memory;
  1472.     struct {
  1473.       ULONG  MinimumVector;
  1474.       ULONG  MaximumVector;
  1475.     } Interrupt;
  1476.     struct {
  1477.       ULONG  MinimumChannel;
  1478.       ULONG  MaximumChannel;
  1479.     } Dma;
  1480.     struct {
  1481.       ULONG  Length;
  1482.       ULONG  Alignment;
  1483.       PHYSICAL_ADDRESS  MinimumAddress;
  1484.       PHYSICAL_ADDRESS  MaximumAddress;
  1485.     } Generic;
  1486.     struct {
  1487.       ULONG  Data[3];
  1488.     } DevicePrivate;
  1489.     struct {
  1490.       ULONG  Length;
  1491.       ULONG  MinBusNumber;
  1492.       ULONG  MaxBusNumber;
  1493.       ULONG  Reserved;
  1494.     } BusNumber;
  1495.     struct {
  1496.       ULONG  Priority;
  1497.       ULONG  Reserved1;
  1498.       ULONG  Reserved2;
  1499.     } ConfigData;
  1500.   } u;
  1501. } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
  1502.  
  1503. typedef struct _IO_RESOURCE_LIST {
  1504.   USHORT  Version;
  1505.   USHORT  Revision;
  1506.   ULONG  Count;
  1507.   IO_RESOURCE_DESCRIPTOR  Descriptors[1];
  1508. } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
  1509.  
  1510. typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
  1511.   ULONG  ListSize;
  1512.   INTERFACE_TYPE  InterfaceType;
  1513.   ULONG  BusNumber;
  1514.   ULONG  SlotNumber;
  1515.   ULONG  Reserved[3];
  1516.   ULONG  AlternativeLists;
  1517.   IO_RESOURCE_LIST  List[1];
  1518. } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
  1519.  
  1520. typedef struct _CONTROLLER_OBJECT {
  1521.   CSHORT  Type;
  1522.   CSHORT  Size;
  1523.   PVOID  ControllerExtension;
  1524.   KDEVICE_QUEUE  DeviceWaitQueue;
  1525.   ULONG  Spare1;
  1526.   LARGE_INTEGER  Spare2;
  1527. } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
  1528.  
  1529. typedef enum _DMA_WIDTH {
  1530.   Width8Bits,
  1531.   Width16Bits,
  1532.   Width32Bits,
  1533.   MaximumDmaWidth
  1534. } DMA_WIDTH, *PDMA_WIDTH;
  1535.  
  1536. typedef enum _DMA_SPEED {
  1537.   Compatible,
  1538.   TypeA,
  1539.   TypeB,
  1540.   TypeC,
  1541.   TypeF,
  1542.   MaximumDmaSpeed
  1543. } DMA_SPEED, *PDMA_SPEED;
  1544.  
  1545. /* DEVICE_DESCRIPTION.Version */
  1546.  
  1547. #define DEVICE_DESCRIPTION_VERSION        0x0000
  1548. #define DEVICE_DESCRIPTION_VERSION1       0x0001
  1549. #define DEVICE_DESCRIPTION_VERSION2       0x0002
  1550.  
  1551. typedef struct _DEVICE_DESCRIPTION {
  1552.   ULONG  Version;
  1553.   BOOLEAN  Master;
  1554.   BOOLEAN  ScatterGather;
  1555.   BOOLEAN  DemandMode;
  1556.   BOOLEAN  AutoInitialize;
  1557.   BOOLEAN  Dma32BitAddresses;
  1558.   BOOLEAN  IgnoreCount;
  1559.   BOOLEAN  Reserved1;
  1560.   BOOLEAN  Dma64BitAddresses;
  1561.   ULONG  BusNumber; 
  1562.   ULONG  DmaChannel;
  1563.   INTERFACE_TYPE  InterfaceType;
  1564.   DMA_WIDTH  DmaWidth;
  1565.   DMA_SPEED  DmaSpeed;
  1566.   ULONG  MaximumLength;
  1567.   ULONG  DmaPort;
  1568. } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
  1569.  
  1570. /* VPB.Flags */
  1571. #define VPB_MOUNTED                       0x0001
  1572. #define VPB_LOCKED                        0x0002
  1573. #define VPB_PERSISTENT                    0x0004
  1574. #define VPB_REMOVE_PENDING                0x0008
  1575. #define VPB_RAW_MOUNT                     0x0010
  1576.  
  1577. #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
  1578.  
  1579. typedef struct _VPB {
  1580.   CSHORT  Type;
  1581.   CSHORT  Size;
  1582.   USHORT  Flags;
  1583.   USHORT  VolumeLabelLength;
  1584.   struct _DEVICE_OBJECT  *DeviceObject;
  1585.   struct _DEVICE_OBJECT  *RealDevice;
  1586.   ULONG  SerialNumber;
  1587.   ULONG  ReferenceCount;
  1588.   WCHAR  VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
  1589. } VPB, *PVPB;
  1590.  
  1591. /* DEVICE_OBJECT.Flags */
  1592.  
  1593. #define DO_VERIFY_VOLUME                  0x00000002      
  1594. #define DO_BUFFERED_IO                    0x00000004      
  1595. #define DO_EXCLUSIVE                      0x00000008      
  1596. #define DO_DIRECT_IO                      0x00000010      
  1597. #define DO_MAP_IO_BUFFER                  0x00000020      
  1598. #define DO_DEVICE_HAS_NAME                0x00000040      
  1599. #define DO_DEVICE_INITIALIZING            0x00000080      
  1600. #define DO_SYSTEM_BOOT_PARTITION          0x00000100      
  1601. #define DO_LONG_TERM_REQUESTS             0x00000200      
  1602. #define DO_NEVER_LAST_DEVICE              0x00000400      
  1603. #define DO_SHUTDOWN_REGISTERED            0x00000800      
  1604. #define DO_BUS_ENUMERATED_DEVICE          0x00001000      
  1605. #define DO_POWER_PAGABLE                  0x00002000      
  1606. #define DO_POWER_INRUSH                   0x00004000      
  1607. #define DO_LOW_PRIORITY_FILESYSTEM        0x00010000      
  1608.  
  1609. /* DEVICE_OBJECT.Characteristics */
  1610.  
  1611. #define FILE_REMOVABLE_MEDIA            0x00000001
  1612. #define FILE_READ_ONLY_DEVICE           0x00000002
  1613. #define FILE_FLOPPY_DISKETTE            0x00000004
  1614. #define FILE_WRITE_ONCE_MEDIA           0x00000008
  1615. #define FILE_REMOTE_DEVICE              0x00000010
  1616. #define FILE_DEVICE_IS_MOUNTED          0x00000020
  1617. #define FILE_VIRTUAL_VOLUME             0x00000040
  1618. #define FILE_AUTOGENERATED_DEVICE_NAME  0x00000080
  1619. #define FILE_DEVICE_SECURE_OPEN         0x00000100
  1620.  
  1621. /* DEVICE_OBJECT.AlignmentRequirement */
  1622.  
  1623. #define FILE_BYTE_ALIGNMENT             0x00000000
  1624. #define FILE_WORD_ALIGNMENT             0x00000001
  1625. #define FILE_LONG_ALIGNMENT             0x00000003
  1626. #define FILE_QUAD_ALIGNMENT             0x00000007
  1627. #define FILE_OCTA_ALIGNMENT             0x0000000f
  1628. #define FILE_32_BYTE_ALIGNMENT          0x0000001f
  1629. #define FILE_64_BYTE_ALIGNMENT          0x0000003f
  1630. #define FILE_128_BYTE_ALIGNMENT         0x0000007f
  1631. #define FILE_256_BYTE_ALIGNMENT         0x000000ff
  1632. #define FILE_512_BYTE_ALIGNMENT         0x000001ff
  1633.  
  1634. /* DEVICE_OBJECT.DeviceType */
  1635.  
  1636. #define DEVICE_TYPE ULONG
  1637.  
  1638. #define FILE_DEVICE_BEEP                  0x00000001
  1639. #define FILE_DEVICE_CD_ROM                0x00000002
  1640. #define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
  1641. #define FILE_DEVICE_CONTROLLER            0x00000004
  1642. #define FILE_DEVICE_DATALINK              0x00000005
  1643. #define FILE_DEVICE_DFS                   0x00000006
  1644. #define FILE_DEVICE_DISK                  0x00000007
  1645. #define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
  1646. #define FILE_DEVICE_FILE_SYSTEM           0x00000009
  1647. #define FILE_DEVICE_INPORT_PORT           0x0000000a
  1648. #define FILE_DEVICE_KEYBOARD              0x0000000b
  1649. #define FILE_DEVICE_MAILSLOT              0x0000000c
  1650. #define FILE_DEVICE_MIDI_IN               0x0000000d
  1651. #define FILE_DEVICE_MIDI_OUT              0x0000000e
  1652. #define FILE_DEVICE_MOUSE                 0x0000000f
  1653. #define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
  1654. #define FILE_DEVICE_NAMED_PIPE            0x00000011
  1655. #define FILE_DEVICE_NETWORK               0x00000012
  1656. #define FILE_DEVICE_NETWORK_BROWSER       0x00000013
  1657. #define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
  1658. #define FILE_DEVICE_NULL                  0x00000015
  1659. #define FILE_DEVICE_PARALLEL_PORT         0x00000016
  1660. #define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
  1661. #define FILE_DEVICE_PRINTER               0x00000018
  1662. #define FILE_DEVICE_SCANNER               0x00000019
  1663. #define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
  1664. #define FILE_DEVICE_SERIAL_PORT           0x0000001b
  1665. #define FILE_DEVICE_SCREEN                0x0000001c
  1666. #define FILE_DEVICE_SOUND                 0x0000001d
  1667. #define FILE_DEVICE_STREAMS               0x0000001e
  1668. #define FILE_DEVICE_TAPE                  0x0000001f
  1669. #define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
  1670. #define FILE_DEVICE_TRANSPORT             0x00000021
  1671. #define FILE_DEVICE_UNKNOWN               0x00000022
  1672. #define FILE_DEVICE_VIDEO                 0x00000023
  1673. #define FILE_DEVICE_VIRTUAL_DISK          0x00000024
  1674. #define FILE_DEVICE_WAVE_IN               0x00000025
  1675. #define FILE_DEVICE_WAVE_OUT              0x00000026
  1676. #define FILE_DEVICE_8042_PORT             0x00000027
  1677. #define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
  1678. #define FILE_DEVICE_BATTERY               0x00000029
  1679. #define FILE_DEVICE_BUS_EXTENDER          0x0000002a
  1680. #define FILE_DEVICE_MODEM                 0x0000002b
  1681. #define FILE_DEVICE_VDM                   0x0000002c
  1682. #define FILE_DEVICE_MASS_STORAGE          0x0000002d
  1683. #define FILE_DEVICE_SMB                   0x0000002e
  1684. #define FILE_DEVICE_KS                    0x0000002f
  1685. #define FILE_DEVICE_CHANGER               0x00000030
  1686. #define FILE_DEVICE_SMARTCARD             0x00000031
  1687. #define FILE_DEVICE_ACPI                  0x00000032
  1688. #define FILE_DEVICE_DVD                   0x00000033
  1689. #define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
  1690. #define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
  1691. #define FILE_DEVICE_DFS_VOLUME            0x00000036
  1692. #define FILE_DEVICE_SERENUM               0x00000037
  1693. #define FILE_DEVICE_TERMSRV               0x00000038
  1694. #define FILE_DEVICE_KSEC                  0x00000039
  1695. #define FILE_DEVICE_FIPS                      0x0000003a
  1696.  
  1697. typedef struct _DEVICE_OBJECT {
  1698.   CSHORT  Type;
  1699.   USHORT  Size;
  1700.   LONG  ReferenceCount;
  1701.   struct _DRIVER_OBJECT  *DriverObject;
  1702.   struct _DEVICE_OBJECT  *NextDevice;
  1703.   struct _DEVICE_OBJECT  *AttachedDevice;
  1704.   struct _IRP  *CurrentIrp;
  1705.   PIO_TIMER  Timer;
  1706.   ULONG  Flags;
  1707.   ULONG  Characteristics;
  1708.   PVPB  Vpb;
  1709.   PVOID  DeviceExtension;
  1710.   DEVICE_TYPE  DeviceType;
  1711.   CCHAR  StackSize;
  1712.   union {
  1713.     LIST_ENTRY  ListEntry;
  1714.     WAIT_CONTEXT_BLOCK  Wcb;
  1715.   } Queue;
  1716.   ULONG  AlignmentRequirement;
  1717.   KDEVICE_QUEUE  DeviceQueue;
  1718.   KDPC  Dpc;
  1719.   ULONG  ActiveThreadCount;
  1720.   PSECURITY_DESCRIPTOR  SecurityDescriptor;
  1721.   KEVENT  DeviceLock;
  1722.   USHORT  SectorSize;
  1723.   USHORT  Spare1;
  1724.   struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
  1725.   PVOID  Reserved;
  1726. } DEVICE_OBJECT;
  1727. typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
  1728.  
  1729. typedef enum _DEVICE_RELATION_TYPE {
  1730.   BusRelations,
  1731.   EjectionRelations,
  1732.   PowerRelations,
  1733.   RemovalRelations,
  1734.   TargetDeviceRelation,
  1735.   SingleBusRelations
  1736. } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
  1737.  
  1738. typedef struct _DEVICE_RELATIONS {
  1739.   ULONG  Count;
  1740.   PDEVICE_OBJECT Objects[1];
  1741. } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
  1742.  
  1743. typedef struct _SCATTER_GATHER_ELEMENT {
  1744.   PHYSICAL_ADDRESS  Address;   
  1745.   ULONG  Length;          
  1746.   ULONG_PTR  Reserved;
  1747. } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
  1748.  
  1749. typedef struct _SCATTER_GATHER_LIST {
  1750.   ULONG  NumberOfElements;
  1751.   ULONG_PTR  Reserved;
  1752.   SCATTER_GATHER_ELEMENT  Elements[0];
  1753. } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
  1754.  
  1755. typedef struct _MDL {
  1756.   struct _MDL  *Next;
  1757.   CSHORT  Size;
  1758.   CSHORT  MdlFlags;
  1759.   struct _EPROCESS  *Process;
  1760.   PVOID  MappedSystemVa;
  1761.   PVOID  StartVa;
  1762.   ULONG  ByteCount;
  1763.   ULONG  ByteOffset;
  1764. } MDL, *PMDL;
  1765.  
  1766. #define MDL_MAPPED_TO_SYSTEM_VA           0x0001
  1767. #define MDL_PAGES_LOCKED                  0x0002
  1768. #define MDL_SOURCE_IS_NONPAGED_POOL       0x0004
  1769. #define MDL_ALLOCATED_FIXED_SIZE          0x0008
  1770. #define MDL_PARTIAL                       0x0010
  1771. #define MDL_PARTIAL_HAS_BEEN_MAPPED       0x0020
  1772. #define MDL_IO_PAGE_READ                  0x0040
  1773. #define MDL_WRITE_OPERATION               0x0080
  1774. #define MDL_PARENT_MAPPED_SYSTEM_VA       0x0100
  1775. #define MDL_FREE_EXTRA_PTES               0x0200
  1776. #define MDL_IO_SPACE                      0x0800
  1777. #define MDL_NETWORK_HEADER                0x1000
  1778. #define MDL_MAPPING_CAN_FAIL              0x2000
  1779. #define MDL_ALLOCATED_MUST_SUCCEED        0x4000
  1780.  
  1781. #define MDL_MAPPING_FLAGS ( \
  1782.   MDL_MAPPED_TO_SYSTEM_VA     | \
  1783.   MDL_PAGES_LOCKED            | \
  1784.   MDL_SOURCE_IS_NONPAGED_POOL | \
  1785.   MDL_PARTIAL_HAS_BEEN_MAPPED | \
  1786.   MDL_PARENT_MAPPED_SYSTEM_VA | \
  1787.   MDL_SYSTEM_VA               | \
  1788.   MDL_IO_SPACE)
  1789.  
  1790. typedef VOID DDKAPI
  1791. (*PPUT_DMA_ADAPTER)(
  1792.   IN PDMA_ADAPTER  DmaAdapter);
  1793.  
  1794. typedef PVOID DDKAPI
  1795. (*PALLOCATE_COMMON_BUFFER)(
  1796.   IN PDMA_ADAPTER  DmaAdapter,
  1797.   IN ULONG  Length,
  1798.   OUT PPHYSICAL_ADDRESS  LogicalAddress,
  1799.   IN BOOLEAN  CacheEnabled);
  1800.  
  1801. typedef VOID DDKAPI
  1802. (*PFREE_COMMON_BUFFER)(
  1803.   IN PDMA_ADAPTER  DmaAdapter,
  1804.   IN ULONG  Length,
  1805.   IN PHYSICAL_ADDRESS  LogicalAddress,
  1806.   IN PVOID  VirtualAddress,
  1807.   IN BOOLEAN  CacheEnabled);
  1808.  
  1809. typedef NTSTATUS DDKAPI
  1810. (*PALLOCATE_ADAPTER_CHANNEL)(
  1811.   IN PDMA_ADAPTER  DmaAdapter,
  1812.   IN PDEVICE_OBJECT  DeviceObject,
  1813.   IN ULONG  NumberOfMapRegisters,
  1814.   IN PDRIVER_CONTROL  ExecutionRoutine,
  1815.   IN PVOID  Context);
  1816.  
  1817. typedef BOOLEAN DDKAPI
  1818. (*PFLUSH_ADAPTER_BUFFERS)(
  1819.   IN PDMA_ADAPTER  DmaAdapter,
  1820.   IN PMDL  Mdl,
  1821.   IN PVOID  MapRegisterBase,
  1822.   IN PVOID  CurrentVa,
  1823.   IN ULONG  Length,
  1824.   IN BOOLEAN  WriteToDevice);
  1825.  
  1826. typedef VOID DDKAPI
  1827. (*PFREE_ADAPTER_CHANNEL)(
  1828.   IN PDMA_ADAPTER  DmaAdapter);
  1829.  
  1830. typedef VOID DDKAPI
  1831. (*PFREE_MAP_REGISTERS)(
  1832.   IN PDMA_ADAPTER  DmaAdapter,
  1833.   PVOID  MapRegisterBase,
  1834.   ULONG  NumberOfMapRegisters);
  1835.  
  1836. typedef PHYSICAL_ADDRESS DDKAPI
  1837. (*PMAP_TRANSFER)(
  1838.   IN PDMA_ADAPTER  DmaAdapter,
  1839.   IN PMDL  Mdl,
  1840.   IN PVOID  MapRegisterBase,
  1841.   IN PVOID  CurrentVa,
  1842.   IN OUT PULONG  Length,
  1843.   IN BOOLEAN  WriteToDevice);
  1844.  
  1845. typedef ULONG DDKAPI
  1846. (*PGET_DMA_ALIGNMENT)(
  1847.   IN PDMA_ADAPTER  DmaAdapter);
  1848.  
  1849. typedef ULONG DDKAPI
  1850. (*PREAD_DMA_COUNTER)(
  1851.   IN PDMA_ADAPTER  DmaAdapter);
  1852.  
  1853. typedef NTSTATUS DDKAPI
  1854. (*PGET_SCATTER_GATHER_LIST)(
  1855.   IN PDMA_ADAPTER  DmaAdapter,
  1856.   IN PDEVICE_OBJECT  DeviceObject,
  1857.   IN PMDL  Mdl,
  1858.   IN PVOID  CurrentVa,
  1859.   IN ULONG  Length,
  1860.   IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
  1861.   IN PVOID  Context,
  1862.   IN BOOLEAN  WriteToDevice);
  1863.  
  1864. typedef VOID DDKAPI
  1865. (*PPUT_SCATTER_GATHER_LIST)(
  1866.   IN PDMA_ADAPTER  DmaAdapter,
  1867.   IN PSCATTER_GATHER_LIST  ScatterGather,
  1868.   IN BOOLEAN  WriteToDevice);
  1869.  
  1870. typedef NTSTATUS DDKAPI
  1871. (*PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
  1872.   IN PDMA_ADAPTER  DmaAdapter,
  1873.   IN PMDL  Mdl  OPTIONAL,
  1874.   IN PVOID  CurrentVa,
  1875.   IN ULONG  Length,
  1876.   OUT PULONG  ScatterGatherListSize,
  1877.   OUT PULONG  pNumberOfMapRegisters  OPTIONAL);
  1878.  
  1879. typedef NTSTATUS DDKAPI
  1880. (*PBUILD_SCATTER_GATHER_LIST)(
  1881.   IN PDMA_ADAPTER  DmaAdapter,
  1882.   IN PDEVICE_OBJECT  DeviceObject,
  1883.   IN PMDL  Mdl,
  1884.   IN PVOID  CurrentVa,
  1885.   IN ULONG  Length,
  1886.   IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
  1887.   IN PVOID  Context,
  1888.   IN BOOLEAN  WriteToDevice,
  1889.   IN PVOID  ScatterGatherBuffer,
  1890.   IN ULONG  ScatterGatherLength);
  1891.  
  1892. typedef NTSTATUS DDKAPI
  1893. (*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
  1894.   IN PDMA_ADAPTER  DmaAdapter,
  1895.   IN PSCATTER_GATHER_LIST  ScatterGather,
  1896.   IN PMDL  OriginalMdl,
  1897.   OUT PMDL  *TargetMdl);
  1898.  
  1899. typedef struct _DMA_OPERATIONS {
  1900.   ULONG  Size;
  1901.   PPUT_DMA_ADAPTER  PutDmaAdapter;
  1902.   PALLOCATE_COMMON_BUFFER  AllocateCommonBuffer;
  1903.   PFREE_COMMON_BUFFER  FreeCommonBuffer;
  1904.   PALLOCATE_ADAPTER_CHANNEL  AllocateAdapterChannel;
  1905.   PFLUSH_ADAPTER_BUFFERS  FlushAdapterBuffers;
  1906.   PFREE_ADAPTER_CHANNEL  FreeAdapterChannel;
  1907.   PFREE_MAP_REGISTERS  FreeMapRegisters;
  1908.   PMAP_TRANSFER  MapTransfer;
  1909.   PGET_DMA_ALIGNMENT  GetDmaAlignment;
  1910.   PREAD_DMA_COUNTER  ReadDmaCounter;
  1911.   PGET_SCATTER_GATHER_LIST  GetScatterGatherList;
  1912.   PPUT_SCATTER_GATHER_LIST  PutScatterGatherList;
  1913.   PCALCULATE_SCATTER_GATHER_LIST_SIZE  CalculateScatterGatherList;
  1914.   PBUILD_SCATTER_GATHER_LIST  BuildScatterGatherList;
  1915.   PBUILD_MDL_FROM_SCATTER_GATHER_LIST  BuildMdlFromScatterGatherList;
  1916. } DMA_OPERATIONS, *PDMA_OPERATIONS;
  1917.  
  1918. typedef struct _DMA_ADAPTER {
  1919.   USHORT  Version;
  1920.   USHORT  Size;
  1921.   PDMA_OPERATIONS  DmaOperations;
  1922. } DMA_ADAPTER;
  1923.  
  1924. typedef enum _FILE_INFORMATION_CLASS {
  1925.   FileDirectoryInformation = 1,
  1926.   FileFullDirectoryInformation,
  1927.   FileBothDirectoryInformation,
  1928.   FileBasicInformation,
  1929.   FileStandardInformation,
  1930.   FileInternalInformation,
  1931.   FileEaInformation,
  1932.   FileAccessInformation,
  1933.   FileNameInformation,
  1934.   FileRenameInformation,
  1935.   FileLinkInformation,
  1936.   FileNamesInformation,
  1937.   FileDispositionInformation,
  1938.   FilePositionInformation,
  1939.   FileFullEaInformation,
  1940.   FileModeInformation,
  1941.   FileAlignmentInformation,
  1942.   FileAllInformation,
  1943.   FileAllocationInformation,
  1944.   FileEndOfFileInformation,
  1945.   FileAlternateNameInformation,
  1946.   FileStreamInformation,
  1947.   FilePipeInformation,
  1948.   FilePipeLocalInformation,
  1949.   FilePipeRemoteInformation,
  1950.   FileMailslotQueryInformation,
  1951.   FileMailslotSetInformation,
  1952.   FileCompressionInformation,
  1953.   FileObjectIdInformation,
  1954.   FileCompletionInformation,
  1955.   FileMoveClusterInformation,
  1956.   FileQuotaInformation,
  1957.   FileReparsePointInformation,
  1958.   FileNetworkOpenInformation,
  1959.   FileAttributeTagInformation,
  1960.   FileTrackingInformation,
  1961.   FileIdBothDirectoryInformation,
  1962.   FileIdFullDirectoryInformation,
  1963.   FileValidDataLengthInformation,
  1964.   FileShortNameInformation,
  1965.   FileMaximumInformation
  1966. } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
  1967.  
  1968. typedef struct _FILE_POSITION_INFORMATION {                 
  1969.   LARGE_INTEGER  CurrentByteOffset;                        
  1970. } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;   
  1971.  
  1972. typedef struct _FILE_ALIGNMENT_INFORMATION {
  1973.   ULONG  AlignmentRequirement;
  1974. } FILE_ALIGNMENT_INFORMATION;
  1975.  
  1976. typedef struct _FILE_NAME_INFORMATION {                     
  1977.   ULONG  FileNameLength;                                   
  1978.   WCHAR  FileName[1];                                      
  1979. } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;           
  1980.  
  1981. typedef struct FILE_BASIC_INFORMATION {
  1982.   LARGE_INTEGER  CreationTime;
  1983.   LARGE_INTEGER  LastAccessTime;
  1984.   LARGE_INTEGER  LastWriteTime;
  1985.   LARGE_INTEGER  ChangeTime;
  1986.   ULONG  FileAttributes;
  1987. } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
  1988.  
  1989. typedef struct _FILE_STANDARD_INFORMATION {
  1990.   LARGE_INTEGER  AllocationSize;
  1991.   LARGE_INTEGER  EndOfFile;
  1992.   ULONG  NumberOfLinks;
  1993.   BOOLEAN  DeletePending;
  1994.   BOOLEAN  Directory;
  1995. } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
  1996.  
  1997. typedef struct _FILE_NETWORK_OPEN_INFORMATION {                 
  1998.   LARGE_INTEGER  CreationTime;                                 
  1999.   LARGE_INTEGER  LastAccessTime;                               
  2000.   LARGE_INTEGER  LastWriteTime;                                
  2001.   LARGE_INTEGER  ChangeTime;                                   
  2002.   LARGE_INTEGER  AllocationSize;                               
  2003.   LARGE_INTEGER  EndOfFile;                                    
  2004.   ULONG  FileAttributes;                                       
  2005. } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;   
  2006.  
  2007. typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {               
  2008.   ULONG  FileAttributes;                                       
  2009.   ULONG  ReparseTag;                                           
  2010. } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
  2011.  
  2012. typedef struct _FILE_DISPOSITION_INFORMATION {                  
  2013.   BOOLEAN  DoDeleteFile;                                         
  2014. } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; 
  2015.                                                                 
  2016. typedef struct _FILE_END_OF_FILE_INFORMATION {                  
  2017.   LARGE_INTEGER  EndOfFile;                                    
  2018. } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; 
  2019.                                                                 
  2020. typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {                                    
  2021.   LARGE_INTEGER  ValidDataLength;                                                      
  2022. } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;             
  2023.  
  2024. typedef enum _FSINFOCLASS {
  2025.   FileFsVolumeInformation = 1,
  2026.   FileFsLabelInformation,
  2027.   FileFsSizeInformation,
  2028.   FileFsDeviceInformation,
  2029.   FileFsAttributeInformation,
  2030.   FileFsControlInformation,
  2031.   FileFsFullSizeInformation,
  2032.   FileFsObjectIdInformation,
  2033.   FileFsDriverPathInformation,
  2034.   FileFsMaximumInformation
  2035. } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
  2036.  
  2037. typedef struct _FILE_FS_DEVICE_INFORMATION {
  2038.   DEVICE_TYPE  DeviceType;
  2039.   ULONG  Characteristics;
  2040. } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
  2041.  
  2042. typedef struct _FILE_FULL_EA_INFORMATION {
  2043.   ULONG  NextEntryOffset;
  2044.   UCHAR  Flags;
  2045.   UCHAR  EaNameLength;
  2046.   USHORT  EaValueLength;
  2047.   CHAR  EaName[1];
  2048. } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
  2049.  
  2050. typedef ULONG_PTR ERESOURCE_THREAD;
  2051. typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
  2052.  
  2053. typedef struct _OWNER_ENTRY {
  2054.   ERESOURCE_THREAD  OwnerThread;
  2055.   union {
  2056.       LONG  OwnerCount;
  2057.       ULONG  TableSize;
  2058.   };
  2059. } OWNER_ENTRY, *POWNER_ENTRY;
  2060.  
  2061. /* ERESOURCE.Flag */
  2062.  
  2063. #define ResourceNeverExclusive            0x0010
  2064. #define ResourceReleaseByOtherThread      0x0020
  2065. #define ResourceOwnedExclusive            0x0080
  2066.  
  2067. #define RESOURCE_HASH_TABLE_SIZE          64
  2068.  
  2069. typedef struct _ERESOURCE {
  2070.   LIST_ENTRY  SystemResourcesList;
  2071.   POWNER_ENTRY  OwnerTable;
  2072.   SHORT  ActiveCount;
  2073.   USHORT  Flag;
  2074.   PKSEMAPHORE  SharedWaiters;
  2075.   PKEVENT  ExclusiveWaiters;
  2076.   OWNER_ENTRY  OwnerThreads[2];
  2077.   ULONG  ContentionCount;
  2078.   USHORT  NumberOfSharedWaiters;
  2079.   USHORT  NumberOfExclusiveWaiters;
  2080.   union {
  2081.     PVOID  Address;
  2082.     ULONG_PTR  CreatorBackTraceIndex;
  2083.   };
  2084.   KSPIN_LOCK  SpinLock;
  2085. } ERESOURCE, *PERESOURCE;
  2086.  
  2087. /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
  2088. typedef struct _DRIVER_EXTENSION {
  2089.   struct _DRIVER_OBJECT  *DriverObject;
  2090.   PVOID  AddDevice;
  2091.   ULONG  Count;
  2092.   UNICODE_STRING  ServiceKeyName;
  2093. } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
  2094.  
  2095. typedef BOOLEAN DDKAPI
  2096. (*PFAST_IO_CHECK_IF_POSSIBLE)(
  2097.   IN struct _FILE_OBJECT  *FileObject,
  2098.   IN PLARGE_INTEGER  FileOffset,
  2099.   IN ULONG  Length,
  2100.   IN BOOLEAN  Wait,
  2101.   IN ULONG  LockKey,
  2102.   IN BOOLEAN  CheckForReadOperation,
  2103.   OUT PIO_STATUS_BLOCK  IoStatus,
  2104.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2105.  
  2106. typedef BOOLEAN DDKAPI
  2107. (*PFAST_IO_READ)(
  2108.   IN struct _FILE_OBJECT  *FileObject,
  2109.   IN PLARGE_INTEGER  FileOffset,
  2110.   IN ULONG  Length,
  2111.   IN BOOLEAN  Wait,
  2112.   IN ULONG  LockKey,
  2113.   OUT PVOID  Buffer,
  2114.   OUT PIO_STATUS_BLOCK  IoStatus,
  2115.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2116.  
  2117. typedef BOOLEAN DDKAPI
  2118. (*PFAST_IO_WRITE)(
  2119.   IN struct _FILE_OBJECT  *FileObject,
  2120.   IN PLARGE_INTEGER  FileOffset,
  2121.   IN ULONG  Length,
  2122.   IN BOOLEAN  Wait,
  2123.   IN ULONG  LockKey,
  2124.   IN PVOID  Buffer,
  2125.   OUT PIO_STATUS_BLOCK  IoStatus,
  2126.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2127.  
  2128. typedef BOOLEAN DDKAPI
  2129. (*PFAST_IO_QUERY_BASIC_INFO)(
  2130.   IN struct _FILE_OBJECT  *FileObject,
  2131.   IN BOOLEAN  Wait,
  2132.   OUT PFILE_BASIC_INFORMATION  Buffer,
  2133.   OUT PIO_STATUS_BLOCK  IoStatus,
  2134.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2135.  
  2136. typedef BOOLEAN DDKAPI
  2137. (*PFAST_IO_QUERY_STANDARD_INFO)(
  2138.   IN struct _FILE_OBJECT  *FileObject,
  2139.   IN BOOLEAN  Wait,
  2140.   OUT PFILE_STANDARD_INFORMATION  Buffer,
  2141.   OUT PIO_STATUS_BLOCK  IoStatus,
  2142.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2143.  
  2144. typedef BOOLEAN DDKAPI
  2145. (*PFAST_IO_LOCK)(
  2146.   IN struct _FILE_OBJECT  *FileObject,
  2147.   IN PLARGE_INTEGER  FileOffset,
  2148.   IN PLARGE_INTEGER  Length,
  2149.   PEPROCESS  ProcessId,
  2150.   ULONG  Key,
  2151.   BOOLEAN  FailImmediately,
  2152.   BOOLEAN  ExclusiveLock,
  2153.   OUT PIO_STATUS_BLOCK  IoStatus,
  2154.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2155.  
  2156. typedef BOOLEAN DDKAPI
  2157. (*PFAST_IO_UNLOCK_SINGLE)(
  2158.   IN struct _FILE_OBJECT  *FileObject,
  2159.   IN PLARGE_INTEGER  FileOffset,
  2160.   IN PLARGE_INTEGER  Length,
  2161.   PEPROCESS  ProcessId,
  2162.   ULONG  Key,
  2163.   OUT PIO_STATUS_BLOCK  IoStatus,
  2164.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2165.  
  2166. typedef BOOLEAN DDKAPI
  2167. (*PFAST_IO_UNLOCK_ALL)(
  2168.   IN struct _FILE_OBJECT  *FileObject,
  2169.   PEPROCESS  ProcessId,
  2170.   OUT PIO_STATUS_BLOCK  IoStatus,
  2171.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2172.  
  2173. typedef BOOLEAN DDKAPI
  2174. (*PFAST_IO_UNLOCK_ALL_BY_KEY)(
  2175.   IN struct _FILE_OBJECT  *FileObject,
  2176.   PVOID  ProcessId,
  2177.   ULONG  Key,
  2178.   OUT PIO_STATUS_BLOCK  IoStatus,
  2179.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2180.  
  2181. typedef BOOLEAN DDKAPI
  2182. (*PFAST_IO_DEVICE_CONTROL)(
  2183.   IN struct _FILE_OBJECT  *FileObject,
  2184.   IN BOOLEAN  Wait,
  2185.   IN PVOID  InputBuffer  OPTIONAL,
  2186.   IN ULONG  InputBufferLength,
  2187.   OUT PVOID  OutputBuffer  OPTIONAL,
  2188.   IN ULONG  OutputBufferLength,
  2189.   IN ULONG  IoControlCode,
  2190.   OUT PIO_STATUS_BLOCK  IoStatus,
  2191.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2192.  
  2193. typedef VOID DDKAPI
  2194. (*PFAST_IO_ACQUIRE_FILE)(
  2195.   IN struct _FILE_OBJECT  *FileObject);
  2196.  
  2197. typedef VOID DDKAPI
  2198. (*PFAST_IO_RELEASE_FILE)(
  2199.   IN struct _FILE_OBJECT  *FileObject);
  2200.  
  2201. typedef VOID DDKAPI
  2202. (*PFAST_IO_DETACH_DEVICE)(
  2203.   IN struct _DEVICE_OBJECT  *SourceDevice,
  2204.   IN struct _DEVICE_OBJECT  *TargetDevice);
  2205.  
  2206. typedef BOOLEAN DDKAPI
  2207. (*PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
  2208.   IN struct _FILE_OBJECT  *FileObject,
  2209.   IN BOOLEAN  Wait,
  2210.   OUT struct _FILE_NETWORK_OPEN_INFORMATION  *Buffer,
  2211.   OUT struct _IO_STATUS_BLOCK  *IoStatus,
  2212.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2213.  
  2214. typedef NTSTATUS DDKAPI
  2215. (*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
  2216.   IN struct _FILE_OBJECT  *FileObject,
  2217.   IN PLARGE_INTEGER  EndingOffset,
  2218.   OUT struct _ERESOURCE  **ResourceToRelease,
  2219.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2220.  
  2221. typedef BOOLEAN DDKAPI
  2222. (*PFAST_IO_MDL_READ)(
  2223.   IN struct _FILE_OBJECT  *FileObject,
  2224.   IN PLARGE_INTEGER  FileOffset,
  2225.   IN ULONG  Length,
  2226.   IN ULONG  LockKey,
  2227.   OUT PMDL  *MdlChain,
  2228.   OUT PIO_STATUS_BLOCK  IoStatus,
  2229.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2230.  
  2231. typedef BOOLEAN DDKAPI
  2232. (*PFAST_IO_MDL_READ_COMPLETE)(
  2233.   IN struct _FILE_OBJECT *FileObject,
  2234.   IN PMDL MdlChain,
  2235.   IN struct _DEVICE_OBJECT *DeviceObject);
  2236.  
  2237. typedef BOOLEAN DDKAPI
  2238. (*PFAST_IO_PREPARE_MDL_WRITE)(
  2239.   IN struct _FILE_OBJECT  *FileObject,
  2240.   IN PLARGE_INTEGER  FileOffset,
  2241.   IN ULONG  Length,
  2242.   IN ULONG  LockKey,
  2243.   OUT PMDL  *MdlChain,
  2244.   OUT PIO_STATUS_BLOCK  IoStatus,
  2245.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2246.  
  2247. typedef BOOLEAN DDKAPI
  2248. (*PFAST_IO_MDL_WRITE_COMPLETE)(
  2249.   IN struct _FILE_OBJECT  *FileObject,
  2250.   IN PLARGE_INTEGER  FileOffset,
  2251.   IN PMDL  MdlChain,
  2252.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2253.  
  2254. typedef BOOLEAN DDKAPI
  2255. (*PFAST_IO_READ_COMPRESSED)(
  2256.   IN struct _FILE_OBJECT  *FileObject,
  2257.   IN PLARGE_INTEGER  FileOffset,
  2258.   IN ULONG  Length,
  2259.   IN ULONG  LockKey,
  2260.   OUT PVOID  Buffer,
  2261.   OUT PMDL  *MdlChain,
  2262.   OUT PIO_STATUS_BLOCK  IoStatus,
  2263.   OUT struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
  2264.   IN ULONG  CompressedDataInfoLength,
  2265.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2266.  
  2267. typedef BOOLEAN DDKAPI
  2268. (*PFAST_IO_WRITE_COMPRESSED)(
  2269.   IN struct _FILE_OBJECT  *FileObject,
  2270.   IN PLARGE_INTEGER  FileOffset,
  2271.   IN ULONG  Length,
  2272.   IN ULONG  LockKey,
  2273.   IN PVOID  Buffer,
  2274.   OUT PMDL  *MdlChain,
  2275.   OUT PIO_STATUS_BLOCK  IoStatus,
  2276.   IN struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
  2277.   IN ULONG  CompressedDataInfoLength,
  2278.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2279.  
  2280. typedef BOOLEAN DDKAPI
  2281. (*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
  2282.   IN struct _FILE_OBJECT  *FileObject,
  2283.   IN PMDL  MdlChain,
  2284.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2285.  
  2286. typedef BOOLEAN DDKAPI
  2287. (*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
  2288.   IN struct _FILE_OBJECT  *FileObject,
  2289.   IN PLARGE_INTEGER  FileOffset,
  2290.   IN PMDL  MdlChain,
  2291.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2292.  
  2293. typedef BOOLEAN DDKAPI
  2294. (*PFAST_IO_QUERY_OPEN)(
  2295.   IN struct _IRP  *Irp,
  2296.   OUT PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
  2297.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2298.  
  2299. typedef NTSTATUS DDKAPI
  2300. (*PFAST_IO_RELEASE_FOR_MOD_WRITE)(
  2301.   IN struct _FILE_OBJECT  *FileObject,
  2302.   IN struct _ERESOURCE  *ResourceToRelease,
  2303.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2304.  
  2305. typedef NTSTATUS DDKAPI
  2306. (*PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
  2307.   IN struct _FILE_OBJECT  *FileObject,
  2308.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2309.  
  2310. typedef NTSTATUS DDKAPI
  2311. (*PFAST_IO_RELEASE_FOR_CCFLUSH) (
  2312.   IN struct _FILE_OBJECT  *FileObject,
  2313.   IN struct _DEVICE_OBJECT  *DeviceObject);
  2314.  
  2315. typedef struct _FAST_IO_DISPATCH {
  2316.   ULONG  SizeOfFastIoDispatch;
  2317.   PFAST_IO_CHECK_IF_POSSIBLE  FastIoCheckIfPossible;
  2318.   PFAST_IO_READ  FastIoRead;
  2319.   PFAST_IO_WRITE  FastIoWrite;
  2320.   PFAST_IO_QUERY_BASIC_INFO  FastIoQueryBasicInfo;
  2321.   PFAST_IO_QUERY_STANDARD_INFO  FastIoQueryStandardInfo;
  2322.   PFAST_IO_LOCK  FastIoLock;
  2323.   PFAST_IO_UNLOCK_SINGLE  FastIoUnlockSingle;
  2324.   PFAST_IO_UNLOCK_ALL  FastIoUnlockAll;
  2325.   PFAST_IO_UNLOCK_ALL_BY_KEY  FastIoUnlockAllByKey;
  2326.   PFAST_IO_DEVICE_CONTROL  FastIoDeviceControl;
  2327.   PFAST_IO_ACQUIRE_FILE  AcquireFileForNtCreateSection;
  2328.   PFAST_IO_RELEASE_FILE  ReleaseFileForNtCreateSection;
  2329.   PFAST_IO_DETACH_DEVICE  FastIoDetachDevice;
  2330.   PFAST_IO_QUERY_NETWORK_OPEN_INFO  FastIoQueryNetworkOpenInfo;
  2331.   PFAST_IO_ACQUIRE_FOR_MOD_WRITE  AcquireForModWrite;
  2332.   PFAST_IO_MDL_READ  MdlRead;
  2333.   PFAST_IO_MDL_READ_COMPLETE  MdlReadComplete;
  2334.   PFAST_IO_PREPARE_MDL_WRITE  PrepareMdlWrite;
  2335.   PFAST_IO_MDL_WRITE_COMPLETE  MdlWriteComplete;
  2336.   PFAST_IO_READ_COMPRESSED  FastIoReadCompressed;
  2337.   PFAST_IO_WRITE_COMPRESSED  FastIoWriteCompressed;
  2338.   PFAST_IO_MDL_READ_COMPLETE_COMPRESSED  MdlReadCompleteCompressed;
  2339.   PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED  MdlWriteCompleteCompressed;
  2340.   PFAST_IO_QUERY_OPEN  FastIoQueryOpen;
  2341.   PFAST_IO_RELEASE_FOR_MOD_WRITE  ReleaseForModWrite;
  2342.   PFAST_IO_ACQUIRE_FOR_CCFLUSH  AcquireForCcFlush;
  2343.   PFAST_IO_RELEASE_FOR_CCFLUSH  ReleaseForCcFlush;
  2344. } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
  2345.  
  2346. /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
  2347. typedef struct _DRIVER_OBJECT {
  2348.   CSHORT  Type;
  2349.   CSHORT  Size;
  2350.   PDEVICE_OBJECT  DeviceObject;
  2351.   ULONG  Flags;
  2352.   PVOID  DriverStart;
  2353.   ULONG  DriverSize;
  2354.   PVOID  DriverSection;
  2355.   PDRIVER_EXTENSION  DriverExtension;
  2356.   UNICODE_STRING  DriverName;
  2357.   PUNICODE_STRING  HardwareDatabase;
  2358.   PVOID  FastIoDispatch;
  2359.   PVOID  DriverInit;
  2360.   PVOID  DriverStartIo;
  2361.   PVOID  DriverUnload;
  2362.   PVOID  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
  2363. } DRIVER_OBJECT;
  2364. typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
  2365.  
  2366. typedef struct _SECTION_OBJECT_POINTERS {
  2367.   PVOID  DataSectionObject;
  2368.   PVOID  SharedCacheMap;
  2369.   PVOID  ImageSectionObject;
  2370. } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
  2371.  
  2372. typedef struct _IO_COMPLETION_CONTEXT {
  2373.   PVOID  Port;
  2374.   PVOID  Key;
  2375. } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
  2376.  
  2377. /* FILE_OBJECT.Flags */
  2378.  
  2379. #define FO_FILE_OPEN                      0x00000001
  2380. #define FO_SYNCHRONOUS_IO                 0x00000002
  2381. #define FO_ALERTABLE_IO                   0x00000004
  2382. #define FO_NO_INTERMEDIATE_BUFFERING      0x00000008
  2383. #define FO_WRITE_THROUGH                  0x00000010
  2384. #define FO_SEQUENTIAL_ONLY                0x00000020
  2385. #define FO_CACHE_SUPPORTED                0x00000040
  2386. #define FO_NAMED_PIPE                     0x00000080
  2387. #define FO_STREAM_FILE                    0x00000100
  2388. #define FO_MAILSLOT                       0x00000200
  2389. #define FO_GENERATE_AUDIT_ON_CLOSE        0x00000400
  2390. #define FO_DIRECT_DEVICE_OPEN             0x00000800
  2391. #define FO_FILE_MODIFIED                  0x00001000
  2392. #define FO_FILE_SIZE_CHANGED              0x00002000
  2393. #define FO_CLEANUP_COMPLETE               0x00004000
  2394. #define FO_TEMPORARY_FILE                 0x00008000
  2395. #define FO_DELETE_ON_CLOSE                0x00010000
  2396. #define FO_OPENED_CASE_SENSITIVE          0x00020000
  2397. #define FO_HANDLE_CREATED                 0x00040000
  2398. #define FO_FILE_FAST_IO_READ              0x00080000
  2399. #define FO_RANDOM_ACCESS                  0x00100000
  2400. #define FO_FILE_OPEN_CANCELLED            0x00200000
  2401. #define FO_VOLUME_OPEN                    0x00400000
  2402. #define FO_FILE_OBJECT_HAS_EXTENSION      0x00800000
  2403. #define FO_REMOTE_ORIGIN                  0x01000000
  2404.  
  2405. typedef struct _FILE_OBJECT {
  2406.   CSHORT  Type;
  2407.   CSHORT  Size;
  2408.   PDEVICE_OBJECT  DeviceObject;
  2409.   PVPB  Vpb;
  2410.   PVOID  FsContext;
  2411.   PVOID  FsContext2;
  2412.   PSECTION_OBJECT_POINTERS  SectionObjectPointer;
  2413.   PVOID  PrivateCacheMap;
  2414.   NTSTATUS  FinalStatus;
  2415.   struct _FILE_OBJECT  *RelatedFileObject;
  2416.   BOOLEAN  LockOperation;
  2417.   BOOLEAN  DeletePending;
  2418.   BOOLEAN  ReadAccess;
  2419.   BOOLEAN  WriteAccess;
  2420.   BOOLEAN  DeleteAccess;
  2421.   BOOLEAN  SharedRead;
  2422.   BOOLEAN  SharedWrite;
  2423.   BOOLEAN  SharedDelete;
  2424.   ULONG  Flags;
  2425.   UNICODE_STRING  FileName;
  2426.   LARGE_INTEGER  CurrentByteOffset;
  2427.   ULONG  Waiters;
  2428.   ULONG  Busy;
  2429.   PVOID  LastLock;
  2430.   KEVENT  Lock;
  2431.   KEVENT  Event;
  2432.   PIO_COMPLETION_CONTEXT  CompletionContext;
  2433. } FILE_OBJECT;
  2434. typedef struct _FILE_OBJECT *PFILE_OBJECT;
  2435.  
  2436. typedef enum _SECURITY_OPERATION_CODE {
  2437.   SetSecurityDescriptor,
  2438.   QuerySecurityDescriptor,
  2439.   DeleteSecurityDescriptor,
  2440.   AssignSecurityDescriptor
  2441. } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
  2442.  
  2443. #define INITIAL_PRIVILEGE_COUNT           3
  2444.  
  2445. typedef struct _INITIAL_PRIVILEGE_SET {
  2446.   ULONG  PrivilegeCount;
  2447.   ULONG  Control;
  2448.   LUID_AND_ATTRIBUTES  Privilege[INITIAL_PRIVILEGE_COUNT];
  2449. } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
  2450.  
  2451. typedef struct _SECURITY_SUBJECT_CONTEXT {
  2452.   PACCESS_TOKEN  ClientToken;
  2453.   SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
  2454.   PACCESS_TOKEN  PrimaryToken;
  2455.   PVOID  ProcessAuditId;
  2456. } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
  2457.  
  2458. typedef struct _ACCESS_STATE {
  2459.   LUID  OperationID;
  2460.   BOOLEAN  SecurityEvaluated;
  2461.   BOOLEAN  GenerateAudit;
  2462.   BOOLEAN  GenerateOnClose;
  2463.   BOOLEAN  PrivilegesAllocated;
  2464.   ULONG  Flags;
  2465.   ACCESS_MASK  RemainingDesiredAccess;
  2466.   ACCESS_MASK  PreviouslyGrantedAccess;
  2467.   ACCESS_MASK  OriginalDesiredAccess;
  2468.   SECURITY_SUBJECT_CONTEXT  SubjectSecurityContext;
  2469.   PSECURITY_DESCRIPTOR  SecurityDescriptor;
  2470.   PVOID  AuxData;
  2471.   union {
  2472.     INITIAL_PRIVILEGE_SET  InitialPrivilegeSet;
  2473.     PRIVILEGE_SET  PrivilegeSet;
  2474.   } Privileges;
  2475.  
  2476.   BOOLEAN  AuditPrivileges;
  2477.   UNICODE_STRING  ObjectName;
  2478.   UNICODE_STRING  ObjectTypeName;
  2479. } ACCESS_STATE, *PACCESS_STATE;
  2480.  
  2481. typedef struct _IO_SECURITY_CONTEXT {
  2482.   PSECURITY_QUALITY_OF_SERVICE  SecurityQos;
  2483.   PACCESS_STATE  AccessState;
  2484.   ACCESS_MASK  DesiredAccess;
  2485.   ULONG  FullCreateOptions;
  2486. } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
  2487.  
  2488. struct _IO_CSQ;
  2489.  
  2490. typedef struct _IO_CSQ_IRP_CONTEXT {
  2491.   ULONG  Type;
  2492.   struct _IRP  *Irp;
  2493.   struct _IO_CSQ  *Csq;
  2494. } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
  2495.  
  2496. typedef VOID DDKAPI
  2497. (*PIO_CSQ_INSERT_IRP)(
  2498.   IN struct _IO_CSQ  *Csq,
  2499.   IN PIRP  Irp);
  2500.  
  2501. typedef VOID DDKAPI
  2502. (*PIO_CSQ_REMOVE_IRP)(
  2503.   IN struct _IO_CSQ  *Csq,
  2504.   IN PIRP  Irp);
  2505.  
  2506. typedef PIRP DDKAPI
  2507. (*PIO_CSQ_PEEK_NEXT_IRP)(
  2508.   IN struct _IO_CSQ  *Csq,
  2509.   IN PIRP  Irp,
  2510.   IN PVOID  PeekContext);
  2511.  
  2512. typedef VOID DDKAPI
  2513. (*PIO_CSQ_ACQUIRE_LOCK)(
  2514.   IN  struct _IO_CSQ  *Csq,
  2515.   OUT PKIRQL  Irql);
  2516.  
  2517. typedef VOID DDKAPI
  2518. (*PIO_CSQ_RELEASE_LOCK)(
  2519.   IN struct _IO_CSQ  *Csq,
  2520.   IN KIRQL  Irql);
  2521.  
  2522. typedef VOID DDKAPI
  2523. (*PIO_CSQ_COMPLETE_CANCELED_IRP)(
  2524.   IN  struct _IO_CSQ  *Csq,
  2525.   IN  PIRP  Irp);
  2526.  
  2527. typedef struct _IO_CSQ {
  2528.   ULONG  Type;
  2529.   PIO_CSQ_INSERT_IRP  CsqInsertIrp;
  2530.   PIO_CSQ_REMOVE_IRP  CsqRemoveIrp;
  2531.   PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp;
  2532.   PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock;
  2533.   PIO_CSQ_RELEASE_LOCK  CsqReleaseLock;
  2534.   PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
  2535.   PVOID  ReservePointer;
  2536. } IO_CSQ, *PIO_CSQ;
  2537.  
  2538. typedef struct _IO_STACK_LOCATION {
  2539.   UCHAR  MajorFunction;
  2540.   UCHAR  MinorFunction;
  2541.   UCHAR  Flags;
  2542.   UCHAR  Control;
  2543.   union {
  2544.     struct {
  2545.       PIO_SECURITY_CONTEXT  SecurityContext;
  2546.       ULONG  Options;
  2547.       USHORT POINTER_ALIGNMENT  FileAttributes;
  2548.       USHORT  ShareAccess;
  2549.       ULONG POINTER_ALIGNMENT  EaLength;
  2550.     } Create;
  2551.     struct {
  2552.       ULONG  Length;
  2553.       ULONG POINTER_ALIGNMENT  Key;
  2554.       LARGE_INTEGER  ByteOffset;
  2555.     } Read;
  2556.     struct {
  2557.       ULONG  Length;
  2558.       ULONG POINTER_ALIGNMENT  Key;
  2559.       LARGE_INTEGER  ByteOffset;
  2560.     } Write;
  2561.     struct {
  2562.       ULONG  Length;
  2563.       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
  2564.     } QueryFile;
  2565.     struct {
  2566.       ULONG  Length;
  2567.       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
  2568.       PFILE_OBJECT  FileObject;
  2569.       union {
  2570.         struct {
  2571.           BOOLEAN  ReplaceIfExists;
  2572.           BOOLEAN  AdvanceOnly;
  2573.         };
  2574.         ULONG  ClusterCount;
  2575.         HANDLE  DeleteHandle;
  2576.       };
  2577.     } SetFile;
  2578.     struct {
  2579.       ULONG  Length;
  2580.       FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
  2581.     } QueryVolume;
  2582.     struct {
  2583.       ULONG  OutputBufferLength;
  2584.       ULONG POINTER_ALIGNMENT  InputBufferLength;
  2585.       ULONG POINTER_ALIGNMENT  IoControlCode;
  2586.       PVOID  Type3InputBuffer;
  2587.     } DeviceIoControl;
  2588.     struct {
  2589.       SECURITY_INFORMATION  SecurityInformation;
  2590.       ULONG POINTER_ALIGNMENT  Length;
  2591.     } QuerySecurity;
  2592.     struct {
  2593.       SECURITY_INFORMATION  SecurityInformation;
  2594.       PSECURITY_DESCRIPTOR  SecurityDescriptor;
  2595.     } SetSecurity;
  2596.     struct {
  2597.       PVPB  Vpb;
  2598.       PDEVICE_OBJECT  DeviceObject;
  2599.     } MountVolume;
  2600.     struct {
  2601.       PVPB  Vpb;
  2602.       PDEVICE_OBJECT  DeviceObject;
  2603.     } VerifyVolume;
  2604.     struct {
  2605.       struct _SCSI_REQUEST_BLOCK  *Srb;
  2606.     } Scsi;
  2607.     struct {
  2608.       DEVICE_RELATION_TYPE  Type;
  2609.     } QueryDeviceRelations;
  2610.     struct {
  2611.       CONST GUID  *InterfaceType;
  2612.       USHORT  Size;
  2613.       USHORT  Version;
  2614.       PINTERFACE  Interface;
  2615.       PVOID  InterfaceSpecificData;
  2616.     } QueryInterface;
  2617.     struct {
  2618.       PDEVICE_CAPABILITIES  Capabilities;
  2619.     } DeviceCapabilities;
  2620.     struct {
  2621.       PIO_RESOURCE_REQUIREMENTS_LIST  IoResourceRequirementList;
  2622.     } FilterResourceRequirements;
  2623.     struct {
  2624.       ULONG  WhichSpace;
  2625.       PVOID  Buffer;
  2626.       ULONG  Offset;
  2627.       ULONG POINTER_ALIGNMENT  Length;
  2628.     } ReadWriteConfig;
  2629.     struct {
  2630.       BOOLEAN  Lock;
  2631.     } SetLock;
  2632.     struct {
  2633.       BUS_QUERY_ID_TYPE  IdType;
  2634.     } QueryId;
  2635.     struct {
  2636.       DEVICE_TEXT_TYPE  DeviceTextType;
  2637.       LCID POINTER_ALIGNMENT  LocaleId;
  2638.     } QueryDeviceText;
  2639.     struct {
  2640.       BOOLEAN  InPath;
  2641.       BOOLEAN  Reserved[3];
  2642.       DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT  Type;
  2643.     } UsageNotification;
  2644.     struct {
  2645.       SYSTEM_POWER_STATE  PowerState;
  2646.     } WaitWake;
  2647.     struct {
  2648.       PPOWER_SEQUENCE  PowerSequence;
  2649.     } PowerSequence;
  2650.     struct {
  2651.       ULONG  SystemContext;
  2652.       POWER_STATE_TYPE POINTER_ALIGNMENT  Type;
  2653.       POWER_STATE POINTER_ALIGNMENT  State;
  2654.       POWER_ACTION POINTER_ALIGNMENT  ShutdownType;
  2655.     } Power;
  2656.     struct {
  2657.       PCM_RESOURCE_LIST  AllocatedResources;
  2658.       PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
  2659.     } StartDevice;
  2660.     struct {
  2661.       ULONG_PTR  ProviderId;
  2662.       PVOID  DataPath;
  2663.       ULONG  BufferSize;
  2664.       PVOID  Buffer;
  2665.     } WMI;
  2666.     struct {
  2667.       PVOID  Argument1;
  2668.       PVOID  Argument2;
  2669.       PVOID  Argument3;
  2670.       PVOID  Argument4;
  2671.     } Others;
  2672.   } Parameters;
  2673.   PDEVICE_OBJECT  DeviceObject;
  2674.   PFILE_OBJECT  FileObject;
  2675.   PIO_COMPLETION_ROUTINE  CompletionRoutine;
  2676.   PVOID  Context;
  2677. } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
  2678.  
  2679. /* IO_STACK_LOCATION.Control */
  2680.  
  2681. #define SL_PENDING_RETURNED               0x01
  2682. #define SL_INVOKE_ON_CANCEL               0x20
  2683. #define SL_INVOKE_ON_SUCCESS              0x40
  2684. #define SL_INVOKE_ON_ERROR                0x80
  2685.  
  2686. typedef enum _KEY_INFORMATION_CLASS {
  2687.   KeyBasicInformation,
  2688.   KeyNodeInformation,
  2689.   KeyFullInformation,
  2690.   KeyNameInformation,
  2691.   KeyCachedInformation,
  2692.   KeyFlagsInformation
  2693. } KEY_INFORMATION_CLASS;
  2694.  
  2695. typedef struct _KEY_BASIC_INFORMATION {
  2696.   LARGE_INTEGER  LastWriteTime;
  2697.   ULONG  TitleIndex;
  2698.   ULONG  NameLength;
  2699.   WCHAR  Name[1];
  2700. } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
  2701.  
  2702. typedef struct _KEY_FULL_INFORMATION {
  2703.   LARGE_INTEGER  LastWriteTime;
  2704.   ULONG  TitleIndex;
  2705.   ULONG  ClassOffset;
  2706.   ULONG  ClassLength;
  2707.   ULONG  SubKeys;
  2708.   ULONG  MaxNameLen;
  2709.   ULONG  MaxClassLen;
  2710.   ULONG  Values;
  2711.   ULONG  MaxValueNameLen;
  2712.   ULONG  MaxValueDataLen;
  2713.   WCHAR  Class[1];
  2714. } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
  2715.  
  2716. typedef struct _KEY_NODE_INFORMATION {
  2717.   LARGE_INTEGER  LastWriteTime;
  2718.   ULONG  TitleIndex;
  2719.   ULONG  ClassOffset;
  2720.   ULONG  ClassLength;
  2721.   ULONG  NameLength;
  2722.   WCHAR  Name[1];
  2723. } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
  2724.  
  2725. typedef struct _KEY_VALUE_BASIC_INFORMATION {
  2726.   ULONG  TitleIndex;
  2727.   ULONG  Type;
  2728.   ULONG  NameLength;
  2729.   WCHAR  Name[1];
  2730. } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
  2731.  
  2732. typedef struct _KEY_VALUE_FULL_INFORMATION {
  2733.   ULONG  TitleIndex;
  2734.   ULONG  Type;
  2735.   ULONG  DataOffset;
  2736.   ULONG  DataLength;
  2737.   ULONG  NameLength;
  2738.   WCHAR  Name[1];
  2739. } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
  2740.  
  2741. typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
  2742.   ULONG  TitleIndex;
  2743.   ULONG  Type;
  2744.   ULONG  DataLength;
  2745.   UCHAR  Data[1];
  2746. } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
  2747.  
  2748. typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
  2749.   ULONG  Type;
  2750.   ULONG  DataLength;
  2751.   UCHAR  Data[1];
  2752. } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
  2753.  
  2754. typedef struct _KEY_VALUE_ENTRY {
  2755.   PUNICODE_STRING  ValueName;
  2756.   ULONG  DataLength;
  2757.   ULONG  DataOffset;
  2758.   ULONG  Type;
  2759. } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
  2760.  
  2761. typedef enum _KEY_VALUE_INFORMATION_CLASS {
  2762.   KeyValueBasicInformation,
  2763.   KeyValueFullInformation,
  2764.   KeyValuePartialInformation,
  2765.   KeyValueFullInformationAlign64,
  2766.   KeyValuePartialInformationAlign64
  2767. } KEY_VALUE_INFORMATION_CLASS;
  2768.  
  2769. /* KEY_VALUE_Xxx.Type */
  2770.  
  2771. #define REG_NONE                           0
  2772. #define REG_SZ                             1
  2773. #define REG_EXPAND_SZ                      2
  2774. #define REG_BINARY                         3
  2775. #define REG_DWORD                          4
  2776. #define REG_DWORD_LITTLE_ENDIAN            4
  2777. #define REG_DWORD_BIG_ENDIAN               5
  2778. #define REG_LINK                           6
  2779. #define REG_MULTI_SZ                       7
  2780. #define REG_RESOURCE_LIST                  8
  2781. #define REG_FULL_RESOURCE_DESCRIPTOR       9
  2782. #define REG_RESOURCE_REQUIREMENTS_LIST    10
  2783. #define REG_QWORD                         11
  2784. #define REG_QWORD_LITTLE_ENDIAN           11
  2785.  
  2786. #define PCI_TYPE0_ADDRESSES               6
  2787. #define PCI_TYPE1_ADDRESSES               2
  2788. #define PCI_TYPE2_ADDRESSES               5
  2789.  
  2790. typedef struct _PCI_COMMON_CONFIG {
  2791.   USHORT  VendorID;
  2792.   USHORT  DeviceID;
  2793.   USHORT  Command;
  2794.   USHORT  Status;
  2795.   UCHAR  RevisionID;
  2796.   UCHAR  ProgIf;
  2797.   UCHAR  SubClass;
  2798.   UCHAR  BaseClass;
  2799.   UCHAR  CacheLineSize;
  2800.   UCHAR  LatencyTimer;
  2801.   UCHAR  HeaderType;
  2802.   UCHAR  BIST;
  2803.   union {
  2804.     struct _PCI_HEADER_TYPE_0 {
  2805.       ULONG  BaseAddresses[PCI_TYPE0_ADDRESSES];
  2806.       ULONG  CIS;
  2807.       USHORT  SubVendorID;
  2808.       USHORT  SubSystemID;
  2809.       ULONG  ROMBaseAddress;
  2810.       UCHAR  CapabilitiesPtr;
  2811.       UCHAR  Reserved1[3];
  2812.       ULONG  Reserved2;
  2813.       UCHAR  InterruptLine;
  2814.       UCHAR  InterruptPin;
  2815.       UCHAR  MinimumGrant;
  2816.       UCHAR  MaximumLatency;
  2817.     } type0;
  2818.       struct _PCI_HEADER_TYPE_1 {
  2819.         ULONG  BaseAddresses[PCI_TYPE1_ADDRESSES];
  2820.         UCHAR  PrimaryBus;
  2821.         UCHAR  SecondaryBus;
  2822.         UCHAR  SubordinateBus;
  2823.         UCHAR  SecondaryLatency;
  2824.         UCHAR  IOBase;
  2825.         UCHAR  IOLimit;
  2826.         USHORT  SecondaryStatus;
  2827.         USHORT  MemoryBase;
  2828.         USHORT  MemoryLimit;
  2829.         USHORT  PrefetchBase;
  2830.         USHORT  PrefetchLimit;
  2831.         ULONG  PrefetchBaseUpper32;
  2832.         ULONG  PrefetchLimitUpper32;
  2833.         USHORT  IOBaseUpper16;
  2834.         USHORT  IOLimitUpper16;
  2835.         UCHAR  CapabilitiesPtr;
  2836.         UCHAR  Reserved1[3];
  2837.         ULONG  ROMBaseAddress;
  2838.         UCHAR  InterruptLine;
  2839.         UCHAR  InterruptPin;
  2840.         USHORT  BridgeControl;
  2841.       } type1;
  2842.       struct _PCI_HEADER_TYPE_2 {
  2843.         ULONG  SocketRegistersBaseAddress;
  2844.         UCHAR  CapabilitiesPtr;
  2845.         UCHAR  Reserved;
  2846.         USHORT  SecondaryStatus;
  2847.         UCHAR  PrimaryBus;
  2848.         UCHAR  SecondaryBus;
  2849.         UCHAR  SubordinateBus;
  2850.         UCHAR  SecondaryLatency;
  2851.         struct {
  2852.           ULONG  Base;
  2853.           ULONG  Limit;
  2854.         } Range[PCI_TYPE2_ADDRESSES - 1];
  2855.         UCHAR  InterruptLine;
  2856.         UCHAR  InterruptPin;
  2857.         USHORT  BridgeControl;
  2858.       } type2;
  2859.   } u;
  2860.   UCHAR  DeviceSpecific[192];
  2861. } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
  2862.  
  2863. /* PCI_COMMON_CONFIG.Command */
  2864.  
  2865. #define PCI_ENABLE_IO_SPACE               0x0001
  2866. #define PCI_ENABLE_MEMORY_SPACE           0x0002
  2867. #define PCI_ENABLE_BUS_MASTER             0x0004
  2868. #define PCI_ENABLE_SPECIAL_CYCLES         0x0008
  2869. #define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
  2870. #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
  2871. #define PCI_ENABLE_PARITY                 0x0040
  2872. #define PCI_ENABLE_WAIT_CYCLE             0x0080
  2873. #define PCI_ENABLE_SERR                   0x0100
  2874. #define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
  2875.  
  2876. /* PCI_COMMON_CONFIG.Status */
  2877.  
  2878. #define PCI_STATUS_CAPABILITIES_LIST      0x0010
  2879. #define PCI_STATUS_66MHZ_CAPABLE          0x0020
  2880. #define PCI_STATUS_UDF_SUPPORTED          0x0040
  2881. #define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
  2882. #define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
  2883. #define PCI_STATUS_DEVSEL                 0x0600
  2884. #define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
  2885. #define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
  2886. #define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
  2887. #define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
  2888. #define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
  2889.  
  2890. /* PCI_COMMON_CONFIG.HeaderType */
  2891.  
  2892. #define PCI_MULTIFUNCTION                 0x80
  2893. #define PCI_DEVICE_TYPE                   0x00
  2894. #define PCI_BRIDGE_TYPE                   0x01
  2895. #define PCI_CARDBUS_BRIDGE_TYPE           0x02
  2896.  
  2897. #define PCI_CONFIGURATION_TYPE(PciData) \
  2898.   (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
  2899.  
  2900. #define PCI_MULTIFUNCTION_DEVICE(PciData) \
  2901.   ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
  2902.  
  2903. typedef struct _PCI_SLOT_NUMBER {
  2904.   union {
  2905.     struct {
  2906.       ULONG  DeviceNumber : 5;
  2907.       ULONG  FunctionNumber : 3;
  2908.       ULONG  Reserved : 24;
  2909.     } bits;
  2910.     ULONG  AsULONG;
  2911.   } u;
  2912. } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
  2913.  
  2914. typedef enum _POOL_TYPE {
  2915.   NonPagedPool,
  2916.   PagedPool,
  2917.   NonPagedPoolMustSucceed,
  2918.   DontUseThisType,
  2919.   NonPagedPoolCacheAligned,
  2920.   PagedPoolCacheAligned,
  2921.   NonPagedPoolCacheAlignedMustS,
  2922.     MaxPoolType,
  2923.     NonPagedPoolSession = 32,
  2924.     PagedPoolSession,
  2925.     NonPagedPoolMustSucceedSession,
  2926.     DontUseThisTypeSession,
  2927.     NonPagedPoolCacheAlignedSession,
  2928.     PagedPoolCacheAlignedSession,
  2929.     NonPagedPoolCacheAlignedMustSSession
  2930. } POOL_TYPE;
  2931.  
  2932. typedef enum _EX_POOL_PRIORITY {
  2933.   LowPoolPriority,
  2934.   LowPoolPrioritySpecialPoolOverrun = 8,
  2935.   LowPoolPrioritySpecialPoolUnderrun = 9,
  2936.   NormalPoolPriority = 16,
  2937.   NormalPoolPrioritySpecialPoolOverrun = 24,
  2938.   NormalPoolPrioritySpecialPoolUnderrun = 25,
  2939.   HighPoolPriority = 32,
  2940.   HighPoolPrioritySpecialPoolOverrun = 40,
  2941.   HighPoolPrioritySpecialPoolUnderrun = 41
  2942. } EX_POOL_PRIORITY;
  2943.  
  2944. /* PRIVILEGE_SET.Control */
  2945.  
  2946. #define PRIVILEGE_SET_ALL_NECESSARY       1
  2947.  
  2948. typedef struct _RTL_OSVERSIONINFOW {
  2949.   ULONG  dwOSVersionInfoSize;
  2950.   ULONG  dwMajorVersion;
  2951.   ULONG  dwMinorVersion;
  2952.   ULONG  dwBuildNumber;
  2953.   ULONG  dwPlatformId;
  2954.   WCHAR  szCSDVersion[128];
  2955. } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
  2956.  
  2957. typedef struct _RTL_OSVERSIONINFOEXW {
  2958.   ULONG  dwOSVersionInfoSize;
  2959.   ULONG  dwMajorVersion;
  2960.   ULONG  dwMinorVersion;
  2961.   ULONG  dwBuildNumber;
  2962.   ULONG  dwPlatformId;
  2963.   WCHAR  szCSDVersion[128];
  2964.   USHORT  wServicePackMajor;
  2965.   USHORT  wServicePackMinor;
  2966.   USHORT  wSuiteMask;
  2967.   UCHAR  wProductType;
  2968.   UCHAR  wReserved;
  2969. } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
  2970.  
  2971. NTOSAPI
  2972. ULONGLONG
  2973. DDKAPI
  2974. VerSetConditionMask(
  2975.   IN ULONGLONG  ConditionMask,
  2976.   IN ULONG  TypeMask,
  2977.   IN UCHAR  Condition);
  2978.  
  2979. #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType)  \
  2980.         ((ConditionMask) = VerSetConditionMask((ConditionMask), \
  2981.         (TypeBitMask), (ComparisonType)))
  2982.  
  2983. /* RtlVerifyVersionInfo() TypeMask */
  2984.  
  2985. #define VER_MINORVERSION                  0x0000001
  2986. #define VER_MAJORVERSION                  0x0000002
  2987. #define VER_BUILDNUMBER                   0x0000004
  2988. #define VER_PLATFORMID                    0x0000008
  2989. #define VER_SERVICEPACKMINOR              0x0000010
  2990. #define VER_SERVICEPACKMAJOR              0x0000020
  2991. #define VER_SUITENAME                     0x0000040
  2992. #define VER_PRODUCT_TYPE                  0x0000080
  2993.  
  2994. /* RtlVerifyVersionInfo() ComparisonType */
  2995.  
  2996. #define VER_EQUAL                       1
  2997. #define VER_GREATER                     2
  2998. #define VER_GREATER_EQUAL               3
  2999. #define VER_LESS                        4
  3000. #define VER_LESS_EQUAL                  5
  3001. #define VER_AND                         6
  3002. #define VER_OR                          7
  3003.  
  3004. #define VER_CONDITION_MASK              7
  3005. #define VER_NUM_BITS_PER_CONDITION_MASK 3
  3006.  
  3007. typedef struct _RTL_BITMAP {
  3008.   ULONG  SizeOfBitMap;
  3009.   PULONG  Buffer;
  3010. } RTL_BITMAP, *PRTL_BITMAP;
  3011.  
  3012. typedef struct _RTL_BITMAP_RUN {
  3013.     ULONG  StartingIndex;
  3014.     ULONG  NumberOfBits;
  3015. } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
  3016.  
  3017. typedef NTSTATUS DDKAPI
  3018. (*PRTL_QUERY_REGISTRY_ROUTINE)(
  3019.   IN PWSTR  ValueName,
  3020.   IN ULONG  ValueType,
  3021.   IN PVOID  ValueData,
  3022.   IN ULONG  ValueLength,
  3023.   IN PVOID  Context,
  3024.   IN PVOID  EntryContext);
  3025.  
  3026. /* RTL_QUERY_REGISTRY_TABLE.Flags */
  3027. #define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
  3028. #define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
  3029. #define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
  3030. #define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
  3031. #define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
  3032. #define RTL_QUERY_REGISTRY_DIRECT         0x00000020
  3033. #define RTL_QUERY_REGISTRY_DELETE         0x00000040
  3034.  
  3035. typedef struct _RTL_QUERY_REGISTRY_TABLE {
  3036.   PRTL_QUERY_REGISTRY_ROUTINE  QueryRoutine;
  3037.   ULONG  Flags;
  3038.   PWSTR  Name;
  3039.   PVOID  EntryContext;
  3040.   ULONG  DefaultType;
  3041.   PVOID  DefaultData;
  3042.   ULONG  DefaultLength;
  3043. } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
  3044.  
  3045. typedef struct _TIME_FIELDS {
  3046.   CSHORT  Year;
  3047.   CSHORT  Month;
  3048.   CSHORT  Day;
  3049.   CSHORT  Hour;
  3050.   CSHORT  Minute;
  3051.   CSHORT  Second;
  3052.   CSHORT  Milliseconds;
  3053.   CSHORT  Weekday;
  3054. } TIME_FIELDS, *PTIME_FIELDS;
  3055.  
  3056. typedef PVOID DDKAPI
  3057. (*PALLOCATE_FUNCTION)(
  3058.   IN POOL_TYPE  PoolType,
  3059.   IN SIZE_T  NumberOfBytes,
  3060.   IN ULONG  Tag);
  3061.  
  3062. typedef VOID DDKAPI
  3063. (*PFREE_FUNCTION)(
  3064.   IN PVOID  Buffer);
  3065.  
  3066. #define GENERAL_LOOKASIDE_S \
  3067.   SLIST_HEADER  ListHead; \
  3068.   USHORT  Depth; \
  3069.   USHORT  MaximumDepth; \
  3070.   ULONG  TotalAllocates; \
  3071.   union { \
  3072.     ULONG  AllocateMisses; \
  3073.     ULONG  AllocateHits; \
  3074.   }; \
  3075.   ULONG  TotalFrees; \
  3076.   union { \
  3077.     ULONG  FreeMisses; \
  3078.     ULONG  FreeHits; \
  3079.   }; \
  3080.   POOL_TYPE  Type; \
  3081.   ULONG  Tag; \
  3082.   ULONG  Size; \
  3083.   PALLOCATE_FUNCTION  Allocate; \
  3084.   PFREE_FUNCTION  Free; \
  3085.   LIST_ENTRY  ListEntry; \
  3086.   ULONG  LastTotalAllocates; \
  3087.   union { \
  3088.     ULONG  LastAllocateMisses; \
  3089.     ULONG  LastAllocateHits; \
  3090.   }; \
  3091.   ULONG Future[2];
  3092.  
  3093. typedef struct _GENERAL_LOOKASIDE {
  3094.   GENERAL_LOOKASIDE_S;
  3095. } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
  3096.  
  3097. typedef struct _NPAGED_LOOKASIDE_LIST {
  3098.   GENERAL_LOOKASIDE_S;
  3099.   KSPIN_LOCK  Obsoleted;
  3100. } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
  3101.  
  3102. typedef struct _PAGED_LOOKASIDE_LIST {
  3103.   GENERAL_LOOKASIDE_S;
  3104.   FAST_MUTEX  Obsoleted;
  3105. } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
  3106.  
  3107. typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
  3108.  
  3109. typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
  3110.   IN PVOID  CallbackContext,
  3111.   IN PVOID  Argument1,
  3112.   IN PVOID  Argument2);
  3113.  
  3114. typedef enum _EVENT_TYPE {
  3115.   NotificationEvent,
  3116.   SynchronizationEvent,
  3117. } EVENT_TYPE;
  3118.  
  3119. typedef enum _KWAIT_REASON {
  3120.   Executive,
  3121.   FreePage,
  3122.   PageIn,
  3123.   PoolAllocation,
  3124.   DelayExecution,
  3125.   Suspended,
  3126.   UserRequest,
  3127.   WrExecutive,
  3128.   WrFreePage,
  3129.   WrPageIn,
  3130.   WrPoolAllocation,
  3131.   WrDelayExecution,
  3132.   WrSuspended,
  3133.   WrUserRequest,
  3134.   WrEventPair,
  3135.   WrQueue,
  3136.   WrLpcReceive,
  3137.   WrLpcReply,
  3138.   WrVirtualMemory,
  3139.   WrPageOut,
  3140.   WrRendezvous,
  3141.   Spare2,
  3142.   Spare3,
  3143.   Spare4,
  3144.   Spare5,
  3145.   Spare6,
  3146.   WrKernel,
  3147.   MaximumWaitReason
  3148. } KWAIT_REASON;
  3149.  
  3150. typedef struct _KWAIT_BLOCK {
  3151.   LIST_ENTRY  WaitListEntry;
  3152.   struct _KTHREAD * RESTRICTED_POINTER  Thread;
  3153.   PVOID  Object;
  3154.   struct _KWAIT_BLOCK * RESTRICTED_POINTER  NextWaitBlock;
  3155.   USHORT  WaitKey;
  3156.   USHORT  WaitType;
  3157. } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
  3158.  
  3159. typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
  3160.  
  3161. typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
  3162.   BOOLEAN  Removed;
  3163.   BOOLEAN  Reserved[3];
  3164.   LONG  IoCount;
  3165.   KEVENT  RemoveEvent;
  3166. } IO_REMOVE_LOCK_COMMON_BLOCK;
  3167.  
  3168. typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
  3169.   LONG  Signature;
  3170.   LONG  HighWatermark;
  3171.   LONGLONG  MaxLockedTicks;
  3172.   LONG  AllocateTag;
  3173.   LIST_ENTRY  LockList;
  3174.   KSPIN_LOCK  Spin;
  3175.   LONG  LowMemoryCount;
  3176.   ULONG  Reserved1[4];
  3177.   PVOID  Reserved2;
  3178.   PIO_REMOVE_LOCK_TRACKING_BLOCK  Blocks;
  3179. } IO_REMOVE_LOCK_DBG_BLOCK;
  3180.  
  3181. typedef struct _IO_REMOVE_LOCK {
  3182.   IO_REMOVE_LOCK_COMMON_BLOCK  Common;
  3183. #if DBG
  3184.   IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
  3185. #endif
  3186. } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
  3187.  
  3188. typedef struct _IO_WORKITEM *PIO_WORKITEM;
  3189.  
  3190. typedef VOID DDKAPI
  3191. (*PIO_WORKITEM_ROUTINE)(
  3192.   IN PDEVICE_OBJECT  DeviceObject,
  3193.   IN PVOID  Context);
  3194.  
  3195. typedef struct _SHARE_ACCESS {
  3196.   ULONG  OpenCount;
  3197.   ULONG  Readers;
  3198.   ULONG  Writers;
  3199.   ULONG  Deleters;
  3200.   ULONG  SharedRead;
  3201.   ULONG  SharedWrite;
  3202.   ULONG  SharedDelete;
  3203. } SHARE_ACCESS, *PSHARE_ACCESS;
  3204.  
  3205. typedef enum _KINTERRUPT_MODE {
  3206.   LevelSensitive,
  3207.   Latched
  3208. } KINTERRUPT_MODE;
  3209.  
  3210. typedef VOID DDKAPI
  3211. (*PKINTERRUPT_ROUTINE)(
  3212.   VOID);
  3213.  
  3214. typedef enum _KPROFILE_SOURCE {
  3215.   ProfileTime,
  3216.   ProfileAlignmentFixup,
  3217.   ProfileTotalIssues,
  3218.   ProfilePipelineDry,
  3219.   ProfileLoadInstructions,
  3220.   ProfilePipelineFrozen,
  3221.   ProfileBranchInstructions,
  3222.   ProfileTotalNonissues,
  3223.   ProfileDcacheMisses,
  3224.   ProfileIcacheMisses,
  3225.   ProfileCacheMisses,
  3226.   ProfileBranchMispredictions,
  3227.   ProfileStoreInstructions,
  3228.   ProfileFpInstructions,
  3229.   ProfileIntegerInstructions,
  3230.   Profile2Issue,
  3231.   Profile3Issue,
  3232.   Profile4Issue,
  3233.   ProfileSpecialInstructions,
  3234.   ProfileTotalCycles,
  3235.   ProfileIcacheIssues,
  3236.   ProfileDcacheAccesses,
  3237.   ProfileMemoryBarrierCycles,
  3238.   ProfileLoadLinkedIssues,
  3239.   ProfileMaximum
  3240. } KPROFILE_SOURCE;
  3241.  
  3242. typedef enum _CREATE_FILE_TYPE {
  3243.   CreateFileTypeNone,
  3244.   CreateFileTypeNamedPipe,
  3245.   CreateFileTypeMailslot
  3246. } CREATE_FILE_TYPE;
  3247.  
  3248. typedef struct _CONFIGURATION_INFORMATION {
  3249.   ULONG  DiskCount;
  3250.   ULONG  FloppyCount;
  3251.   ULONG  CdRomCount;
  3252.   ULONG  TapeCount;
  3253.   ULONG  ScsiPortCount;
  3254.   ULONG  SerialCount;
  3255.   ULONG  ParallelCount;
  3256.   BOOLEAN  AtDiskPrimaryAddressClaimed;
  3257.   BOOLEAN  AtDiskSecondaryAddressClaimed;
  3258.   ULONG  Version;
  3259.   ULONG  MediumChangerCount;
  3260. } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
  3261.  
  3262. typedef enum _CONFIGURATION_TYPE {
  3263.   ArcSystem,
  3264.   CentralProcessor,
  3265.   FloatingPointProcessor,
  3266.   PrimaryIcache,
  3267.   PrimaryDcache,
  3268.   SecondaryIcache,
  3269.   SecondaryDcache,
  3270.   SecondaryCache,
  3271.   EisaAdapter,
  3272.   TcAdapter,
  3273.   ScsiAdapter,
  3274.   DtiAdapter,
  3275.   MultiFunctionAdapter,
  3276.   DiskController,
  3277.   TapeController,
  3278.   CdromController,
  3279.   WormController,
  3280.   SerialController,
  3281.   NetworkController,
  3282.   DisplayController,
  3283.   ParallelController,
  3284.   PointerController,
  3285.   KeyboardController,
  3286.   AudioController,
  3287.   OtherController,
  3288.   DiskPeripheral,
  3289.   FloppyDiskPeripheral,
  3290.   TapePeripheral,
  3291.   ModemPeripheral,
  3292.   MonitorPeripheral,
  3293.   PrinterPeripheral,
  3294.   PointerPeripheral,
  3295.   KeyboardPeripheral,
  3296.   TerminalPeripheral,
  3297.   OtherPeripheral,
  3298.   LinePeripheral,
  3299.   NetworkPeripheral,
  3300.   SystemMemory,
  3301.   DockingInformation,
  3302.   RealModeIrqRoutingTable,
  3303.   MaximumType
  3304. } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
  3305.  
  3306. typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
  3307.   IN PVOID  Context,
  3308.   IN PUNICODE_STRING  PathName,
  3309.   IN INTERFACE_TYPE  BusType,
  3310.   IN ULONG  BusNumber,
  3311.   IN PKEY_VALUE_FULL_INFORMATION  *BusInformation,
  3312.   IN CONFIGURATION_TYPE  ControllerType,
  3313.   IN ULONG  ControllerNumber,
  3314.   IN PKEY_VALUE_FULL_INFORMATION  *ControllerInformation,
  3315.   IN CONFIGURATION_TYPE  PeripheralType,
  3316.   IN ULONG  PeripheralNumber,
  3317.   IN PKEY_VALUE_FULL_INFORMATION  *PeripheralInformation);
  3318.  
  3319. typedef enum _WORK_QUEUE_TYPE {
  3320.   CriticalWorkQueue,
  3321.   DelayedWorkQueue,
  3322.   HyperCriticalWorkQueue,
  3323.   MaximumWorkQueue
  3324. } WORK_QUEUE_TYPE;
  3325.  
  3326. typedef VOID DDKAPI
  3327. (*PWORKER_THREAD_ROUTINE)(
  3328.   IN PVOID Parameter);
  3329.  
  3330. typedef struct _WORK_QUEUE_ITEM {
  3331.   LIST_ENTRY  List;
  3332.   PWORKER_THREAD_ROUTINE  WorkerRoutine;
  3333.   PVOID  Parameter;
  3334. } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
  3335.  
  3336. typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
  3337.     BufferEmpty,
  3338.     BufferInserted,
  3339.     BufferStarted,
  3340.     BufferFinished,
  3341.     BufferIncomplete
  3342. } KBUGCHECK_BUFFER_DUMP_STATE;
  3343.  
  3344. typedef VOID DDKAPI
  3345. (*PKBUGCHECK_CALLBACK_ROUTINE)(
  3346.   IN PVOID  Buffer,
  3347.   IN ULONG  Length);
  3348.  
  3349. typedef struct _KBUGCHECK_CALLBACK_RECORD {
  3350.   LIST_ENTRY  Entry;
  3351.   PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine;
  3352.   PVOID  Buffer;
  3353.   ULONG  Length;
  3354.   PUCHAR  Component;
  3355.   ULONG_PTR  Checksum;
  3356.   UCHAR  State;
  3357. } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
  3358.  
  3359. /*
  3360.  * VOID
  3361.  * KeInitializeCallbackRecord(
  3362.  *   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
  3363.  */
  3364. #define KeInitializeCallbackRecord(CallbackRecord) \
  3365.   CallbackRecord->State = BufferEmpty;
  3366.  
  3367. typedef enum _KDPC_IMPORTANCE {
  3368.   LowImportance,
  3369.   MediumImportance,
  3370.   HighImportance
  3371. } KDPC_IMPORTANCE;
  3372.  
  3373. typedef enum _MEMORY_CACHING_TYPE_ORIG {
  3374.   MmFrameBufferCached = 2
  3375. } MEMORY_CACHING_TYPE_ORIG;
  3376.  
  3377. typedef enum _MEMORY_CACHING_TYPE {
  3378.   MmNonCached = FALSE,
  3379.   MmCached = TRUE,
  3380.   MmWriteCombined = MmFrameBufferCached,
  3381.   MmHardwareCoherentCached,
  3382.   MmNonCachedUnordered,
  3383.   MmUSWCCached,
  3384.   MmMaximumCacheType
  3385. } MEMORY_CACHING_TYPE;
  3386.  
  3387. typedef enum _MM_PAGE_PRIORITY {
  3388.   LowPagePriority,
  3389.   NormalPagePriority = 16,
  3390.   HighPagePriority = 32
  3391. } MM_PAGE_PRIORITY;
  3392.  
  3393. typedef enum _LOCK_OPERATION {
  3394.   IoReadAccess,
  3395.   IoWriteAccess,
  3396.   IoModifyAccess
  3397. } LOCK_OPERATION;
  3398.  
  3399. typedef enum _MM_SYSTEM_SIZE {
  3400.   MmSmallSystem,
  3401.   MmMediumSystem,
  3402.   MmLargeSystem
  3403. } MM_SYSTEM_SIZE;
  3404.  
  3405. typedef struct _OBJECT_HANDLE_INFORMATION {
  3406.   ULONG HandleAttributes;
  3407.   ACCESS_MASK GrantedAccess;
  3408. } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
  3409.  
  3410. typedef struct _CLIENT_ID {
  3411.   HANDLE  UniqueProcess;
  3412.   HANDLE  UniqueThread;
  3413. } CLIENT_ID, *PCLIENT_ID;
  3414.  
  3415. typedef VOID DDKAPI
  3416. (*PKSTART_ROUTINE)(
  3417.   IN PVOID  StartContext);
  3418.  
  3419. typedef VOID DDKAPI
  3420. (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
  3421.   IN HANDLE  ParentId,
  3422.   IN HANDLE  ProcessId,
  3423.   IN BOOLEAN  Create);
  3424.  
  3425. typedef VOID DDKAPI
  3426. (*PCREATE_THREAD_NOTIFY_ROUTINE)(
  3427.   IN HANDLE  ProcessId,
  3428.   IN HANDLE  ThreadId,
  3429.   IN BOOLEAN  Create);
  3430.  
  3431. typedef struct _IMAGE_INFO {
  3432.   union {
  3433.     ULONG  Properties;
  3434.     struct {
  3435.       ULONG  ImageAddressingMode  : 8;
  3436.       ULONG  SystemModeImage      : 1;
  3437.       ULONG  ImageMappedToAllPids : 1;
  3438.       ULONG  Reserved             : 22;
  3439.     };
  3440.   };
  3441.   PVOID  ImageBase;
  3442.   ULONG  ImageSelector;
  3443.   SIZE_T  ImageSize;
  3444.   ULONG  ImageSectionNumber;
  3445. } IMAGE_INFO, *PIMAGE_INFO;
  3446.  
  3447. #define IMAGE_ADDRESSING_MODE_32BIT       3
  3448.  
  3449. typedef VOID DDKAPI
  3450. (*PLOAD_IMAGE_NOTIFY_ROUTINE)(
  3451.   IN PUNICODE_STRING  FullImageName,
  3452.   IN HANDLE  ProcessId,
  3453.   IN PIMAGE_INFO  ImageInfo);
  3454.  
  3455. typedef enum _PROCESSINFOCLASS {
  3456.   ProcessBasicInformation,
  3457.   ProcessQuotaLimits,
  3458.   ProcessIoCounters,
  3459.   ProcessVmCounters,
  3460.   ProcessTimes,
  3461.   ProcessBasePriority,
  3462.   ProcessRaisePriority,
  3463.   ProcessDebugPort,
  3464.   ProcessExceptionPort,
  3465.   ProcessAccessToken,
  3466.   ProcessLdtInformation,
  3467.   ProcessLdtSize,
  3468.   ProcessDefaultHardErrorMode,
  3469.   ProcessIoPortHandlers,
  3470.   ProcessPooledUsageAndLimits,
  3471.   ProcessWorkingSetWatch,
  3472.   ProcessUserModeIOPL,
  3473.   ProcessEnableAlignmentFaultFixup,
  3474.   ProcessPriorityClass,
  3475.   ProcessWx86Information,
  3476.   ProcessHandleCount,
  3477.   ProcessAffinityMask,
  3478.   ProcessPriorityBoost,
  3479.   ProcessDeviceMap,
  3480.   ProcessSessionInformation,
  3481.   ProcessForegroundInformation,
  3482.   ProcessWow64Information,
  3483.   ProcessImageFileName,
  3484.   ProcessLUIDDeviceMapsEnabled,
  3485.   ProcessBreakOnTermination,
  3486.   ProcessDebugObjectHandle,
  3487.   ProcessDebugFlags,
  3488.   ProcessHandleTracing,
  3489.   MaxProcessInfoClass
  3490. } PROCESSINFOCLASS;
  3491.  
  3492. typedef enum _THREADINFOCLASS {
  3493.   ThreadBasicInformation,
  3494.   ThreadTimes,
  3495.   ThreadPriority,
  3496.   ThreadBasePriority,
  3497.   ThreadAffinityMask,
  3498.   ThreadImpersonationToken,
  3499.   ThreadDescriptorTableEntry,
  3500.   ThreadEnableAlignmentFaultFixup,
  3501.   ThreadEventPair_Reusable,
  3502.   ThreadQuerySetWin32StartAddress,
  3503.   ThreadZeroTlsCell,
  3504.   ThreadPerformanceCount,
  3505.   ThreadAmILastThread,
  3506.   ThreadIdealProcessor,
  3507.   ThreadPriorityBoost,
  3508.   ThreadSetTlsArrayAddress,
  3509.   ThreadIsIoPending,
  3510.   ThreadHideFromDebugger,
  3511.   ThreadBreakOnTermination,
  3512.   MaxThreadInfoClass
  3513. } THREADINFOCLASS;
  3514.  
  3515. #define ES_SYSTEM_REQUIRED                0x00000001
  3516. #define ES_DISPLAY_REQUIRED               0x00000002
  3517. #define ES_USER_PRESENT                   0x00000004
  3518. #define ES_CONTINUOUS                     0x80000000
  3519.  
  3520. typedef ULONG EXECUTION_STATE;
  3521.  
  3522. typedef VOID DDKAPI
  3523. (*PREQUEST_POWER_COMPLETE)(
  3524.   IN PDEVICE_OBJECT  DeviceObject,
  3525.   IN UCHAR  MinorFunction,
  3526.   IN POWER_STATE  PowerState,
  3527.   IN PVOID  Context,
  3528.   IN PIO_STATUS_BLOCK  IoStatus);
  3529.  
  3530. typedef enum _TRACE_INFORMATION_CLASS {
  3531.   TraceIdClass,
  3532.   TraceHandleClass,
  3533.   TraceEnableFlagsClass,
  3534.   TraceEnableLevelClass,
  3535.   GlobalLoggerHandleClass,
  3536.   EventLoggerHandleClass,
  3537.   AllLoggerHandlesClass,
  3538.   TraceHandleByNameClass
  3539. } TRACE_INFORMATION_CLASS;
  3540.  
  3541. typedef NTSTATUS DDKAPI
  3542. (*PEX_CALLBACK_FUNCTION)(
  3543.   IN PVOID  CallbackContext,
  3544.   IN PVOID  Argument1,
  3545.   IN PVOID  Argument2);
  3546.  
  3547.  
  3548.  
  3549. /*
  3550. ** Storage structures
  3551. */
  3552. typedef enum _PARTITION_STYLE {
  3553.   PARTITION_STYLE_MBR,
  3554.   PARTITION_STYLE_GPT
  3555. } PARTITION_STYLE;
  3556.  
  3557. typedef struct _CREATE_DISK_MBR {
  3558.   ULONG  Signature;
  3559. } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
  3560.  
  3561. typedef struct _CREATE_DISK_GPT {
  3562.   GUID  DiskId;
  3563.   ULONG  MaxPartitionCount;
  3564. } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
  3565.  
  3566. typedef struct _CREATE_DISK {
  3567.   PARTITION_STYLE  PartitionStyle;
  3568.   union {
  3569.     CREATE_DISK_MBR  Mbr;
  3570.     CREATE_DISK_GPT  Gpt;
  3571.   };
  3572. } CREATE_DISK, *PCREATE_DISK;
  3573.  
  3574. typedef struct _DISK_SIGNATURE {
  3575.   ULONG  PartitionStyle;
  3576.   union {
  3577.     struct {
  3578.       ULONG  Signature;
  3579.       ULONG  CheckSum;
  3580.     } Mbr;
  3581.     struct {
  3582.       GUID  DiskId;
  3583.     } Gpt;
  3584.   };
  3585. } DISK_SIGNATURE, *PDISK_SIGNATURE;
  3586.  
  3587. typedef VOID DDKFASTAPI
  3588. (*PTIME_UPDATE_NOTIFY_ROUTINE)(
  3589.   IN HANDLE  ThreadId,
  3590.   IN KPROCESSOR_MODE  Mode);
  3591.  
  3592. #define DBG_STATUS_CONTROL_C              1
  3593. #define DBG_STATUS_SYSRQ                  2
  3594. #define DBG_STATUS_BUGCHECK_FIRST         3
  3595. #define DBG_STATUS_BUGCHECK_SECOND        4
  3596. #define DBG_STATUS_FATAL                  5
  3597. #define DBG_STATUS_DEBUG_CONTROL          6
  3598. #define DBG_STATUS_WORKER                 7
  3599.  
  3600. typedef struct _PHYSICAL_MEMORY_RANGE {
  3601.   PHYSICAL_ADDRESS  BaseAddress;
  3602.   LARGE_INTEGER  NumberOfBytes;
  3603. } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
  3604.  
  3605. typedef ULONG_PTR
  3606. (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
  3607.   IN PVOID  Context);
  3608.  
  3609. typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
  3610.   PDRIVER_VERIFIER_THUNK_ROUTINE  PristineRoutine;
  3611.   PDRIVER_VERIFIER_THUNK_ROUTINE  NewRoutine;
  3612. } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
  3613.  
  3614. #define DRIVER_VERIFIER_SPECIAL_POOLING             0x0001
  3615. #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING         0x0002
  3616. #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES  0x0004
  3617. #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
  3618. #define DRIVER_VERIFIER_IO_CHECKING                 0x0010
  3619.  
  3620. #define RTL_RANGE_LIST_ADD_IF_CONFLICT    0x00000001
  3621. #define RTL_RANGE_LIST_ADD_SHARED         0x00000002
  3622.  
  3623. #define RTL_RANGE_LIST_SHARED_OK          0x00000001
  3624. #define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002
  3625.  
  3626. #define RTL_RANGE_LIST_SHARED_OK          0x00000001
  3627. #define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002
  3628.  
  3629. #define RTL_RANGE_LIST_MERGE_IF_CONFLICT  RTL_RANGE_LIST_ADD_IF_CONFLICT
  3630.  
  3631. typedef struct _RTL_RANGE {
  3632.   ULONGLONG  Start;
  3633.   ULONGLONG  End;
  3634.   PVOID  UserData;
  3635.   PVOID  Owner;
  3636.   UCHAR  Attributes;
  3637.   UCHAR  Flags;
  3638. } RTL_RANGE, *PRTL_RANGE;
  3639.  
  3640. #define RTL_RANGE_SHARED                  0x01
  3641. #define RTL_RANGE_CONFLICT                0x02
  3642.  
  3643. typedef struct _RTL_RANGE_LIST {
  3644.   LIST_ENTRY  ListHead;
  3645.   ULONG  Flags;
  3646.   ULONG  Count;
  3647.   ULONG  Stamp;
  3648. } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
  3649.  
  3650. typedef struct _RANGE_LIST_ITERATOR {
  3651.   PLIST_ENTRY  RangeListHead;
  3652.   PLIST_ENTRY  MergedHead;
  3653.   PVOID  Current;
  3654.   ULONG  Stamp;
  3655. } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
  3656.  
  3657. typedef BOOLEAN
  3658. (*PRTL_CONFLICT_RANGE_CALLBACK)(
  3659.   IN PVOID  Context,
  3660.   IN PRTL_RANGE  Range);
  3661.  
  3662. #define HASH_STRING_ALGORITHM_DEFAULT     0
  3663. #define HASH_STRING_ALGORITHM_X65599      1
  3664. #define HASH_STRING_ALGORITHM_INVALID     0xffffffff
  3665.  
  3666. typedef enum _SUITE_TYPE {
  3667.   SmallBusiness,
  3668.   Enterprise,
  3669.   BackOffice,
  3670.   CommunicationServer,
  3671.   TerminalServer,
  3672.   SmallBusinessRestricted,
  3673.   EmbeddedNT,
  3674.   DataCenter,
  3675.   SingleUserTS,
  3676.   Personal,
  3677.   Blade,
  3678.   MaxSuiteType
  3679. } SUITE_TYPE;
  3680.  
  3681. typedef VOID DDKAPI
  3682. (*PTIMER_APC_ROUTINE)(
  3683.   IN PVOID  TimerContext,
  3684.   IN ULONG  TimerLowValue,
  3685.   IN LONG  TimerHighValue);
  3686.  
  3687.  
  3688.  
  3689. /*
  3690. ** WMI structures
  3691. */
  3692.  
  3693. typedef VOID DDKAPI
  3694. (*WMI_NOTIFICATION_CALLBACK)(
  3695.   PVOID  Wnode,
  3696.   PVOID  Context);
  3697.  
  3698.  
  3699. /*
  3700. ** Architecture specific structures
  3701. */
  3702.  
  3703. #ifdef _X86_
  3704.  
  3705. typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
  3706.  
  3707. #define PASSIVE_LEVEL                      0
  3708. #define LOW_LEVEL                          0
  3709. #define APC_LEVEL                          1
  3710. #define DISPATCH_LEVEL                     2
  3711. #define PROFILE_LEVEL                     27
  3712. #define CLOCK1_LEVEL                      28
  3713. #define CLOCK2_LEVEL                      28
  3714. #define IPI_LEVEL                         29
  3715. #define POWER_LEVEL                       30
  3716. #define HIGH_LEVEL                        31
  3717.  
  3718. typedef struct _KPCR_TIB {
  3719.   PVOID  ExceptionList;         /* 00 */
  3720.   PVOID  StackBase;             /* 04 */
  3721.   PVOID  StackLimit;            /* 08 */
  3722.   PVOID  SubSystemTib;          /* 0C */
  3723.   union {
  3724.     PVOID  FiberData;           /* 10 */
  3725.     DWORD  Version;             /* 10 */
  3726.   };
  3727.   PVOID  ArbitraryUserPointer;  /* 14 */
  3728. } KPCR_TIB, *PKPCR_TIB;         /* 18 */
  3729.  
  3730. #define PCR_MINOR_VERSION 1
  3731. #define PCR_MAJOR_VERSION 1
  3732.  
  3733. typedef struct _KPCR {
  3734.   KPCR_TIB  Tib;                /* 00 */
  3735.   struct _KPCR  *Self;          /* 18 */
  3736.   struct _KPRCB  *PCRCB;        /* 1C */
  3737.   KIRQL  Irql;                  /* 20 */
  3738.   ULONG  IRR;                   /* 24 */
  3739.   ULONG  IrrActive;             /* 28 */
  3740.   ULONG  IDR;                   /* 2C */
  3741.   PVOID  KdVersionBlock;        /* 30 */  PUSHORT  IDT;                 /* 34 */
  3742.   PUSHORT  GDT;                 /* 38 */
  3743.   struct _KTSS  *TSS;           /* 3C */
  3744.   USHORT  MajorVersion;         /* 40 */
  3745.   USHORT  MinorVersion;         /* 42 */
  3746.   KAFFINITY  SetMember;         /* 44 */
  3747.   ULONG  StallScaleFactor;      /* 48 */
  3748.   UCHAR  DebugActive;           /* 4C */
  3749.   UCHAR  ProcessorNumber;       /* 4D */
  3750.   UCHAR  Reserved[2];           /* 4E */
  3751. } KPCR, *PKPCR;                 /* 50 */
  3752.  
  3753. typedef struct _KFLOATING_SAVE {
  3754.   ULONG  ControlWord;
  3755.   ULONG  StatusWord;
  3756.   ULONG  ErrorOffset;
  3757.   ULONG  ErrorSelector;
  3758.   ULONG  DataOffset;
  3759.   ULONG  DataSelector;
  3760.   ULONG  Cr0NpxState;
  3761.   ULONG  Spare1;
  3762. } KFLOATING_SAVE, *PKFLOATING_SAVE;
  3763.  
  3764. #define PAGE_SIZE                         0x1000
  3765. #define PAGE_SHIFT                        12L
  3766.  
  3767. extern NTOSAPI PVOID *MmHighestUserAddress;
  3768. extern NTOSAPI PVOID *MmSystemRangeStart;
  3769. extern NTOSAPI ULONG *MmUserProbeAddress;
  3770.  
  3771. #define MM_HIGHEST_USER_ADDRESS           *MmHighestUserAddress
  3772. #define MM_SYSTEM_RANGE_START             *MmSystemRangeStart
  3773. #define MM_USER_PROBE_ADDRESS             *MmUserProbeAddress
  3774. #define MM_LOWEST_USER_ADDRESS            (PVOID)0x10000
  3775. #define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC0C00000
  3776.  
  3777. #define KI_USER_SHARED_DATA               0xffdf0000
  3778. #define SharedUserData                    ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
  3779.  
  3780. #define EFLAG_SIGN                        0x8000
  3781. #define EFLAG_ZERO                        0x4000
  3782. #define EFLAG_SELECT                      (EFLAG_SIGN | EFLAG_ZERO)
  3783.  
  3784. #define RESULT_NEGATIVE                   ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
  3785. #define RESULT_ZERO                       ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
  3786. #define RESULT_POSITIVE                   ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
  3787.  
  3788. typedef enum _INTERLOCKED_RESULT {
  3789.   ResultNegative = RESULT_NEGATIVE,
  3790.   ResultZero = RESULT_ZERO,
  3791.   ResultPositive = RESULT_POSITIVE
  3792. } INTERLOCKED_RESULT;
  3793.  
  3794. NTOSAPI
  3795. KIRQL
  3796. DDKAPI
  3797. KeGetCurrentIrql(
  3798.   VOID);
  3799.  
  3800. /*
  3801.  * ULONG
  3802.  * KeGetCurrentProcessorNumber(
  3803.  *   VOID)
  3804.  */
  3805. #define KeGetCurrentProcessorNumber() \
  3806.   ((ULONG)KeGetCurrentKPCR()->ProcessorNumber)
  3807.  
  3808. #if !defined(__INTERLOCKED_DECLARED)
  3809. #define __INTERLOCKED_DECLARED
  3810.  
  3811. NTOSAPI
  3812. LONG
  3813. DDKFASTAPI
  3814. InterlockedIncrement(
  3815.   IN PLONG  VOLATILE  Addend);
  3816.  
  3817. NTOSAPI
  3818. LONG
  3819. DDKFASTAPI
  3820. InterlockedDecrement(
  3821.   IN PLONG  VOLATILE  Addend);
  3822.  
  3823. NTOSAPI
  3824. LONG
  3825. DDKFASTAPI
  3826. InterlockedCompareExchange(
  3827.   IN OUT PLONG  VOLATILE  Destination,
  3828.   IN LONG  Exchange,
  3829.   IN LONG  Comparand);
  3830.  
  3831. NTOSAPI
  3832. LONG
  3833. DDKFASTAPI
  3834. InterlockedExchange(
  3835.   IN OUT PLONG  VOLATILE  Target,
  3836.   IN LONG Value);
  3837.  
  3838. NTOSAPI
  3839. LONG
  3840. DDKFASTAPI
  3841. InterlockedExchangeAdd(
  3842.   IN OUT PLONG VOLATILE  Addend,
  3843.   IN LONG  Value);
  3844.  
  3845. /*
  3846.  * PVOID
  3847.  * InterlockedExchangePointer(
  3848.  *   IN OUT PVOID VOLATILE  *Target,
  3849.  *   IN PVOID  Value)
  3850.  */
  3851. #define InterlockedExchangePointer(Target, Value) \
  3852.   (PVOID) InterlockedExchange((PLONG) Target, (LONG) Value);
  3853.  
  3854. /*
  3855.  * PVOID
  3856.  * InterlockedCompareExchangePointer(
  3857.  *   IN OUT PVOID  *Destination,
  3858.  *   IN PVOID  Exchange,
  3859.  *   IN PVOID  Comparand)
  3860.  */
  3861. #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
  3862.   (PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand);
  3863.  
  3864. #endif /* !__INTERLOCKED_DECLARED */
  3865.  
  3866. NTOSAPI
  3867. VOID
  3868. DDKFASTAPI
  3869. KefAcquireSpinLockAtDpcLevel(
  3870.   IN PKSPIN_LOCK  SpinLock);
  3871.  
  3872. NTOSAPI
  3873. VOID
  3874. DDKFASTAPI
  3875. KefReleaseSpinLockFromDpcLevel(
  3876.   IN PKSPIN_LOCK  SpinLock);
  3877.  
  3878. #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
  3879. #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
  3880.  
  3881. #define RtlCopyMemoryNonTemporal RtlCopyMemory
  3882.  
  3883. #define KeGetDcacheFillSize() 1L
  3884.  
  3885. #endif /* _X86_ */
  3886.  
  3887.  
  3888.  
  3889. /*
  3890. ** Utillity functions
  3891. */
  3892.  
  3893. #define ARGUMENT_PRESENT(ArgumentPointer) \
  3894.   (BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL);
  3895.  
  3896. /*
  3897.  * ULONG
  3898.  * BYTE_OFFSET(
  3899.  *   IN PVOID  Va)
  3900.  */
  3901. #define BYTE_OFFSET(Va) \
  3902.   (ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1));
  3903.  
  3904. /*
  3905.  * ULONG
  3906.  * BYTES_TO_PAGES(
  3907.  *   IN ULONG  Size)
  3908.  */
  3909. #define BYTES_TO_PAGES(Size) \
  3910.   (ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0);
  3911.  
  3912. /*
  3913.  * PCHAR
  3914.  * CONTAINING_RECORD(
  3915.  *   IN PCHAR  Address,
  3916.  *   IN TYPE  Type,
  3917.  *   IN PCHAR  Field);
  3918.  */
  3919. #ifndef CONTAINING_RECORD
  3920. #define CONTAINING_RECORD(Address, Type, Field) \
  3921.   ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
  3922. #endif
  3923.  
  3924. /* LONG
  3925.  * FIELD_OFFSET(
  3926.  *   IN TYPE  Type,
  3927.  *   IN PCHAR  Field);
  3928.  */
  3929. #ifndef FIELD_OFFSET
  3930. #define FIELD_OFFSET(Type, Field) \
  3931.   ((LONG) (&(((Type *) 0)->Field)))
  3932. #endif
  3933.  
  3934. /*
  3935.  * PVOID
  3936.  * PAGE_ALIGN(
  3937.  *   IN PVOID  Va)
  3938.  */
  3939. #define PAGE_ALIGN(Va) \
  3940.   (PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1));
  3941.  
  3942. /*
  3943.  * ULONG_PTR
  3944.  * ROUND_TO_PAGES(
  3945.  *   IN ULONG_PTR  Size)
  3946.  */
  3947. #define ROUND_TO_PAGES(Size) \
  3948.   (ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1));
  3949.  
  3950. NTOSAPI
  3951. VOID
  3952. DDKAPI
  3953. RtlAssert(
  3954.   IN PVOID  FailedAssertion,
  3955.   IN PVOID  FileName,
  3956.   IN ULONG  LineNumber,
  3957.   IN PCHAR  Message);
  3958.  
  3959. #if DBG
  3960.  
  3961. #define ASSERT(exp) \
  3962.   ((!(exp)) ? \
  3963.     (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)
  3964.  
  3965. #define ASSERTMSG(msg, exp) \
  3966.   ((!(exp)) ? \
  3967.     (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)
  3968.  
  3969. #define RTL_SOFT_ASSERT(exp) \
  3970.   ((!(_exp)) ? \
  3971.     (DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)
  3972.  
  3973. #define RTL_SOFT_ASSERTMSG(msg, exp) \
  3974.   ((!(exp)) ? \
  3975.     (DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE)
  3976.  
  3977. #define RTL_VERIFY(exp) ASSERT(exp)
  3978. #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
  3979.  
  3980. #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
  3981. #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
  3982.  
  3983. #else /* !DBG */
  3984.  
  3985. #define ASSERT(exp) ((VOID) 0)
  3986. #define ASSERTMSG(msg, exp) ((VOID) 0)
  3987.  
  3988. #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
  3989. #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
  3990.  
  3991. #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
  3992. #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
  3993.  
  3994. #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
  3995. #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
  3996.  
  3997. #endif /* DBG */
  3998.  
  3999. #define assert ASSERT
  4000.  
  4001.  
  4002. /*
  4003. ** Driver support routines
  4004. */
  4005.  
  4006. /** Runtime library routines **/
  4007.  
  4008. /*
  4009.  * VOID
  4010.  * InitializeListHead(
  4011.  *   IN PLIST_ENTRY  ListHead)
  4012.  */
  4013. #define InitializeListHead(_ListHead) \
  4014. { \
  4015.   (_ListHead)->Flink = (_ListHead); \
  4016.   (_ListHead)->Blink = (_ListHead); \
  4017. }
  4018.  
  4019. /*
  4020.  * VOID
  4021.  * InsertHeadList(
  4022.  *   IN PLIST_ENTRY  ListHead,
  4023.  *   IN PLIST_ENTRY  Entry)
  4024.  */
  4025. #define InsertHeadList(_ListHead, \
  4026.                        _Entry) \
  4027. { \
  4028.   PLIST_ENTRY _OldFlink; \
  4029.   _OldFlink = (_ListHead)->Flink; \
  4030.   (_Entry)->Flink = _OldFlink; \
  4031.   (_Entry)->Blink = (_ListHead); \
  4032.   _OldFlink->Blink = (_Entry); \
  4033.   (_ListHead)->Flink = (_Entry); \
  4034. }
  4035.  
  4036. /*
  4037.  * VOID
  4038.  * InsertTailList(
  4039.  *   IN PLIST_ENTRY  ListHead,
  4040.  *   IN PLIST_ENTRY  Entry)
  4041.  */
  4042. #define InsertTailList(_ListHead, \
  4043.                        _Entry) \
  4044. { \
  4045.     PLIST_ENTRY _OldBlink; \
  4046.     _OldBlink = (_ListHead)->Blink; \
  4047.     (_Entry)->Flink = (_ListHead); \
  4048.     (_Entry)->Blink = _OldBlink; \
  4049.     _OldBlink->Flink = (_Entry); \
  4050.     (_ListHead)->Blink = (_Entry); \
  4051. }
  4052.  
  4053. /*
  4054.  * BOOLEAN
  4055.  * IsListEmpty(
  4056.  *   IN PLIST_ENTRY  ListHead)
  4057.  */
  4058. #define IsListEmpty(_ListHead) \
  4059.   ((_ListHead)->Flink == (_ListHead))
  4060.  
  4061. static inline PSINGLE_LIST_ENTRY 
  4062. PopEntryList(
  4063.   IN PSINGLE_LIST_ENTRY  ListHead)
  4064. {
  4065.     PSINGLE_LIST_ENTRY Entry;
  4066.  
  4067.     Entry = ListHead->Next;
  4068.     if (Entry != NULL)
  4069.     {
  4070.         ListHead->Next = Entry->Next;
  4071.     }
  4072.   return Entry;
  4073. }
  4074.  
  4075. /*
  4076.  * VOID
  4077.  * PushEntryList(
  4078.  *   IN PSINGLE_LIST_ENTRY  ListHead,
  4079.  *   IN PSINGLE_LIST_ENTRY  Entry)
  4080.  */
  4081. #define PushEntryList(_ListHead, \
  4082.                       _Entry) \
  4083. { \
  4084.     (_Entry)->Next = (_ListHead)->Next; \
  4085.     (_ListHead)->Next = (_Entry); \
  4086. }
  4087.  
  4088. /*
  4089.  * VOID
  4090.  * RemoveEntryList(
  4091.  *   IN PLIST_ENTRY  Entry)
  4092.  */
  4093. #define RemoveEntryList(_Entry) \
  4094. { \
  4095.     PLIST_ENTRY _OldFlink; \
  4096.     PLIST_ENTRY _OldBlink; \
  4097.     _OldFlink = (_Entry)->Flink; \
  4098.     _OldBlink = (_Entry)->Blink; \
  4099.     _OldFlink->Blink = _OldBlink; \
  4100.     _OldBlink->Flink = _OldFlink; \
  4101.   (_Entry)->Flink = NULL; \
  4102.   (_Entry)->Blink = NULL; \
  4103. }
  4104.  
  4105. static inline PLIST_ENTRY 
  4106. RemoveHeadList(
  4107.   IN PLIST_ENTRY  ListHead)
  4108. {
  4109.     PLIST_ENTRY OldFlink;
  4110.     PLIST_ENTRY OldBlink;
  4111.     PLIST_ENTRY Entry;
  4112.  
  4113.     Entry = ListHead->Flink;
  4114.     OldFlink = ListHead->Flink->Flink;
  4115.     OldBlink = ListHead->Flink->Blink;
  4116.     OldFlink->Blink = OldBlink;
  4117.     OldBlink->Flink = OldFlink;
  4118.  
  4119.   if (Entry != ListHead)
  4120.   {
  4121.     Entry->Flink = NULL;
  4122.     Entry->Blink = NULL;
  4123.   }
  4124.  
  4125.     return Entry;
  4126. }
  4127.  
  4128. static inline PLIST_ENTRY
  4129. RemoveTailList(
  4130.   IN PLIST_ENTRY  ListHead)
  4131. {
  4132.     PLIST_ENTRY OldFlink;
  4133.     PLIST_ENTRY OldBlink;
  4134.     PLIST_ENTRY Entry;
  4135.  
  4136.     Entry = ListHead->Blink;
  4137.     OldFlink = ListHead->Blink->Flink;
  4138.     OldBlink = ListHead->Blink->Blink;
  4139.     OldFlink->Blink = OldBlink;
  4140.     OldBlink->Flink = OldFlink;
  4141.  
  4142.   if (Entry != ListHead)
  4143.   {
  4144.     Entry->Flink = NULL;
  4145.     Entry->Blink = NULL;
  4146.   }
  4147.    
  4148.   return Entry;
  4149. }
  4150.  
  4151. NTOSAPI
  4152. PSLIST_ENTRY
  4153. DDKFASTAPI
  4154. InterlockedPopEntrySList(
  4155.   IN PSLIST_HEADER  ListHead);
  4156.  
  4157. NTOSAPI
  4158. PSLIST_ENTRY
  4159. DDKFASTAPI
  4160. InterlockedPushEntrySList(
  4161.   IN PSLIST_HEADER  ListHead,
  4162.   IN PSLIST_ENTRY  ListEntry);
  4163.  
  4164. /*
  4165.  * USHORT
  4166.  * QueryDepthSList(
  4167.  *   IN PSLIST_HEADER  SListHead)
  4168.  */
  4169. #define QueryDepthSList(_SListHead) \
  4170.   ((USHORT) ((_SListHead)->Alignment & 0xffff))
  4171.  
  4172. #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
  4173.  
  4174. NTOSAPI
  4175. ULONG
  4176. DDKAPI
  4177. RtlAnsiStringToUnicodeSize(
  4178.   IN PANSI_STRING  AnsiString);
  4179.  
  4180. NTOSAPI
  4181. NTSTATUS
  4182. DDKAPI
  4183. RtlAddRange(
  4184.   IN OUT PRTL_RANGE_LIST  RangeList,
  4185.   IN ULONGLONG  Start,
  4186.   IN ULONGLONG  End,
  4187.   IN UCHAR  Attributes,
  4188.   IN ULONG  Flags,
  4189.   IN PVOID  UserData  OPTIONAL,
  4190.   IN PVOID  Owner  OPTIONAL);
  4191.  
  4192. NTOSAPI
  4193. NTSTATUS
  4194. DDKAPI
  4195. RtlAnsiStringToUnicodeString(
  4196.   IN OUT PUNICODE_STRING  DestinationString,
  4197.   IN PANSI_STRING  SourceString,
  4198.   IN BOOLEAN  AllocateDestinationString);
  4199.  
  4200. NTOSAPI
  4201. NTSTATUS
  4202. DDKAPI
  4203. RtlAppendUnicodeStringToString(
  4204.   IN OUT PUNICODE_STRING  Destination,
  4205.   IN PUNICODE_STRING  Source);
  4206.  
  4207. NTOSAPI
  4208. NTSTATUS
  4209. DDKAPI
  4210. RtlAppendUnicodeToString(
  4211.   IN OUT PUNICODE_STRING  Destination,
  4212.   IN PCWSTR  Source);
  4213.  
  4214. NTOSAPI
  4215. BOOLEAN
  4216. DDKAPI
  4217. RtlAreBitsClear(
  4218.   IN PRTL_BITMAP  BitMapHeader,
  4219.   IN ULONG  StartingIndex,
  4220.   IN ULONG  Length); 
  4221.  
  4222. NTOSAPI
  4223. BOOLEAN
  4224. DDKAPI
  4225. RtlAreBitsSet(
  4226.   IN PRTL_BITMAP  BitMapHeader,
  4227.   IN ULONG  StartingIndex,
  4228.   IN ULONG  Length); 
  4229.  
  4230. NTOSAPI
  4231. NTSTATUS
  4232. DDKAPI
  4233. RtlCharToInteger(
  4234.   IN PCSZ  String,
  4235.   IN ULONG  Base  OPTIONAL,
  4236.   IN OUT PULONG  Value);
  4237.  
  4238. NTOSAPI
  4239. ULONG
  4240. DDKAPI
  4241. RtlCheckBit(
  4242.   IN PRTL_BITMAP  BitMapHeader,
  4243.   IN ULONG  BitPosition); 
  4244.  
  4245. NTOSAPI
  4246. NTSTATUS
  4247. DDKAPI
  4248. RtlCheckRegistryKey(
  4249.   IN ULONG  RelativeTo,
  4250.   IN PWSTR  Path);
  4251.  
  4252. NTOSAPI
  4253. VOID
  4254. DDKAPI
  4255. RtlClearAllBits(
  4256.   IN PRTL_BITMAP  BitMapHeader); 
  4257.  
  4258. NTOSAPI
  4259. VOID
  4260. DDKAPI
  4261. RtlClearBit(
  4262.   PRTL_BITMAP  BitMapHeader,
  4263.   ULONG  BitNumber);
  4264.  
  4265. NTOSAPI
  4266. VOID
  4267. DDKAPI
  4268. RtlClearBits(
  4269.   IN PRTL_BITMAP  BitMapHeader,
  4270.   IN ULONG  StartingIndex,
  4271.   IN ULONG  NumberToClear); 
  4272.  
  4273. NTOSAPI
  4274. SIZE_T
  4275. DDKAPI
  4276. RtlCompareMemory(
  4277.   IN CONST VOID  *Source1,
  4278.   IN CONST VOID  *Source2,
  4279.   IN SIZE_T  Length);
  4280.  
  4281. NTOSAPI
  4282. LONG
  4283. DDKAPI
  4284. RtlCompareString(
  4285.   IN PSTRING  String1,
  4286.   IN PSTRING  String2,
  4287.   BOOLEAN  CaseInSensitive);
  4288.  
  4289. NTOSAPI
  4290. LONG
  4291. DDKAPI
  4292. RtlCompareUnicodeString(
  4293.   IN PUNICODE_STRING  String1,
  4294.   IN PUNICODE_STRING  String2,
  4295.   IN BOOLEAN  CaseInSensitive);
  4296.  
  4297. NTOSAPI
  4298. LARGE_INTEGER
  4299. DDKAPI
  4300. RtlConvertLongToLargeInteger(
  4301.   IN LONG  SignedInteger);
  4302.  
  4303. NTOSAPI
  4304. LUID
  4305. DDKAPI
  4306. RtlConvertLongToLuid(
  4307.   IN LONG  Long);
  4308.  
  4309. NTOSAPI
  4310. LARGE_INTEGER
  4311. DDKAPI
  4312. RtlConvertUlongToLargeInteger(
  4313.   IN ULONG  UnsignedInteger);
  4314.  
  4315. NTOSAPI
  4316. LUID
  4317. DDKAPI
  4318. RtlConvertUlongToLuid(
  4319.   ULONG  Ulong);
  4320.  
  4321. /*
  4322.  * VOID
  4323.  * RtlCopyMemory(
  4324.  *   IN VOID UNALIGNED  *Destination,
  4325.  *   IN CONST VOID UNALIGNED  *Source,
  4326.  *   IN SIZE_T  Length)
  4327.  */
  4328. #ifndef RtlCopyMemory
  4329. #define RtlCopyMemory(Destination, Source, Length) \
  4330.   memcpy(Destination, Source, Length);
  4331. #endif
  4332.  
  4333. #ifndef RtlCopyBytes
  4334. #define RtlCopyBytes RtlCopyMemory
  4335. #endif
  4336.  
  4337. NTOSAPI
  4338. VOID
  4339. DDKAPI
  4340. RtlCopyMemory32(
  4341.   IN VOID UNALIGNED  *Destination,
  4342.   IN CONST VOID UNALIGNED  *Source,
  4343.   IN ULONG  Length);
  4344.  
  4345. NTOSAPI
  4346. NTSTATUS
  4347. DDKAPI
  4348. RtlCopyRangeList(
  4349.   OUT PRTL_RANGE_LIST  CopyRangeList,
  4350.   IN PRTL_RANGE_LIST  RangeList);
  4351.  
  4352. NTOSAPI
  4353. VOID
  4354. DDKAPI
  4355. RtlCopyString(
  4356.   IN OUT PSTRING  DestinationString,
  4357.   IN PSTRING  SourceString  OPTIONAL);
  4358.  
  4359. NTOSAPI
  4360. VOID
  4361. DDKAPI
  4362. RtlCopyUnicodeString(
  4363.   IN OUT PUNICODE_STRING  DestinationString,
  4364.   IN PUNICODE_STRING  SourceString);
  4365.  
  4366. NTOSAPI
  4367. NTSTATUS
  4368. DDKAPI
  4369. RtlCreateRegistryKey(
  4370.   IN ULONG  RelativeTo,
  4371.   IN PWSTR  Path);
  4372.  
  4373. NTOSAPI
  4374. NTSTATUS
  4375. DDKAPI
  4376. RtlCreateSecurityDescriptor(
  4377.   IN OUT PSECURITY_DESCRIPTOR  SecurityDescriptor,
  4378.   IN ULONG  Revision);
  4379.  
  4380. NTOSAPI
  4381. NTSTATUS
  4382. DDKAPI
  4383. RtlDeleteOwnersRanges(
  4384.   IN OUT PRTL_RANGE_LIST  RangeList,
  4385.   IN PVOID  Owner);
  4386.  
  4387. NTOSAPI
  4388. NTSTATUS
  4389. DDKAPI
  4390. RtlDeleteRange(
  4391.   IN OUT PRTL_RANGE_LIST  RangeList,
  4392.   IN ULONGLONG  Start,
  4393.   IN ULONGLONG  End,
  4394.   IN PVOID  Owner);
  4395.  
  4396. NTOSAPI
  4397. NTSTATUS
  4398. DDKAPI
  4399. RtlDeleteRegistryValue(
  4400.   IN ULONG  RelativeTo,
  4401.   IN PCWSTR  Path,
  4402.   IN PCWSTR  ValueName);
  4403.  
  4404. /*
  4405.  * BOOLEAN
  4406.  * RtlEqualLuid( 
  4407.  *   IN LUID  Luid1,
  4408.  *   IN LUID  Luid2)
  4409.  */
  4410. #define RtlEqualLuid(_Luid1, \
  4411.                      _Luid2) \
  4412.   ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
  4413.  
  4414. /*
  4415.  * ULONG
  4416.  * RtlEqualMemory(
  4417.  *   IN VOID UNALIGNED  *Destination,
  4418.  *   IN CONST VOID UNALIGNED  *Source,
  4419.  *   IN SIZE_T  Length)
  4420.  */
  4421. #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
  4422.  
  4423. NTOSAPI
  4424. BOOLEAN
  4425. DDKAPI
  4426. RtlEqualString(
  4427.   IN PSTRING  String1,
  4428.   IN PSTRING  String2,
  4429.   IN BOOLEAN  CaseInSensitive);
  4430.  
  4431. NTOSAPI
  4432. BOOLEAN
  4433. DDKAPI
  4434. RtlEqualUnicodeString(
  4435.   IN CONST UNICODE_STRING  *String1,
  4436.   IN CONST UNICODE_STRING  *String2,
  4437.   IN BOOLEAN  CaseInSensitive);
  4438.  
  4439. /*
  4440.  * VOID
  4441.  * RtlFillMemory(
  4442.  *   IN VOID UNALIGNED  *Destination,
  4443.  *   IN SIZE_T  Length,
  4444.  *   IN UCHAR  Fill)
  4445.  */
  4446. #ifndef RtlFillMemory
  4447. #define RtlFillMemory(Destination, Length, Fill) \
  4448.   memset(Destination, Fill, Length);
  4449. #endif
  4450.  
  4451. #ifndef RtlFillBytes
  4452. #define RtlFillBytes RtlFillMemory
  4453. #endif
  4454.  
  4455. NTOSAPI
  4456. ULONG
  4457. DDKAPI
  4458. RtlFindClearBits(
  4459.   IN PRTL_BITMAP  BitMapHeader,
  4460.   IN ULONG  NumberToFind,
  4461.   IN ULONG  HintIndex); 
  4462.  
  4463. NTOSAPI
  4464. ULONG
  4465. DDKAPI
  4466. RtlFindClearBitsAndSet(
  4467.   IN PRTL_BITMAP  BitMapHeader,
  4468.   IN ULONG  NumberToFind,
  4469.   IN ULONG  HintIndex); 
  4470.  
  4471. NTOSAPI
  4472. ULONG
  4473. DDKAPI
  4474. RtlFindClearRuns( 
  4475.   IN PRTL_BITMAP  BitMapHeader, 
  4476.   OUT PRTL_BITMAP_RUN  RunArray, 
  4477.   IN ULONG  SizeOfRunArray, 
  4478.   IN BOOLEAN  LocateLongestRuns);
  4479.  
  4480. NTOSAPI
  4481. ULONG
  4482. DDKAPI
  4483. RtlFindFirstRunClear(
  4484.   IN PRTL_BITMAP  BitMapHeader,
  4485.   OUT PULONG  StartingIndex);
  4486.  
  4487. NTOSAPI
  4488. ULONG
  4489. DDKAPI
  4490. RtlFindLastBackwardRunClear(
  4491.   IN PRTL_BITMAP  BitMapHeader, 
  4492.   IN ULONG  FromIndex, 
  4493.   OUT PULONG  StartingRunIndex); 
  4494.  
  4495. NTOSAPI
  4496. CCHAR
  4497. DDKAPI
  4498. RtlFindLeastSignificantBit(
  4499.   IN ULONGLONG  Set);
  4500.  
  4501. NTOSAPI
  4502. ULONG
  4503. DDKAPI
  4504. RtlFindLongestRunClear(
  4505.   IN PRTL_BITMAP  BitMapHeader,
  4506.   OUT PULONG  StartingIndex); 
  4507.  
  4508. NTOSAPI
  4509. CCHAR
  4510. DDKAPI
  4511. RtlFindMostSignificantBit(
  4512.   IN ULONGLONG  Set);
  4513.  
  4514. NTOSAPI
  4515. ULONG
  4516. DDKAPI
  4517. RtlFindNextForwardRunClear(
  4518.   IN PRTL_BITMAP  BitMapHeader, 
  4519.   IN ULONG  FromIndex, 
  4520.   OUT PULONG  StartingRunIndex);
  4521.  
  4522. NTOSAPI
  4523. NTSTATUS
  4524. DDKAPI
  4525. RtlFindRange(
  4526.   IN PRTL_RANGE_LIST  RangeList,
  4527.   IN ULONGLONG  Minimum,
  4528.   IN ULONGLONG  Maximum,
  4529.   IN ULONG  Length,
  4530.   IN ULONG  Alignment,
  4531.   IN ULONG  Flags,
  4532.   IN UCHAR  AttributeAvailableMask,
  4533.   IN PVOID  Context  OPTIONAL,
  4534.   IN PRTL_CONFLICT_RANGE_CALLBACK  Callback  OPTIONAL,
  4535.   OUT PULONGLONG  Start);
  4536.  
  4537. NTOSAPI
  4538. ULONG
  4539. DDKAPI
  4540. RtlFindSetBits(
  4541.   IN PRTL_BITMAP  BitMapHeader,
  4542.   IN ULONG  NumberToFind,
  4543.   IN ULONG  HintIndex); 
  4544.  
  4545. NTOSAPI
  4546. ULONG
  4547. DDKAPI
  4548. RtlFindSetBitsAndClear(
  4549.   IN PRTL_BITMAP  BitMapHeader,
  4550.   IN ULONG  NumberToFind,
  4551.   IN ULONG  HintIndex); 
  4552.  
  4553. NTOSAPI
  4554. VOID
  4555. DDKAPI
  4556. RtlFreeAnsiString(
  4557.   IN PANSI_STRING  AnsiString);
  4558.  
  4559. NTOSAPI
  4560. VOID
  4561. DDKAPI
  4562. RtlFreeRangeList(
  4563.   IN PRTL_RANGE_LIST  RangeList);
  4564.  
  4565. NTOSAPI
  4566. VOID
  4567. DDKAPI
  4568. RtlFreeUnicodeString(
  4569.   IN PUNICODE_STRING  UnicodeString);
  4570.  
  4571. NTOSAPI
  4572. VOID
  4573. DDKAPI
  4574. RtlGetCallersAddress(
  4575.   OUT PVOID  *CallersAddress,
  4576.   OUT PVOID  *CallersCaller);
  4577.  
  4578. NTOSAPI
  4579. NTSTATUS
  4580. DDKAPI
  4581. RtlGetVersion(
  4582.   IN OUT PRTL_OSVERSIONINFOW  lpVersionInformation);
  4583.  
  4584. NTOSAPI
  4585. NTSTATUS
  4586. DDKAPI
  4587. RtlGetFirstRange(
  4588.   IN PRTL_RANGE_LIST  RangeList,
  4589.   OUT PRTL_RANGE_LIST_ITERATOR  Iterator,
  4590.   OUT PRTL_RANGE  *Range);
  4591.  
  4592. NTOSAPI
  4593. NTSTATUS
  4594. DDKAPI
  4595. RtlGetNextRange(
  4596.   IN OUT  PRTL_RANGE_LIST_ITERATOR  Iterator,
  4597.   OUT PRTL_RANGE  *Range,
  4598.   IN BOOLEAN  MoveForwards);
  4599.  
  4600. #define FOR_ALL_RANGES(RangeList, Iterator, Current)          \
  4601.   for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
  4602.     (Current) != NULL;                                        \
  4603.     RtlGetNextRange((Iterator), &(Current), TRUE))
  4604.  
  4605. #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
  4606.   for (RtlGetLastRange((RangeList), (Iterator), &(Current));   \
  4607.     (Current) != NULL;                                         \
  4608.     RtlGetNextRange((Iterator), &(Current), FALSE))
  4609.  
  4610. NTOSAPI
  4611. NTSTATUS
  4612. DDKAPI
  4613. RtlGUIDFromString( 
  4614.   IN PUNICODE_STRING  GuidString, 
  4615.   OUT GUID  *Guid);
  4616.  
  4617. NTOSAPI
  4618. NTSTATUS
  4619. DDKAPI
  4620. RtlHashUnicodeString(
  4621.   IN CONST UNICODE_STRING  *String,
  4622.   IN BOOLEAN  CaseInSensitive,
  4623.   IN ULONG  HashAlgorithm,
  4624.   OUT PULONG  HashValue);
  4625.  
  4626. NTOSAPI
  4627. VOID
  4628. DDKAPI
  4629. RtlInitAnsiString(
  4630.   IN OUT PANSI_STRING  DestinationString,
  4631.   IN PCSZ  SourceString);
  4632.  
  4633. NTOSAPI
  4634. VOID
  4635. DDKAPI
  4636. RtlInitializeBitMap(
  4637.   IN PRTL_BITMAP  BitMapHeader,
  4638.   IN PULONG  BitMapBuffer,
  4639.   IN ULONG  SizeOfBitMap); 
  4640.  
  4641. NTOSAPI
  4642. VOID
  4643. DDKAPI
  4644. RtlInitializeRangeList(
  4645.   IN OUT PRTL_RANGE_LIST  RangeList);
  4646.  
  4647. NTOSAPI
  4648. VOID
  4649. DDKAPI
  4650. RtlInitString(
  4651.   IN OUT PSTRING  DestinationString,
  4652.   IN PCSZ  SourceString);
  4653.  
  4654. NTOSAPI
  4655. VOID
  4656. DDKAPI
  4657. RtlInitUnicodeString(
  4658.   IN OUT PUNICODE_STRING  DestinationString,
  4659.   IN PCWSTR  SourceString);
  4660.  
  4661. NTOSAPI
  4662. NTSTATUS
  4663. DDKAPI
  4664. RtlInt64ToUnicodeString(
  4665.   IN ULONGLONG  Value,
  4666.   IN ULONG  Base OPTIONAL,
  4667.   IN OUT PUNICODE_STRING  String);
  4668.  
  4669. NTOSAPI
  4670. NTSTATUS
  4671. DDKAPI
  4672. RtlIntegerToUnicodeString(
  4673.   IN ULONG  Value,
  4674.   IN ULONG  Base  OPTIONAL,
  4675.   IN OUT PUNICODE_STRING  String);
  4676.  
  4677. NTOSAPI
  4678. NTSTATUS
  4679. DDKAPI
  4680. RtlIntPtrToUnicodeString(
  4681.   PLONG  Value,
  4682.   ULONG  Base  OPTIONAL,
  4683.   PUNICODE_STRING  String);
  4684.  
  4685. NTOSAPI
  4686. NTSTATUS
  4687. DDKAPI
  4688. RtlInvertRangeList(
  4689.   OUT PRTL_RANGE_LIST  InvertedRangeList,
  4690.   IN PRTL_RANGE_LIST  RangeList);
  4691.  
  4692. NTOSAPI
  4693. NTSTATUS
  4694. DDKAPI
  4695. RtlIsRangeAvailable(
  4696.   IN PRTL_RANGE_LIST  RangeList,
  4697.   IN ULONGLONG  Start,
  4698.   IN ULONGLONG  End,
  4699.   IN ULONG  Flags,
  4700.   IN UCHAR  AttributeAvailableMask,
  4701.   IN PVOID  Context  OPTIONAL,
  4702.   IN PRTL_CONFLICT_RANGE_CALLBACK  Callback  OPTIONAL,
  4703.   OUT PBOOLEAN  Available);
  4704.  
  4705. /*
  4706.  * BOOLEAN
  4707.  * RtlIsZeroLuid(
  4708.  *   IN PLUID  L1)
  4709.  */
  4710. #define RtlIsZeroLuid(_L1) \
  4711.   ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
  4712.  
  4713. NTOSAPI
  4714. ULONG
  4715. DDKAPI
  4716. RtlLengthSecurityDescriptor(
  4717.   IN PSECURITY_DESCRIPTOR  SecurityDescriptor);
  4718.  
  4719. NTOSAPI
  4720. VOID
  4721. DDKAPI
  4722. RtlMapGenericMask(
  4723.   IN OUT PACCESS_MASK  AccessMask,
  4724.   IN PGENERIC_MAPPING  GenericMapping);
  4725.  
  4726. NTOSAPI
  4727. NTSTATUS
  4728. DDKAPI
  4729. RtlMergeRangeLists(
  4730.   OUT PRTL_RANGE_LIST  MergedRangeList,
  4731.   IN PRTL_RANGE_LIST  RangeList1,
  4732.   IN PRTL_RANGE_LIST  RangeList2,
  4733.   IN ULONG  Flags);
  4734.  
  4735. /*
  4736.  * VOID
  4737.  * RtlMoveMemory(
  4738.  *  IN VOID UNALIGNED  *Destination,
  4739.  *  IN CONST VOID UNALIGNED  *Source,
  4740.  *  IN SIZE_T  Length)
  4741.  */
  4742. #define RtlMoveMemory memmove
  4743.  
  4744. NTOSAPI
  4745. ULONG
  4746. DDKAPI
  4747. RtlNumberOfClearBits(
  4748.   IN PRTL_BITMAP  BitMapHeader);
  4749.  
  4750. NTOSAPI
  4751. ULONG
  4752. DDKAPI
  4753. RtlNumberOfSetBits(
  4754.   IN PRTL_BITMAP  BitMapHeader); 
  4755.  
  4756. NTOSAPI
  4757. VOID
  4758. DDKFASTAPI
  4759. RtlPrefetchMemoryNonTemporal(
  4760.   IN PVOID  Source,
  4761.   IN SIZE_T  Length);
  4762.  
  4763. NTOSAPI
  4764. BOOLEAN
  4765. DDKAPI
  4766. RtlPrefixUnicodeString( 
  4767.   IN PUNICODE_STRING  String1, 
  4768.   IN PUNICODE_STRING  String2, 
  4769.   IN BOOLEAN  CaseInSensitive);
  4770.  
  4771. NTOSAPI
  4772. NTSTATUS
  4773. DDKAPI
  4774. RtlQueryRegistryValues(
  4775.   IN ULONG  RelativeTo,
  4776.   IN PCWSTR  Path,
  4777.   IN PRTL_QUERY_REGISTRY_TABLE  QueryTable,
  4778.   IN PVOID  Context,
  4779.   IN PVOID  Environment  OPTIONAL);
  4780.  
  4781. NTOSAPI
  4782. VOID
  4783. DDKAPI
  4784. RtlRetrieveUlong(
  4785.   IN OUT PULONG  DestinationAddress,
  4786.   IN PULONG  SourceAddress);
  4787.  
  4788. NTOSAPI
  4789. VOID
  4790. DDKAPI
  4791. RtlRetrieveUshort(
  4792.   IN OUT PUSHORT  DestinationAddress,
  4793.   IN PUSHORT  SourceAddress);
  4794.  
  4795. NTOSAPI
  4796. VOID
  4797. DDKAPI
  4798. RtlSetAllBits(
  4799.   IN PRTL_BITMAP  BitMapHeader); 
  4800.  
  4801. NTOSAPI
  4802. VOID
  4803. DDKAPI
  4804. RtlSetBit(
  4805.   PRTL_BITMAP  BitMapHeader,
  4806.   ULONG  BitNumber);
  4807.  
  4808. NTOSAPI
  4809. VOID
  4810. DDKAPI
  4811. RtlSetBits(
  4812.   IN PRTL_BITMAP  BitMapHeader,
  4813.   IN ULONG  StartingIndex,
  4814.   IN ULONG  NumberToSet); 
  4815.  
  4816. NTOSAPI
  4817. NTSTATUS
  4818. DDKAPI
  4819. RtlSetDaclSecurityDescriptor(
  4820.   IN OUT PSECURITY_DESCRIPTOR  SecurityDescriptor,
  4821.   IN BOOLEAN  DaclPresent,
  4822.   IN PACL  Dacl  OPTIONAL,
  4823.   IN BOOLEAN  DaclDefaulted  OPTIONAL);
  4824.  
  4825. NTOSAPI
  4826. VOID
  4827. DDKAPI
  4828. RtlStoreUlong(
  4829.   IN PULONG  Address,
  4830.   IN ULONG  Value);
  4831.  
  4832. NTOSAPI
  4833. VOID
  4834. DDKAPI
  4835. RtlStoreUlonglong(
  4836.   IN OUT PULONGLONG  Address,
  4837.   ULONGLONG  Value);
  4838.  
  4839. NTOSAPI
  4840. VOID
  4841. DDKAPI
  4842. RtlStoreUlongPtr(
  4843.   IN OUT PULONG_PTR  Address,
  4844.   IN ULONG_PTR  Value);
  4845.  
  4846. NTOSAPI
  4847. VOID
  4848. DDKAPI
  4849. RtlStoreUshort(
  4850.   IN PUSHORT  Address,
  4851.   IN USHORT  Value);
  4852.  
  4853. NTOSAPI
  4854. NTSTATUS
  4855. DDKAPI
  4856. RtlStringFromGUID( 
  4857.   IN REFGUID  Guid, 
  4858.   OUT PUNICODE_STRING  GuidString);
  4859.  
  4860. NTOSAPI
  4861. BOOLEAN
  4862. DDKAPI
  4863. RtlTestBit(
  4864.   IN PRTL_BITMAP  BitMapHeader,
  4865.   IN ULONG  BitNumber);
  4866.  
  4867. NTOSAPI
  4868. BOOLEAN
  4869. DDKAPI
  4870. RtlTimeFieldsToTime(
  4871.   IN PTIME_FIELDS  TimeFields,
  4872.   IN PLARGE_INTEGER  Time);
  4873.  
  4874. NTOSAPI
  4875. VOID
  4876. DDKAPI
  4877. RtlTimeToTimeFields(
  4878.   IN PLARGE_INTEGER  Time,
  4879.   IN PTIME_FIELDS  TimeFields);
  4880.  
  4881. NTOSAPI
  4882. ULONG
  4883. DDKFASTAPI
  4884. RtlUlongByteSwap(
  4885.   IN ULONG  Source);
  4886.  
  4887. NTOSAPI
  4888. ULONGLONG
  4889. DDKFASTAPI
  4890. RtlUlonglongByteSwap(
  4891.   IN ULONGLONG  Source);
  4892.  
  4893. NTOSAPI
  4894. ULONG
  4895. DDKAPI
  4896. RtlUnicodeStringToAnsiSize(
  4897.   IN PUNICODE_STRING  UnicodeString);
  4898.  
  4899. NTOSAPI
  4900. NTSTATUS
  4901. DDKAPI
  4902. RtlUnicodeStringToAnsiString(
  4903.   IN OUT PANSI_STRING  DestinationString,
  4904.   IN PUNICODE_STRING  SourceString,
  4905.   IN BOOLEAN  AllocateDestinationString);
  4906.  
  4907. NTOSAPI
  4908. NTSTATUS
  4909. DDKAPI
  4910. RtlUnicodeStringToInteger(
  4911.   IN PUNICODE_STRING  String,
  4912.   IN ULONG  Base  OPTIONAL,
  4913.   OUT PULONG  Value);
  4914.  
  4915. NTOSAPI
  4916. WCHAR
  4917. DDKAPI
  4918. RtlUpcaseUnicodeChar( 
  4919.   IN WCHAR  SourceCharacter);
  4920.  
  4921. NTOSAPI
  4922. NTSTATUS
  4923. DDKAPI
  4924. RtlUpcaseUnicodeString(
  4925.   IN OUT PUNICODE_STRING  DestinationString  OPTIONAL,
  4926.   IN PCUNICODE_STRING  SourceString,
  4927.   IN BOOLEAN  AllocateDestinationString);
  4928.  
  4929. NTOSAPI
  4930. CHAR
  4931. DDKAPI
  4932. RtlUpperChar( 
  4933.   IN CHAR Character);
  4934.  
  4935. NTOSAPI
  4936. VOID
  4937. DDKAPI
  4938. RtlUpperString(
  4939.   IN OUT PSTRING  DestinationString,
  4940.   IN PSTRING  SourceString);
  4941.  
  4942. NTOSAPI
  4943. USHORT
  4944. DDKFASTAPI
  4945. RtlUshortByteSwap(
  4946.   IN USHORT  Source);
  4947.  
  4948. NTOSAPI
  4949. BOOLEAN
  4950. DDKAPI
  4951. RtlValidRelativeSecurityDescriptor(
  4952.   IN PSECURITY_DESCRIPTOR  SecurityDescriptorInput,
  4953.   IN ULONG  SecurityDescriptorLength,
  4954.   IN SECURITY_INFORMATION  RequiredInformation);
  4955.  
  4956. NTOSAPI
  4957. BOOLEAN
  4958. DDKAPI
  4959. RtlValidSecurityDescriptor(
  4960.   IN PSECURITY_DESCRIPTOR  SecurityDescriptor);
  4961.  
  4962. NTOSAPI
  4963. NTSTATUS
  4964. DDKAPI
  4965. RtlVerifyVersionInfo(
  4966.   IN PRTL_OSVERSIONINFOEXW  VersionInfo,
  4967.   IN ULONG  TypeMask,
  4968.   IN ULONGLONG  ConditionMask);
  4969.  
  4970. NTOSAPI
  4971. NTSTATUS
  4972. DDKAPI
  4973. RtlVolumeDeviceToDosName(
  4974.   IN PVOID  VolumeDeviceObject,
  4975.   OUT PUNICODE_STRING  DosName);
  4976.  
  4977. NTOSAPI
  4978. ULONG
  4979. DDKAPI
  4980. RtlWalkFrameChain(
  4981.   OUT PVOID  *Callers,
  4982.   IN ULONG  Count,
  4983.   IN ULONG  Flags);
  4984.  
  4985. NTOSAPI
  4986. NTSTATUS
  4987. DDKAPI
  4988. RtlWriteRegistryValue(
  4989.   IN ULONG  RelativeTo,
  4990.   IN PCWSTR  Path,
  4991.   IN PCWSTR  ValueName,
  4992.   IN ULONG  ValueType,
  4993.   IN PVOID  ValueData,
  4994.   IN ULONG  ValueLength);
  4995.  
  4996. NTOSAPI
  4997. ULONG
  4998. DDKAPI
  4999. RtlxUnicodeStringToAnsiSize(
  5000.   IN PUNICODE_STRING  UnicodeString);
  5001.  
  5002. /*
  5003.  * VOID
  5004.  * RtlZeroMemory(
  5005.  *   IN VOID UNALIGNED  *Destination,
  5006.  *   IN SIZE_T  Length)
  5007.  */
  5008. #ifndef RtlZeroMemory
  5009. #define RtlZeroMemory(Destination, Length) \
  5010.   memset(Destination, 0, Length);
  5011. #endif
  5012.  
  5013. #ifndef RtlZeroBytes
  5014. #define RtlZeroBytes RtlZeroMemory
  5015. #endif
  5016.  
  5017.  
  5018. /** Executive support routines **/
  5019.  
  5020. NTOSAPI
  5021. VOID
  5022. DDKFASTAPI
  5023. ExAcquireFastMutex(
  5024.   IN PFAST_MUTEX  FastMutex);
  5025.  
  5026. NTOSAPI
  5027. VOID
  5028. DDKFASTAPI
  5029. ExAcquireFastMutexUnsafe(
  5030.   IN PFAST_MUTEX  FastMutex);
  5031.  
  5032. NTOSAPI
  5033. BOOLEAN
  5034. DDKAPI
  5035. ExAcquireResourceExclusiveLite(
  5036.   IN PERESOURCE  Resource,
  5037.   IN BOOLEAN  Wait);
  5038.  
  5039. NTOSAPI
  5040. BOOLEAN
  5041. DDKAPI
  5042. ExAcquireResourceSharedLite(
  5043.   IN PERESOURCE  Resource,
  5044.   IN BOOLEAN  Wait);
  5045.  
  5046. NTOSAPI
  5047. BOOLEAN
  5048. DDKAPI
  5049. ExAcquireSharedStarveExclusive(
  5050.   IN PERESOURCE  Resource,
  5051.   IN BOOLEAN  Wait);
  5052.  
  5053. NTOSAPI
  5054. BOOLEAN
  5055. DDKAPI
  5056. ExAcquireSharedWaitForExclusive(
  5057.   IN PERESOURCE  Resource,
  5058.   IN BOOLEAN  Wait);
  5059.  
  5060. static inline PVOID
  5061. ExAllocateFromNPagedLookasideList(
  5062.   IN PNPAGED_LOOKASIDE_LIST  Lookaside)
  5063. {
  5064.     PVOID Entry;
  5065.  
  5066.     Lookaside->TotalAllocates++;
  5067.   Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
  5068.     if (Entry == NULL) {
  5069.         Lookaside->AllocateMisses++;
  5070.         Entry = (Lookaside->Allocate)(Lookaside->Type, Lookaside->Size, Lookaside->Tag);
  5071.     }
  5072.   return Entry;
  5073. }
  5074.  
  5075. static inline PVOID
  5076. ExAllocateFromPagedLookasideList(
  5077.   IN PPAGED_LOOKASIDE_LIST  Lookaside)
  5078. {
  5079.   PVOID Entry;
  5080.  
  5081.   Lookaside->TotalAllocates++;
  5082.   Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
  5083.   if (Entry == NULL) {
  5084.     Lookaside->AllocateMisses++;
  5085.     Entry = (Lookaside->Allocate)(Lookaside->Type,
  5086.       Lookaside->Size, Lookaside->Tag);
  5087.   }
  5088.   return Entry;
  5089. }
  5090.  
  5091. NTOSAPI
  5092. PVOID
  5093. DDKAPI
  5094. ExAllocatePoolWithQuotaTag(
  5095.   IN POOL_TYPE  PoolType,
  5096.   IN SIZE_T  NumberOfBytes,
  5097.   IN ULONG  Tag);
  5098.  
  5099. NTOSAPI
  5100. PVOID
  5101. DDKAPI
  5102. ExAllocatePoolWithTag(
  5103.   IN POOL_TYPE  PoolType,
  5104.   IN SIZE_T  NumberOfBytes,
  5105.   IN ULONG  Tag);
  5106.  
  5107. #ifdef POOL_TAGGING
  5108.  
  5109. #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
  5110. #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
  5111.  
  5112. #else /* !POOL_TAGGING */
  5113.  
  5114. NTOSAPI
  5115. PVOID
  5116. DDKAPI
  5117. ExAllocatePool(
  5118.   IN POOL_TYPE  PoolType,
  5119.   IN SIZE_T  NumberOfBytes);
  5120.  
  5121. NTOSAPI
  5122. PVOID
  5123. DDKAPI
  5124. ExAllocatePoolWithQuota(
  5125.   IN POOL_TYPE  PoolType,
  5126.   IN SIZE_T  NumberOfBytes);
  5127.  
  5128. #endif /* POOL_TAGGING */
  5129.  
  5130. NTOSAPI
  5131. PVOID
  5132. DDKAPI
  5133. ExAllocatePoolWithTagPriority(
  5134.   IN POOL_TYPE  PoolType,
  5135.   IN SIZE_T  NumberOfBytes,
  5136.   IN ULONG  Tag,
  5137.   IN EX_POOL_PRIORITY  Priority);
  5138.  
  5139. NTOSAPI
  5140. VOID
  5141. DDKAPI
  5142. ExConvertExclusiveToSharedLite(
  5143.   IN PERESOURCE  Resource);
  5144.  
  5145. NTOSAPI
  5146. NTSTATUS
  5147. DDKAPI
  5148. ExCreateCallback(
  5149.   OUT PCALLBACK_OBJECT  *CallbackObject,
  5150.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  5151.   IN BOOLEAN  Create,
  5152.   IN BOOLEAN  AllowMultipleCallbacks);
  5153.  
  5154. NTOSAPI
  5155. VOID
  5156. DDKAPI
  5157. ExDeleteNPagedLookasideList(
  5158.   IN PNPAGED_LOOKASIDE_LIST  Lookaside);
  5159.  
  5160. NTOSAPI
  5161. VOID
  5162. DDKAPI
  5163. ExDeletePagedLookasideList(
  5164.   IN PPAGED_LOOKASIDE_LIST  Lookaside);
  5165.  
  5166. NTOSAPI
  5167. NTSTATUS
  5168. DDKAPI
  5169. ExDeleteResourceLite(
  5170.   IN PERESOURCE  Resource);
  5171.  
  5172. NTOSAPI
  5173. VOID
  5174. DDKAPI
  5175. ExFreePool(
  5176.   IN PVOID  P);
  5177.  
  5178. #define PROTECTED_POOL                    0x80000000
  5179.  
  5180. #ifdef POOL_TAGGING
  5181. #define ExFreePool(P) ExFreePoolWithTag(P, 0)
  5182. #endif
  5183.  
  5184. NTOSAPI
  5185. VOID
  5186. DDKAPI
  5187. ExFreePoolWithTag(
  5188.   IN PVOID  P,
  5189.   IN ULONG  Tag);
  5190.  
  5191. #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
  5192.  
  5193. static inline VOID
  5194. ExFreeToNPagedLookasideList(
  5195.   IN PNPAGED_LOOKASIDE_LIST  Lookaside,
  5196.   IN PVOID  Entry)
  5197. {
  5198.   Lookaside->TotalFrees++;
  5199.     if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
  5200.         Lookaside->FreeMisses++;
  5201.         (Lookaside->Free)(Entry);
  5202.   } else {
  5203.         InterlockedPushEntrySList(&Lookaside->ListHead,
  5204.       (PSLIST_ENTRY)Entry);
  5205.     }
  5206. }
  5207.  
  5208. static inline VOID
  5209. ExFreeToPagedLookasideList(
  5210.   IN PPAGED_LOOKASIDE_LIST  Lookaside,
  5211.   IN PVOID  Entry)
  5212. {
  5213.   Lookaside->TotalFrees++;
  5214.   if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
  5215.     Lookaside->FreeMisses++;
  5216.     (Lookaside->Free)(Entry);
  5217.   } else {
  5218.     InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry);
  5219.   }
  5220. }
  5221.  
  5222. /*
  5223.  * ERESOURCE_THREAD
  5224.  * ExGetCurrentResourceThread(
  5225.  *   VOID);
  5226.  */
  5227. #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
  5228.  
  5229. NTOSAPI
  5230. ULONG
  5231. DDKAPI
  5232. ExGetExclusiveWaiterCount(
  5233.   IN PERESOURCE  Resource);
  5234.  
  5235. NTOSAPI
  5236. KPROCESSOR_MODE
  5237. DDKAPI
  5238. ExGetPreviousMode( 
  5239.   VOID);
  5240.  
  5241. NTOSAPI
  5242. ULONG
  5243. DDKAPI
  5244. ExGetSharedWaiterCount(
  5245.   IN PERESOURCE  Resource);
  5246.  
  5247. NTOSAPI
  5248. VOID
  5249. DDKAPI
  5250. KeInitializeEvent(
  5251.   IN PRKEVENT  Event,
  5252.   IN EVENT_TYPE  Type,
  5253.   IN BOOLEAN  State);
  5254.  
  5255. /*
  5256.  * VOID DDKAPI
  5257.  * ExInitializeFastMutex(
  5258.  *   IN PFAST_MUTEX  FastMutex)
  5259.  */
  5260. #define ExInitializeFastMutex(_FastMutex) \
  5261. { \
  5262.   (_FastMutex)->Count = 1; \
  5263.   (_FastMutex)->Owner = NULL; \
  5264.   (_FastMutex)->Contention = 0; \
  5265.   KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
  5266. }
  5267.  
  5268. NTOSAPI
  5269. VOID
  5270. DDKAPI
  5271. ExInitializeNPagedLookasideList(
  5272.   IN PNPAGED_LOOKASIDE_LIST  Lookaside,
  5273.   IN PALLOCATE_FUNCTION  Allocate  OPTIONAL,
  5274.   IN PFREE_FUNCTION  Free  OPTIONAL,
  5275.   IN ULONG  Flags,
  5276.   IN SIZE_T  Size,
  5277.   IN ULONG  Tag,
  5278.   IN USHORT  Depth);
  5279.  
  5280. NTOSAPI
  5281. VOID
  5282. DDKAPI
  5283. ExInitializePagedLookasideList(
  5284.   IN PPAGED_LOOKASIDE_LIST  Lookaside,
  5285.   IN PALLOCATE_FUNCTION  Allocate  OPTIONAL,
  5286.   IN PFREE_FUNCTION  Free  OPTIONAL,
  5287.   IN ULONG  Flags,
  5288.   IN SIZE_T  Size,
  5289.   IN ULONG  Tag,
  5290.   IN USHORT  Depth);
  5291.  
  5292. NTOSAPI
  5293. NTSTATUS
  5294. DDKAPI
  5295. ExInitializeResourceLite(
  5296.   IN PERESOURCE  Resource);
  5297.  
  5298. /*
  5299.  * VOID
  5300.  * InitializeSListHead(
  5301.  *   IN PSLIST_HEADER  SListHead)
  5302.  */
  5303. #define InitializeSListHead(_SListHead) \
  5304.     (_SListHead)->Alignment = 0;
  5305.  
  5306. #define ExInitializeSListHead InitializeSListHead
  5307.  
  5308. NTOSAPI
  5309. LARGE_INTEGER
  5310. DDKAPI
  5311. ExInterlockedAddLargeInteger(
  5312.   IN PLARGE_INTEGER  Addend,
  5313.   IN LARGE_INTEGER  Increment,
  5314.   IN PKSPIN_LOCK  Lock);
  5315.  
  5316. NTOSAPI
  5317. VOID
  5318. DDKFASTAPI
  5319. ExInterlockedAddLargeStatistic(
  5320.   IN PLARGE_INTEGER  Addend,
  5321.   IN ULONG  Increment);
  5322.  
  5323. NTOSAPI
  5324. ULONG
  5325. DDKFASTAPI
  5326. ExInterlockedAddUlong(
  5327.   IN PULONG  Addend,
  5328.   IN ULONG  Increment,
  5329.   PKSPIN_LOCK  Lock);
  5330.  
  5331. NTOSAPI
  5332. LONGLONG
  5333. DDKFASTAPI
  5334. ExInterlockedCompareExchange64(
  5335.   IN OUT PLONGLONG  Destination,
  5336.   IN PLONGLONG  Exchange,
  5337.   IN PLONGLONG  Comparand,
  5338.   IN PKSPIN_LOCK  Lock); 
  5339.  
  5340. NTOSAPI
  5341. PSINGLE_LIST_ENTRY
  5342. DDKFASTAPI
  5343. ExInterlockedFlushSList(
  5344.   IN PSLIST_HEADER  ListHead);
  5345.  
  5346. NTOSAPI
  5347. PLIST_ENTRY
  5348. DDKFASTAPI
  5349. ExInterlockedInsertHeadList(
  5350.   IN PLIST_ENTRY  ListHead,
  5351.   IN PLIST_ENTRY  ListEntry,
  5352.   IN PKSPIN_LOCK  Lock);
  5353.  
  5354. NTOSAPI
  5355. PLIST_ENTRY
  5356. DDKFASTAPI
  5357. ExInterlockedInsertTailList(
  5358.   IN PLIST_ENTRY  ListHead,
  5359.   IN PLIST_ENTRY  ListEntry,
  5360.   IN PKSPIN_LOCK  Lock);
  5361.  
  5362. NTOSAPI
  5363. PSINGLE_LIST_ENTRY
  5364. DDKFASTAPI
  5365. ExInterlockedPopEntryList(
  5366.   IN PSINGLE_LIST_ENTRY  ListHead,
  5367.   IN PKSPIN_LOCK  Lock);
  5368.  
  5369. /*
  5370.  * PSINGLE_LIST_ENTRY
  5371.  * ExInterlockedPopEntrySList(
  5372.  *   IN PSLIST_HEADER  ListHead,
  5373.  *   IN PKSPIN_LOCK  Lock)
  5374.  */
  5375. #define ExInterlockedPopEntrySList(_ListHead, \
  5376.                                    _Lock) \
  5377.   InterlockedPopEntrySList(_ListHead)
  5378.  
  5379. NTOSAPI
  5380. PSINGLE_LIST_ENTRY
  5381. DDKFASTAPI
  5382. ExInterlockedPushEntryList(
  5383.   IN PSINGLE_LIST_ENTRY  ListHead,
  5384.   IN PSINGLE_LIST_ENTRY  ListEntry,
  5385.   IN PKSPIN_LOCK  Lock);
  5386.  
  5387. /*
  5388.  * PSINGLE_LIST_ENTRY FASTCALL
  5389.  * ExInterlockedPushEntrySList(
  5390.  *   IN PSLIST_HEADER  ListHead,
  5391.  *   IN PSINGLE_LIST_ENTRY  ListEntry,
  5392.  *   IN PKSPIN_LOCK  Lock)
  5393.  */
  5394. #define ExInterlockedPushEntrySList(_ListHead, \
  5395.                                     _ListEntry, \
  5396.                                     _Lock) \
  5397.   InterlockedPushEntrySList(_ListHead, _ListEntry)
  5398.  
  5399. NTOSAPI
  5400. PLIST_ENTRY
  5401. DDKFASTAPI
  5402. ExInterlockedRemoveHeadList(
  5403.   IN PLIST_ENTRY  ListHead,
  5404.   IN PKSPIN_LOCK  Lock);
  5405.  
  5406. NTOSAPI
  5407. BOOLEAN
  5408. DDKAPI
  5409. ExIsProcessorFeaturePresent(
  5410.   IN ULONG  ProcessorFeature);
  5411.  
  5412. NTOSAPI
  5413. BOOLEAN
  5414. DDKAPI
  5415. ExIsResourceAcquiredExclusiveLite(
  5416.   IN PERESOURCE  Resource);
  5417.  
  5418. NTOSAPI
  5419. USHORT
  5420. DDKAPI
  5421. ExIsResourceAcquiredLite(
  5422.   IN PERESOURCE  Resource);
  5423.  
  5424. NTOSAPI
  5425. USHORT
  5426. DDKAPI
  5427. ExIsResourceAcquiredSharedLite(
  5428.   IN PERESOURCE  Resource);
  5429.  
  5430. NTOSAPI
  5431. VOID
  5432. DDKAPI
  5433. ExLocalTimeToSystemTime(
  5434.   IN PLARGE_INTEGER  LocalTime,
  5435.   OUT PLARGE_INTEGER  SystemTime);
  5436.  
  5437. NTOSAPI
  5438. VOID
  5439. DDKAPI
  5440. ExNotifyCallback(
  5441.   IN PCALLBACK_OBJECT  CallbackObject,
  5442.   IN PVOID  Argument1,
  5443.   IN PVOID  Argument2);
  5444.  
  5445. NTOSAPI
  5446. VOID
  5447. DDKAPI
  5448. ExRaiseAccessViolation(
  5449.   VOID);
  5450.  
  5451. NTOSAPI
  5452. VOID
  5453. DDKAPI
  5454. ExRaiseDatatypeMisalignment(
  5455.   VOID);
  5456.  
  5457. NTOSAPI
  5458. VOID
  5459. DDKAPI
  5460. ExRaiseStatus(
  5461.   IN NTSTATUS  Status);
  5462.  
  5463. NTOSAPI
  5464. PVOID
  5465. DDKAPI
  5466. ExRegisterCallback(
  5467.   IN PCALLBACK_OBJECT  CallbackObject,
  5468.   IN PCALLBACK_FUNCTION  CallbackFunction,
  5469.   IN PVOID  CallbackContext);
  5470.  
  5471. NTOSAPI
  5472. VOID
  5473. DDKAPI
  5474. ExReinitializeResourceLite(
  5475.   IN PERESOURCE  Resource);
  5476.  
  5477. NTOSAPI
  5478. VOID
  5479. DDKFASTAPI
  5480. ExReleaseFastMutex(
  5481.   IN PFAST_MUTEX  FastMutex);
  5482.  
  5483. NTOSAPI
  5484. VOID
  5485. DDKFASTAPI
  5486. ExReleaseFastMutexUnsafe(
  5487.   IN PFAST_MUTEX  FastMutex);
  5488.  
  5489. NTOSAPI
  5490. VOID
  5491. DDKAPI
  5492. ExReleaseResourceForThreadLite(
  5493.   IN PERESOURCE  Resource,
  5494.   IN ERESOURCE_THREAD  ResourceThreadId);
  5495.  
  5496. NTOSAPI
  5497. VOID
  5498. DDKFASTAPI
  5499. ExReleaseResourceLite(
  5500.   IN PERESOURCE  Resource);
  5501.  
  5502. NTOSAPI
  5503. VOID
  5504. DDKAPI
  5505. ExSetResourceOwnerPointer( 
  5506.   IN PERESOURCE  Resource,
  5507.   IN PVOID  OwnerPointer);
  5508.  
  5509. NTOSAPI
  5510. ULONG
  5511. DDKAPI
  5512. ExSetTimerResolution(
  5513.   IN ULONG  DesiredTime,
  5514.   IN BOOLEAN  SetResolution);
  5515.  
  5516. NTOSAPI
  5517. VOID
  5518. DDKAPI
  5519. ExSystemTimeToLocalTime(
  5520.   IN PLARGE_INTEGER  SystemTime,
  5521.   OUT PLARGE_INTEGER  LocalTime);
  5522.  
  5523. NTOSAPI
  5524. BOOLEAN
  5525. DDKFASTAPI
  5526. ExTryToAcquireFastMutex(
  5527.   IN PFAST_MUTEX  FastMutex);
  5528.  
  5529. NTOSAPI
  5530. BOOLEAN
  5531. DDKAPI
  5532. ExTryToAcquireResourceExclusiveLite(
  5533.   IN PERESOURCE  Resource);
  5534.  
  5535. NTOSAPI
  5536. VOID
  5537. DDKAPI
  5538. ExUnregisterCallback(
  5539.   IN PVOID  CbRegistration);
  5540.  
  5541. NTOSAPI
  5542. NTSTATUS
  5543. DDKAPI
  5544. ExUuidCreate(
  5545.   OUT UUID  *Uuid);
  5546.  
  5547. NTOSAPI
  5548. BOOLEAN
  5549. DDKAPI
  5550. ExVerifySuite(
  5551.   IN SUITE_TYPE  SuiteType);
  5552.  
  5553. #if DBG
  5554.  
  5555. #define PAGED_CODE() { \
  5556.   if (KeGetCurrentIrql() > APC_LEVEL) { \
  5557.     KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
  5558.     assert(FALSE); \
  5559.   } \
  5560. }
  5561.  
  5562. #else
  5563.  
  5564. #define PAGED_CODE()
  5565.  
  5566. #endif
  5567.  
  5568. NTOSAPI
  5569. VOID
  5570. DDKAPI
  5571. ProbeForRead(
  5572.   IN CONST VOID  *Address,
  5573.   IN ULONG  Length,
  5574.   IN ULONG  Alignment);
  5575.  
  5576. NTOSAPI
  5577. VOID
  5578. DDKAPI
  5579. ProbeForWrite(
  5580.   IN CONST VOID  *Address,
  5581.   IN ULONG  Length,
  5582.   IN ULONG  Alignment);
  5583.  
  5584.  
  5585.  
  5586. /** Configuration manager routines **/
  5587.  
  5588. NTOSAPI
  5589. NTSTATUS
  5590. DDKAPI
  5591. CmRegisterCallback(
  5592.   IN PEX_CALLBACK_FUNCTION  Function,
  5593.   IN PVOID  Context,
  5594.   IN OUT PLARGE_INTEGER  Cookie);
  5595.  
  5596. NTOSAPI
  5597. NTSTATUS
  5598. DDKAPI
  5599. CmUnRegisterCallback(
  5600.   IN LARGE_INTEGER  Cookie);
  5601.  
  5602.  
  5603.  
  5604. /** Filesystem runtime library routines **/
  5605.  
  5606. NTOSAPI
  5607. BOOLEAN
  5608. DDKAPI
  5609. FsRtlIsTotalDeviceFailure(
  5610.   IN NTSTATUS  Status);
  5611.  
  5612.  
  5613.  
  5614. /** Hardware abstraction layer routines **/
  5615.  
  5616. NTOSAPI
  5617. VOID
  5618. DDKFASTAPI
  5619. HalExamineMBR(
  5620.   IN PDEVICE_OBJECT  DeviceObject,
  5621.   IN ULONG  SectorSize,
  5622.   IN ULONG  MBRTypeIdentifier,
  5623.   OUT PVOID  Buffer);
  5624.  
  5625. NTOSAPI
  5626. VOID
  5627. DDKAPI
  5628. READ_PORT_BUFFER_UCHAR(
  5629.   IN PUCHAR  Port,
  5630.   IN PUCHAR  Buffer,
  5631.   IN ULONG  Count);
  5632.  
  5633. NTOSAPI
  5634. VOID
  5635. DDKAPI
  5636. READ_PORT_BUFFER_ULONG(
  5637.   IN PULONG  Port,
  5638.   IN PULONG  Buffer,
  5639.   IN ULONG  Count);
  5640.  
  5641. NTOSAPI
  5642. VOID
  5643. DDKAPI
  5644. READ_PORT_BUFFER_USHORT(
  5645.   IN PUSHORT  Port,
  5646.   IN PUSHORT  Buffer,
  5647.   IN ULONG  Count);
  5648.  
  5649. NTOSAPI
  5650. UCHAR
  5651. DDKAPI
  5652. READ_PORT_UCHAR(
  5653.   IN PUCHAR  Port);
  5654.  
  5655. NTOSAPI
  5656. ULONG
  5657. DDKAPI
  5658. READ_PORT_ULONG(
  5659.   IN PULONG  Port);
  5660.  
  5661. NTOSAPI
  5662. USHORT
  5663. DDKAPI
  5664. READ_PORT_USHORT(
  5665.   IN PUSHORT  Port);
  5666.  
  5667. NTOSAPI
  5668. VOID
  5669. DDKAPI
  5670. READ_REGISTER_BUFFER_UCHAR(
  5671.   IN PUCHAR  Register,
  5672.   IN PUCHAR  Buffer,
  5673.   IN ULONG  Count);
  5674.  
  5675. NTOSAPI
  5676. VOID
  5677. DDKAPI
  5678. READ_REGISTER_BUFFER_ULONG(
  5679.   IN PULONG  Register,
  5680.   IN PULONG  Buffer,
  5681.   IN ULONG  Count);
  5682.  
  5683. NTOSAPI
  5684. VOID
  5685. DDKAPI
  5686. READ_REGISTER_BUFFER_USHORT(
  5687.   IN PUSHORT  Register,
  5688.   IN PUSHORT  Buffer,
  5689.   IN ULONG  Count);
  5690.  
  5691. NTOSAPI
  5692. UCHAR
  5693. DDKAPI
  5694. READ_REGISTER_UCHAR(
  5695.   IN PUCHAR  Register);
  5696.  
  5697. NTOSAPI
  5698. ULONG
  5699. DDKAPI
  5700. READ_REGISTER_ULONG(
  5701.   IN PULONG  Register);
  5702.  
  5703. NTOSAPI
  5704. USHORT
  5705. DDKAPI
  5706. READ_REGISTER_USHORT(
  5707.   IN PUSHORT  Register);
  5708.  
  5709. NTOSAPI
  5710. VOID
  5711. DDKAPI
  5712. WRITE_PORT_BUFFER_UCHAR(
  5713.   IN PUCHAR  Port,
  5714.   IN PUCHAR  Buffer,
  5715.   IN ULONG  Count);
  5716.  
  5717. NTOSAPI
  5718. VOID
  5719. DDKAPI
  5720. WRITE_PORT_BUFFER_ULONG(
  5721.   IN PULONG  Port,
  5722.   IN PULONG  Buffer,
  5723.   IN ULONG  Count);
  5724.  
  5725. NTOSAPI
  5726. VOID
  5727. DDKAPI
  5728. WRITE_PORT_BUFFER_USHORT(
  5729.   IN PUSHORT  Port,
  5730.   IN PUSHORT  Buffer,
  5731.   IN ULONG  Count);
  5732.  
  5733. NTOSAPI
  5734. VOID
  5735. DDKAPI
  5736. WRITE_PORT_UCHAR(
  5737.   IN PUCHAR  Port,
  5738.   IN UCHAR  Value);
  5739.  
  5740. NTOSAPI
  5741. VOID
  5742. DDKAPI
  5743. WRITE_PORT_ULONG(
  5744.   IN PULONG  Port,
  5745.   IN ULONG  Value);
  5746.  
  5747. NTOSAPI
  5748. VOID
  5749. DDKAPI
  5750. WRITE_PORT_USHORT(
  5751.   IN PUSHORT  Port,
  5752.   IN USHORT  Value);
  5753.  
  5754. NTOSAPI
  5755. VOID
  5756. DDKAPI
  5757. WRITE_REGISTER_BUFFER_UCHAR(
  5758.   IN PUCHAR  Register,
  5759.   IN PUCHAR  Buffer,
  5760.   IN ULONG  Count);
  5761.  
  5762. NTOSAPI
  5763. VOID
  5764. DDKAPI
  5765. WRITE_REGISTER_BUFFER_ULONG(
  5766.   IN PULONG  Register,
  5767.   IN PULONG  Buffer,
  5768.   IN ULONG  Count);
  5769.  
  5770. NTOSAPI
  5771. VOID
  5772. DDKAPI
  5773. WRITE_REGISTER_BUFFER_USHORT(
  5774.   IN PUSHORT  Register,
  5775.   IN PUSHORT  Buffer,
  5776.   IN ULONG  Count);
  5777.  
  5778. NTOSAPI
  5779. VOID
  5780. DDKAPI
  5781. WRITE_REGISTER_UCHAR(
  5782.   IN PUCHAR  Register,
  5783.   IN UCHAR  Value);
  5784.  
  5785. NTOSAPI
  5786. VOID
  5787. DDKAPI
  5788. WRITE_REGISTER_ULONG(
  5789.   IN PULONG  Register,
  5790.   IN ULONG  Value);
  5791.  
  5792. NTOSAPI
  5793. VOID
  5794. DDKAPI
  5795. WRITE_REGISTER_USHORT(
  5796.   IN PUSHORT  Register,
  5797.   IN USHORT  Value);
  5798.  
  5799.  
  5800.  
  5801. /** I/O manager routines **/
  5802.  
  5803. NTOSAPI
  5804. VOID
  5805. DDKAPI
  5806. IoAcquireCancelSpinLock(
  5807.   OUT PKIRQL  Irql);
  5808.  
  5809. NTOSAPI
  5810. NTSTATUS
  5811. DDKAPI
  5812. IoAcquireRemoveLockEx(
  5813.   IN PIO_REMOVE_LOCK  RemoveLock,
  5814.   IN OPTIONAL PVOID  Tag  OPTIONAL,
  5815.   IN PCSTR  File,
  5816.   IN ULONG  Line,
  5817.   IN ULONG  RemlockSize);
  5818.  
  5819. /*
  5820.  * NTSTATUS
  5821.  * IoAcquireRemoveLock(
  5822.  *   IN PIO_REMOVE_LOCK  RemoveLock,
  5823.  *   IN OPTIONAL PVOID  Tag)
  5824.  */
  5825. #define IoAcquireRemoveLock(_RemoveLock, \
  5826.                             _Tag) \
  5827.   IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK));
  5828.  
  5829. /*
  5830.  * VOID
  5831.  * IoAdjustPagingPathCount(
  5832.  *   IN PLONG  Count,
  5833.  *   IN BOOLEAN  Increment)
  5834.  */
  5835. #define IoAdjustPagingPathCount(_Count, \
  5836.                                 _Increment) \
  5837. { \
  5838.   if (_Increment) \
  5839.     { \
  5840.       InterlockedIncrement(_Count); \
  5841.     } \
  5842.   else \
  5843.     { \
  5844.       InterlockedDecrement(_Count); \
  5845.     } \
  5846. }
  5847.  
  5848. NTOSAPI
  5849. VOID
  5850. DDKAPI
  5851. IoAllocateController(
  5852.   IN PCONTROLLER_OBJECT  ControllerObject,
  5853.   IN PDEVICE_OBJECT  DeviceObject,
  5854.   IN PDRIVER_CONTROL  ExecutionRoutine,
  5855.   IN PVOID  Context);
  5856.  
  5857. NTOSAPI
  5858. NTSTATUS
  5859. DDKAPI
  5860. IoAllocateDriverObjectExtension(
  5861.   IN PDRIVER_OBJECT  DriverObject,
  5862.   IN PVOID  ClientIdentificationAddress,
  5863.   IN ULONG  DriverObjectExtensionSize,
  5864.   OUT PVOID  *DriverObjectExtension);
  5865.  
  5866. typedef struct _IO_ERROR_LOG_PACKET { 
  5867.     UCHAR  MajorFunctionCode; 
  5868.     UCHAR  RetryCount; 
  5869.     USHORT  DumpDataSize; 
  5870.     USHORT  NumberOfStrings; 
  5871.     USHORT  StringOffset; 
  5872.     USHORT  EventCategory; 
  5873.     NTSTATUS  ErrorCode; 
  5874.     ULONG  UniqueErrorValue; 
  5875.     NTSTATUS  FinalStatus; 
  5876.     ULONG  SequenceNumber; 
  5877.     ULONG  IoControlCode; 
  5878.     LARGE_INTEGER  DeviceOffset; 
  5879.     ULONG  DumpData[1]; 
  5880. } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET; 
  5881.  
  5882. NTOSAPI
  5883. PVOID
  5884. DDKAPI
  5885. IoAllocateErrorLogEntry(
  5886.   IN PVOID  IoObject,
  5887.   IN UCHAR  EntrySize);
  5888.  
  5889. NTOSAPI
  5890. PIRP
  5891. DDKAPI
  5892. IoAllocateIrp(
  5893.   IN CCHAR  StackSize,
  5894.   IN BOOLEAN  ChargeQuota);
  5895.  
  5896. NTOSAPI
  5897. PMDL
  5898. DDKAPI
  5899. IoAllocateMdl(
  5900.   IN PVOID  VirtualAddress,
  5901.   IN ULONG  Length,
  5902.   IN BOOLEAN  SecondaryBuffer,
  5903.   IN BOOLEAN  ChargeQuota,
  5904.   IN OUT PIRP  Irp  OPTIONAL);
  5905.  
  5906. NTOSAPI
  5907. PIO_WORKITEM
  5908. DDKAPI
  5909. IoAllocateWorkItem(
  5910.   IN PDEVICE_OBJECT  DeviceObject);
  5911.  
  5912. /*
  5913.  * VOID IoAssignArcName(
  5914.  *   IN PUNICODE_STRING  ArcName,
  5915.  *   IN PUNICODE_STRING  DeviceName);
  5916.  */
  5917. #define IoAssignArcName(_ArcName, _DeviceName) ( \
  5918.   IoCreateSymbolicLink((_ArcName), (_DeviceName)))
  5919.  
  5920. NTOSAPI
  5921. NTSTATUS
  5922. DDKAPI
  5923. IoAttachDevice(
  5924.   IN PDEVICE_OBJECT  SourceDevice,
  5925.   IN PUNICODE_STRING  TargetDevice,
  5926.   OUT PDEVICE_OBJECT  *AttachedDevice);
  5927.  
  5928. NTOSAPI
  5929. PDEVICE_OBJECT
  5930. DDKAPI
  5931. IoAttachDeviceToDeviceStack(
  5932.   IN PDEVICE_OBJECT  SourceDevice,
  5933.   IN PDEVICE_OBJECT  TargetDevice);
  5934.  
  5935. NTOSAPI
  5936. PIRP
  5937. DDKAPI
  5938. IoBuildAsynchronousFsdRequest(
  5939.   IN ULONG  MajorFunction,
  5940.   IN PDEVICE_OBJECT  DeviceObject,
  5941.   IN OUT PVOID  Buffer  OPTIONAL,
  5942.   IN ULONG  Length  OPTIONAL,
  5943.   IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
  5944.   IN PIO_STATUS_BLOCK  IoStatusBlock  OPTIONAL);
  5945.  
  5946. NTOSAPI
  5947. PIRP
  5948. DDKAPI
  5949. IoBuildDeviceIoControlRequest(
  5950.   IN ULONG  IoControlCode,
  5951.   IN PDEVICE_OBJECT  DeviceObject,
  5952.   IN PVOID  InputBuffer  OPTIONAL,
  5953.   IN ULONG  InputBufferLength,
  5954.   OUT PVOID  OutputBuffer  OPTIONAL,
  5955.   IN ULONG  OutputBufferLength,
  5956.   IN BOOLEAN  InternalDeviceIoControl,
  5957.   IN PKEVENT  Event,
  5958.   OUT PIO_STATUS_BLOCK  IoStatusBlock);
  5959.  
  5960. NTOSAPI
  5961. VOID
  5962. DDKAPI
  5963. IoBuildPartialMdl(
  5964.   IN PMDL  SourceMdl,
  5965.   IN OUT PMDL  TargetMdl,
  5966.   IN PVOID  VirtualAddress,
  5967.   IN ULONG  Length);
  5968.  
  5969. NTOSAPI
  5970. PIRP
  5971. DDKAPI
  5972. IoBuildSynchronousFsdRequest(
  5973.   IN ULONG  MajorFunction,
  5974.   IN PDEVICE_OBJECT  DeviceObject,
  5975.   IN OUT PVOID  Buffer  OPTIONAL,
  5976.   IN ULONG  Length  OPTIONAL,
  5977.   IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
  5978.   IN PKEVENT  Event,
  5979.   OUT PIO_STATUS_BLOCK  IoStatusBlock);
  5980.  
  5981. NTOSAPI
  5982. NTSTATUS
  5983. DDKFASTAPI
  5984. IofCallDriver(
  5985.   IN PDEVICE_OBJECT  DeviceObject,
  5986.   IN OUT PIRP  Irp);
  5987.  
  5988. /*
  5989.  * NTSTATUS
  5990.  * IoCallDriver(
  5991.  *   IN PDEVICE_OBJECT  DeviceObject,
  5992.  *   IN OUT PIRP  Irp)
  5993.  */
  5994. #define IoCallDriver IofCallDriver
  5995.  
  5996. NTOSAPI
  5997. VOID
  5998. DDKAPI
  5999. IoCancelFileOpen(
  6000.   IN PDEVICE_OBJECT  DeviceObject,
  6001.   IN PFILE_OBJECT  FileObject);
  6002.  
  6003. NTOSAPI
  6004. BOOLEAN
  6005. DDKAPI
  6006. IoCancelIrp(
  6007.   IN PIRP  Irp);
  6008.  
  6009. NTOSAPI
  6010. NTSTATUS
  6011. DDKAPI
  6012. IoCheckShareAccess(
  6013.   IN ACCESS_MASK  DesiredAccess,
  6014.   IN ULONG  DesiredShareAccess,
  6015.   IN OUT PFILE_OBJECT  FileObject,
  6016.   IN OUT PSHARE_ACCESS  ShareAccess,
  6017.   IN BOOLEAN  Update);
  6018.  
  6019. NTOSAPI
  6020. VOID
  6021. DDKFASTAPI
  6022. IofCompleteRequest(
  6023.   IN PIRP  Irp,
  6024.   IN CCHAR  PriorityBoost);
  6025.  
  6026. /*
  6027.  * VOID
  6028.  * IoCompleteRequest(
  6029.  *  IN PIRP  Irp,
  6030.  *  IN CCHAR  PriorityBoost)
  6031.  */
  6032. #define IoCompleteRequest IofCompleteRequest
  6033.  
  6034. NTOSAPI
  6035. NTSTATUS
  6036. DDKAPI
  6037. IoConnectInterrupt(
  6038.   OUT PKINTERRUPT  *InterruptObject,
  6039.   IN PKSERVICE_ROUTINE  ServiceRoutine,
  6040.   IN PVOID  ServiceContext,
  6041.   IN PKSPIN_LOCK  SpinLock  OPTIONAL,
  6042.   IN ULONG  Vector,
  6043.   IN KIRQL  Irql,
  6044.   IN KIRQL  SynchronizeIrql,
  6045.   IN KINTERRUPT_MODE    InterruptMode,
  6046.   IN BOOLEAN  ShareVector,
  6047.   IN KAFFINITY  ProcessorEnableMask,
  6048.   IN BOOLEAN  FloatingSave);
  6049.  
  6050. /*
  6051.  * PIO_STACK_LOCATION
  6052.  * IoGetCurrentIrpStackLocation(
  6053.  *   IN PIRP  Irp)
  6054.  */
  6055. #define IoGetCurrentIrpStackLocation(_Irp) \
  6056.   ((_Irp)->Tail.Overlay.CurrentStackLocation)
  6057.  
  6058. /*
  6059.  * PIO_STACK_LOCATION
  6060.  * IoGetNextIrpStackLocation(
  6061.  *   IN PIRP  Irp)
  6062.  */
  6063. #define IoGetNextIrpStackLocation(_Irp) \
  6064.   ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
  6065.  
  6066. /*
  6067.  * VOID
  6068.  * IoCopyCurrentIrpStackLocationToNext(
  6069.  *   IN PIRP  Irp)
  6070.  */
  6071. #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
  6072. { \
  6073.   PIO_STACK_LOCATION _IrpSp; \
  6074.   PIO_STACK_LOCATION _NextIrpSp; \
  6075.   _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
  6076.   _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
  6077.   RtlCopyMemory(_NextIrpSp, _IrpSp, \
  6078.     FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
  6079.   _NextIrpSp->Control = 0; \
  6080. }
  6081.  
  6082. NTOSAPI
  6083. PCONTROLLER_OBJECT
  6084. DDKAPI
  6085. IoCreateController(
  6086.   IN ULONG  Size);
  6087.  
  6088. NTOSAPI
  6089. NTSTATUS
  6090. DDKAPI
  6091. IoCreateDevice(
  6092.   IN PDRIVER_OBJECT  DriverObject,
  6093.   IN ULONG  DeviceExtensionSize,
  6094.   IN PUNICODE_STRING  DeviceName  OPTIONAL,
  6095.   IN DEVICE_TYPE  DeviceType,
  6096.   IN ULONG  DeviceCharacteristics,
  6097.   IN BOOLEAN  Exclusive,
  6098.   OUT PDEVICE_OBJECT  *DeviceObject);
  6099.  
  6100. NTOSAPI
  6101. NTSTATUS
  6102. DDKAPI
  6103. IoCreateDisk(
  6104.   IN PDEVICE_OBJECT  DeviceObject,
  6105.   IN PCREATE_DISK  Disk);
  6106.  
  6107. NTOSAPI
  6108. NTSTATUS
  6109. DDKAPI
  6110. IoCreateFile(
  6111.   OUT PHANDLE FileHandle,
  6112.   IN ACCESS_MASK DesiredAccess,
  6113.   IN POBJECT_ATTRIBUTES ObjectAttributes,
  6114.   OUT PIO_STATUS_BLOCK IoStatusBlock,
  6115.   IN PLARGE_INTEGER AllocationSize OPTIONAL,
  6116.   IN ULONG FileAttributes,
  6117.   IN ULONG ShareAccess,
  6118.   IN ULONG Disposition,
  6119.   IN ULONG CreateOptions,
  6120.   IN PVOID EaBuffer OPTIONAL,
  6121.   IN ULONG EaLength,
  6122.   IN CREATE_FILE_TYPE CreateFileType,
  6123.   IN PVOID ExtraCreateParameters OPTIONAL,
  6124.   IN ULONG Options);
  6125.  
  6126. NTOSAPI
  6127. PKEVENT
  6128. DDKAPI
  6129. IoCreateNotificationEvent(
  6130.   IN PUNICODE_STRING  EventName,
  6131.   OUT PHANDLE  EventHandle);
  6132.  
  6133. NTOSAPI
  6134. NTSTATUS
  6135. DDKAPI
  6136. IoCreateSymbolicLink(
  6137.   IN PUNICODE_STRING  SymbolicLinkName,
  6138.   IN PUNICODE_STRING  DeviceName);
  6139.  
  6140. NTOSAPI
  6141. PKEVENT
  6142. DDKAPI
  6143. IoCreateSynchronizationEvent(
  6144.   IN PUNICODE_STRING  EventName,
  6145.   OUT PHANDLE  EventHandle);
  6146.  
  6147. NTOSAPI
  6148. NTSTATUS
  6149. DDKAPI
  6150. IoCreateUnprotectedSymbolicLink(
  6151.   IN PUNICODE_STRING  SymbolicLinkName,
  6152.   IN PUNICODE_STRING  DeviceName);
  6153.  
  6154. NTOSAPI
  6155. VOID
  6156. DDKAPI
  6157. IoCsqInitialize(
  6158.   PIO_CSQ  Csq,
  6159.   IN PIO_CSQ_INSERT_IRP  CsqInsertIrp,
  6160.   IN PIO_CSQ_REMOVE_IRP  CsqRemoveIrp,
  6161.   IN PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp,
  6162.   IN PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock,
  6163.   IN PIO_CSQ_RELEASE_LOCK  CsqReleaseLock,
  6164.   IN PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp);
  6165.  
  6166. NTOSAPI
  6167. VOID
  6168. DDKAPI
  6169. IoCsqInsertIrp(
  6170.   IN  PIO_CSQ  Csq,
  6171.   IN  PIRP  Irp,
  6172.   IN  PIO_CSQ_IRP_CONTEXT  Context);
  6173.  
  6174. NTOSAPI
  6175. PIRP
  6176. DDKAPI
  6177. IoCsqRemoveIrp(
  6178.   IN  PIO_CSQ  Csq,
  6179.   IN  PIO_CSQ_IRP_CONTEXT  Context);
  6180.  
  6181. NTOSAPI
  6182. PIRP
  6183. DDKAPI
  6184. IoCsqRemoveNextIrp(
  6185.   IN PIO_CSQ  Csq,
  6186.   IN PVOID  PeekContext);
  6187.  
  6188. NTOSAPI
  6189. VOID
  6190. DDKAPI
  6191. IoDeleteController(
  6192.   IN PCONTROLLER_OBJECT  ControllerObject);
  6193.  
  6194. NTOSAPI
  6195. VOID
  6196. DDKAPI
  6197. IoDeleteDevice(
  6198.   IN PDEVICE_OBJECT  DeviceObject);
  6199.  
  6200. NTOSAPI
  6201. NTSTATUS
  6202. DDKAPI
  6203. IoDeleteSymbolicLink(
  6204.   IN PUNICODE_STRING  SymbolicLinkName);
  6205.  
  6206. /*
  6207.  * VOID
  6208.  * IoDeassignArcName(
  6209.  *   IN PUNICODE_STRING  ArcName)
  6210.  */
  6211. #define IoDeassignArcName IoDeleteSymbolicLink
  6212.  
  6213. NTOSAPI
  6214. VOID
  6215. DDKAPI
  6216. IoDetachDevice(
  6217.   IN OUT PDEVICE_OBJECT  TargetDevice);
  6218.  
  6219. NTOSAPI
  6220. VOID
  6221. DDKAPI
  6222. IoDisconnectInterrupt(
  6223.   IN PKINTERRUPT  InterruptObject);
  6224.  
  6225. NTOSAPI
  6226. BOOLEAN
  6227. DDKAPI
  6228. IoForwardIrpSynchronously(
  6229.   IN PDEVICE_OBJECT  DeviceObject,
  6230.   IN PIRP  Irp);
  6231.  
  6232. #define IoForwardAndCatchIrp IoForwardIrpSynchronously
  6233.  
  6234. NTOSAPI
  6235. VOID
  6236. DDKAPI
  6237. IoFreeController(
  6238.   IN PCONTROLLER_OBJECT  ControllerObject);
  6239.  
  6240. NTOSAPI
  6241. VOID
  6242. DDKAPI
  6243. IoFreeErrorLogEntry(
  6244.   PVOID  ElEntry);
  6245.  
  6246. NTOSAPI
  6247. VOID
  6248. DDKAPI
  6249. IoFreeIrp(
  6250.   IN PIRP  Irp);
  6251.  
  6252. NTOSAPI
  6253. VOID
  6254. DDKAPI
  6255. IoFreeMdl(
  6256.   IN PMDL  Mdl);
  6257.  
  6258. NTOSAPI
  6259. VOID
  6260. DDKAPI
  6261. IoFreeWorkItem(
  6262.   IN PIO_WORKITEM  pIOWorkItem);
  6263.  
  6264. NTOSAPI
  6265. PDEVICE_OBJECT
  6266. DDKAPI
  6267. IoGetAttachedDevice(
  6268.   IN PDEVICE_OBJECT  DeviceObject);
  6269.  
  6270. NTOSAPI
  6271. PDEVICE_OBJECT
  6272. DDKAPI
  6273. IoGetAttachedDeviceReference(
  6274.   IN PDEVICE_OBJECT  DeviceObject);
  6275.  
  6276. NTOSAPI
  6277. NTSTATUS
  6278. DDKAPI
  6279. IoGetBootDiskInformation(
  6280.   IN OUT PBOOTDISK_INFORMATION  BootDiskInformation,
  6281.   IN ULONG  Size);
  6282.  
  6283. NTOSAPI
  6284. PCONFIGURATION_INFORMATION
  6285. DDKAPI
  6286. IoGetConfigurationInformation( 
  6287.   VOID);
  6288.  
  6289. NTOSAPI
  6290. PEPROCESS
  6291. DDKAPI
  6292. IoGetCurrentProcess(
  6293.   VOID);
  6294.  
  6295. NTOSAPI
  6296. NTSTATUS
  6297. DDKAPI
  6298. IoGetDeviceInterfaceAlias(
  6299.   IN PUNICODE_STRING  SymbolicLinkName,
  6300.   IN CONST GUID  *AliasInterfaceClassGuid,
  6301.   OUT PUNICODE_STRING  AliasSymbolicLinkName);
  6302.  
  6303. NTOSAPI
  6304. NTSTATUS
  6305. DDKAPI
  6306. IoGetDeviceInterfaces(
  6307.   IN CONST GUID  *InterfaceClassGuid,
  6308.   IN PDEVICE_OBJECT  PhysicalDeviceObject  OPTIONAL,
  6309.   IN ULONG  Flags,
  6310.   OUT PWSTR  *SymbolicLinkList);
  6311.  
  6312. NTOSAPI
  6313. NTSTATUS
  6314. DDKAPI
  6315. IoGetDeviceObjectPointer(
  6316.   IN PUNICODE_STRING  ObjectName,
  6317.   IN ACCESS_MASK  DesiredAccess,
  6318.   OUT PFILE_OBJECT  *FileObject,
  6319.   OUT PDEVICE_OBJECT  *DeviceObject);
  6320.  
  6321. NTOSAPI
  6322. NTSTATUS
  6323. DDKAPI
  6324. IoGetDeviceProperty(
  6325.   IN PDEVICE_OBJECT  DeviceObject,
  6326.   IN DEVICE_REGISTRY_PROPERTY  DeviceProperty,
  6327.   IN ULONG  BufferLength,
  6328.   OUT PVOID  PropertyBuffer,
  6329.   OUT PULONG  ResultLength);
  6330.  
  6331. NTOSAPI
  6332. PDEVICE_OBJECT
  6333. DDKAPI
  6334. IoGetDeviceToVerify(
  6335.   IN PETHREAD  Thread);
  6336.  
  6337. NTOSAPI
  6338. PDMA_ADAPTER
  6339. DDKAPI
  6340. IoGetDmaAdapter(
  6341.   IN PDEVICE_OBJECT  PhysicalDeviceObject,
  6342.   IN PDEVICE_DESCRIPTION  DeviceDescription,
  6343.   IN OUT PULONG  NumberOfMapRegisters);
  6344.  
  6345. NTOSAPI
  6346. PVOID
  6347. DDKAPI
  6348. IoGetDriverObjectExtension(
  6349.   IN PDRIVER_OBJECT  DriverObject,
  6350.   IN PVOID  ClientIdentificationAddress);
  6351.  
  6352. NTOSAPI
  6353. PGENERIC_MAPPING
  6354. DDKAPI
  6355. IoGetFileObjectGenericMapping(
  6356.   VOID);
  6357.  
  6358. /*
  6359.  * ULONG
  6360.  * IoGetFunctionCodeFromCtlCode(
  6361.  *   IN ULONG  ControlCode)
  6362.  */
  6363. #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
  6364.   (((_ControlCode) >> 2) & 0x00000FFF);
  6365.  
  6366. NTOSAPI
  6367. PVOID
  6368. DDKAPI
  6369. IoGetInitialStack(
  6370.   VOID);
  6371.  
  6372. NTOSAPI
  6373. PDEVICE_OBJECT
  6374. DDKAPI
  6375. IoGetRelatedDeviceObject(
  6376.   IN PFILE_OBJECT  FileObject);
  6377.  
  6378. NTOSAPI
  6379. ULONG
  6380. DDKAPI
  6381. IoGetRemainingStackSize(
  6382.   VOID);
  6383.  
  6384. NTOSAPI
  6385. VOID
  6386. DDKAPI
  6387. IoGetStackLimits(
  6388.   OUT PULONG_PTR  LowLimit,
  6389.   OUT PULONG_PTR  HighLimit);
  6390.  
  6391. NTOSAPI
  6392. VOID
  6393. DDKAPI
  6394. KeInitializeDpc(
  6395.   IN PRKDPC  Dpc,
  6396.   IN PKDEFERRED_ROUTINE  DeferredRoutine,
  6397.   IN PVOID  DeferredContext);
  6398.  
  6399. /*
  6400.  * VOID
  6401.  * IoInitializeDpcRequest(
  6402.  *   IN PDEVICE_OBJECT DeviceObject,
  6403.  *   IN PIO_DPC_ROUTINE DpcRoutine)
  6404.  */
  6405. #define IoInitializeDpcRequest(_DeviceObject, \
  6406.                                _DpcRoutine) \
  6407.   KeInitializeDpc(&(_DeviceObject)->Dpc, \
  6408.     (PKDEFERRED_ROUTINE) (_DpcRoutine), \
  6409.     _DeviceObject);
  6410.  
  6411. NTOSAPI
  6412. VOID
  6413. DDKAPI
  6414. IoInitializeIrp(
  6415.   IN OUT PIRP  Irp,
  6416.   IN USHORT  PacketSize,
  6417.   IN CCHAR  StackSize);
  6418.  
  6419. NTOSAPI
  6420. VOID
  6421. DDKAPI
  6422. IoInitializeRemoveLockEx(
  6423.   IN  PIO_REMOVE_LOCK Lock,
  6424.   IN  ULONG   AllocateTag,
  6425.   IN  ULONG   MaxLockedMinutes,
  6426.   IN  ULONG   HighWatermark,
  6427.   IN  ULONG   RemlockSize);
  6428.  
  6429. /* VOID
  6430.  * IoInitializeRemoveLock(
  6431.  *   IN PIO_REMOVE_LOCK  Lock,
  6432.  *   IN ULONG  AllocateTag,
  6433.  *   IN ULONG  MaxLockedMinutes,
  6434.  *   IN ULONG  HighWatermark)
  6435.  */
  6436. #define IoInitializeRemoveLock( \
  6437.   Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
  6438.   IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
  6439.     HighWatermark, sizeof(IO_REMOVE_LOCK));
  6440.  
  6441. NTOSAPI
  6442. NTSTATUS
  6443. DDKAPI
  6444. IoInitializeTimer(
  6445.   IN PDEVICE_OBJECT  DeviceObject,
  6446.   IN PIO_TIMER_ROUTINE  TimerRoutine,
  6447.   IN PVOID  Context);
  6448.  
  6449. NTOSAPI
  6450. VOID
  6451. DDKAPI
  6452. IoInvalidateDeviceRelations(
  6453.   IN PDEVICE_OBJECT  DeviceObject,
  6454.   IN DEVICE_RELATION_TYPE  Type);
  6455.  
  6456. NTOSAPI
  6457. VOID
  6458. DDKAPI
  6459. IoInvalidateDeviceState(
  6460.   IN PDEVICE_OBJECT  PhysicalDeviceObject);
  6461.  
  6462. NTOSAPI
  6463. BOOLEAN
  6464. DDKAPI
  6465. IoIs32bitProcess(
  6466.   IN PIRP  Irp  OPTIONAL);
  6467.  
  6468. /*
  6469.  * BOOLEAN
  6470.  * IoIsErrorUserInduced(
  6471.  *   IN NTSTATUS  Status);
  6472.  */
  6473. #define IoIsErrorUserInduced(Status) \
  6474.     ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
  6475.    ((Status) == STATUS_IO_TIMEOUT) || \
  6476.    ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
  6477.    ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
  6478.    ((Status) == STATUS_VERIFY_REQUIRED) || \
  6479.    ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
  6480.    ((Status) == STATUS_WRONG_VOLUME)))
  6481.  
  6482. NTOSAPI
  6483. BOOLEAN
  6484. DDKAPI
  6485. IoIsWdmVersionAvailable(
  6486.   IN UCHAR  MajorVersion,
  6487.   IN UCHAR  MinorVersion);
  6488.  
  6489. NTOSAPI
  6490. PIRP
  6491. DDKAPI
  6492. IoMakeAssociatedIrp(
  6493.   IN PIRP  Irp,
  6494.   IN CCHAR  StackSize);
  6495.  
  6496. /*
  6497.  * VOID
  6498.  * IoMarkIrpPending(
  6499.  *   IN OUT PIRP  Irp)
  6500.  */
  6501. #define IoMarkIrpPending(_Irp) \
  6502.   (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
  6503.  
  6504. NTOSAPI
  6505. NTSTATUS
  6506. DDKAPI
  6507. IoOpenDeviceInterfaceRegistryKey(
  6508.   IN PUNICODE_STRING  SymbolicLinkName,
  6509.   IN ACCESS_MASK  DesiredAccess,
  6510.   OUT PHANDLE  DeviceInterfaceKey);
  6511.  
  6512. NTOSAPI
  6513. NTSTATUS
  6514. DDKAPI
  6515. IoOpenDeviceRegistryKey(
  6516.   IN PDEVICE_OBJECT  DeviceObject,
  6517.   IN ULONG  DevInstKeyType,
  6518.   IN ACCESS_MASK  DesiredAccess,
  6519.   OUT PHANDLE  DevInstRegKey);
  6520.  
  6521. NTOSAPI
  6522. NTSTATUS
  6523. DDKAPI
  6524. IoQueryDeviceDescription(
  6525.   IN PINTERFACE_TYPE  BusType  OPTIONAL,
  6526.   IN PULONG  BusNumber  OPTIONAL,
  6527.   IN PCONFIGURATION_TYPE  ControllerType  OPTIONAL,
  6528.   IN PULONG  ControllerNumber  OPTIONAL,
  6529.   IN PCONFIGURATION_TYPE  PeripheralType  OPTIONAL,
  6530.   IN PULONG  PeripheralNumber  OPTIONAL,
  6531.   IN PIO_QUERY_DEVICE_ROUTINE  CalloutRoutine,
  6532.   IN PVOID  Context);
  6533.  
  6534. NTOSAPI
  6535. VOID
  6536. DDKAPI
  6537. IoQueueWorkItem(
  6538.   IN PIO_WORKITEM  pIOWorkItem,
  6539.   IN PIO_WORKITEM_ROUTINE  Routine,
  6540.   IN WORK_QUEUE_TYPE  QueueType,
  6541.   IN PVOID  Context);
  6542.  
  6543. NTOSAPI
  6544. VOID
  6545. DDKAPI
  6546. IoRaiseHardError(
  6547.   IN PIRP  Irp,
  6548.   IN PVPB  Vpb  OPTIONAL,
  6549.   IN PDEVICE_OBJECT  RealDeviceObject);
  6550.  
  6551. NTOSAPI
  6552. BOOLEAN
  6553. DDKAPI
  6554. IoRaiseInformationalHardError(
  6555.   IN NTSTATUS  ErrorStatus,
  6556.   IN PUNICODE_STRING  String  OPTIONAL,
  6557.   IN PKTHREAD  Thread  OPTIONAL);
  6558.  
  6559. NTOSAPI
  6560. NTSTATUS
  6561. DDKAPI
  6562. IoReadDiskSignature(
  6563.   IN PDEVICE_OBJECT  DeviceObject,
  6564.   IN ULONG  BytesPerSector,
  6565.   OUT PDISK_SIGNATURE  Signature);
  6566.  
  6567. NTOSAPI
  6568. NTSTATUS
  6569. DDKAPI
  6570. IoReadPartitionTableEx(
  6571.   IN PDEVICE_OBJECT  DeviceObject,
  6572.   IN struct _DRIVE_LAYOUT_INFORMATION_EX  **PartitionBuffer);
  6573.  
  6574. NTOSAPI
  6575. VOID
  6576. DDKAPI
  6577. IoRegisterBootDriverReinitialization(
  6578.   IN PDRIVER_OBJECT  DriverObject,
  6579.   IN PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
  6580.   IN PVOID  Context);
  6581.  
  6582. NTOSAPI
  6583. VOID
  6584. DDKAPI
  6585. IoRegisterBootDriverReinitialization(
  6586.   IN PDRIVER_OBJECT  DriverObject,
  6587.   IN PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
  6588.   IN PVOID  Context);
  6589.  
  6590. NTOSAPI
  6591. NTSTATUS
  6592. DDKAPI
  6593. IoRegisterDeviceInterface(
  6594.   IN PDEVICE_OBJECT  PhysicalDeviceObject,
  6595.   IN CONST GUID  *InterfaceClassGuid,
  6596.   IN PUNICODE_STRING  ReferenceString  OPTIONAL,
  6597.   OUT PUNICODE_STRING  SymbolicLinkName);
  6598.  
  6599. NTOSAPI
  6600. VOID
  6601. DDKAPI
  6602. IoRegisterDriverReinitialization(
  6603.   IN PDRIVER_OBJECT  DriverObject,
  6604.   IN PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
  6605.   IN PVOID  Context);
  6606.  
  6607. NTOSAPI
  6608. NTSTATUS
  6609. DDKAPI
  6610. IoRegisterPlugPlayNotification(
  6611.   IN IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
  6612.   IN ULONG  EventCategoryFlags,
  6613.   IN PVOID  EventCategoryData  OPTIONAL,
  6614.   IN PDRIVER_OBJECT  DriverObject,
  6615.   IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
  6616.   IN PVOID  Context,
  6617.   OUT PVOID  *NotificationEntry);
  6618.  
  6619. NTOSAPI
  6620. NTSTATUS
  6621. DDKAPI
  6622. IoRegisterShutdownNotification(
  6623.   IN PDEVICE_OBJECT  DeviceObject);
  6624.  
  6625. NTOSAPI
  6626. VOID
  6627. DDKAPI
  6628. IoReleaseCancelSpinLock(
  6629.   IN KIRQL  Irql);
  6630.  
  6631. NTOSAPI
  6632. VOID
  6633. DDKAPI
  6634. IoReleaseRemoveLockAndWaitEx(
  6635.   IN PIO_REMOVE_LOCK  RemoveLock,
  6636.   IN PVOID  Tag,
  6637.   IN ULONG  RemlockSize);
  6638.  
  6639. NTOSAPI
  6640. VOID
  6641. DDKAPI
  6642. IoReleaseRemoveLockEx(
  6643.   IN PIO_REMOVE_LOCK  RemoveLock,
  6644.   IN PVOID  Tag,
  6645.   IN ULONG  RemlockSize);
  6646.  
  6647. /*
  6648.  * VOID
  6649.  * IoReleaseRemoveLockAndWait(
  6650.  *   IN PIO_REMOVE_LOCK  RemoveLock,
  6651.  *   IN PVOID  Tag)
  6652.  */
  6653. #define IoReleaseRemoveLockAndWait(_RemoveLock, \
  6654.                                    _Tag) \
  6655.   IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK));
  6656.  
  6657. NTOSAPI
  6658. VOID
  6659. DDKAPI
  6660. IoRemoveShareAccess(
  6661.   IN PFILE_OBJECT  FileObject,
  6662.   IN OUT PSHARE_ACCESS  ShareAccess);
  6663.  
  6664. NTOSAPI
  6665. NTSTATUS
  6666. DDKAPI
  6667. IoReportDetectedDevice(
  6668.   IN PDRIVER_OBJECT  DriverObject,
  6669.   IN INTERFACE_TYPE  LegacyBusType,
  6670.   IN ULONG  BusNumber,
  6671.   IN ULONG  SlotNumber,
  6672.   IN PCM_RESOURCE_LIST  ResourceList,
  6673.   IN PIO_RESOURCE_REQUIREMENTS_LIST  ResourceRequirements  OPTIONAL,
  6674.   IN BOOLEAN  ResourceAssigned,
  6675.   IN OUT PDEVICE_OBJECT  *DeviceObject);
  6676.  
  6677. NTOSAPI
  6678. NTSTATUS
  6679. DDKAPI
  6680. IoReportResourceForDetection(
  6681.   IN PDRIVER_OBJECT  DriverObject,
  6682.   IN PCM_RESOURCE_LIST  DriverList  OPTIONAL,
  6683.   IN ULONG  DriverListSize  OPTIONAL,
  6684.   IN PDEVICE_OBJECT  DeviceObject  OPTIONAL,
  6685.   IN PCM_RESOURCE_LIST  DeviceList  OPTIONAL,
  6686.   IN ULONG  DeviceListSize  OPTIONAL,
  6687.   OUT PBOOLEAN  ConflictDetected);
  6688.  
  6689. NTOSAPI
  6690. NTSTATUS
  6691. DDKAPI
  6692. IoReportResourceUsage(
  6693.   IN PUNICODE_STRING  DriverClassName  OPTIONAL,
  6694.   IN PDRIVER_OBJECT  DriverObject,
  6695.   IN PCM_RESOURCE_LIST  DriverList  OPTIONAL,
  6696.   IN ULONG  DriverListSize  OPTIONAL,
  6697.   IN PDEVICE_OBJECT  DeviceObject,
  6698.   IN PCM_RESOURCE_LIST  DeviceList  OPTIONAL,
  6699.   IN ULONG  DeviceListSize  OPTIONAL,
  6700.   IN BOOLEAN  OverrideConflict,
  6701.   OUT PBOOLEAN  ConflictDetected);
  6702.  
  6703. NTOSAPI
  6704. NTSTATUS
  6705. DDKAPI
  6706. IoReportTargetDeviceChange(
  6707.   IN PDEVICE_OBJECT  PhysicalDeviceObject,
  6708.   IN PVOID  NotificationStructure);
  6709.  
  6710. NTOSAPI
  6711. NTSTATUS
  6712. DDKAPI
  6713. IoReportTargetDeviceChangeAsynchronous(
  6714.   IN PDEVICE_OBJECT  PhysicalDeviceObject,
  6715.   IN PVOID  NotificationStructure,
  6716.   IN PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  OPTIONAL,
  6717.   IN PVOID  Context  OPTIONAL);
  6718.  
  6719. NTOSAPI
  6720. VOID
  6721. DDKAPI
  6722. IoRequestDeviceEject(
  6723.   IN PDEVICE_OBJECT  PhysicalDeviceObject);
  6724.  
  6725. /*
  6726.  * VOID
  6727.  * IoRequestDpc(
  6728.  *   IN PDEVICE_OBJECT  DeviceObject,
  6729.  *   IN PIRP  Irp,
  6730.  *   IN PVOID  Context);
  6731.  */
  6732. #define IoRequestDpc(DeviceObject, Irp, Context)( \
  6733.   KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
  6734.  
  6735. NTOSAPI
  6736. VOID
  6737. DDKAPI
  6738. IoReuseIrp(
  6739.   IN OUT PIRP  Irp,
  6740.   IN NTSTATUS  Status);
  6741.  
  6742. /*
  6743.  * PDRIVER_CANCEL
  6744.  * IoSetCancelRoutine(
  6745.  *   IN PIRP  Irp,
  6746.  *   IN PDRIVER_CANCEL  CancelRoutine)
  6747.  */
  6748. #define IoSetCancelRoutine(_Irp, \
  6749.                            _CancelRoutine) \
  6750.   (PDRIVER_CANCEL) InterlockedExchangePointer( \
  6751.     (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine));
  6752.  
  6753. /*
  6754.  * VOID
  6755.  * IoSetCompletionRoutine(
  6756.  *   IN PIRP  Irp,
  6757.  *   IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
  6758.  *   IN PVOID  Context,
  6759.  *   IN BOOLEAN  InvokeOnSuccess,
  6760.  *   IN BOOLEAN  InvokeOnError,
  6761.  *   IN BOOLEAN  InvokeOnCancel)
  6762.  */
  6763. #define IoSetCompletionRoutine(_Irp, \
  6764.                                _CompletionRoutine, \
  6765.                                _Context, \
  6766.                                _InvokeOnSuccess, \
  6767.                                _InvokeOnError, \
  6768.                                _InvokeOnCancel) \
  6769. { \
  6770.   PIO_STACK_LOCATION _IrpSp; \
  6771.   assert(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
  6772.     _CompletionRoutine != NULL : TRUE); \
  6773.   _IrpSp = IoGetNextIrpStackLocation(_Irp); \
  6774.   _IrpSp->CompletionRoutine = (_CompletionRoutine); \
  6775.     _IrpSp->Context = (_Context); \
  6776.   _IrpSp->Control = 0; \
  6777.   if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
  6778.   if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
  6779.   if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
  6780. }
  6781.  
  6782. NTOSAPI
  6783. VOID
  6784. DDKAPI
  6785. IoSetCompletionRoutineEx(
  6786.   IN PDEVICE_OBJECT  DeviceObject,
  6787.   IN PIRP  Irp,
  6788.   IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
  6789.   IN PVOID  Context,
  6790.   IN BOOLEAN    InvokeOnSuccess,
  6791.   IN BOOLEAN  InvokeOnError,
  6792.   IN BOOLEAN  InvokeOnCancel);
  6793.  
  6794. NTOSAPI
  6795. NTSTATUS
  6796. DDKAPI
  6797. IoSetDeviceInterfaceState(
  6798.   IN PUNICODE_STRING  SymbolicLinkName,
  6799.   IN BOOLEAN  Enable);
  6800.  
  6801. NTOSAPI
  6802. VOID
  6803. DDKAPI
  6804. IoSetHardErrorOrVerifyDevice(
  6805.   IN PIRP  Irp,
  6806.   IN PDEVICE_OBJECT  DeviceObject);
  6807.  
  6808. /*
  6809.  * VOID
  6810.  * IoSetNextIrpStackLocation(
  6811.  *   IN OUT PIRP  Irp)
  6812.  */
  6813. #define IoSetNextIrpStackLocation(_Irp) \
  6814. { \
  6815.   (_Irp)->CurrentLocation--; \
  6816.   (_Irp)->Tail.Overlay.CurrentStackLocation--; \
  6817. }
  6818.  
  6819. NTOSAPI
  6820. NTSTATUS
  6821. DDKAPI
  6822. IoSetPartitionInformationEx(
  6823.   IN PDEVICE_OBJECT  DeviceObject,
  6824.   IN ULONG  PartitionNumber,
  6825.   IN struct _SET_PARTITION_INFORMATION_EX  *PartitionInfo);
  6826.  
  6827. NTOSAPI
  6828. VOID
  6829. DDKAPI
  6830. IoSetShareAccess(
  6831.   IN ACCESS_MASK  DesiredAccess,
  6832.   IN ULONG  DesiredShareAccess,
  6833.   IN OUT PFILE_OBJECT  FileObject,
  6834.   OUT PSHARE_ACCESS  ShareAccess);
  6835.  
  6836. NTOSAPI
  6837. VOID
  6838. DDKAPI
  6839. IoSetStartIoAttributes(
  6840.   IN PDEVICE_OBJECT  DeviceObject, 
  6841.   IN BOOLEAN  DeferredStartIo, 
  6842.   IN BOOLEAN  NonCancelable); 
  6843.  
  6844. NTOSAPI
  6845. NTSTATUS
  6846. DDKAPI
  6847. IoSetSystemPartition(
  6848.   IN PUNICODE_STRING  VolumeNameString);
  6849.  
  6850. NTOSAPI
  6851. BOOLEAN
  6852. DDKAPI
  6853. IoSetThreadHardErrorMode(
  6854.   IN BOOLEAN  EnableHardErrors);
  6855.  
  6856. /*
  6857.  * USHORT
  6858.  * IoSizeOfIrp(
  6859.  *   IN CCHAR  StackSize)
  6860.  */
  6861. #define IoSizeOfIrp(_StackSize) \
  6862.   ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
  6863.  
  6864. /*
  6865.  * VOID
  6866.  * IoSkipCurrentIrpStackLocation(
  6867.  *   IN PIRP  Irp)
  6868.  */
  6869. #define IoSkipCurrentIrpStackLocation(_Irp) \
  6870. { \
  6871.   (_Irp)->CurrentLocation++; \
  6872.   (_Irp)->Tail.Overlay.CurrentStackLocation++; \
  6873. }
  6874.  
  6875. NTOSAPI
  6876. VOID
  6877. DDKAPI
  6878. IoStartNextPacket(
  6879.   IN PDEVICE_OBJECT  DeviceObject,
  6880.   IN BOOLEAN  Cancelable);
  6881.  
  6882. NTOSAPI
  6883. VOID
  6884. DDKAPI
  6885. IoStartNextPacketByKey(
  6886.   IN PDEVICE_OBJECT  DeviceObject,
  6887.   IN BOOLEAN  Cancelable,
  6888.   IN ULONG  Key);
  6889.  
  6890. NTOSAPI
  6891. VOID
  6892. DDKAPI
  6893. IoStartPacket(
  6894.   IN PDEVICE_OBJECT  DeviceObject,
  6895.   IN PIRP  Irp,
  6896.   IN PULONG  Key  OPTIONAL,
  6897.   IN PDRIVER_CANCEL  CancelFunction  OPTIONAL);
  6898.  
  6899. NTOSAPI
  6900. VOID
  6901. DDKAPI
  6902. IoStartTimer(
  6903.   IN PDEVICE_OBJECT  DeviceObject);
  6904.  
  6905. NTOSAPI
  6906. VOID
  6907. DDKAPI
  6908. IoStopTimer(
  6909.   IN PDEVICE_OBJECT  DeviceObject);
  6910.  
  6911. NTOSAPI
  6912. NTSTATUS
  6913. DDKAPI
  6914. IoUnregisterPlugPlayNotification(
  6915.   IN PVOID  NotificationEntry);
  6916.  
  6917. NTOSAPI
  6918. VOID
  6919. DDKAPI
  6920. IoUnregisterShutdownNotification(
  6921.   IN PDEVICE_OBJECT  DeviceObject);
  6922.  
  6923. NTOSAPI
  6924. VOID
  6925. DDKAPI
  6926. IoUpdateShareAccess(
  6927.   IN PFILE_OBJECT  FileObject,
  6928.   IN OUT PSHARE_ACCESS  ShareAccess);
  6929.  
  6930. NTOSAPI
  6931. NTSTATUS
  6932. DDKAPI
  6933. IoVerifyPartitionTable(
  6934.   IN PDEVICE_OBJECT  DeviceObject,
  6935.   IN BOOLEAN  FixErrors);
  6936.  
  6937. NTOSAPI
  6938. NTSTATUS
  6939. DDKAPI
  6940. IoVolumeDeviceToDosName(
  6941.   IN  PVOID  VolumeDeviceObject,
  6942.   OUT PUNICODE_STRING  DosName);
  6943.  
  6944. NTOSAPI
  6945. NTSTATUS
  6946. DDKAPI
  6947. IoWMIAllocateInstanceIds(
  6948.   IN GUID  *Guid,
  6949.   IN ULONG  InstanceCount,
  6950.   OUT ULONG  *FirstInstanceId);
  6951.  
  6952. NTOSAPI
  6953. ULONG
  6954. DDKAPI
  6955. IoWMIDeviceObjectToProviderId(
  6956.   IN PDEVICE_OBJECT  DeviceObject);
  6957.  
  6958. NTOSAPI
  6959. NTSTATUS
  6960. DDKAPI
  6961. IoWMIDeviceObjectToInstanceName(
  6962.   IN PVOID  DataBlockObject,
  6963.   IN PDEVICE_OBJECT  DeviceObject,
  6964.   OUT PUNICODE_STRING  InstanceName);
  6965.  
  6966. NTOSAPI
  6967. NTSTATUS
  6968. DDKAPI
  6969. IoWMIExecuteMethod(
  6970.   IN PVOID  DataBlockObject,
  6971.   IN PUNICODE_STRING  InstanceName,
  6972.   IN ULONG  MethodId,
  6973.   IN ULONG  InBufferSize,
  6974.   IN OUT PULONG  OutBufferSize,
  6975.   IN OUT  PUCHAR  InOutBuffer);
  6976.  
  6977. NTOSAPI
  6978. NTSTATUS
  6979. DDKAPI
  6980. IoWMIHandleToInstanceName(
  6981.   IN PVOID  DataBlockObject,
  6982.   IN HANDLE  FileHandle,
  6983.   OUT PUNICODE_STRING  InstanceName);
  6984.  
  6985. NTOSAPI
  6986. NTSTATUS
  6987. DDKAPI
  6988. IoWMIOpenBlock(
  6989.   IN GUID  *DataBlockGuid,
  6990.   IN ULONG  DesiredAccess,
  6991.   OUT PVOID  *DataBlockObject);
  6992.  
  6993. NTOSAPI
  6994. NTSTATUS
  6995. DDKAPI
  6996. IoWMIQueryAllData(
  6997.   IN PVOID  DataBlockObject,
  6998.   IN OUT ULONG  *InOutBufferSize,
  6999.   OUT PVOID  OutBuffer);
  7000.  
  7001. NTOSAPI
  7002. NTSTATUS
  7003. DDKAPI
  7004. IoWMIQueryAllDataMultiple(
  7005.   IN PVOID  *DataBlockObjectList,
  7006.   IN ULONG  ObjectCount,
  7007.   IN OUT ULONG  *InOutBufferSize,
  7008.   OUT PVOID  OutBuffer);
  7009.  
  7010. NTOSAPI
  7011. NTSTATUS
  7012. DDKAPI
  7013. IoWMIQuerySingleInstance(
  7014.   IN PVOID  DataBlockObject,
  7015.   IN PUNICODE_STRING  InstanceName,
  7016.   IN OUT ULONG  *InOutBufferSize,
  7017.   OUT PVOID OutBuffer);
  7018.  
  7019. NTOSAPI
  7020. NTSTATUS
  7021. DDKAPI
  7022. IoWMIQuerySingleInstanceMultiple(
  7023.   IN PVOID  *DataBlockObjectList,
  7024.   IN PUNICODE_STRING  InstanceNames,
  7025.   IN ULONG  ObjectCount,
  7026.   IN OUT ULONG  *InOutBufferSize,
  7027.   OUT PVOID  OutBuffer);
  7028.  
  7029. NTOSAPI
  7030. NTSTATUS
  7031. DDKAPI
  7032. IoWMIRegistrationControl(
  7033.   IN PDEVICE_OBJECT  DeviceObject,
  7034.   IN ULONG  Action);
  7035.  
  7036. NTOSAPI
  7037. NTSTATUS
  7038. DDKAPI
  7039. IoWMISetNotificationCallback(
  7040.   IN PVOID  Object,
  7041.   IN WMI_NOTIFICATION_CALLBACK  Callback,
  7042.   IN PVOID  Context);
  7043.  
  7044. NTOSAPI
  7045. NTSTATUS
  7046. DDKAPI
  7047. IoWMISetSingleInstance(
  7048.   IN PVOID  DataBlockObject,
  7049.   IN PUNICODE_STRING  InstanceName,
  7050.   IN ULONG  Version,
  7051.   IN ULONG  ValueBufferSize,
  7052.   IN PVOID  ValueBuffer);
  7053.  
  7054. NTOSAPI
  7055. NTSTATUS
  7056. DDKAPI
  7057. IoWMISetSingleItem(
  7058.   IN PVOID  DataBlockObject,
  7059.   IN PUNICODE_STRING  InstanceName,
  7060.   IN ULONG  DataItemId,
  7061.   IN ULONG  Version,
  7062.   IN ULONG  ValueBufferSize,
  7063.   IN PVOID  ValueBuffer);
  7064.  
  7065. NTOSAPI
  7066. NTSTATUS
  7067. DDKAPI
  7068. IoWMISuggestInstanceName(
  7069.   IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
  7070.   IN PUNICODE_STRING  SymbolicLinkName OPTIONAL,
  7071.   IN BOOLEAN  CombineNames,
  7072.   OUT PUNICODE_STRING  SuggestedInstanceName);
  7073.  
  7074. NTOSAPI
  7075. NTSTATUS
  7076. DDKAPI
  7077. IoWMIWriteEvent(
  7078.   IN PVOID  WnodeEventItem);
  7079.  
  7080. NTOSAPI
  7081. VOID
  7082. DDKAPI
  7083. IoWriteErrorLogEntry(
  7084.   IN PVOID  ElEntry);
  7085.  
  7086. NTOSAPI
  7087. NTSTATUS
  7088. DDKAPI
  7089. IoWritePartitionTableEx(
  7090.   IN PDEVICE_OBJECT  DeviceObject,
  7091.   IN struct _DRIVE_LAYOUT_INFORMATION_EX  *PartitionBuffer);
  7092.  
  7093.  
  7094.  
  7095. /** Kernel routines **/
  7096.  
  7097. NTOSAPI
  7098. VOID
  7099. DDKFASTAPI
  7100. KeAcquireInStackQueuedSpinLock(
  7101.   IN PKSPIN_LOCK  SpinLock,
  7102.   IN PKLOCK_QUEUE_HANDLE  LockHandle);
  7103.  
  7104. NTOSAPI
  7105. VOID
  7106. DDKFASTAPI
  7107. KeAcquireInStackQueuedSpinLockAtDpcLevel(
  7108.   IN PKSPIN_LOCK  SpinLock,
  7109.   IN PKLOCK_QUEUE_HANDLE  LockHandle);
  7110.  
  7111. NTOSAPI
  7112. KIRQL
  7113. DDKAPI
  7114. KeAcquireInterruptSpinLock(
  7115.   IN PKINTERRUPT  Interrupt);
  7116.  
  7117. NTOSAPI
  7118. VOID
  7119. DDKAPI
  7120. KeAcquireSpinLock(
  7121.   IN PKSPIN_LOCK  SpinLock,
  7122.   OUT PKIRQL  OldIrql);
  7123.  
  7124. /* System Service Dispatch Table */
  7125. typedef struct _SSDT {
  7126.   ULONG  SysCallPtr;
  7127. } SSDT, *PSSDT;
  7128.  
  7129. /* System Service Parameters Table */
  7130. typedef struct _SSPT {
  7131.   ULONG  ParamBytes;
  7132. } SSPT, *PSSPT;
  7133.  
  7134. typedef struct _SSDT_ENTRY {
  7135.     PSSDT  SSDT;
  7136.     PULONG  ServiceCounterTable;
  7137.     ULONG  NumberOfServices;
  7138.     PSSPT  SSPT;
  7139. } SSDT_ENTRY, *PSSDT_ENTRY;
  7140.  
  7141. NTOSAPI
  7142. BOOLEAN
  7143. DDKAPI
  7144. KeAddSystemServiceTable(
  7145.   IN PSSDT  SSDT,
  7146.   IN PULONG  ServiceCounterTable,
  7147.   IN ULONG  NumberOfServices,
  7148.   IN PSSPT  SSPT,
  7149.   IN ULONG  TableIndex);
  7150.  
  7151. NTOSAPI
  7152. BOOLEAN
  7153. DDKAPI
  7154. KeAreApcsDisabled(
  7155.   VOID);
  7156.  
  7157. NTOSAPI
  7158. VOID
  7159. DDKAPI
  7160. KeAttachProcess(
  7161.   IN PEPROCESS  Process);
  7162.  
  7163. NTOSAPI
  7164. VOID
  7165. DDKAPI
  7166. KeBugCheck(
  7167.   IN ULONG  BugCheckCode);
  7168.  
  7169. NTOSAPI
  7170. VOID
  7171. DDKAPI
  7172. KeBugCheckEx(
  7173.   IN ULONG  BugCheckCode,
  7174.   IN ULONG_PTR  BugCheckParameter1,
  7175.   IN ULONG_PTR  BugCheckParameter2,
  7176.   IN ULONG_PTR  BugCheckParameter3,
  7177.   IN ULONG_PTR  BugCheckParameter4);
  7178.  
  7179. NTOSAPI
  7180. BOOLEAN
  7181. DDKAPI
  7182. KeCancelTimer(
  7183.   IN PKTIMER  Timer);
  7184.  
  7185. NTOSAPI
  7186. VOID
  7187. DDKAPI
  7188. KeClearEvent(
  7189.   IN PRKEVENT  Event);
  7190.  
  7191. NTOSAPI
  7192. NTSTATUS
  7193. DDKAPI
  7194. KeDelayExecutionThread(
  7195.   IN KPROCESSOR_MODE  WaitMode,
  7196.   IN BOOLEAN  Alertable,
  7197.   IN PLARGE_INTEGER  Interval);
  7198.  
  7199. NTOSAPI
  7200. BOOLEAN
  7201. DDKAPI
  7202. KeDeregisterBugCheckCallback(
  7203.   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord);
  7204.  
  7205. NTOSAPI
  7206. VOID
  7207. DDKAPI
  7208. KeDetachProcess(
  7209.   VOID);
  7210.  
  7211. NTOSAPI
  7212. VOID
  7213. DDKAPI
  7214. KeEnterCriticalRegion(
  7215.   VOID);
  7216.  
  7217. /*
  7218.  * VOID
  7219.  * KeFlushIoBuffers(
  7220.  *   IN PMDL  Mdl,
  7221.  *   IN BOOLEAN  ReadOperation,
  7222.  *   IN BOOLEAN  DmaOperation)
  7223.  */
  7224. #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
  7225.  
  7226. NTOSAPI
  7227. PRKTHREAD
  7228. DDKAPI
  7229. KeGetCurrentThread(
  7230.   VOID);
  7231.  
  7232. NTOSAPI
  7233. KPROCESSOR_MODE
  7234. DDKAPI
  7235. KeGetPreviousMode(
  7236.   VOID);
  7237.  
  7238. NTOSAPI
  7239. ULONG
  7240. DDKAPI
  7241. KeGetRecommendedSharedDataAlignment(
  7242.   VOID);
  7243.  
  7244. NTOSAPI
  7245. VOID
  7246. DDKAPI
  7247. KeInitializeApc(
  7248.   IN PKAPC  Apc,
  7249.     IN PKTHREAD  Thread,
  7250.     IN UCHAR  StateIndex,
  7251.     IN PKKERNEL_ROUTINE  KernelRoutine,
  7252.     IN PKRUNDOWN_ROUTINE  RundownRoutine,
  7253.     IN PKNORMAL_ROUTINE  NormalRoutine,
  7254.     IN UCHAR  Mode,
  7255.     IN PVOID  Context);
  7256.  
  7257. NTOSAPI
  7258. VOID
  7259. DDKAPI
  7260. KeInitializeDeviceQueue(
  7261.   IN PKDEVICE_QUEUE  DeviceQueue);
  7262.  
  7263. NTOSAPI
  7264. VOID
  7265. DDKAPI
  7266. KeInitializeMutex(
  7267.   IN PRKMUTEX  Mutex,
  7268.   IN ULONG  Level);
  7269.  
  7270. NTOSAPI
  7271. VOID
  7272. DDKAPI
  7273. KeInitializeSemaphore(
  7274.   IN PRKSEMAPHORE  Semaphore,
  7275.   IN LONG  Count,
  7276.   IN LONG  Limit);
  7277.  
  7278. NTOSAPI
  7279. VOID
  7280. DDKAPI
  7281. KeInitializeSpinLock(
  7282.   IN PKSPIN_LOCK  SpinLock);
  7283.  
  7284. NTOSAPI
  7285. VOID
  7286. DDKAPI
  7287. KeInitializeTimer(
  7288.   IN PKTIMER  Timer);
  7289.  
  7290. NTOSAPI
  7291. VOID
  7292. DDKAPI
  7293. KeInitializeTimerEx(
  7294.   IN PKTIMER  Timer,
  7295.   IN TIMER_TYPE  Type);
  7296.  
  7297. NTOSAPI
  7298. BOOLEAN
  7299. DDKAPI
  7300. KeInsertByKeyDeviceQueue(
  7301.   IN PKDEVICE_QUEUE  DeviceQueue,
  7302.   IN PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry,
  7303.   IN ULONG  SortKey);
  7304.  
  7305. NTOSAPI
  7306. BOOLEAN
  7307. DDKAPI
  7308. KeInsertDeviceQueue(
  7309.   IN PKDEVICE_QUEUE  DeviceQueue,
  7310.   IN PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
  7311.  
  7312. NTOSAPI
  7313. BOOLEAN
  7314. DDKAPI
  7315. KeInsertQueueDpc(
  7316.   IN PRKDPC  Dpc,
  7317.   IN PVOID  SystemArgument1,
  7318.   IN PVOID  SystemArgument2);
  7319.  
  7320. NTOSAPI
  7321. VOID
  7322. DDKAPI
  7323. KeLeaveCriticalRegion(
  7324.   VOID);
  7325.  
  7326. NTOSAPI
  7327. VOID
  7328. DDKAPI
  7329. KeLowerIrql(
  7330.   IN KIRQL  NewIrql);
  7331.  
  7332. NTOSAPI
  7333. NTSTATUS
  7334. DDKAPI
  7335. KePulseEvent(
  7336.   IN PRKEVENT  Event,
  7337.   IN KPRIORITY  Increment,
  7338.   IN BOOLEAN  Wait);
  7339.  
  7340. NTOSAPI
  7341. ULONGLONG
  7342. DDKAPI
  7343. KeQueryInterruptTime(
  7344.   VOID);
  7345.  
  7346. NTOSAPI
  7347. LARGE_INTEGER
  7348. DDKAPI
  7349. KeQueryPerformanceCounter(
  7350.   OUT PLARGE_INTEGER  PerformanceFrequency  OPTIONAL);
  7351.  
  7352. NTOSAPI
  7353. KPRIORITY
  7354. DDKAPI
  7355. KeQueryPriorityThread(
  7356.   IN PRKTHREAD  Thread);
  7357.  
  7358. NTOSAPI
  7359. VOID
  7360. DDKAPI
  7361. KeQuerySystemTime(
  7362.   OUT PLARGE_INTEGER  CurrentTime);
  7363.  
  7364. NTOSAPI
  7365. VOID
  7366. DDKAPI
  7367. KeQueryTickCount(
  7368.   OUT PLARGE_INTEGER  TickCount);
  7369.  
  7370. NTOSAPI
  7371. ULONG
  7372. DDKAPI
  7373. KeQueryTimeIncrement(
  7374.   VOID);
  7375.  
  7376. NTOSAPI
  7377. VOID
  7378. DDKAPI
  7379. KeRaiseIrql(
  7380.   IN KIRQL  NewIrql,
  7381.   OUT PKIRQL  OldIrql);
  7382.  
  7383. NTOSAPI
  7384. KIRQL
  7385. DDKAPI
  7386. KeRaiseIrqlToDpcLevel(
  7387.   VOID);
  7388.  
  7389. NTOSAPI
  7390. LONG
  7391. DDKAPI
  7392. KeReadStateEvent(
  7393.   IN PRKEVENT  Event);
  7394.  
  7395. NTOSAPI
  7396. LONG
  7397. DDKAPI
  7398. KeReadStateMutex(
  7399.   IN PRKMUTEX  Mutex);
  7400.  
  7401. NTOSAPI
  7402. LONG
  7403. DDKAPI
  7404. KeReadStateSemaphore(
  7405.   IN PRKSEMAPHORE  Semaphore);
  7406.  
  7407. NTOSAPI
  7408. BOOLEAN
  7409. DDKAPI
  7410. KeReadStateTimer(
  7411.   IN PKTIMER  Timer);
  7412.  
  7413. NTOSAPI
  7414. BOOLEAN
  7415. DDKAPI
  7416. KeRegisterBugCheckCallback(
  7417.   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord,
  7418.   IN PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine,
  7419.   IN PVOID  Buffer,
  7420.   IN ULONG  Length,
  7421.   IN PUCHAR  Component);
  7422.  
  7423. NTOSAPI
  7424. VOID
  7425. DDKFASTAPI
  7426. KeReleaseInStackQueuedSpinLock(
  7427.   IN PKLOCK_QUEUE_HANDLE  LockHandle);
  7428.  
  7429. NTOSAPI
  7430. VOID
  7431. DDKFASTAPI
  7432. KeReleaseInStackQueuedSpinLockFromDpcLevel(
  7433.   IN PKLOCK_QUEUE_HANDLE  LockHandle);
  7434.  
  7435. NTOSAPI
  7436. VOID
  7437. DDKAPI
  7438. KeReleaseInterruptSpinLock(
  7439.   IN PKINTERRUPT  Interrupt,
  7440.   IN KIRQL  OldIrql);
  7441.  
  7442. NTOSAPI
  7443. LONG
  7444. DDKAPI
  7445. KeReleaseMutex(
  7446.   IN PRKMUTEX  Mutex,
  7447.   IN BOOLEAN  Wait);
  7448.  
  7449. NTOSAPI
  7450. LONG
  7451. DDKAPI
  7452. KeReleaseSemaphore(
  7453.   IN PRKSEMAPHORE  Semaphore,
  7454.   IN KPRIORITY  Increment,
  7455.   IN LONG  Adjustment,
  7456.   IN BOOLEAN  Wait);
  7457.  
  7458. NTOSAPI
  7459. VOID
  7460. DDKAPI
  7461. KeReleaseSpinLock(
  7462.   IN PKSPIN_LOCK  SpinLock,
  7463.   IN KIRQL  NewIrql);
  7464.  
  7465. NTOSAPI
  7466. PKDEVICE_QUEUE_ENTRY
  7467. DDKAPI 
  7468. KeRemoveByKeyDeviceQueue(
  7469.   IN PKDEVICE_QUEUE  DeviceQueue,
  7470.   IN ULONG  SortKey);
  7471.  
  7472. NTOSAPI
  7473. PKDEVICE_QUEUE_ENTRY
  7474. DDKAPI
  7475. KeRemoveDeviceQueue(
  7476.   IN PKDEVICE_QUEUE  DeviceQueue);
  7477.  
  7478. NTOSAPI
  7479. BOOLEAN
  7480. DDKAPI
  7481. KeRemoveEntryDeviceQueue(
  7482.   IN PKDEVICE_QUEUE  DeviceQueue,
  7483.   IN PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
  7484.  
  7485. NTOSAPI
  7486. BOOLEAN
  7487. DDKAPI
  7488. KeRemoveQueueDpc(
  7489.   IN PRKDPC  Dpc);
  7490.  
  7491. NTOSAPI
  7492. LONG
  7493. DDKAPI
  7494. KeResetEvent(
  7495.   IN PRKEVENT  Event);
  7496.  
  7497. NTOSAPI
  7498. NTSTATUS
  7499. DDKAPI
  7500. KeRestoreFloatingPointState(
  7501.   IN PKFLOATING_SAVE  FloatSave);
  7502.  
  7503. NTOSAPI
  7504. NTSTATUS
  7505. DDKAPI
  7506. KeSaveFloatingPointState(
  7507.   OUT PKFLOATING_SAVE  FloatSave);
  7508.  
  7509. NTOSAPI
  7510. LONG
  7511. DDKAPI
  7512. KeSetBasePriorityThread(
  7513.   IN PRKTHREAD  Thread,
  7514.   IN LONG  Increment);
  7515.  
  7516. NTOSAPI
  7517. LONG
  7518. DDKAPI
  7519. KeSetEvent(
  7520.   IN PRKEVENT  Event,
  7521.   IN KPRIORITY  Increment,
  7522.   IN BOOLEAN  Wait);
  7523.  
  7524. NTOSAPI
  7525. VOID
  7526. DDKAPI
  7527. KeSetImportanceDpc(
  7528.   IN PRKDPC  Dpc,
  7529.   IN KDPC_IMPORTANCE  Importance);
  7530.  
  7531. NTOSAPI
  7532. KPRIORITY
  7533. DDKAPI
  7534. KeSetPriorityThread(
  7535.   IN PKTHREAD  Thread,
  7536.   IN KPRIORITY  Priority);
  7537.  
  7538. NTOSAPI
  7539. VOID
  7540. DDKAPI
  7541. KeSetTargetProcessorDpc(
  7542.   IN PRKDPC  Dpc,
  7543.   IN CCHAR  Number);
  7544.  
  7545. NTOSAPI
  7546. BOOLEAN
  7547. DDKAPI
  7548. KeSetTimer(
  7549.   IN PKTIMER  Timer,
  7550.   IN LARGE_INTEGER  DueTime,
  7551.   IN PKDPC  Dpc  OPTIONAL);
  7552.  
  7553. NTOSAPI
  7554. BOOLEAN
  7555. DDKAPI
  7556. KeSetTimerEx(
  7557.   IN PKTIMER  Timer,
  7558.   IN LARGE_INTEGER  DueTime,
  7559.   IN LONG  Period  OPTIONAL,
  7560.   IN PKDPC  Dpc  OPTIONAL);
  7561.  
  7562. NTOSAPI
  7563. VOID
  7564. DDKFASTAPI
  7565. KeSetTimeUpdateNotifyRoutine(
  7566.   IN PTIME_UPDATE_NOTIFY_ROUTINE  NotifyRoutine);
  7567.  
  7568. NTOSAPI
  7569. VOID
  7570. DDKAPI
  7571. KeStallExecutionProcessor(
  7572.   IN ULONG  MicroSeconds);
  7573.  
  7574. NTOSAPI
  7575. BOOLEAN
  7576. DDKAPI
  7577. KeSynchronizeExecution(
  7578.   IN PKINTERRUPT    Interrupt,
  7579.   IN PKSYNCHRONIZE_ROUTINE  SynchronizeRoutine,
  7580.   IN PVOID  SynchronizeContext);
  7581.  
  7582. NTOSAPI
  7583. NTSTATUS
  7584. DDKAPI
  7585. KeWaitForMultipleObjects(
  7586.   IN ULONG  Count,
  7587.   IN PVOID  Object[],
  7588.   IN WAIT_TYPE  WaitType,
  7589.   IN KWAIT_REASON  WaitReason,
  7590.   IN KPROCESSOR_MODE  WaitMode,
  7591.   IN BOOLEAN  Alertable,
  7592.   IN PLARGE_INTEGER  Timeout  OPTIONAL,
  7593.   IN PKWAIT_BLOCK  WaitBlockArray  OPTIONAL);
  7594.  
  7595. NTOSAPI
  7596. NTSTATUS
  7597. DDKAPI
  7598. KeWaitForMutexObject(
  7599.   IN PRKMUTEX  Mutex,
  7600.   IN KWAIT_REASON  WaitReason,
  7601.   IN KPROCESSOR_MODE  WaitMode,
  7602.   IN BOOLEAN  Alertable,
  7603.   IN PLARGE_INTEGER  Timeout  OPTIONAL);
  7604.  
  7605. NTOSAPI
  7606. NTSTATUS
  7607. DDKAPI
  7608. KeWaitForSingleObject(
  7609.   IN PVOID  Object,
  7610.   IN KWAIT_REASON  WaitReason,
  7611.   IN KPROCESSOR_MODE  WaitMode,
  7612.   IN BOOLEAN  Alertable,
  7613.   IN PLARGE_INTEGER  Timeout  OPTIONAL);
  7614.  
  7615.  
  7616.  
  7617. /** Memory manager routines **/
  7618.  
  7619. NTOSAPI
  7620. NTSTATUS
  7621. DDKAPI
  7622. MmAdvanceMdl(
  7623.   IN PMDL  Mdl,
  7624.   IN ULONG  NumberOfBytes);
  7625.  
  7626. NTOSAPI
  7627. PVOID
  7628. DDKAPI
  7629. MmAllocateContiguousMemory(
  7630.   IN ULONG  NumberOfBytes,
  7631.   IN PHYSICAL_ADDRESS  HighestAcceptableAddress);
  7632.  
  7633. NTOSAPI
  7634. PVOID
  7635. DDKAPI
  7636. MmAllocateContiguousMemorySpecifyCache(
  7637.   IN SIZE_T  NumberOfBytes,
  7638.   IN PHYSICAL_ADDRESS  LowestAcceptableAddress,
  7639.   IN PHYSICAL_ADDRESS  HighestAcceptableAddress,
  7640.   IN PHYSICAL_ADDRESS  BoundaryAddressMultiple  OPTIONAL,
  7641.   IN MEMORY_CACHING_TYPE  CacheType);
  7642.  
  7643. NTOSAPI
  7644. PVOID
  7645. DDKAPI
  7646. MmAllocateMappingAddress(
  7647.   IN SIZE_T  NumberOfBytes,
  7648.   IN ULONG  PoolTag);
  7649.  
  7650. NTOSAPI
  7651. PVOID
  7652. DDKAPI
  7653. MmAllocateNonCachedMemory(
  7654.   IN ULONG  NumberOfBytes);
  7655.  
  7656. NTOSAPI
  7657. PMDL
  7658. DDKAPI
  7659. MmAllocatePagesForMdl(
  7660.   IN PHYSICAL_ADDRESS  LowAddress,
  7661.   IN PHYSICAL_ADDRESS  HighAddress,
  7662.   IN PHYSICAL_ADDRESS  SkipBytes,
  7663.   IN SIZE_T  TotalBytes);
  7664.  
  7665. NTOSAPI
  7666. VOID
  7667. DDKAPI
  7668. MmBuildMdlForNonPagedPool(
  7669.   IN OUT PMDL  MemoryDescriptorList);
  7670.  
  7671. NTOSAPI
  7672. NTSTATUS
  7673. DDKAPI
  7674. MmCreateSection(
  7675.   OUT PSECTION_OBJECT  *SectionObject,
  7676.   IN ACCESS_MASK  DesiredAccess,
  7677.   IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
  7678.   IN PLARGE_INTEGER  MaximumSize,
  7679.   IN ULONG  SectionPageProtection,
  7680.   IN ULONG  AllocationAttributes,
  7681.   IN HANDLE  FileHandle  OPTIONAL,
  7682.   IN PFILE_OBJECT  File  OPTIONAL);
  7683.  
  7684. typedef enum _MMFLUSH_TYPE {
  7685.   MmFlushForDelete,
  7686.   MmFlushForWrite
  7687. } MMFLUSH_TYPE;
  7688.  
  7689. NTOSAPI
  7690. BOOLEAN
  7691. DDKAPI
  7692. MmFlushImageSection(
  7693.   IN PSECTION_OBJECT_POINTERS  SectionObjectPointer,
  7694.   IN MMFLUSH_TYPE  FlushType);
  7695.  
  7696. NTOSAPI
  7697. VOID
  7698. DDKAPI
  7699. MmFreeContiguousMemory(
  7700.   IN PVOID  BaseAddress);
  7701.  
  7702. NTOSAPI
  7703. VOID
  7704. DDKAPI
  7705. MmFreeContiguousMemorySpecifyCache(
  7706.   IN PVOID  BaseAddress,
  7707.   IN SIZE_T  NumberOfBytes,
  7708.   IN MEMORY_CACHING_TYPE  CacheType);
  7709.  
  7710. NTOSAPI
  7711. VOID
  7712. DDKAPI
  7713. MmFreeMappingAddress(
  7714.   IN PVOID  BaseAddress,
  7715.   IN ULONG  PoolTag);
  7716.  
  7717. NTOSAPI
  7718. VOID
  7719. DDKAPI
  7720. MmFreeNonCachedMemory(
  7721.   IN PVOID  BaseAddress,
  7722.   IN SIZE_T  NumberOfBytes);
  7723.  
  7724. NTOSAPI
  7725. VOID
  7726. DDKAPI
  7727. MmFreePagesFromMdl(
  7728.   IN PMDL  MemoryDescriptorList);
  7729.  
  7730. /*
  7731.  * ULONG
  7732.  * MmGetMdlByteCount(
  7733.  *   IN PMDL  Mdl)
  7734.  */
  7735. #define MmGetMdlByteCount(_Mdl) \
  7736.   ((_Mdl)->ByteCount)
  7737.  
  7738. /*
  7739.  * ULONG
  7740.  * MmGetMdlByteOffset(
  7741.  *   IN PMDL  Mdl)
  7742.  */
  7743. #define MmGetMdlByteOffset(_Mdl) \
  7744.   ((_Mdl)->ByteOffset)
  7745.  
  7746. /*
  7747.  * PPFN_NUMBER
  7748.  * MmGetMdlPfnArray(
  7749.  *   IN PMDL  Mdl)
  7750.  */
  7751. #define MmGetMdlPfnArray(_Mdl) \
  7752.   ((PPFN_NUMBER) ((_Mdl) + 1))
  7753.  
  7754. /*
  7755.  * PVOID
  7756.  * MmGetMdlVirtualAddress(
  7757.  *   IN PMDL  Mdl)
  7758.  */
  7759. #define MmGetMdlVirtualAddress(_Mdl) \
  7760.   ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
  7761.  
  7762. NTOSAPI
  7763. PHYSICAL_ADDRESS
  7764. DDKAPI
  7765. MmGetPhysicalAddress(
  7766.   IN PVOID  BaseAddress);
  7767.  
  7768. NTOSAPI
  7769. PPHYSICAL_MEMORY_RANGE
  7770. DDKAPI
  7771. MmGetPhysicalMemoryRanges(
  7772.   VOID);
  7773.  
  7774. NTOSAPI
  7775. PVOID
  7776. DDKAPI
  7777. MmGetVirtualForPhysical(
  7778.   IN PHYSICAL_ADDRESS  PhysicalAddress);
  7779.  
  7780. NTOSAPI
  7781. PVOID
  7782. DDKAPI
  7783. MmMapLockedPagesSpecifyCache(
  7784.   IN PMDL  MemoryDescriptorList,
  7785.   IN KPROCESSOR_MODE  AccessMode,
  7786.   IN MEMORY_CACHING_TYPE  CacheType,
  7787.   IN PVOID  BaseAddress,
  7788.   IN ULONG  BugCheckOnFailure,
  7789.   IN MM_PAGE_PRIORITY  Priority);
  7790.  
  7791. NTOSAPI
  7792. PVOID
  7793. DDKAPI
  7794. MmMapLockedPagesWithReservedMapping(
  7795.   IN PVOID  MappingAddress,
  7796.   IN ULONG  PoolTag,
  7797.   IN PMDL  MemoryDescriptorList,
  7798.   IN MEMORY_CACHING_TYPE  CacheType);
  7799.  
  7800. NTOSAPI
  7801. NTSTATUS
  7802. DDKAPI
  7803. MmMapUserAddressesToPage(
  7804.   IN PVOID  BaseAddress,
  7805.   IN SIZE_T  NumberOfBytes,
  7806.   IN PVOID  PageAddress);
  7807.  
  7808. NTOSAPI
  7809. PVOID
  7810. DDKAPI
  7811. MmMapVideoDisplay(
  7812.   IN PHYSICAL_ADDRESS  PhysicalAddress,
  7813.   IN SIZE_T  NumberOfBytes,
  7814.   IN MEMORY_CACHING_TYPE  CacheType);
  7815.  
  7816. NTOSAPI
  7817. NTSTATUS
  7818. DDKAPI
  7819. MmMapViewInSessionSpace(
  7820.   IN PVOID  Section,
  7821.   OUT PVOID  *MappedBase,
  7822.   IN OUT PSIZE_T  ViewSize);
  7823.  
  7824. NTOSAPI
  7825. NTSTATUS
  7826. DDKAPI
  7827. MmMapViewInSystemSpace(
  7828.   IN PVOID  Section,
  7829.   OUT PVOID  *MappedBase,
  7830.   IN PSIZE_T  ViewSize);
  7831.  
  7832. NTOSAPI
  7833. NTSTATUS
  7834. DDKAPI
  7835. MmMarkPhysicalMemoryAsBad(
  7836.   IN PPHYSICAL_ADDRESS  StartAddress,
  7837.   IN OUT PLARGE_INTEGER  NumberOfBytes);
  7838.  
  7839. NTOSAPI
  7840. NTSTATUS
  7841. DDKAPI
  7842. MmMarkPhysicalMemoryAsGood(
  7843.   IN PPHYSICAL_ADDRESS  StartAddress,
  7844.   IN OUT PLARGE_INTEGER  NumberOfBytes);
  7845.  
  7846. /*
  7847.  * PVOID
  7848.  * MmGetSystemAddressForMdlSafe(
  7849.  *   IN PMDL  Mdl,
  7850.  *   IN MM_PAGE_PRIORITY  Priority)
  7851.  */
  7852. #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
  7853.   ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
  7854.     | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
  7855.     (_Mdl)->MappedSystemVa : \
  7856.     (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
  7857.       KernelMode, MmCached, NULL, FALSE, _Priority);
  7858.  
  7859. NTOSAPI
  7860. PVOID
  7861. DDKAPI
  7862. MmGetSystemRoutineAddress(
  7863.   IN PUNICODE_STRING  SystemRoutineName);
  7864.  
  7865. /*
  7866.  * ULONG
  7867.  * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
  7868.  *   IN PVOID  Va,
  7869.  *   IN ULONG  Size)
  7870.  */
  7871. #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
  7872.                                        _Size) \
  7873.   (ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
  7874.     + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)
  7875.  
  7876. /*
  7877.  * VOID
  7878.  * MmInitializeMdl(
  7879.  *   IN PMDL  MemoryDescriptorList,
  7880.  *   IN PVOID  BaseVa,
  7881.  *   IN SIZE_T  Length)
  7882.  */
  7883. #define MmInitializeMdl(_MemoryDescriptorList, \
  7884.                         _BaseVa, \
  7885.                         _Length) \
  7886. { \
  7887.   (_MemoryDescriptorList)->Next = (PMDL) NULL; \
  7888.   (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
  7889.     (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
  7890.   (_MemoryDescriptorList)->MdlFlags = 0; \
  7891.   (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
  7892.   (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
  7893.   (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
  7894. }
  7895.  
  7896. NTOSAPI
  7897. BOOLEAN
  7898. DDKAPI
  7899. MmIsAddressValid(
  7900.   IN PVOID  VirtualAddress);
  7901.  
  7902. NTOSAPI
  7903. LOGICAL
  7904. DDKAPI
  7905. MmIsDriverVerifying(
  7906.   IN PDRIVER_OBJECT  DriverObject);
  7907.  
  7908. NTOSAPI
  7909. BOOLEAN
  7910. DDKAPI
  7911. MmIsThisAnNtAsSystem(
  7912.   VOID);
  7913.  
  7914. NTOSAPI
  7915. NTSTATUS
  7916. DDKAPI
  7917. MmIsVerifierEnabled(
  7918.   OUT PULONG  VerifierFlags);
  7919.  
  7920. NTOSAPI
  7921. PVOID
  7922. DDKAPI
  7923. MmLockPagableDataSection(
  7924.   IN PVOID  AddressWithinSection);
  7925.  
  7926. NTOSAPI
  7927. PVOID
  7928. DDKAPI
  7929. MmLockPagableImageSection(
  7930.   IN PVOID  AddressWithinSection);
  7931.  
  7932. /*
  7933.  * PVOID
  7934.  * MmLockPagableCodeSection(
  7935.  *   IN PVOID  AddressWithinSection)
  7936.  */
  7937. #define MmLockPagableCodeSection MmLockPagableDataSection
  7938.  
  7939. NTOSAPI
  7940. VOID
  7941. DDKAPI
  7942. MmLockPagableSectionByHandle(
  7943.   IN PVOID  ImageSectionHandle);
  7944.  
  7945. NTOSAPI
  7946. PVOID
  7947. DDKAPI
  7948. MmMapIoSpace(
  7949.   IN PHYSICAL_ADDRESS  PhysicalAddress,
  7950.   IN ULONG  NumberOfBytes,
  7951.   IN MEMORY_CACHING_TYPE  CacheEnable);
  7952.  
  7953. NTOSAPI
  7954. PVOID
  7955. DDKAPI
  7956. MmMapLockedPages(
  7957.   IN PMDL  MemoryDescriptorList,
  7958.   IN KPROCESSOR_MODE  AccessMode);
  7959.  
  7960. NTOSAPI
  7961. VOID
  7962. DDKAPI
  7963. MmPageEntireDriver(
  7964.   IN PVOID  AddressWithinSection);
  7965.  
  7966. NTOSAPI
  7967. VOID
  7968. DDKAPI
  7969. MmProbeAndLockProcessPages(
  7970.   IN OUT PMDL  MemoryDescriptorList,
  7971.   IN PEPROCESS  Process,
  7972.   IN KPROCESSOR_MODE  AccessMode,
  7973.   IN LOCK_OPERATION  Operation);
  7974.  
  7975. NTOSAPI
  7976. NTSTATUS
  7977. DDKAPI
  7978. MmProtectMdlSystemAddress(
  7979.   IN PMDL  MemoryDescriptorList,
  7980.   IN ULONG  NewProtect);
  7981.  
  7982. NTOSAPI
  7983. VOID
  7984. DDKAPI
  7985. MmUnmapLockedPages(
  7986.   IN PVOID  BaseAddress,
  7987.   IN PMDL  MemoryDescriptorList);
  7988.  
  7989. NTOSAPI
  7990. NTSTATUS
  7991. DDKAPI
  7992. MmUnmapViewInSessionSpace(
  7993.   IN PVOID  MappedBase);
  7994.  
  7995. NTOSAPI
  7996. NTSTATUS
  7997. DDKAPI
  7998. MmUnmapViewInSystemSpace(
  7999.   IN PVOID MappedBase);
  8000.  
  8001. NTOSAPI
  8002. VOID
  8003. DDKAPI
  8004. MmUnsecureVirtualMemory(
  8005.   IN HANDLE  SecureHandle);
  8006.  
  8007. /*
  8008.  * VOID
  8009.  * MmPrepareMdlForReuse(
  8010.  *   IN PMDL  Mdl)
  8011.  */
  8012. #define MmPrepareMdlForReuse(_Mdl) \
  8013. { \
  8014.   if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
  8015.     assert(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
  8016.     MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
  8017.   } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
  8018.     assert(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
  8019.   } \
  8020. }
  8021.  
  8022. NTOSAPI
  8023. VOID
  8024. DDKAPI
  8025. MmProbeAndLockPages(
  8026.   IN OUT PMDL  MemoryDescriptorList,
  8027.   IN KPROCESSOR_MODE  AccessMode,
  8028.   IN LOCK_OPERATION  Operation);
  8029.  
  8030. NTOSAPI
  8031. MM_SYSTEM_SIZE
  8032. DDKAPI
  8033. MmQuerySystemSize(
  8034.   VOID);
  8035.  
  8036. NTOSAPI
  8037. NTSTATUS
  8038. DDKAPI
  8039. MmRemovePhysicalMemory(
  8040.   IN PPHYSICAL_ADDRESS  StartAddress,
  8041.   IN OUT PLARGE_INTEGER  NumberOfBytes);
  8042.  
  8043. NTOSAPI
  8044. VOID
  8045. DDKAPI
  8046. MmResetDriverPaging(
  8047.   IN PVOID  AddressWithinSection);
  8048.  
  8049. NTOSAPI
  8050. HANDLE
  8051. DDKAPI
  8052. MmSecureVirtualMemory(
  8053.   IN PVOID  Address,
  8054.   IN SIZE_T  Size,
  8055.   IN ULONG  ProbeMode);
  8056.  
  8057. NTOSAPI
  8058. ULONG
  8059. DDKAPI
  8060. MmSizeOfMdl(
  8061.   IN PVOID  Base,
  8062.   IN SIZE_T  Length);
  8063.  
  8064. NTOSAPI
  8065. VOID
  8066. DDKAPI
  8067. MmUnlockPagableImageSection(
  8068.   IN PVOID  ImageSectionHandle);
  8069.  
  8070. NTOSAPI
  8071. VOID
  8072. DDKAPI
  8073. MmUnlockPages(
  8074.   IN PMDL  MemoryDescriptorList);
  8075.  
  8076. NTOSAPI
  8077. VOID
  8078. DDKAPI
  8079. MmUnmapIoSpace(
  8080.   IN PVOID  BaseAddress,
  8081.   IN SIZE_T  NumberOfBytes);
  8082.  
  8083. NTOSAPI
  8084. VOID
  8085. DDKAPI
  8086. MmUnmapReservedMapping(
  8087.   IN PVOID  BaseAddress,
  8088.   IN ULONG  PoolTag,
  8089.   IN PMDL  MemoryDescriptorList);
  8090.  
  8091. NTOSAPI
  8092. VOID
  8093. DDKAPI
  8094. MmUnmapVideoDisplay(
  8095.   IN PVOID  BaseAddress,
  8096.   IN SIZE_T  NumberOfBytes);
  8097.  
  8098.  
  8099.  
  8100. /** Object manager routines **/
  8101.  
  8102. NTOSAPI
  8103. NTSTATUS
  8104. DDKAPI
  8105. ObAssignSecurity(
  8106.   IN PACCESS_STATE  AccessState,
  8107.   IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
  8108.   IN PVOID  Object,
  8109.   IN POBJECT_TYPE  Type);
  8110.  
  8111. NTOSAPI
  8112. VOID
  8113. DDKAPI
  8114. ObDereferenceSecurityDescriptor(
  8115.   PSECURITY_DESCRIPTOR  SecurityDescriptor,
  8116.   ULONG  Count);
  8117.  
  8118. NTOSAPI
  8119. VOID
  8120. DDKFASTAPI
  8121. ObfDereferenceObject(
  8122.   IN PVOID  Object);
  8123.  
  8124. /*
  8125.  * VOID
  8126.  * ObDereferenceObject(
  8127.  *   IN PVOID  Object)
  8128.  */
  8129. #define ObDereferenceObject ObfDereferenceObject
  8130.  
  8131. NTOSAPI
  8132. NTSTATUS
  8133. DDKAPI
  8134. ObGetObjectSecurity(
  8135.   IN PVOID  Object,
  8136.   OUT PSECURITY_DESCRIPTOR  *SecurityDescriptor,
  8137.   OUT PBOOLEAN  MemoryAllocated); 
  8138.  
  8139. NTOSAPI
  8140. NTSTATUS
  8141. DDKAPI
  8142. ObInsertObject(
  8143.   IN PVOID  Object,
  8144.   IN PACCESS_STATE  PassedAccessState  OPTIONAL,
  8145.   IN ACCESS_MASK  DesiredAccess,
  8146.   IN ULONG  AdditionalReferences,
  8147.   OUT PVOID*  ReferencedObject  OPTIONAL,
  8148.   OUT PHANDLE  Handle);
  8149.  
  8150. NTOSAPI
  8151. VOID
  8152. DDKFASTAPI
  8153. ObfReferenceObject(
  8154.   IN PVOID  Object);
  8155.  
  8156. NTOSAPI
  8157. NTSTATUS
  8158. DDKAPI
  8159. ObLogSecurityDescriptor(
  8160.   IN PSECURITY_DESCRIPTOR  InputSecurityDescriptor,
  8161.   OUT PSECURITY_DESCRIPTOR  *OutputSecurityDescriptor,
  8162.   IN ULONG RefBias);
  8163. /*
  8164.  * VOID
  8165.  * ObReferenceObject(
  8166.  *   IN PVOID  Object)
  8167.  */
  8168. #define ObReferenceObject ObfReferenceObject
  8169.  
  8170. NTOSAPI
  8171. VOID
  8172. DDKAPI
  8173. ObMakeTemporaryObject(
  8174.   IN PVOID  Object);
  8175.  
  8176. NTOSAPI
  8177. NTSTATUS
  8178. DDKAPI
  8179. ObOpenObjectByName(
  8180.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8181.   IN POBJECT_TYPE  ObjectType,
  8182.   IN OUT PVOID  ParseContext  OPTIONAL,
  8183.   IN KPROCESSOR_MODE  AccessMode,
  8184.   IN ACCESS_MASK  DesiredAccess,
  8185.   IN PACCESS_STATE  PassedAccessState,
  8186.   OUT PHANDLE  Handle);
  8187.  
  8188. NTOSAPI
  8189. NTSTATUS
  8190. DDKAPI
  8191. ObOpenObjectByPointer(
  8192.   IN PVOID  Object,
  8193.   IN ULONG  HandleAttributes,
  8194.   IN PACCESS_STATE  PassedAccessState  OPTIONAL,
  8195.   IN ACCESS_MASK  DesiredAccess  OPTIONAL,
  8196.   IN POBJECT_TYPE  ObjectType  OPTIONAL,
  8197.   IN KPROCESSOR_MODE  AccessMode,
  8198.   OUT PHANDLE  Handle);
  8199.  
  8200. NTOSAPI
  8201. NTSTATUS
  8202. DDKAPI
  8203. ObQueryObjectAuditingByHandle(
  8204.   IN HANDLE  Handle,
  8205.   OUT PBOOLEAN  GenerateOnClose);
  8206.  
  8207. NTOSAPI
  8208. NTSTATUS
  8209. DDKAPI
  8210. ObReferenceObjectByHandle(
  8211.   IN HANDLE  Handle,
  8212.   IN ACCESS_MASK  DesiredAccess,
  8213.   IN POBJECT_TYPE  ObjectType  OPTIONAL,
  8214.   IN KPROCESSOR_MODE  AccessMode,
  8215.   OUT PVOID  *Object,
  8216.   OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL);
  8217.  
  8218. NTOSAPI
  8219. NTSTATUS
  8220. DDKAPI
  8221. ObReferenceObjectByName(
  8222.   IN PUNICODE_STRING  ObjectPath,
  8223.   IN ULONG  Attributes,
  8224.   IN PACCESS_STATE  PassedAccessState  OPTIONAL,
  8225.   IN ACCESS_MASK  DesiredAccess  OPTIONAL,
  8226.   IN POBJECT_TYPE  ObjectType,
  8227.   IN KPROCESSOR_MODE  AccessMode,
  8228.   IN OUT PVOID  ParseContext  OPTIONAL,
  8229.   OUT PVOID  *Object);
  8230.  
  8231. NTOSAPI
  8232. NTSTATUS
  8233. DDKAPI
  8234. ObReferenceObjectByPointer(
  8235.   IN PVOID  Object,
  8236.   IN ACCESS_MASK  DesiredAccess,
  8237.   IN POBJECT_TYPE  ObjectType,
  8238.   IN KPROCESSOR_MODE  AccessMode);
  8239.  
  8240. NTOSAPI
  8241. VOID
  8242. DDKAPI
  8243. ObReferenceSecurityDescriptor(
  8244.   IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
  8245.   IN ULONG  Count);
  8246.  
  8247. NTOSAPI
  8248. VOID
  8249. DDKAPI
  8250. ObReleaseObjectSecurity(
  8251.   IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
  8252.   IN BOOLEAN  MemoryAllocated);
  8253.  
  8254.  
  8255.  
  8256. /** Process manager routines **/
  8257.  
  8258. NTOSAPI
  8259. NTSTATUS
  8260. DDKAPI
  8261. PsCreateSystemProcess(
  8262.   IN PHANDLE  ProcessHandle,
  8263.   IN ACCESS_MASK  DesiredAccess,
  8264.   IN POBJECT_ATTRIBUTES  ObjectAttributes);
  8265.  
  8266. NTOSAPI
  8267. NTSTATUS
  8268. DDKAPI
  8269. PsCreateSystemThread(
  8270.   OUT PHANDLE  ThreadHandle,
  8271.   IN ULONG  DesiredAccess,
  8272.   IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
  8273.   IN HANDLE  ProcessHandle  OPTIONAL,
  8274.   OUT PCLIENT_ID  ClientId  OPTIONAL,
  8275.   IN PKSTART_ROUTINE  StartRoutine,
  8276.   IN PVOID  StartContext);
  8277.  
  8278. /*
  8279.  * PEPROCESS
  8280.  * PsGetCurrentProcess(VOID)
  8281.  */
  8282. #define PsGetCurrentProcess IoGetCurrentProcess
  8283.  
  8284. NTOSAPI
  8285. HANDLE
  8286. DDKAPI
  8287. PsGetCurrentProcessId(
  8288.   VOID);
  8289.  
  8290. /*
  8291.  * PETHREAD
  8292.  * PsGetCurrentThread(VOID)
  8293.  */
  8294. #define PsGetCurrentThread() \
  8295.   ((PETHREAD) KeGetCurrentThread())
  8296.  
  8297. NTOSAPI
  8298. HANDLE
  8299. DDKAPI
  8300. PsGetCurrentThreadId(
  8301.   VOID);
  8302.  
  8303. NTOSAPI
  8304. BOOLEAN
  8305. DDKAPI
  8306. PsGetVersion(
  8307.   PULONG  MajorVersion  OPTIONAL,
  8308.   PULONG  MinorVersion  OPTIONAL,
  8309.   PULONG  BuildNumber  OPTIONAL,
  8310.   PUNICODE_STRING  CSDVersion  OPTIONAL);
  8311.  
  8312. NTOSAPI
  8313. NTSTATUS
  8314. DDKAPI
  8315. PsRemoveCreateThreadNotifyRoutine(
  8316.   IN PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
  8317.  
  8318. NTOSAPI
  8319. NTSTATUS
  8320. DDKAPI
  8321. PsRemoveLoadImageNotifyRoutine(
  8322.   IN PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
  8323.  
  8324. NTOSAPI
  8325. NTSTATUS
  8326. DDKAPI
  8327. PsSetCreateProcessNotifyRoutine(
  8328.   IN PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
  8329.   IN BOOLEAN  Remove);
  8330.  
  8331. NTOSAPI
  8332. NTSTATUS
  8333. DDKAPI
  8334. PsSetCreateThreadNotifyRoutine(
  8335.   IN PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
  8336.  
  8337. NTOSAPI
  8338. NTSTATUS
  8339. DDKAPI
  8340. PsSetLoadImageNotifyRoutine(
  8341.   IN PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
  8342.  
  8343. NTOSAPI
  8344. NTSTATUS
  8345. DDKAPI
  8346. PsTerminateSystemThread(
  8347.   IN NTSTATUS  ExitStatus);
  8348.  
  8349.  
  8350.  
  8351. /** Security reference monitor routines **/
  8352.  
  8353. NTOSAPI
  8354. BOOLEAN
  8355. DDKAPI
  8356. SeAccessCheck(
  8357.   IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
  8358.   IN PSECURITY_SUBJECT_CONTEXT  SubjectSecurityContext,
  8359.   IN BOOLEAN  SubjectContextLocked,
  8360.   IN ACCESS_MASK  DesiredAccess,
  8361.   IN ACCESS_MASK  PreviouslyGrantedAccess,
  8362.   OUT PPRIVILEGE_SET  *Privileges  OPTIONAL,
  8363.   IN PGENERIC_MAPPING  GenericMapping,
  8364.   IN KPROCESSOR_MODE  AccessMode,
  8365.   OUT PACCESS_MASK  GrantedAccess,
  8366.   OUT PNTSTATUS  AccessStatus);
  8367.  
  8368. NTOSAPI
  8369. NTSTATUS
  8370. DDKAPI
  8371. SeAssignSecurity(
  8372.   IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
  8373.   IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
  8374.   OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
  8375.   IN BOOLEAN  IsDirectoryObject,
  8376.   IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
  8377.   IN PGENERIC_MAPPING  GenericMapping,
  8378.   IN POOL_TYPE  PoolType);
  8379.  
  8380. NTOSAPI
  8381. NTSTATUS
  8382. DDKAPI
  8383. SeAssignSecurityEx(
  8384.   IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
  8385.   IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
  8386.   OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
  8387.   IN GUID  *ObjectType  OPTIONAL,
  8388.   IN BOOLEAN  IsDirectoryObject,
  8389.   IN ULONG  AutoInheritFlags,
  8390.   IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
  8391.   IN PGENERIC_MAPPING  GenericMapping,
  8392.   IN POOL_TYPE  PoolType);
  8393.  
  8394. NTOSAPI
  8395. NTSTATUS
  8396. DDKAPI
  8397. SeDeassignSecurity(
  8398.   IN OUT PSECURITY_DESCRIPTOR  *SecurityDescriptor);
  8399.  
  8400. NTOSAPI
  8401. BOOLEAN
  8402. DDKAPI
  8403. SeSinglePrivilegeCheck(
  8404.   LUID  PrivilegeValue,
  8405.   KPROCESSOR_MODE  PreviousMode);
  8406.  
  8407. NTOSAPI
  8408. BOOLEAN
  8409. DDKAPI
  8410. SeValidSecurityDescriptor(
  8411.   IN ULONG  Length,
  8412.   IN PSECURITY_DESCRIPTOR  SecurityDescriptor);
  8413.  
  8414.  
  8415.  
  8416. /** NtXxx routines **/
  8417.  
  8418. NTOSAPI
  8419. NTSTATUS
  8420. DDKAPI
  8421. NtOpenProcess(
  8422.   OUT PHANDLE  ProcessHandle,
  8423.   IN ACCESS_MASK  DesiredAccess,
  8424.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8425.   IN PCLIENT_ID  ClientId  OPTIONAL);
  8426.  
  8427. NTOSAPI
  8428. NTSTATUS
  8429. DDKAPI
  8430. NtQueryInformationProcess(
  8431.   IN HANDLE  ProcessHandle,
  8432.   IN PROCESSINFOCLASS  ProcessInformationClass,
  8433.   OUT PVOID  ProcessInformation,
  8434.   IN ULONG  ProcessInformationLength,
  8435.   OUT PULONG  ReturnLength OPTIONAL);
  8436.  
  8437.  
  8438.  
  8439. /** NtXxx and ZwXxx routines **/
  8440.  
  8441. NTOSAPI
  8442. NTSTATUS
  8443. DDKAPI
  8444. ZwCancelTimer(
  8445.   IN HANDLE  TimerHandle,
  8446.   OUT PBOOLEAN  CurrentState  OPTIONAL);
  8447.  
  8448. NTOSAPI
  8449. NTSTATUS
  8450. DDKAPI
  8451. NtClose(
  8452.   IN HANDLE  Handle);
  8453.  
  8454. NTOSAPI
  8455. NTSTATUS
  8456. DDKAPI
  8457. ZwClose(
  8458.   IN HANDLE  Handle);
  8459.  
  8460. NTOSAPI
  8461. NTSTATUS
  8462. DDKAPI
  8463. ZwCreateDirectoryObject(
  8464.   OUT PHANDLE  DirectoryHandle,
  8465.   IN ACCESS_MASK  DesiredAccess,
  8466.   IN POBJECT_ATTRIBUTES  ObjectAttributes);
  8467.  
  8468. NTOSAPI
  8469. NTSTATUS
  8470. DDKAPI
  8471. NtCreateEvent(
  8472.   OUT PHANDLE  EventHandle,
  8473.   IN ACCESS_MASK  DesiredAccess,
  8474.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8475.   IN BOOLEAN  ManualReset,
  8476.   IN BOOLEAN  InitialState);
  8477.  
  8478. NTOSAPI
  8479. NTSTATUS
  8480. DDKAPI
  8481. ZwCreateEvent(
  8482.   OUT PHANDLE  EventHandle,
  8483.   IN ACCESS_MASK  DesiredAccess,
  8484.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8485.   IN BOOLEAN  ManualReset,
  8486.   IN BOOLEAN  InitialState);
  8487.  
  8488. NTOSAPI
  8489. NTSTATUS
  8490. DDKAPI
  8491. ZwCreateFile(
  8492.   OUT PHANDLE  FileHandle,
  8493.   IN ACCESS_MASK  DesiredAccess,
  8494.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8495.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8496.   IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
  8497.   IN ULONG  FileAttributes,
  8498.   IN ULONG  ShareAccess,
  8499.   IN ULONG  CreateDisposition,
  8500.   IN ULONG  CreateOptions,
  8501.   IN PVOID  EaBuffer  OPTIONAL,
  8502.   IN ULONG  EaLength);
  8503.  
  8504. NTOSAPI
  8505. NTSTATUS
  8506. DDKAPI
  8507. ZwCreateKey(
  8508.   OUT PHANDLE  KeyHandle,
  8509.   IN ACCESS_MASK  DesiredAccess,
  8510.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8511.   IN ULONG  TitleIndex,
  8512.   IN PUNICODE_STRING  Class  OPTIONAL,
  8513.   IN ULONG  CreateOptions,
  8514.   OUT PULONG  Disposition  OPTIONAL);
  8515.  
  8516. NTOSAPI
  8517. NTSTATUS
  8518. DDKAPI
  8519. ZwCreateTimer(
  8520.   OUT PHANDLE  TimerHandle,
  8521.   IN ACCESS_MASK  DesiredAccess,
  8522.   IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
  8523.   IN TIMER_TYPE  TimerType);
  8524.  
  8525. NTOSAPI
  8526. NTSTATUS
  8527. DDKAPI
  8528. ZwDeleteKey(
  8529.   IN HANDLE  KeyHandle);
  8530.  
  8531. NTOSAPI
  8532. NTSTATUS
  8533. DDKAPI
  8534. ZwDeleteValueKey(
  8535.   IN HANDLE  KeyHandle,
  8536.   IN PUNICODE_STRING  ValueName);
  8537.  
  8538. NTOSAPI
  8539. NTSTATUS
  8540. DDKAPI
  8541. NtDeviceIoControlFile(
  8542.   IN HANDLE  DeviceHandle,
  8543.   IN HANDLE  Event  OPTIONAL, 
  8544.   IN PIO_APC_ROUTINE  UserApcRoutine  OPTIONAL, 
  8545.   IN PVOID  UserApcContext  OPTIONAL, 
  8546.   OUT PIO_STATUS_BLOCK  IoStatusBlock, 
  8547.   IN ULONG  IoControlCode,
  8548.   IN PVOID  InputBuffer, 
  8549.   IN ULONG  InputBufferSize,
  8550.   OUT PVOID  OutputBuffer,
  8551.   IN ULONG  OutputBufferSize);
  8552.  
  8553. NTOSAPI
  8554. NTSTATUS
  8555. DDKAPI
  8556. ZwDeviceIoControlFile(
  8557.   IN HANDLE  DeviceHandle,
  8558.   IN HANDLE  Event  OPTIONAL, 
  8559.   IN PIO_APC_ROUTINE  UserApcRoutine  OPTIONAL, 
  8560.   IN PVOID  UserApcContext  OPTIONAL, 
  8561.   OUT PIO_STATUS_BLOCK  IoStatusBlock, 
  8562.   IN ULONG  IoControlCode,
  8563.   IN PVOID  InputBuffer, 
  8564.   IN ULONG  InputBufferSize,
  8565.   OUT PVOID  OutputBuffer,
  8566.   IN ULONG  OutputBufferSize);
  8567.  
  8568. NTOSAPI
  8569. NTSTATUS
  8570. DDKAPI
  8571. ZwEnumerateKey(
  8572.   IN HANDLE  KeyHandle,
  8573.   IN ULONG  Index,
  8574.   IN KEY_INFORMATION_CLASS  KeyInformationClass,
  8575.   OUT PVOID  KeyInformation,
  8576.   IN ULONG  Length,
  8577.   OUT PULONG  ResultLength);
  8578.  
  8579. NTOSAPI
  8580. NTSTATUS
  8581. DDKAPI
  8582. ZwEnumerateValueKey(
  8583.   IN HANDLE  KeyHandle,
  8584.   IN ULONG  Index,
  8585.   IN KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
  8586.   OUT PVOID  KeyValueInformation,
  8587.   IN ULONG  Length,
  8588.   OUT PULONG  ResultLength);
  8589.  
  8590. NTOSAPI
  8591. NTSTATUS
  8592. DDKAPI
  8593. ZwFlushKey(
  8594.   IN HANDLE  KeyHandle);
  8595.  
  8596. NTOSAPI
  8597. NTSTATUS
  8598. DDKAPI
  8599. ZwMakeTemporaryObject(
  8600.   IN HANDLE  Handle);
  8601.  
  8602. NTOSAPI
  8603. NTSTATUS
  8604. DDKAPI
  8605. NtMapViewOfSection(
  8606.   IN HANDLE  SectionHandle,
  8607.   IN HANDLE  ProcessHandle,
  8608.   IN OUT PVOID  *BaseAddress,
  8609.   IN ULONG  ZeroBits,
  8610.   IN ULONG  CommitSize,
  8611.   IN OUT PLARGE_INTEGER  SectionOffset  OPTIONAL,
  8612.   IN OUT PSIZE_T  ViewSize,
  8613.   IN SECTION_INHERIT  InheritDisposition,
  8614.   IN ULONG  AllocationType,
  8615.   IN ULONG  Protect);
  8616.  
  8617. NTOSAPI
  8618. NTSTATUS
  8619. DDKAPI
  8620. ZwMapViewOfSection(
  8621.   IN HANDLE  SectionHandle,
  8622.   IN HANDLE  ProcessHandle,
  8623.   IN OUT PVOID  *BaseAddress,
  8624.   IN ULONG  ZeroBits,
  8625.   IN ULONG  CommitSize,
  8626.   IN OUT PLARGE_INTEGER  SectionOffset  OPTIONAL,
  8627.   IN OUT PSIZE_T  ViewSize,
  8628.   IN SECTION_INHERIT  InheritDisposition,
  8629.   IN ULONG  AllocationType,
  8630.   IN ULONG  Protect);
  8631.  
  8632. NTOSAPI
  8633. NTSTATUS
  8634. DDKAPI
  8635. NtOpenFile(
  8636.   OUT PHANDLE  FileHandle,
  8637.   IN ACCESS_MASK  DesiredAccess,
  8638.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8639.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8640.   IN ULONG  ShareAccess,
  8641.   IN ULONG  OpenOptions);
  8642.  
  8643. NTOSAPI
  8644. NTSTATUS
  8645. DDKAPI
  8646. ZwOpenFile(
  8647.   OUT PHANDLE  FileHandle,
  8648.   IN ACCESS_MASK  DesiredAccess,
  8649.   IN POBJECT_ATTRIBUTES  ObjectAttributes,
  8650.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8651.   IN ULONG  ShareAccess,
  8652.   IN ULONG  OpenOptions);
  8653.  
  8654. NTOSAPI
  8655. NTSTATUS
  8656. DDKAPI
  8657. ZwOpenKey(
  8658.   OUT PHANDLE  KeyHandle,
  8659.   IN ACCESS_MASK  DesiredAccess,
  8660.   IN POBJECT_ATTRIBUTES  ObjectAttributes);
  8661.  
  8662. NTOSAPI
  8663. NTSTATUS
  8664. DDKAPI
  8665. ZwOpenSection(
  8666.   OUT PHANDLE  SectionHandle,
  8667.   IN ACCESS_MASK  DesiredAccess,
  8668.   IN POBJECT_ATTRIBUTES  ObjectAttributes);
  8669.  
  8670. NTOSAPI
  8671. NTSTATUS
  8672. DDKAPI
  8673. ZwOpenSymbolicLinkObject(
  8674.   OUT PHANDLE  LinkHandle,
  8675.   IN ACCESS_MASK  DesiredAccess,
  8676.   IN POBJECT_ATTRIBUTES  ObjectAttributes);
  8677.  
  8678. NTOSAPI
  8679. NTSTATUS
  8680. DDKAPI
  8681. ZwOpenTimer(
  8682.   OUT PHANDLE  TimerHandle,
  8683.   IN ACCESS_MASK  DesiredAccess,
  8684.   IN POBJECT_ATTRIBUTES  ObjectAttributes);
  8685.  
  8686. NTOSAPI
  8687. NTSTATUS
  8688. DDKAPI
  8689. ZwQueryInformationFile(
  8690.   IN HANDLE  FileHandle,
  8691.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8692.   OUT PVOID  FileInformation,
  8693.   IN ULONG  Length,
  8694.   IN FILE_INFORMATION_CLASS  FileInformationClass);
  8695.  
  8696. NTOSAPI
  8697. NTSTATUS
  8698. DDKAPI
  8699. ZwQueryKey(
  8700.   IN HANDLE  KeyHandle,
  8701.   IN KEY_INFORMATION_CLASS  KeyInformationClass,
  8702.   OUT PVOID  KeyInformation,
  8703.   IN ULONG  Length,
  8704.   OUT PULONG  ResultLength);
  8705.  
  8706. NTOSAPI
  8707. NTSTATUS
  8708. DDKAPI
  8709. ZwQuerySymbolicLinkObject(
  8710.   IN HANDLE  LinkHandle,
  8711.   IN OUT PUNICODE_STRING  LinkTarget,
  8712.   OUT PULONG  ReturnedLength  OPTIONAL);
  8713.  
  8714. NTOSAPI
  8715. NTSTATUS
  8716. DDKAPI
  8717. ZwQueryValueKey(
  8718.   IN HANDLE  KeyHandle,
  8719.   IN PUNICODE_STRING  ValueName,
  8720.   IN KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
  8721.   OUT PVOID  KeyValueInformation,
  8722.   IN ULONG  Length,
  8723.   OUT PULONG  ResultLength);
  8724.  
  8725. NTOSAPI
  8726. NTSTATUS
  8727. DDKAPI
  8728. NtReadFile(
  8729.   IN HANDLE  FileHandle,
  8730.   IN HANDLE  Event  OPTIONAL,
  8731.   IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
  8732.   IN PVOID  ApcContext  OPTIONAL,
  8733.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8734.   OUT PVOID  Buffer,
  8735.   IN ULONG  Length,
  8736.   IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
  8737.   IN PULONG  Key  OPTIONAL);
  8738.  
  8739. NTOSAPI
  8740. NTSTATUS
  8741. DDKAPI
  8742. ZwReadFile(
  8743.   IN HANDLE  FileHandle,
  8744.   IN HANDLE  Event  OPTIONAL,
  8745.   IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
  8746.   IN PVOID  ApcContext  OPTIONAL,
  8747.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8748.   OUT PVOID  Buffer,
  8749.   IN ULONG  Length,
  8750.   IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
  8751.   IN PULONG  Key  OPTIONAL);
  8752.  
  8753. NTOSAPI
  8754. NTSTATUS
  8755. DDKAPI
  8756. NtSetEvent(
  8757.   IN HANDLE  EventHandle,
  8758.   IN PULONG  NumberOfThreadsReleased);
  8759.  
  8760. NTOSAPI
  8761. NTSTATUS
  8762. DDKAPI
  8763. ZwSetEvent(
  8764.   IN HANDLE  EventHandle,
  8765.   IN PULONG  NumberOfThreadsReleased);
  8766.  
  8767. NTOSAPI
  8768. NTSTATUS
  8769. DDKAPI
  8770. ZwSetInformationFile(
  8771.   IN HANDLE  FileHandle,
  8772.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8773.   IN PVOID  FileInformation,
  8774.   IN ULONG  Length,
  8775.   IN FILE_INFORMATION_CLASS  FileInformationClass);
  8776.  
  8777. NTOSAPI
  8778. NTSTATUS
  8779. DDKAPI
  8780. ZwSetInformationThread(
  8781.   IN HANDLE  ThreadHandle,
  8782.   IN THREADINFOCLASS  ThreadInformationClass,
  8783.   IN PVOID  ThreadInformation,
  8784.   IN ULONG  ThreadInformationLength);
  8785.  
  8786. NTOSAPI
  8787. NTSTATUS
  8788. DDKAPI
  8789. ZwSetTimer(
  8790.   IN HANDLE  TimerHandle,
  8791.   IN PLARGE_INTEGER  DueTime,
  8792.   IN PTIMER_APC_ROUTINE  TimerApcRoutine  OPTIONAL,
  8793.   IN PVOID  TimerContext  OPTIONAL,
  8794.   IN BOOLEAN  WakeTimer,
  8795.   IN LONG  Period  OPTIONAL,
  8796.   OUT PBOOLEAN  PreviousState  OPTIONAL);
  8797.  
  8798. NTOSAPI
  8799. NTSTATUS
  8800. DDKAPI
  8801. ZwSetValueKey(
  8802.   IN HANDLE  KeyHandle,
  8803.   IN PUNICODE_STRING  ValueName,
  8804.   IN ULONG  TitleIndex  OPTIONAL,
  8805.   IN ULONG  Type,
  8806.   IN PVOID  Data,
  8807.   IN ULONG  DataSize);
  8808.  
  8809. /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
  8810. #define AT_EXTENDABLE_FILE                0x00002000
  8811. #define SEC_NO_CHANGE                     0x00400000
  8812. #define AT_RESERVED                       0x20000000
  8813. #define AT_ROUND_TO_PAGE                  0x40000000
  8814.  
  8815. NTOSAPI
  8816. NTSTATUS
  8817. DDKAPI
  8818. NtUnmapViewOfSection(
  8819.   IN HANDLE  ProcessHandle,
  8820.   IN PVOID  BaseAddress);
  8821.  
  8822. NTOSAPI
  8823. NTSTATUS
  8824. DDKAPI
  8825. ZwUnmapViewOfSection(
  8826.   IN HANDLE  ProcessHandle,
  8827.   IN PVOID  BaseAddress);
  8828.  
  8829. NTOSAPI
  8830. NTSTATUS
  8831. DDKAPI
  8832. NtWaitForSingleObject(
  8833.   IN HANDLE  Object,
  8834.   IN BOOLEAN  Alertable,
  8835.   IN PLARGE_INTEGER  Time);
  8836.  
  8837. NTOSAPI
  8838. NTSTATUS
  8839. DDKAPI
  8840. ZwWaitForSingleObject(
  8841.   IN HANDLE  Object,
  8842.   IN BOOLEAN  Alertable,
  8843.   IN PLARGE_INTEGER  Time);
  8844.  
  8845. NTOSAPI
  8846. NTSTATUS
  8847. DDKAPI
  8848. NtWriteFile(
  8849.   IN HANDLE  FileHandle,
  8850.   IN HANDLE  Event  OPTIONAL,
  8851.   IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
  8852.   IN PVOID  ApcContext  OPTIONAL,
  8853.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8854.   IN PVOID  Buffer,
  8855.   IN ULONG  Length,
  8856.   IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
  8857.   IN PULONG  Key  OPTIONAL);
  8858.  
  8859. NTOSAPI
  8860. NTSTATUS
  8861. DDKAPI
  8862. ZwWriteFile(
  8863.   IN HANDLE  FileHandle,
  8864.   IN HANDLE  Event  OPTIONAL,
  8865.   IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
  8866.   IN PVOID  ApcContext  OPTIONAL,
  8867.   OUT PIO_STATUS_BLOCK  IoStatusBlock,
  8868.   IN PVOID  Buffer,
  8869.   IN ULONG  Length,
  8870.   IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
  8871.   IN PULONG  Key  OPTIONAL);
  8872.  
  8873.  
  8874.  
  8875. /** Power management support routines **/
  8876.  
  8877. NTOSAPI
  8878. NTSTATUS
  8879. DDKAPI
  8880. PoCallDriver(
  8881.   IN PDEVICE_OBJECT  DeviceObject,
  8882.   IN OUT PIRP  Irp);
  8883.  
  8884. NTOSAPI
  8885. PULONG
  8886. DDKAPI
  8887. PoRegisterDeviceForIdleDetection(
  8888.   IN PDEVICE_OBJECT  DeviceObject,
  8889.   IN ULONG  ConservationIdleTime,
  8890.   IN ULONG  PerformanceIdleTime,
  8891.   IN DEVICE_POWER_STATE  State);
  8892.  
  8893. NTOSAPI
  8894. PVOID
  8895. DDKAPI
  8896. PoRegisterSystemState(
  8897.   IN PVOID  StateHandle,
  8898.   IN EXECUTION_STATE  Flags);
  8899.  
  8900. NTOSAPI
  8901. NTSTATUS
  8902. DDKAPI
  8903. PoRequestPowerIrp(
  8904.   IN PDEVICE_OBJECT  DeviceObject,
  8905.   IN UCHAR  MinorFunction,  
  8906.   IN POWER_STATE  PowerState,
  8907.   IN PREQUEST_POWER_COMPLETE  CompletionFunction,
  8908.   IN PVOID  Context,
  8909.   OUT PIRP  *Irp OPTIONAL);
  8910.  
  8911. NTOSAPI
  8912. NTSTATUS
  8913. DDKAPI
  8914. PoRequestShutdownEvent(
  8915.   OUT PVOID  *Event);
  8916.  
  8917. NTOSAPI
  8918. VOID
  8919. DDKAPI
  8920. PoSetDeviceBusy(
  8921.   PULONG  IdlePointer); 
  8922.  
  8923. NTOSAPI
  8924. POWER_STATE
  8925. DDKAPI
  8926. PoSetPowerState(
  8927.   IN PDEVICE_OBJECT  DeviceObject,
  8928.   IN POWER_STATE_TYPE  Type,
  8929.   IN POWER_STATE  State);
  8930.  
  8931. NTOSAPI
  8932. VOID
  8933. DDKAPI
  8934. PoSetSystemState(
  8935.   IN EXECUTION_STATE  Flags);
  8936.  
  8937. NTOSAPI
  8938. VOID
  8939. DDKAPI
  8940. PoStartNextPowerIrp(
  8941.   IN PIRP  Irp);
  8942.  
  8943. NTOSAPI
  8944. VOID
  8945. DDKAPI
  8946. PoUnregisterSystemState(
  8947.   IN PVOID  StateHandle);
  8948.  
  8949.  
  8950.  
  8951. /** WMI library support routines **/
  8952.  
  8953. NTOSAPI
  8954. NTSTATUS
  8955. DDKAPI
  8956. WmiCompleteRequest(
  8957.   IN PDEVICE_OBJECT  DeviceObject,
  8958.   IN PIRP  Irp,
  8959.   IN NTSTATUS  Status,
  8960.   IN ULONG  BufferUsed,
  8961.   IN CCHAR  PriorityBoost);
  8962.  
  8963. NTOSAPI
  8964. NTSTATUS
  8965. DDKAPI
  8966. WmiFireEvent(
  8967.   IN PDEVICE_OBJECT  DeviceObject,
  8968.   IN LPGUID  Guid, 
  8969.   IN ULONG  InstanceIndex,
  8970.   IN ULONG  EventDataSize,
  8971.   IN PVOID  EventData); 
  8972.  
  8973. NTOSAPI
  8974. NTSTATUS
  8975. DDKAPI
  8976. WmiQueryTraceInformation(
  8977.   IN TRACE_INFORMATION_CLASS  TraceInformationClass,
  8978.   OUT PVOID  TraceInformation,
  8979.   IN ULONG  TraceInformationLength,
  8980.   OUT PULONG  RequiredLength OPTIONAL,
  8981.   IN PVOID  Buffer OPTIONAL);
  8982.  
  8983. NTOSAPI
  8984. NTSTATUS
  8985. DDKAPI
  8986. WmiSystemControl(
  8987.   IN PWMILIB_CONTEXT  WmiLibInfo,
  8988.   IN PDEVICE_OBJECT  DeviceObject,
  8989.   IN PIRP  Irp,
  8990.   OUT PSYSCTL_IRP_DISPOSITION  IrpDisposition);
  8991.  
  8992. NTOSAPI
  8993. NTSTATUS
  8994. DDKCDECLAPI
  8995. WmiTraceMessage(
  8996.   IN TRACEHANDLE  LoggerHandle,
  8997.   IN ULONG  MessageFlags,
  8998.   IN LPGUID  MessageGuid,
  8999.   IN USHORT  MessageNumber,
  9000.   IN ...);
  9001.  
  9002. #if 0
  9003. /* FIXME: Get va_list from where? */
  9004. NTOSAPI
  9005. NTSTATUS
  9006. DDKCDECLAPI
  9007. WmiTraceMessageVa(
  9008.   IN TRACEHANDLE  LoggerHandle,
  9009.   IN ULONG  MessageFlags,
  9010.   IN LPGUID  MessageGuid,
  9011.   IN USHORT  MessageNumber,
  9012.   IN va_list  MessageArgList);
  9013. #endif
  9014.  
  9015.  
  9016. /** Kernel debugger routines **/
  9017.  
  9018. NTOSAPI
  9019. VOID
  9020. DDKAPI
  9021. KdDisableDebugger(
  9022.   VOID);
  9023.  
  9024. NTOSAPI
  9025. VOID
  9026. DDKAPI
  9027. KdEnableDebugger(
  9028.   VOID);
  9029.  
  9030. NTOSAPI
  9031. VOID
  9032. DDKAPI
  9033. DbgBreakPoint(
  9034.   VOID);
  9035.  
  9036. NTOSAPI
  9037. VOID
  9038. DDKAPI
  9039. DbgBreakPointWithStatus(
  9040.   IN ULONG  Status);
  9041.  
  9042. NTOSAPI
  9043. ULONG
  9044. DDKCDECLAPI
  9045. DbgPrint(
  9046.   IN PCH  Format,
  9047.   IN ...);
  9048.  
  9049. NTOSAPI
  9050. ULONG
  9051. DDKCDECLAPI
  9052. DbgPrintEx(
  9053.   IN ULONG  ComponentId,
  9054.   IN ULONG  Level,
  9055.   IN PCH  Format,
  9056.   IN ...);
  9057.  
  9058. NTOSAPI
  9059. ULONG
  9060. DDKCDECLAPI
  9061. DbgPrintReturnControlC(
  9062.   IN PCH  Format,
  9063.   IN ...);
  9064.  
  9065. NTOSAPI
  9066. NTSTATUS
  9067. DDKAPI
  9068. DbgQueryDebugFilterState(
  9069.   IN ULONG  ComponentId,
  9070.   IN ULONG  Level);
  9071.  
  9072. NTOSAPI
  9073. NTSTATUS
  9074. DDKAPI
  9075. DbgSetDebugFilterState(
  9076.   IN ULONG  ComponentId,
  9077.   IN ULONG  Level,
  9078.   IN BOOLEAN  State);
  9079.  
  9080. #if DBG
  9081.  
  9082. #define KdPrint(_x_) DbgPrint _x_
  9083. #define KdPrintEx(_x_) DbgPrintEx _x_
  9084. #define KdBreakPoint() DbgBreakPoint()
  9085. #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
  9086.  
  9087. #else /* !DBG */
  9088.  
  9089. #define KdPrint(_x_)
  9090. #define KdPrintEx(_x_)
  9091. #define KdBreakPoint()
  9092. #define KdBreakPointWithStatus(s)
  9093.  
  9094. #endif /* !DBG */
  9095.  
  9096. extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
  9097. extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
  9098. #define KD_DEBUGGER_ENABLED     *KdDebuggerEnabled
  9099. #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
  9100.  
  9101. #pragma pack(pop)
  9102.  
  9103. #ifdef __cplusplus
  9104. }
  9105. #endif
  9106.  
  9107. #endif /* __WINDDK_H */
  9108.