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