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