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