OSDN Git Service

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