OSDN Git Service

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