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