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