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