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