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