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