Import w32api version 2.5 include files
[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 DDKAPI
432 (*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 DDKAPI
439 (*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 DDKAPI
446 (*PDRIVER_ADD_DEVICE)(
447 IN struct _DRIVER_OBJECT *DriverObject,
448 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
449
450 typedef NTSTATUS DDKAPI
451 (*PIO_COMPLETION_ROUTINE)(
452 IN struct _DEVICE_OBJECT *DeviceObject,
453 IN struct _IRP *Irp,
454 IN PVOID Context);
455
456 typedef VOID DDKAPI
457 (*PDRIVER_CANCEL)(
458 IN struct _DEVICE_OBJECT *DeviceObject,
459 IN struct _IRP *Irp);
460
461 typedef VOID DDKAPI
462 (*PKDEFERRED_ROUTINE)(
463 IN struct _KDPC *Dpc,
464 IN PVOID DeferredContext,
465 IN PVOID SystemArgument1,
466 IN PVOID SystemArgument2);
467
468 typedef NTSTATUS DDKAPI
469 (*PDRIVER_DISPATCH)(
470 IN struct _DEVICE_OBJECT *DeviceObject,
471 IN struct _IRP *Irp);
472
473 typedef VOID DDKAPI
474 (*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 DDKAPI
481 (*PMM_DLL_INITIALIZE)(
482 IN PUNICODE_STRING RegistryPath);
483
484 typedef NTSTATUS DDKAPI
485 (*PMM_DLL_UNLOAD)(
486 VOID);
487
488 typedef NTSTATUS DDKAPI
489 (*PDRIVER_ENTRY)(
490 IN struct _DRIVER_OBJECT *DriverObject,
491 IN PUNICODE_STRING RegistryPath);
492
493 typedef NTSTATUS DDKAPI
494 (*PDRIVER_INITIALIZE)(
495 IN struct _DRIVER_OBJECT *DriverObject,
496 IN PUNICODE_STRING RegistryPath);
497
498 typedef BOOLEAN DDKAPI
499 (*PKSERVICE_ROUTINE)(
500 IN struct _KINTERRUPT *Interrupt,
501 IN PVOID ServiceContext);
502
503 typedef VOID DDKAPI
504 (*PIO_TIMER_ROUTINE)(
505 IN struct _DEVICE_OBJECT *DeviceObject,
506 IN PVOID Context);
507
508 typedef VOID DDKAPI
509 (*PDRIVER_REINITIALIZE)(
510 IN struct _DRIVER_OBJECT *DriverObject,
511 IN PVOID Context,
512 IN ULONG Count);
513
514 typedef NTSTATUS DDKAPI
515 (*PDRIVER_STARTIO)(
516 IN struct _DEVICE_OBJECT *DeviceObject,
517 IN struct _IRP *Irp);
518
519 typedef BOOLEAN DDKAPI
520 (*PKSYNCHRONIZE_ROUTINE)(
521 IN PVOID SynchronizeContext);
522
523 typedef VOID DDKAPI
524 (*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 /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
2335 typedef struct _DRIVER_OBJECT {
2336 CSHORT Type;
2337 CSHORT Size;
2338 PDEVICE_OBJECT DeviceObject;
2339 ULONG Flags;
2340 PVOID DriverStart;
2341 ULONG DriverSize;
2342 PVOID DriverSection;
2343 PDRIVER_EXTENSION DriverExtension;
2344 UNICODE_STRING DriverName;
2345 PUNICODE_STRING HardwareDatabase;
2346 PVOID FastIoDispatch;
2347 PVOID DriverInit;
2348 PVOID DriverStartIo;
2349 PVOID DriverUnload;
2350 PVOID MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
2351 } DRIVER_OBJECT;
2352 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
2353
2354 typedef struct _SECTION_OBJECT_POINTERS {
2355 PVOID DataSectionObject;
2356 PVOID SharedCacheMap;
2357 PVOID ImageSectionObject;
2358 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
2359
2360 typedef struct _IO_COMPLETION_CONTEXT {
2361 PVOID Port;
2362 PVOID Key;
2363 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
2364
2365 /* FILE_OBJECT.Flags */
2366
2367 #define FO_FILE_OPEN 0x00000001
2368 #define FO_SYNCHRONOUS_IO 0x00000002
2369 #define FO_ALERTABLE_IO 0x00000004
2370 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
2371 #define FO_WRITE_THROUGH 0x00000010
2372 #define FO_SEQUENTIAL_ONLY 0x00000020
2373 #define FO_CACHE_SUPPORTED 0x00000040
2374 #define FO_NAMED_PIPE 0x00000080
2375 #define FO_STREAM_FILE 0x00000100
2376 #define FO_MAILSLOT 0x00000200
2377 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
2378 #define FO_DIRECT_DEVICE_OPEN 0x00000800
2379 #define FO_FILE_MODIFIED 0x00001000
2380 #define FO_FILE_SIZE_CHANGED 0x00002000
2381 #define FO_CLEANUP_COMPLETE 0x00004000
2382 #define FO_TEMPORARY_FILE 0x00008000
2383 #define FO_DELETE_ON_CLOSE 0x00010000
2384 #define FO_OPENED_CASE_SENSITIVE 0x00020000
2385 #define FO_HANDLE_CREATED 0x00040000
2386 #define FO_FILE_FAST_IO_READ 0x00080000
2387 #define FO_RANDOM_ACCESS 0x00100000
2388 #define FO_FILE_OPEN_CANCELLED 0x00200000
2389 #define FO_VOLUME_OPEN 0x00400000
2390 #define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
2391 #define FO_REMOTE_ORIGIN 0x01000000
2392
2393 typedef struct _FILE_OBJECT {
2394 CSHORT Type;
2395 CSHORT Size;
2396 PDEVICE_OBJECT DeviceObject;
2397 PVPB Vpb;
2398 PVOID FsContext;
2399 PVOID FsContext2;
2400 PSECTION_OBJECT_POINTERS SectionObjectPointer;
2401 PVOID PrivateCacheMap;
2402 NTSTATUS FinalStatus;
2403 struct _FILE_OBJECT *RelatedFileObject;
2404 BOOLEAN LockOperation;
2405 BOOLEAN DeletePending;
2406 BOOLEAN ReadAccess;
2407 BOOLEAN WriteAccess;
2408 BOOLEAN DeleteAccess;
2409 BOOLEAN SharedRead;
2410 BOOLEAN SharedWrite;
2411 BOOLEAN SharedDelete;
2412 ULONG Flags;
2413 UNICODE_STRING FileName;
2414 LARGE_INTEGER CurrentByteOffset;
2415 ULONG Waiters;
2416 ULONG Busy;
2417 PVOID LastLock;
2418 KEVENT Lock;
2419 KEVENT Event;
2420 PIO_COMPLETION_CONTEXT CompletionContext;
2421 } FILE_OBJECT;
2422 typedef struct _FILE_OBJECT *PFILE_OBJECT;
2423
2424 typedef enum _SECURITY_OPERATION_CODE {
2425 SetSecurityDescriptor,
2426 QuerySecurityDescriptor,
2427 DeleteSecurityDescriptor,
2428 AssignSecurityDescriptor
2429 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2430
2431 #define INITIAL_PRIVILEGE_COUNT 3
2432
2433 typedef struct _INITIAL_PRIVILEGE_SET {
2434 ULONG PrivilegeCount;
2435 ULONG Control;
2436 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2437 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2438
2439 typedef struct _SECURITY_SUBJECT_CONTEXT {
2440 PACCESS_TOKEN ClientToken;
2441 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2442 PACCESS_TOKEN PrimaryToken;
2443 PVOID ProcessAuditId;
2444 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2445
2446 typedef struct _ACCESS_STATE {
2447 LUID OperationID;
2448 BOOLEAN SecurityEvaluated;
2449 BOOLEAN GenerateAudit;
2450 BOOLEAN GenerateOnClose;
2451 BOOLEAN PrivilegesAllocated;
2452 ULONG Flags;
2453 ACCESS_MASK RemainingDesiredAccess;
2454 ACCESS_MASK PreviouslyGrantedAccess;
2455 ACCESS_MASK OriginalDesiredAccess;
2456 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2457 PSECURITY_DESCRIPTOR SecurityDescriptor;
2458 PVOID AuxData;
2459 union {
2460 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2461 PRIVILEGE_SET PrivilegeSet;
2462 } Privileges;
2463
2464 BOOLEAN AuditPrivileges;
2465 UNICODE_STRING ObjectName;
2466 UNICODE_STRING ObjectTypeName;
2467 } ACCESS_STATE, *PACCESS_STATE;
2468
2469 typedef struct _IO_SECURITY_CONTEXT {
2470 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2471 PACCESS_STATE AccessState;
2472 ACCESS_MASK DesiredAccess;
2473 ULONG FullCreateOptions;
2474 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2475
2476 struct _IO_CSQ;
2477
2478 typedef struct _IO_CSQ_IRP_CONTEXT {
2479 ULONG Type;
2480 struct _IRP *Irp;
2481 struct _IO_CSQ *Csq;
2482 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2483
2484 typedef VOID DDKAPI
2485 (*PIO_CSQ_INSERT_IRP)(
2486 IN struct _IO_CSQ *Csq,
2487 IN PIRP Irp);
2488
2489 typedef VOID DDKAPI
2490 (*PIO_CSQ_REMOVE_IRP)(
2491 IN struct _IO_CSQ *Csq,
2492 IN PIRP Irp);
2493
2494 typedef PIRP DDKAPI
2495 (*PIO_CSQ_PEEK_NEXT_IRP)(
2496 IN struct _IO_CSQ *Csq,
2497 IN PIRP Irp,
2498 IN PVOID PeekContext);
2499
2500 typedef VOID DDKAPI
2501 (*PIO_CSQ_ACQUIRE_LOCK)(
2502 IN struct _IO_CSQ *Csq,
2503 OUT PKIRQL Irql);
2504
2505 typedef VOID DDKAPI
2506 (*PIO_CSQ_RELEASE_LOCK)(
2507 IN struct _IO_CSQ *Csq,
2508 IN KIRQL Irql);
2509
2510 typedef VOID DDKAPI
2511 (*PIO_CSQ_COMPLETE_CANCELED_IRP)(
2512 IN struct _IO_CSQ *Csq,
2513 IN PIRP Irp);
2514
2515 typedef struct _IO_CSQ {
2516 ULONG Type;
2517 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2518 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2519 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2520 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2521 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2522 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2523 PVOID ReservePointer;
2524 } IO_CSQ, *PIO_CSQ;
2525
2526 typedef struct _IO_STACK_LOCATION {
2527 UCHAR MajorFunction;
2528 UCHAR MinorFunction;
2529 UCHAR Flags;
2530 UCHAR Control;
2531 union {
2532 struct {
2533 PIO_SECURITY_CONTEXT SecurityContext;
2534 ULONG Options;
2535 USHORT POINTER_ALIGNMENT FileAttributes;
2536 USHORT ShareAccess;
2537 ULONG POINTER_ALIGNMENT EaLength;
2538 } Create;
2539 struct {
2540 ULONG Length;
2541 ULONG POINTER_ALIGNMENT Key;
2542 LARGE_INTEGER ByteOffset;
2543 } Read;
2544 struct {
2545 ULONG Length;
2546 ULONG POINTER_ALIGNMENT Key;
2547 LARGE_INTEGER ByteOffset;
2548 } Write;
2549 struct {
2550 ULONG Length;
2551 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2552 } QueryFile;
2553 struct {
2554 ULONG Length;
2555 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2556 PFILE_OBJECT FileObject;
2557 _ANONYMOUS_UNION union {
2558 _ANONYMOUS_STRUCT struct {
2559 BOOLEAN ReplaceIfExists;
2560 BOOLEAN AdvanceOnly;
2561 } DUMMYSTRUCTNAME;
2562 ULONG ClusterCount;
2563 HANDLE DeleteHandle;
2564 } DUMMYUNIONNAME;
2565 } SetFile;
2566 struct {
2567 ULONG Length;
2568 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2569 } QueryVolume;
2570 struct {
2571 ULONG OutputBufferLength;
2572 ULONG POINTER_ALIGNMENT InputBufferLength;
2573 ULONG POINTER_ALIGNMENT IoControlCode;
2574 PVOID Type3InputBuffer;
2575 } DeviceIoControl;
2576 struct {
2577 SECURITY_INFORMATION SecurityInformation;
2578 ULONG POINTER_ALIGNMENT Length;
2579 } QuerySecurity;
2580 struct {
2581 SECURITY_INFORMATION SecurityInformation;
2582 PSECURITY_DESCRIPTOR SecurityDescriptor;
2583 } SetSecurity;
2584 struct {
2585 PVPB Vpb;
2586 PDEVICE_OBJECT DeviceObject;
2587 } MountVolume;
2588 struct {
2589 PVPB Vpb;
2590 PDEVICE_OBJECT DeviceObject;
2591 } VerifyVolume;
2592 struct {
2593 struct _SCSI_REQUEST_BLOCK *Srb;
2594 } Scsi;
2595 struct {
2596 DEVICE_RELATION_TYPE Type;
2597 } QueryDeviceRelations;
2598 struct {
2599 CONST GUID *InterfaceType;
2600 USHORT Size;
2601 USHORT Version;
2602 PINTERFACE Interface;
2603 PVOID InterfaceSpecificData;
2604 } QueryInterface;
2605 struct {
2606 PDEVICE_CAPABILITIES Capabilities;
2607 } DeviceCapabilities;
2608 struct {
2609 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2610 } FilterResourceRequirements;
2611 struct {
2612 ULONG WhichSpace;
2613 PVOID Buffer;
2614 ULONG Offset;
2615 ULONG POINTER_ALIGNMENT Length;
2616 } ReadWriteConfig;
2617 struct {
2618 BOOLEAN Lock;
2619 } SetLock;
2620 struct {
2621 BUS_QUERY_ID_TYPE IdType;
2622 } QueryId;
2623 struct {
2624 DEVICE_TEXT_TYPE DeviceTextType;
2625 LCID POINTER_ALIGNMENT LocaleId;
2626 } QueryDeviceText;
2627 struct {
2628 BOOLEAN InPath;
2629 BOOLEAN Reserved[3];
2630 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2631 } UsageNotification;
2632 struct {
2633 SYSTEM_POWER_STATE PowerState;
2634 } WaitWake;
2635 struct {
2636 PPOWER_SEQUENCE PowerSequence;
2637 } PowerSequence;
2638 struct {
2639 ULONG SystemContext;
2640 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2641 POWER_STATE POINTER_ALIGNMENT State;
2642 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2643 } Power;
2644 struct {
2645 PCM_RESOURCE_LIST AllocatedResources;
2646 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2647 } StartDevice;
2648 struct {
2649 ULONG_PTR ProviderId;
2650 PVOID DataPath;
2651 ULONG BufferSize;
2652 PVOID Buffer;
2653 } WMI;
2654 struct {
2655 PVOID Argument1;
2656 PVOID Argument2;
2657 PVOID Argument3;
2658 PVOID Argument4;
2659 } Others;
2660 } Parameters;
2661 PDEVICE_OBJECT DeviceObject;
2662 PFILE_OBJECT FileObject;
2663 PIO_COMPLETION_ROUTINE CompletionRoutine;
2664 PVOID Context;
2665 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2666
2667 /* IO_STACK_LOCATION.Control */
2668
2669 #define SL_PENDING_RETURNED 0x01
2670 #define SL_INVOKE_ON_CANCEL 0x20
2671 #define SL_INVOKE_ON_SUCCESS 0x40
2672 #define SL_INVOKE_ON_ERROR 0x80
2673
2674 typedef enum _KEY_INFORMATION_CLASS {
2675 KeyBasicInformation,
2676 KeyNodeInformation,
2677 KeyFullInformation,
2678 KeyNameInformation,
2679 KeyCachedInformation,
2680 KeyFlagsInformation
2681 } KEY_INFORMATION_CLASS;
2682
2683 typedef struct _KEY_BASIC_INFORMATION {
2684 LARGE_INTEGER LastWriteTime;
2685 ULONG TitleIndex;
2686 ULONG NameLength;
2687 WCHAR Name[1];
2688 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2689
2690 typedef struct _KEY_FULL_INFORMATION {
2691 LARGE_INTEGER LastWriteTime;
2692 ULONG TitleIndex;
2693 ULONG ClassOffset;
2694 ULONG ClassLength;
2695 ULONG SubKeys;
2696 ULONG MaxNameLen;
2697 ULONG MaxClassLen;
2698 ULONG Values;
2699 ULONG MaxValueNameLen;
2700 ULONG MaxValueDataLen;
2701 WCHAR Class[1];
2702 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2703
2704 typedef struct _KEY_NODE_INFORMATION {
2705 LARGE_INTEGER LastWriteTime;
2706 ULONG TitleIndex;
2707 ULONG ClassOffset;
2708 ULONG ClassLength;
2709 ULONG NameLength;
2710 WCHAR Name[1];
2711 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2712
2713 typedef struct _KEY_VALUE_BASIC_INFORMATION {
2714 ULONG TitleIndex;
2715 ULONG Type;
2716 ULONG NameLength;
2717 WCHAR Name[1];
2718 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2719
2720 typedef struct _KEY_VALUE_FULL_INFORMATION {
2721 ULONG TitleIndex;
2722 ULONG Type;
2723 ULONG DataOffset;
2724 ULONG DataLength;
2725 ULONG NameLength;
2726 WCHAR Name[1];
2727 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2728
2729 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2730 ULONG TitleIndex;
2731 ULONG Type;
2732 ULONG DataLength;
2733 UCHAR Data[1];
2734 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2735
2736 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2737 ULONG Type;
2738 ULONG DataLength;
2739 UCHAR Data[1];
2740 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2741
2742 typedef struct _KEY_VALUE_ENTRY {
2743 PUNICODE_STRING ValueName;
2744 ULONG DataLength;
2745 ULONG DataOffset;
2746 ULONG Type;
2747 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2748
2749 typedef enum _KEY_VALUE_INFORMATION_CLASS {
2750 KeyValueBasicInformation,
2751 KeyValueFullInformation,
2752 KeyValuePartialInformation,
2753 KeyValueFullInformationAlign64,
2754 KeyValuePartialInformationAlign64
2755 } KEY_VALUE_INFORMATION_CLASS;
2756
2757 /* KEY_VALUE_Xxx.Type */
2758
2759 #define REG_NONE 0
2760 #define REG_SZ 1
2761 #define REG_EXPAND_SZ 2
2762 #define REG_BINARY 3
2763 #define REG_DWORD 4
2764 #define REG_DWORD_LITTLE_ENDIAN 4
2765 #define REG_DWORD_BIG_ENDIAN 5
2766 #define REG_LINK 6
2767 #define REG_MULTI_SZ 7
2768 #define REG_RESOURCE_LIST 8
2769 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2770 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2771 #define REG_QWORD 11
2772 #define REG_QWORD_LITTLE_ENDIAN 11
2773
2774 #define PCI_TYPE0_ADDRESSES 6
2775 #define PCI_TYPE1_ADDRESSES 2
2776 #define PCI_TYPE2_ADDRESSES 5
2777
2778 typedef struct _PCI_COMMON_CONFIG {
2779 USHORT VendorID;
2780 USHORT DeviceID;
2781 USHORT Command;
2782 USHORT Status;
2783 UCHAR RevisionID;
2784 UCHAR ProgIf;
2785 UCHAR SubClass;
2786 UCHAR BaseClass;
2787 UCHAR CacheLineSize;
2788 UCHAR LatencyTimer;
2789 UCHAR HeaderType;
2790 UCHAR BIST;
2791 union {
2792 struct _PCI_HEADER_TYPE_0 {
2793 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
2794 ULONG CIS;
2795 USHORT SubVendorID;
2796 USHORT SubSystemID;
2797 ULONG ROMBaseAddress;
2798 UCHAR CapabilitiesPtr;
2799 UCHAR Reserved1[3];
2800 ULONG Reserved2;
2801 UCHAR InterruptLine;
2802 UCHAR InterruptPin;
2803 UCHAR MinimumGrant;
2804 UCHAR MaximumLatency;
2805 } type0;
2806 struct _PCI_HEADER_TYPE_1 {
2807 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
2808 UCHAR PrimaryBus;
2809 UCHAR SecondaryBus;
2810 UCHAR SubordinateBus;
2811 UCHAR SecondaryLatency;
2812 UCHAR IOBase;
2813 UCHAR IOLimit;
2814 USHORT SecondaryStatus;
2815 USHORT MemoryBase;
2816 USHORT MemoryLimit;
2817 USHORT PrefetchBase;
2818 USHORT PrefetchLimit;
2819 ULONG PrefetchBaseUpper32;
2820 ULONG PrefetchLimitUpper32;
2821 USHORT IOBaseUpper16;
2822 USHORT IOLimitUpper16;
2823 UCHAR CapabilitiesPtr;
2824 UCHAR Reserved1[3];
2825 ULONG ROMBaseAddress;
2826 UCHAR InterruptLine;
2827 UCHAR InterruptPin;
2828 USHORT BridgeControl;
2829 } type1;
2830 struct _PCI_HEADER_TYPE_2 {
2831 ULONG SocketRegistersBaseAddress;
2832 UCHAR CapabilitiesPtr;
2833 UCHAR Reserved;
2834 USHORT SecondaryStatus;
2835 UCHAR PrimaryBus;
2836 UCHAR SecondaryBus;
2837 UCHAR SubordinateBus;
2838 UCHAR SecondaryLatency;
2839 struct {
2840 ULONG Base;
2841 ULONG Limit;
2842 } Range[PCI_TYPE2_ADDRESSES - 1];
2843 UCHAR InterruptLine;
2844 UCHAR InterruptPin;
2845 USHORT BridgeControl;
2846 } type2;
2847 } u;
2848 UCHAR DeviceSpecific[192];
2849 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2850
2851 /* PCI_COMMON_CONFIG.Command */
2852
2853 #define PCI_ENABLE_IO_SPACE 0x0001
2854 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2855 #define PCI_ENABLE_BUS_MASTER 0x0004
2856 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2857 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2858 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2859 #define PCI_ENABLE_PARITY 0x0040
2860 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2861 #define PCI_ENABLE_SERR 0x0100
2862 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2863
2864 /* PCI_COMMON_CONFIG.Status */
2865
2866 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2867 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2868 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2869 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2870 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2871 #define PCI_STATUS_DEVSEL 0x0600
2872 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2873 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2874 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2875 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2876 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2877
2878 /* PCI_COMMON_CONFIG.HeaderType */
2879
2880 #define PCI_MULTIFUNCTION 0x80
2881 #define PCI_DEVICE_TYPE 0x00
2882 #define PCI_BRIDGE_TYPE 0x01
2883 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2884
2885 #define PCI_CONFIGURATION_TYPE(PciData) \
2886 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2887
2888 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2889 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2890
2891 typedef struct _PCI_SLOT_NUMBER {
2892 union {
2893 struct {
2894 ULONG DeviceNumber : 5;
2895 ULONG FunctionNumber : 3;
2896 ULONG Reserved : 24;
2897 } bits;
2898 ULONG AsULONG;
2899 } u;
2900 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
2901
2902 typedef enum _POOL_TYPE {
2903 NonPagedPool,
2904 PagedPool,
2905 NonPagedPoolMustSucceed,
2906 DontUseThisType,
2907 NonPagedPoolCacheAligned,
2908 PagedPoolCacheAligned,
2909 NonPagedPoolCacheAlignedMustS,
2910 MaxPoolType,
2911 NonPagedPoolSession = 32,
2912 PagedPoolSession,
2913 NonPagedPoolMustSucceedSession,
2914 DontUseThisTypeSession,
2915 NonPagedPoolCacheAlignedSession,
2916 PagedPoolCacheAlignedSession,
2917 NonPagedPoolCacheAlignedMustSSession
2918 } POOL_TYPE;
2919
2920 typedef enum _EX_POOL_PRIORITY {
2921 LowPoolPriority,
2922 LowPoolPrioritySpecialPoolOverrun = 8,
2923 LowPoolPrioritySpecialPoolUnderrun = 9,
2924 NormalPoolPriority = 16,
2925 NormalPoolPrioritySpecialPoolOverrun = 24,
2926 NormalPoolPrioritySpecialPoolUnderrun = 25,
2927 HighPoolPriority = 32,
2928 HighPoolPrioritySpecialPoolOverrun = 40,
2929 HighPoolPrioritySpecialPoolUnderrun = 41
2930 } EX_POOL_PRIORITY;
2931
2932 /* PRIVILEGE_SET.Control */
2933
2934 #define PRIVILEGE_SET_ALL_NECESSARY 1
2935
2936 typedef struct _RTL_OSVERSIONINFOW {
2937 ULONG dwOSVersionInfoSize;
2938 ULONG dwMajorVersion;
2939 ULONG dwMinorVersion;
2940 ULONG dwBuildNumber;
2941 ULONG dwPlatformId;
2942 WCHAR szCSDVersion[128];
2943 } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
2944
2945 typedef struct _RTL_OSVERSIONINFOEXW {
2946 ULONG dwOSVersionInfoSize;
2947 ULONG dwMajorVersion;
2948 ULONG dwMinorVersion;
2949 ULONG dwBuildNumber;
2950 ULONG dwPlatformId;
2951 WCHAR szCSDVersion[128];
2952 USHORT wServicePackMajor;
2953 USHORT wServicePackMinor;
2954 USHORT wSuiteMask;
2955 UCHAR wProductType;
2956 UCHAR wReserved;
2957 } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
2958
2959 NTOSAPI
2960 ULONGLONG
2961 DDKAPI
2962 VerSetConditionMask(
2963 IN ULONGLONG ConditionMask,
2964 IN ULONG TypeMask,
2965 IN UCHAR Condition);
2966
2967 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
2968 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
2969 (TypeBitMask), (ComparisonType)))
2970
2971 /* RtlVerifyVersionInfo() TypeMask */
2972
2973 #define VER_MINORVERSION 0x0000001
2974 #define VER_MAJORVERSION 0x0000002
2975 #define VER_BUILDNUMBER 0x0000004
2976 #define VER_PLATFORMID 0x0000008
2977 #define VER_SERVICEPACKMINOR 0x0000010
2978 #define VER_SERVICEPACKMAJOR 0x0000020
2979 #define VER_SUITENAME 0x0000040
2980 #define VER_PRODUCT_TYPE 0x0000080
2981
2982 /* RtlVerifyVersionInfo() ComparisonType */
2983
2984 #define VER_EQUAL 1
2985 #define VER_GREATER 2
2986 #define VER_GREATER_EQUAL 3
2987 #define VER_LESS 4
2988 #define VER_LESS_EQUAL 5
2989 #define VER_AND 6
2990 #define VER_OR 7
2991
2992 #define VER_CONDITION_MASK 7
2993 #define VER_NUM_BITS_PER_CONDITION_MASK 3
2994
2995 typedef struct _RTL_BITMAP {
2996 ULONG SizeOfBitMap;
2997 PULONG Buffer;
2998 } RTL_BITMAP, *PRTL_BITMAP;
2999
3000 typedef struct _RTL_BITMAP_RUN {
3001 ULONG StartingIndex;
3002 ULONG NumberOfBits;
3003 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
3004
3005 typedef NTSTATUS DDKAPI
3006 (*PRTL_QUERY_REGISTRY_ROUTINE)(
3007 IN PWSTR ValueName,
3008 IN ULONG ValueType,
3009 IN PVOID ValueData,
3010 IN ULONG ValueLength,
3011 IN PVOID Context,
3012 IN PVOID EntryContext);
3013
3014 #define RTL_REGISTRY_ABSOLUTE 0
3015 #define RTL_REGISTRY_SERVICES 1
3016 #define RTL_REGISTRY_CONTROL 2
3017 #define RTL_REGISTRY_WINDOWS_NT 3
3018 #define RTL_REGISTRY_DEVICEMAP 4
3019 #define RTL_REGISTRY_USER 5
3020
3021 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3022 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3023 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3024 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3025 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3026 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3027 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3028 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3029
3030 typedef struct _RTL_QUERY_REGISTRY_TABLE {
3031 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
3032 ULONG Flags;
3033 PWSTR Name;
3034 PVOID EntryContext;
3035 ULONG DefaultType;
3036 PVOID DefaultData;
3037 ULONG DefaultLength;
3038 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
3039
3040 typedef struct _TIME_FIELDS {
3041 CSHORT Year;
3042 CSHORT Month;
3043 CSHORT Day;
3044 CSHORT Hour;
3045 CSHORT Minute;
3046 CSHORT Second;
3047 CSHORT Milliseconds;
3048 CSHORT Weekday;
3049 } TIME_FIELDS, *PTIME_FIELDS;
3050
3051 typedef PVOID DDKAPI
3052 (*PALLOCATE_FUNCTION)(
3053 IN POOL_TYPE PoolType,
3054 IN SIZE_T NumberOfBytes,
3055 IN ULONG Tag);
3056
3057 typedef VOID DDKAPI
3058 (*PFREE_FUNCTION)(
3059 IN PVOID Buffer);
3060
3061 #define GENERAL_LOOKASIDE_S \
3062 SLIST_HEADER ListHead; \
3063 USHORT Depth; \
3064 USHORT MaximumDepth; \
3065 ULONG TotalAllocates; \
3066 _ANONYMOUS_UNION union { \
3067 ULONG AllocateMisses; \
3068 ULONG AllocateHits; \
3069 } DUMMYUNIONNAME; \
3070 ULONG TotalFrees; \
3071 _ANONYMOUS_UNION union { \
3072 ULONG FreeMisses; \
3073 ULONG FreeHits; \
3074 } DUMMYUNIONNAME2; \
3075 POOL_TYPE Type; \
3076 ULONG Tag; \
3077 ULONG Size; \
3078 PALLOCATE_FUNCTION Allocate; \
3079 PFREE_FUNCTION Free; \
3080 LIST_ENTRY ListEntry; \
3081 ULONG LastTotalAllocates; \
3082 _ANONYMOUS_UNION union { \
3083 ULONG LastAllocateMisses; \
3084 ULONG LastAllocateHits; \
3085 } DUMMYUNIONNAME3; \
3086 ULONG Future[2];
3087
3088 typedef struct _GENERAL_LOOKASIDE {
3089 GENERAL_LOOKASIDE_S
3090 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
3091
3092 typedef struct _NPAGED_LOOKASIDE_LIST {
3093 GENERAL_LOOKASIDE_S
3094 KSPIN_LOCK Obsoleted;
3095 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
3096
3097 typedef struct _PAGED_LOOKASIDE_LIST {
3098 GENERAL_LOOKASIDE_S
3099 FAST_MUTEX Obsoleted;
3100 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
3101
3102 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
3103
3104 typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
3105 IN PVOID CallbackContext,
3106 IN PVOID Argument1,
3107 IN PVOID Argument2);
3108
3109 typedef enum _EVENT_TYPE {
3110 NotificationEvent,
3111 SynchronizationEvent
3112 } EVENT_TYPE;
3113
3114 typedef enum _KWAIT_REASON {
3115 Executive,
3116 FreePage,
3117 PageIn,
3118 PoolAllocation,
3119 DelayExecution,
3120 Suspended,
3121 UserRequest,
3122 WrExecutive,
3123 WrFreePage,
3124 WrPageIn,
3125 WrPoolAllocation,
3126 WrDelayExecution,
3127 WrSuspended,
3128 WrUserRequest,
3129 WrEventPair,
3130 WrQueue,
3131 WrLpcReceive,
3132 WrLpcReply,
3133 WrVirtualMemory,
3134 WrPageOut,
3135 WrRendezvous,
3136 Spare2,
3137 Spare3,
3138 Spare4,
3139 Spare5,
3140 Spare6,
3141 WrKernel,
3142 MaximumWaitReason
3143 } KWAIT_REASON;
3144
3145 typedef struct _KWAIT_BLOCK {
3146 LIST_ENTRY WaitListEntry;
3147 struct _KTHREAD * RESTRICTED_POINTER Thread;
3148 PVOID Object;
3149 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
3150 USHORT WaitKey;
3151 USHORT WaitType;
3152 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
3153
3154 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
3155
3156 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
3157 BOOLEAN Removed;
3158 BOOLEAN Reserved[3];
3159 LONG IoCount;
3160 KEVENT RemoveEvent;
3161 } IO_REMOVE_LOCK_COMMON_BLOCK;
3162
3163 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
3164 LONG Signature;
3165 LONG HighWatermark;
3166 LONGLONG MaxLockedTicks;
3167 LONG AllocateTag;
3168 LIST_ENTRY LockList;
3169 KSPIN_LOCK Spin;
3170 LONG LowMemoryCount;
3171 ULONG Reserved1[4];
3172 PVOID Reserved2;
3173 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
3174 } IO_REMOVE_LOCK_DBG_BLOCK;
3175
3176 typedef struct _IO_REMOVE_LOCK {
3177 IO_REMOVE_LOCK_COMMON_BLOCK Common;
3178 #ifdef DBG
3179 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
3180 #endif
3181 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
3182
3183 typedef struct _IO_WORKITEM *PIO_WORKITEM;
3184
3185 typedef VOID DDKAPI
3186 (*PIO_WORKITEM_ROUTINE)(
3187 IN PDEVICE_OBJECT DeviceObject,
3188 IN PVOID Context);
3189
3190 typedef struct _SHARE_ACCESS {
3191 ULONG OpenCount;
3192 ULONG Readers;
3193 ULONG Writers;
3194 ULONG Deleters;
3195 ULONG SharedRead;
3196 ULONG SharedWrite;
3197 ULONG SharedDelete;
3198 } SHARE_ACCESS, *PSHARE_ACCESS;
3199
3200 typedef enum _KINTERRUPT_MODE {
3201 LevelSensitive,
3202 Latched
3203 } KINTERRUPT_MODE;
3204
3205 typedef VOID DDKAPI
3206 (*PKINTERRUPT_ROUTINE)(
3207 VOID);
3208
3209 typedef enum _KPROFILE_SOURCE {
3210 ProfileTime,
3211 ProfileAlignmentFixup,
3212 ProfileTotalIssues,
3213 ProfilePipelineDry,
3214 ProfileLoadInstructions,
3215 ProfilePipelineFrozen,
3216 ProfileBranchInstructions,
3217 ProfileTotalNonissues,
3218 ProfileDcacheMisses,
3219 ProfileIcacheMisses,
3220 ProfileCacheMisses,
3221 ProfileBranchMispredictions,
3222 ProfileStoreInstructions,
3223 ProfileFpInstructions,
3224 ProfileIntegerInstructions,
3225 Profile2Issue,
3226 Profile3Issue,
3227 Profile4Issue,
3228 ProfileSpecialInstructions,
3229 ProfileTotalCycles,
3230 ProfileIcacheIssues,
3231 ProfileDcacheAccesses,
3232 ProfileMemoryBarrierCycles,
3233 ProfileLoadLinkedIssues,
3234 ProfileMaximum
3235 } KPROFILE_SOURCE;
3236
3237 typedef enum _CREATE_FILE_TYPE {
3238 CreateFileTypeNone,
3239 CreateFileTypeNamedPipe,
3240 CreateFileTypeMailslot
3241 } CREATE_FILE_TYPE;
3242
3243 typedef struct _CONFIGURATION_INFORMATION {
3244 ULONG DiskCount;
3245 ULONG FloppyCount;
3246 ULONG CdRomCount;
3247 ULONG TapeCount;
3248 ULONG ScsiPortCount;
3249 ULONG SerialCount;
3250 ULONG ParallelCount;
3251 BOOLEAN AtDiskPrimaryAddressClaimed;
3252 BOOLEAN AtDiskSecondaryAddressClaimed;
3253 ULONG Version;
3254 ULONG MediumChangerCount;
3255 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3256
3257 typedef enum _CONFIGURATION_TYPE {
3258 ArcSystem,
3259 CentralProcessor,
3260 FloatingPointProcessor,
3261 PrimaryIcache,
3262 PrimaryDcache,
3263 SecondaryIcache,
3264 SecondaryDcache,
3265 SecondaryCache,
3266 EisaAdapter,
3267 TcAdapter,
3268 ScsiAdapter,
3269 DtiAdapter,
3270 MultiFunctionAdapter,
3271 DiskController,
3272 TapeController,
3273 CdromController,
3274 WormController,
3275 SerialController,
3276 NetworkController,
3277 DisplayController,
3278 ParallelController,
3279 PointerController,
3280 KeyboardController,
3281 AudioController,
3282 OtherController,
3283 DiskPeripheral,
3284 FloppyDiskPeripheral,
3285 TapePeripheral,
3286 ModemPeripheral,
3287 MonitorPeripheral,
3288 PrinterPeripheral,
3289 PointerPeripheral,
3290 KeyboardPeripheral,
3291 TerminalPeripheral,
3292 OtherPeripheral,
3293 LinePeripheral,
3294 NetworkPeripheral,
3295 SystemMemory,
3296 DockingInformation,
3297 RealModeIrqRoutingTable,
3298 MaximumType
3299 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
3300
3301 typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
3302 IN PVOID Context,
3303 IN PUNICODE_STRING PathName,
3304 IN INTERFACE_TYPE BusType,
3305 IN ULONG BusNumber,
3306 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
3307 IN CONFIGURATION_TYPE ControllerType,
3308 IN ULONG ControllerNumber,
3309 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3310 IN CONFIGURATION_TYPE PeripheralType,
3311 IN ULONG PeripheralNumber,
3312 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3313
3314 typedef enum _WORK_QUEUE_TYPE {
3315 CriticalWorkQueue,
3316 DelayedWorkQueue,
3317 HyperCriticalWorkQueue,
3318 MaximumWorkQueue
3319 } WORK_QUEUE_TYPE;
3320
3321 typedef VOID DDKAPI
3322 (*PWORKER_THREAD_ROUTINE)(
3323 IN PVOID Parameter);
3324
3325 typedef struct _WORK_QUEUE_ITEM {
3326 LIST_ENTRY List;
3327 PWORKER_THREAD_ROUTINE WorkerRoutine;
3328 PVOID Parameter;
3329 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
3330
3331 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
3332 BufferEmpty,
3333 BufferInserted,
3334 BufferStarted,
3335 BufferFinished,
3336 BufferIncomplete
3337 } KBUGCHECK_BUFFER_DUMP_STATE;
3338
3339 typedef VOID DDKAPI
3340 (*PKBUGCHECK_CALLBACK_ROUTINE)(
3341 IN PVOID Buffer,
3342 IN ULONG Length);
3343
3344 typedef struct _KBUGCHECK_CALLBACK_RECORD {
3345 LIST_ENTRY Entry;
3346 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
3347 PVOID Buffer;
3348 ULONG Length;
3349 PUCHAR Component;
3350 ULONG_PTR Checksum;
3351 UCHAR State;
3352 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
3353
3354 /*
3355 * VOID
3356 * KeInitializeCallbackRecord(
3357 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
3358 */
3359 #define KeInitializeCallbackRecord(CallbackRecord) \
3360 CallbackRecord->State = BufferEmpty;
3361
3362 typedef enum _KDPC_IMPORTANCE {
3363 LowImportance,
3364 MediumImportance,
3365 HighImportance
3366 } KDPC_IMPORTANCE;
3367
3368 typedef enum _MEMORY_CACHING_TYPE_ORIG {
3369 MmFrameBufferCached = 2
3370 } MEMORY_CACHING_TYPE_ORIG;
3371
3372 typedef enum _MEMORY_CACHING_TYPE {
3373 MmNonCached = FALSE,
3374 MmCached = TRUE,
3375 MmWriteCombined = MmFrameBufferCached,
3376 MmHardwareCoherentCached,
3377 MmNonCachedUnordered,
3378 MmUSWCCached,
3379 MmMaximumCacheType
3380 } MEMORY_CACHING_TYPE;
3381
3382 typedef enum _MM_PAGE_PRIORITY {
3383 LowPagePriority,
3384 NormalPagePriority = 16,
3385 HighPagePriority = 32
3386 } MM_PAGE_PRIORITY;
3387
3388 typedef enum _LOCK_OPERATION {
3389 IoReadAccess,
3390 IoWriteAccess,
3391 IoModifyAccess
3392 } LOCK_OPERATION;
3393
3394 typedef enum _MM_SYSTEM_SIZE {
3395 MmSmallSystem,
3396 MmMediumSystem,
3397 MmLargeSystem
3398 } MM_SYSTEM_SIZE;
3399
3400 typedef struct _OBJECT_HANDLE_INFORMATION {
3401 ULONG HandleAttributes;
3402 ACCESS_MASK GrantedAccess;
3403 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3404
3405 typedef struct _CLIENT_ID {
3406 HANDLE UniqueProcess;
3407 HANDLE UniqueThread;
3408 } CLIENT_ID, *PCLIENT_ID;
3409
3410 typedef VOID DDKAPI
3411 (*PKSTART_ROUTINE)(
3412 IN PVOID StartContext);
3413
3414 typedef VOID DDKAPI
3415 (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
3416 IN HANDLE ParentId,
3417 IN HANDLE ProcessId,
3418 IN BOOLEAN Create);
3419
3420 typedef VOID DDKAPI
3421 (*PCREATE_THREAD_NOTIFY_ROUTINE)(
3422 IN HANDLE ProcessId,
3423 IN HANDLE ThreadId,
3424 IN BOOLEAN Create);
3425
3426 typedef struct _IMAGE_INFO {
3427 _ANONYMOUS_UNION union {
3428 ULONG Properties;
3429 _ANONYMOUS_STRUCT struct {
3430 ULONG ImageAddressingMode : 8;
3431 ULONG SystemModeImage : 1;
3432 ULONG ImageMappedToAllPids : 1;
3433 ULONG Reserved : 22;
3434 } DUMMYSTRUCTNAME;
3435 } DUMMYUNIONNAME;
3436 PVOID ImageBase;
3437 ULONG ImageSelector;
3438 SIZE_T ImageSize;
3439 ULONG ImageSectionNumber;
3440 } IMAGE_INFO, *PIMAGE_INFO;
3441
3442 #define IMAGE_ADDRESSING_MODE_32BIT 3
3443
3444 typedef VOID DDKAPI
3445 (*PLOAD_IMAGE_NOTIFY_ROUTINE)(
3446 IN PUNICODE_STRING FullImageName,
3447 IN HANDLE ProcessId,
3448 IN PIMAGE_INFO ImageInfo);
3449
3450 typedef enum _PROCESSINFOCLASS {
3451 ProcessBasicInformation,
3452 ProcessQuotaLimits,
3453 ProcessIoCounters,
3454 ProcessVmCounters,
3455 ProcessTimes,
3456 ProcessBasePriority,
3457 ProcessRaisePriority,
3458 ProcessDebugPort,
3459 ProcessExceptionPort,
3460 ProcessAccessToken,
3461 ProcessLdtInformation,
3462 ProcessLdtSize,
3463 ProcessDefaultHardErrorMode,
3464 ProcessIoPortHandlers,
3465 ProcessPooledUsageAndLimits,
3466 ProcessWorkingSetWatch,
3467 ProcessUserModeIOPL,
3468 ProcessEnableAlignmentFaultFixup,
3469 ProcessPriorityClass,
3470 ProcessWx86Information,
3471 ProcessHandleCount,
3472 ProcessAffinityMask,
3473 ProcessPriorityBoost,
3474 ProcessDeviceMap,
3475 ProcessSessionInformation,
3476 ProcessForegroundInformation,
3477 ProcessWow64Information,
3478 ProcessImageFileName,
3479 ProcessLUIDDeviceMapsEnabled,
3480 ProcessBreakOnTermination,
3481 ProcessDebugObjectHandle,
3482 ProcessDebugFlags,
3483 ProcessHandleTracing,
3484 MaxProcessInfoClass
3485 } PROCESSINFOCLASS;
3486
3487 typedef enum _THREADINFOCLASS {
3488 ThreadBasicInformation,
3489 ThreadTimes,
3490 ThreadPriority,
3491 ThreadBasePriority,
3492 ThreadAffinityMask,
3493 ThreadImpersonationToken,
3494 ThreadDescriptorTableEntry,
3495 ThreadEnableAlignmentFaultFixup,
3496 ThreadEventPair_Reusable,
3497 ThreadQuerySetWin32StartAddress,
3498 ThreadZeroTlsCell,
3499 ThreadPerformanceCount,
3500 ThreadAmILastThread,
3501 ThreadIdealProcessor,
3502 ThreadPriorityBoost,
3503 ThreadSetTlsArrayAddress,
3504 ThreadIsIoPending,
3505 ThreadHideFromDebugger,
3506 ThreadBreakOnTermination,
3507 MaxThreadInfoClass
3508 } THREADINFOCLASS;
3509
3510 #define ES_SYSTEM_REQUIRED 0x00000001
3511 #define ES_DISPLAY_REQUIRED 0x00000002
3512 #define ES_USER_PRESENT 0x00000004
3513 #define ES_CONTINUOUS 0x80000000
3514
3515 typedef ULONG EXECUTION_STATE;
3516
3517 typedef VOID DDKAPI
3518 (*PREQUEST_POWER_COMPLETE)(
3519 IN PDEVICE_OBJECT DeviceObject,
3520 IN UCHAR MinorFunction,
3521 IN POWER_STATE PowerState,
3522 IN PVOID Context,
3523 IN PIO_STATUS_BLOCK IoStatus);
3524
3525 typedef enum _TRACE_INFORMATION_CLASS {
3526 TraceIdClass,
3527 TraceHandleClass,
3528 TraceEnableFlagsClass,
3529 TraceEnableLevelClass,
3530 GlobalLoggerHandleClass,
3531 EventLoggerHandleClass,
3532 AllLoggerHandlesClass,
3533 TraceHandleByNameClass
3534 } TRACE_INFORMATION_CLASS;
3535
3536 typedef NTSTATUS DDKAPI
3537 (*PEX_CALLBACK_FUNCTION)(
3538 IN PVOID CallbackContext,
3539 IN PVOID Argument1,
3540 IN PVOID Argument2);
3541
3542
3543
3544 /*
3545 ** Storage structures
3546 */
3547 typedef enum _PARTITION_STYLE {
3548 PARTITION_STYLE_MBR,
3549 PARTITION_STYLE_GPT
3550 } PARTITION_STYLE;
3551
3552 typedef struct _CREATE_DISK_MBR {
3553 ULONG Signature;
3554 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
3555
3556 typedef struct _CREATE_DISK_GPT {
3557 GUID DiskId;
3558 ULONG MaxPartitionCount;
3559 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
3560
3561 typedef struct _CREATE_DISK {
3562 PARTITION_STYLE PartitionStyle;
3563 _ANONYMOUS_UNION union {
3564 CREATE_DISK_MBR Mbr;
3565 CREATE_DISK_GPT Gpt;
3566 } DUMMYUNIONNAME;
3567 } CREATE_DISK, *PCREATE_DISK;
3568
3569 typedef struct _DISK_SIGNATURE {
3570 ULONG PartitionStyle;
3571 _ANONYMOUS_UNION union {
3572 struct {
3573 ULONG Signature;
3574 ULONG CheckSum;
3575 } Mbr;
3576 struct {
3577 GUID DiskId;
3578 } Gpt;
3579 } DUMMYUNIONNAME;
3580 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3581
3582 typedef VOID DDKFASTAPI
3583 (*PTIME_UPDATE_NOTIFY_ROUTINE)(
3584 IN HANDLE ThreadId,
3585 IN KPROCESSOR_MODE Mode);
3586
3587 #define DBG_STATUS_CONTROL_C 1
3588 #define DBG_STATUS_SYSRQ 2
3589 #define DBG_STATUS_BUGCHECK_FIRST 3
3590 #define DBG_STATUS_BUGCHECK_SECOND 4
3591 #define DBG_STATUS_FATAL 5
3592 #define DBG_STATUS_DEBUG_CONTROL 6
3593 #define DBG_STATUS_WORKER 7
3594
3595 typedef struct _PHYSICAL_MEMORY_RANGE {
3596 PHYSICAL_ADDRESS BaseAddress;
3597 LARGE_INTEGER NumberOfBytes;
3598 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
3599
3600 typedef ULONG_PTR
3601 (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
3602 IN PVOID Context);
3603
3604 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
3605 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
3606 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
3607 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
3608
3609 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
3610 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
3611 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
3612 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
3613 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
3614
3615 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
3616 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002
3617
3618 #define RTL_RANGE_LIST_SHARED_OK 0x00000001
3619 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3620
3621 #define RTL_RANGE_LIST_SHARED_OK 0x00000001
3622 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3623
3624 #define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT
3625
3626 typedef struct _RTL_RANGE {
3627 ULONGLONG Start;
3628 ULONGLONG End;
3629 PVOID UserData;
3630 PVOID Owner;
3631 UCHAR Attributes;
3632 UCHAR Flags;
3633 } RTL_RANGE, *PRTL_RANGE;
3634
3635 #define RTL_RANGE_SHARED 0x01
3636 #define RTL_RANGE_CONFLICT 0x02
3637
3638 typedef struct _RTL_RANGE_LIST {
3639 LIST_ENTRY ListHead;
3640 ULONG Flags;
3641 ULONG Count;
3642 ULONG Stamp;
3643 } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
3644
3645 typedef struct _RANGE_LIST_ITERATOR {
3646 PLIST_ENTRY RangeListHead;
3647 PLIST_ENTRY MergedHead;
3648 PVOID Current;
3649 ULONG Stamp;
3650 } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
3651
3652 typedef BOOLEAN
3653 (*PRTL_CONFLICT_RANGE_CALLBACK)(
3654 IN PVOID Context,
3655 IN PRTL_RANGE Range);
3656
3657 #define HASH_STRING_ALGORITHM_DEFAULT 0
3658 #define HASH_STRING_ALGORITHM_X65599 1
3659 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
3660
3661 typedef enum _SUITE_TYPE {
3662 SmallBusiness,
3663 Enterprise,
3664 BackOffice,
3665 CommunicationServer,
3666 TerminalServer,
3667 SmallBusinessRestricted,
3668 EmbeddedNT,
3669 DataCenter,
3670 SingleUserTS,
3671 Personal,
3672 Blade,
3673 MaxSuiteType
3674 } SUITE_TYPE;
3675
3676 typedef VOID DDKAPI
3677 (*PTIMER_APC_ROUTINE)(
3678 IN PVOID TimerContext,
3679 IN ULONG TimerLowValue,
3680 IN LONG TimerHighValue);
3681
3682
3683
3684 /*
3685 ** WMI structures
3686 */
3687
3688 typedef VOID DDKAPI
3689 (*WMI_NOTIFICATION_CALLBACK)(
3690 PVOID Wnode,
3691 PVOID Context);
3692
3693
3694 /*
3695 ** Architecture specific structures
3696 */
3697
3698 #ifdef _X86_
3699
3700 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
3701
3702 #define PASSIVE_LEVEL 0
3703 #define LOW_LEVEL 0
3704 #define APC_LEVEL 1
3705 #define DISPATCH_LEVEL 2
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 #define assert ASSERT
3996
3997
3998 /*
3999 ** Driver support routines
4000 */
4001
4002 /** Runtime library routines **/
4003
4004 /*
4005 * VOID
4006 * InitializeListHead(
4007 * IN PLIST_ENTRY ListHead)
4008 */
4009 #define InitializeListHead(_ListHead) \
4010 { \
4011 (_ListHead)->Flink = (_ListHead); \
4012 (_ListHead)->Blink = (_ListHead); \
4013 }
4014
4015 /*
4016 * VOID
4017 * InsertHeadList(
4018 * IN PLIST_ENTRY ListHead,
4019 * IN PLIST_ENTRY Entry)
4020 */
4021 #define InsertHeadList(_ListHead, \
4022 _Entry) \
4023 { \
4024 PLIST_ENTRY _OldFlink; \
4025 _OldFlink = (_ListHead)->Flink; \
4026 (_Entry)->Flink = _OldFlink; \
4027 (_Entry)->Blink = (_ListHead); \
4028 _OldFlink->Blink = (_Entry); \
4029 (_ListHead)->Flink = (_Entry); \
4030 }
4031
4032 /*
4033 * VOID
4034 * InsertTailList(
4035 * IN PLIST_ENTRY ListHead,
4036 * IN PLIST_ENTRY Entry)
4037 */
4038 #define InsertTailList(_ListHead, \
4039 _Entry) \
4040 { \
4041 PLIST_ENTRY _OldBlink; \
4042 _OldBlink = (_ListHead)->Blink; \
4043 (_Entry)->Flink = (_ListHead); \
4044 (_Entry)->Blink = _OldBlink; \
4045 _OldBlink->Flink = (_Entry); \
4046 (_ListHead)->Blink = (_Entry); \
4047 }
4048
4049 /*
4050 * BOOLEAN
4051 * IsListEmpty(
4052 * IN PLIST_ENTRY ListHead)
4053 */
4054 #define IsListEmpty(_ListHead) \
4055 ((_ListHead)->Flink == (_ListHead))
4056
4057 static __inline PSINGLE_LIST_ENTRY
4058 PopEntryList(
4059 IN PSINGLE_LIST_ENTRY ListHead)
4060 {
4061 PSINGLE_LIST_ENTRY Entry;
4062
4063 Entry = ListHead->Next;
4064 if (Entry != NULL)
4065 {
4066 ListHead->Next = Entry->Next;
4067 }
4068 return Entry;
4069 }
4070
4071 /*
4072 * VOID
4073 * PushEntryList(
4074 * IN PSINGLE_LIST_ENTRY ListHead,
4075 * IN PSINGLE_LIST_ENTRY Entry)
4076 */
4077 #define PushEntryList(_ListHead, \
4078 _Entry) \
4079 { \
4080 (_Entry)->Next = (_ListHead)->Next; \
4081 (_ListHead)->Next = (_Entry); \
4082 }
4083
4084 /*
4085 * VOID
4086 * RemoveEntryList(
4087 * IN PLIST_ENTRY Entry)
4088 */
4089 #define RemoveEntryList(_Entry) \
4090 { \
4091 PLIST_ENTRY _OldFlink; \
4092 PLIST_ENTRY _OldBlink; \
4093 _OldFlink = (_Entry)->Flink; \
4094 _OldBlink = (_Entry)->Blink; \
4095 _OldFlink->Blink = _OldBlink; \
4096 _OldBlink->Flink = _OldFlink; \
4097 (_Entry)->Flink = NULL; \
4098 (_Entry)->Blink = NULL; \
4099 }
4100
4101 static __inline PLIST_ENTRY
4102 RemoveHeadList(
4103 IN PLIST_ENTRY ListHead)
4104 {
4105 PLIST_ENTRY OldFlink;
4106 PLIST_ENTRY OldBlink;
4107 PLIST_ENTRY Entry;
4108
4109 Entry = ListHead->Flink;
4110 OldFlink = ListHead->Flink->Flink;
4111 OldBlink = ListHead->Flink->Blink;
4112 OldFlink->Blink = OldBlink;
4113 OldBlink->Flink = OldFlink;
4114
4115 if (Entry != ListHead)
4116 {
4117 Entry->Flink = NULL;
4118 Entry->Blink = NULL;
4119 }
4120
4121 return Entry;
4122 }
4123
4124 static __inline PLIST_ENTRY
4125 RemoveTailList(
4126 IN PLIST_ENTRY ListHead)
4127 {
4128 PLIST_ENTRY OldFlink;
4129 PLIST_ENTRY OldBlink;
4130 PLIST_ENTRY Entry;
4131
4132 Entry = ListHead->Blink;
4133 OldFlink = ListHead->Blink->Flink;
4134 OldBlink = ListHead->Blink->Blink;
4135 OldFlink->Blink = OldBlink;
4136 OldBlink->Flink = OldFlink;
4137
4138 if (Entry != ListHead)
4139 {
4140 Entry->Flink = NULL;
4141 Entry->Blink = NULL;
4142 }
4143
4144 return Entry;
4145 }
4146
4147 NTOSAPI
4148 PSLIST_ENTRY
4149 DDKFASTAPI
4150 InterlockedPopEntrySList(
4151 IN PSLIST_HEADER ListHead);
4152
4153 NTOSAPI
4154 PSLIST_ENTRY
4155 DDKFASTAPI
4156 InterlockedPushEntrySList(
4157 IN PSLIST_HEADER ListHead,
4158 IN PSLIST_ENTRY ListEntry);
4159
4160 /*
4161 * USHORT
4162 * QueryDepthSList(
4163 * IN PSLIST_HEADER SListHead)
4164 */
4165 #define QueryDepthSList(_SListHead) \
4166 ((USHORT) ((_SListHead)->Alignment & 0xffff))
4167
4168 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
4169
4170 NTOSAPI
4171 ULONG
4172 DDKAPI
4173 RtlAnsiStringToUnicodeSize(
4174 IN PANSI_STRING AnsiString);
4175
4176 NTOSAPI
4177 NTSTATUS
4178 DDKAPI
4179 RtlAddRange(
4180 IN OUT PRTL_RANGE_LIST RangeList,
4181 IN ULONGLONG Start,
4182 IN ULONGLONG End,
4183 IN UCHAR Attributes,
4184 IN ULONG Flags,
4185 IN PVOID UserData OPTIONAL,
4186 IN PVOID Owner OPTIONAL);
4187
4188 NTOSAPI
4189 NTSTATUS
4190 DDKAPI
4191 RtlAnsiStringToUnicodeString(
4192 IN OUT PUNICODE_STRING DestinationString,
4193 IN PANSI_STRING SourceString,
4194 IN BOOLEAN AllocateDestinationString);
4195
4196 NTOSAPI
4197 NTSTATUS
4198 DDKAPI
4199 RtlAppendUnicodeStringToString(
4200 IN OUT PUNICODE_STRING Destination,
4201 IN PUNICODE_STRING Source);
4202
4203 NTOSAPI
4204 NTSTATUS
4205 DDKAPI
4206 RtlAppendUnicodeToString(
4207 IN OUT PUNICODE_STRING Destination,
4208 IN PCWSTR Source);
4209
4210 NTOSAPI
4211 BOOLEAN
4212 DDKAPI
4213 RtlAreBitsClear(
4214 IN PRTL_BITMAP BitMapHeader,
4215 IN ULONG StartingIndex,
4216 IN ULONG Length);
4217
4218 NTOSAPI
4219 BOOLEAN
4220 DDKAPI
4221 RtlAreBitsSet(
4222 IN PRTL_BITMAP BitMapHeader,
4223 IN ULONG StartingIndex,
4224 IN ULONG Length);
4225
4226 NTOSAPI
4227 NTSTATUS
4228 DDKAPI
4229 RtlCharToInteger(
4230 IN PCSZ String,
4231 IN ULONG Base OPTIONAL,
4232 IN OUT PULONG Value);
4233
4234 NTOSAPI
4235 ULONG
4236 DDKAPI
4237 RtlCheckBit(
4238 IN PRTL_BITMAP BitMapHeader,
4239 IN ULONG BitPosition);
4240
4241 NTOSAPI
4242 NTSTATUS
4243 DDKAPI
4244 RtlCheckRegistryKey(
4245 IN ULONG RelativeTo,
4246 IN PWSTR Path);
4247
4248 NTOSAPI
4249 VOID
4250 DDKAPI
4251 RtlClearAllBits(
4252 IN PRTL_BITMAP BitMapHeader);
4253
4254 NTOSAPI
4255 VOID
4256 DDKAPI
4257 RtlClearBit(
4258 PRTL_BITMAP BitMapHeader,
4259 ULONG BitNumber);
4260
4261 NTOSAPI
4262 VOID
4263 DDKAPI
4264 RtlClearBits(
4265 IN PRTL_BITMAP BitMapHeader,
4266 IN ULONG StartingIndex,
4267 IN ULONG NumberToClear);
4268
4269 NTOSAPI
4270 SIZE_T
4271 DDKAPI
4272 RtlCompareMemory(
4273 IN CONST VOID *Source1,
4274 IN CONST VOID *Source2,
4275 IN SIZE_T Length);
4276
4277 NTOSAPI
4278 LONG
4279 DDKAPI
4280 RtlCompareString(
4281 IN PSTRING String1,
4282 IN PSTRING String2,
4283 BOOLEAN CaseInSensitive);
4284
4285 NTOSAPI
4286 LONG
4287 DDKAPI
4288 RtlCompareUnicodeString(
4289 IN PUNICODE_STRING String1,
4290 IN PUNICODE_STRING String2,
4291 IN BOOLEAN CaseInSensitive);
4292
4293 NTOSAPI
4294 LARGE_INTEGER
4295 DDKAPI
4296 RtlConvertLongToLargeInteger(
4297 IN LONG SignedInteger);
4298
4299 NTOSAPI
4300 LUID
4301 DDKAPI
4302 RtlConvertLongToLuid(
4303 IN LONG Long);
4304
4305 NTOSAPI
4306 LARGE_INTEGER
4307 DDKAPI
4308 RtlConvertUlongToLargeInteger(
4309 IN ULONG UnsignedInteger);
4310
4311 NTOSAPI
4312 LUID
4313 DDKAPI
4314 RtlConvertUlongToLuid(
4315 ULONG Ulong);
4316
4317 /*
4318 * VOID
4319 * RtlCopyMemory(
4320 * IN VOID UNALIGNED *Destination,
4321 * IN CONST VOID UNALIGNED *Source,
4322 * IN SIZE_T Length)
4323 */
4324 #ifndef RtlCopyMemory
4325 #define RtlCopyMemory(Destination, Source, Length) \
4326 memcpy(Destination, Source, Length);
4327 #endif
4328
4329 #ifndef RtlCopyBytes
4330 #define RtlCopyBytes RtlCopyMemory
4331 #endif
4332
4333 NTOSAPI
4334 VOID
4335 DDKAPI
4336 RtlCopyMemory32(
4337 IN VOID UNALIGNED *Destination,
4338 IN CONST VOID UNALIGNED *Source,
4339 IN ULONG Length);
4340
4341 NTOSAPI
4342 NTSTATUS
4343 DDKAPI
4344 RtlCopyRangeList(
4345 OUT PRTL_RANGE_LIST CopyRangeList,
4346 IN PRTL_RANGE_LIST RangeList);
4347
4348 NTOSAPI
4349 VOID
4350 DDKAPI
4351 RtlCopyString(
4352 IN OUT PSTRING DestinationString,
4353 IN PSTRING SourceString OPTIONAL);
4354
4355 NTOSAPI
4356 VOID
4357 DDKAPI
4358 RtlCopyUnicodeString(
4359 IN OUT PUNICODE_STRING DestinationString,
4360 IN PUNICODE_STRING SourceString);
4361
4362 NTOSAPI
4363 NTSTATUS
4364 DDKAPI
4365 RtlCreateRegistryKey(
4366 IN ULONG RelativeTo,
4367 IN PWSTR Path);
4368
4369 NTOSAPI
4370 NTSTATUS
4371 DDKAPI
4372 RtlCreateSecurityDescriptor(
4373 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4374 IN ULONG Revision);
4375
4376 NTOSAPI
4377 NTSTATUS
4378 DDKAPI
4379 RtlDeleteOwnersRanges(
4380 IN OUT PRTL_RANGE_LIST RangeList,
4381 IN PVOID Owner);
4382
4383 NTOSAPI
4384 NTSTATUS
4385 DDKAPI
4386 RtlDeleteRange(
4387 IN OUT PRTL_RANGE_LIST RangeList,
4388 IN ULONGLONG Start,
4389 IN ULONGLONG End,
4390 IN PVOID Owner);
4391
4392 NTOSAPI
4393 NTSTATUS
4394 DDKAPI
4395 RtlDeleteRegistryValue(
4396 IN ULONG RelativeTo,
4397 IN PCWSTR Path,
4398 IN PCWSTR ValueName);
4399
4400 /*
4401 * BOOLEAN
4402 * RtlEqualLuid(
4403 * IN LUID Luid1,
4404 * IN LUID Luid2)
4405 */
4406 #define RtlEqualLuid(_Luid1, \
4407 _Luid2) \
4408 ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
4409
4410 /*
4411 * ULONG
4412 * RtlEqualMemory(
4413 * IN VOID UNALIGNED *Destination,
4414 * IN CONST VOID UNALIGNED *Source,
4415 * IN SIZE_T Length)
4416 */
4417 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
4418
4419 NTOSAPI
4420 BOOLEAN
4421 DDKAPI
4422 RtlEqualString(
4423 IN PSTRING String1,
4424 IN PSTRING String2,
4425 IN BOOLEAN CaseInSensitive);
4426
4427 NTOSAPI
4428 BOOLEAN
4429 DDKAPI
4430 RtlEqualUnicodeString(
4431 IN CONST UNICODE_STRING *String1,
4432 IN CONST UNICODE_STRING *String2,
4433 IN BOOLEAN CaseInSensitive);
4434
4435 /*
4436 * VOID
4437 * RtlFillMemory(
4438 * IN VOID UNALIGNED *Destination,
4439 * IN SIZE_T Length,
4440 * IN UCHAR Fill)
4441 */
4442 #ifndef RtlFillMemory
4443 #define RtlFillMemory(Destination, Length, Fill) \
4444 memset(Destination, Fill, Length)
4445 #endif
4446
4447 #ifndef RtlFillBytes
4448 #define RtlFillBytes RtlFillMemory
4449 #endif
4450
4451 NTOSAPI
4452 ULONG
4453 DDKAPI
4454 RtlFindClearBits(
4455 IN PRTL_BITMAP BitMapHeader,
4456 IN ULONG NumberToFind,
4457 IN ULONG HintIndex);
4458
4459 NTOSAPI
4460 ULONG
4461 DDKAPI
4462 RtlFindClearBitsAndSet(
4463 IN PRTL_BITMAP BitMapHeader,
4464 IN ULONG NumberToFind,
4465 IN ULONG HintIndex);
4466
4467 NTOSAPI
4468 ULONG
4469 DDKAPI
4470 RtlFindClearRuns(
4471 IN PRTL_BITMAP BitMapHeader,
4472 OUT PRTL_BITMAP_RUN RunArray,
4473 IN ULONG SizeOfRunArray,
4474 IN BOOLEAN LocateLongestRuns);
4475
4476 NTOSAPI
4477 ULONG
4478 DDKAPI
4479 RtlFindFirstRunClear(
4480 IN PRTL_BITMAP BitMapHeader,
4481 OUT PULONG StartingIndex);
4482
4483 NTOSAPI
4484 ULONG
4485 DDKAPI
4486 RtlFindLastBackwardRunClear(
4487 IN PRTL_BITMAP BitMapHeader,
4488 IN ULONG FromIndex,
4489 OUT PULONG StartingRunIndex);
4490
4491 NTOSAPI
4492 CCHAR
4493 DDKAPI
4494 RtlFindLeastSignificantBit(
4495 IN ULONGLONG Set);
4496
4497 NTOSAPI
4498 ULONG
4499 DDKAPI
4500 RtlFindLongestRunClear(
4501 IN PRTL_BITMAP BitMapHeader,
4502 OUT PULONG StartingIndex);
4503
4504 NTOSAPI
4505 CCHAR
4506 DDKAPI
4507 RtlFindMostSignificantBit(
4508 IN ULONGLONG Set);
4509
4510 NTOSAPI
4511 ULONG
4512 DDKAPI
4513 RtlFindNextForwardRunClear(
4514 IN PRTL_BITMAP BitMapHeader,
4515 IN ULONG FromIndex,
4516 OUT PULONG StartingRunIndex);
4517
4518 NTOSAPI
4519 NTSTATUS
4520 DDKAPI
4521 RtlFindRange(
4522 IN PRTL_RANGE_LIST RangeList,
4523 IN ULONGLONG Minimum,
4524 IN ULONGLONG Maximum,
4525 IN ULONG Length,
4526 IN ULONG Alignment,
4527 IN ULONG Flags,
4528 IN UCHAR AttributeAvailableMask,
4529 IN PVOID Context OPTIONAL,
4530 IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
4531 OUT PULONGLONG Start);
4532
4533 NTOSAPI
4534 ULONG
4535 DDKAPI
4536 RtlFindSetBits(
4537 IN PRTL_BITMAP BitMapHeader,
4538 IN ULONG NumberToFind,
4539 IN ULONG HintIndex);
4540
4541 NTOSAPI
4542 ULONG
4543 DDKAPI
4544 RtlFindSetBitsAndClear(
4545 IN PRTL_BITMAP BitMapHeader,
4546 IN ULONG NumberToFind,
4547 IN ULONG HintIndex);
4548
4549 NTOSAPI
4550 VOID
4551 DDKAPI
4552 RtlFreeAnsiString(
4553 IN PANSI_STRING AnsiString);
4554
4555 NTOSAPI
4556 VOID
4557 DDKAPI
4558 RtlFreeRangeList(
4559 IN PRTL_RANGE_LIST RangeList);
4560
4561 NTOSAPI
4562 VOID
4563 DDKAPI
4564 RtlFreeUnicodeString(
4565 IN PUNICODE_STRING UnicodeString);
4566
4567 NTOSAPI
4568 VOID
4569 DDKAPI
4570 RtlGetCallersAddress(
4571 OUT PVOID *CallersAddress,
4572 OUT PVOID *CallersCaller);
4573
4574 NTOSAPI
4575 NTSTATUS
4576 DDKAPI
4577 RtlGetVersion(
4578 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
4579
4580 NTOSAPI
4581 NTSTATUS
4582 DDKAPI
4583 RtlGetFirstRange(
4584 IN PRTL_RANGE_LIST RangeList,
4585 OUT PRTL_RANGE_LIST_ITERATOR Iterator,
4586 OUT PRTL_RANGE *Range);
4587
4588 NTOSAPI
4589 NTSTATUS
4590 DDKAPI
4591 RtlGetNextRange(
4592 IN OUT PRTL_RANGE_LIST_ITERATOR Iterator,
4593 OUT PRTL_RANGE *Range,
4594 IN BOOLEAN MoveForwards);
4595
4596 #define FOR_ALL_RANGES(RangeList, Iterator, Current) \
4597 for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
4598 (Current) != NULL; \
4599 RtlGetNextRange((Iterator), &(Current), TRUE))
4600
4601 #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
4602 for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \
4603 (Current) != NULL; \
4604 RtlGetNextRange((Iterator), &(Current), FALSE))
4605
4606 NTOSAPI
4607 NTSTATUS
4608 DDKAPI
4609 RtlGUIDFromString(
4610 IN PUNICODE_STRING GuidString,
4611 OUT GUID *Guid);
4612
4613 NTOSAPI
4614 NTSTATUS
4615 DDKAPI
4616 RtlHashUnicodeString(
4617 IN CONST UNICODE_STRING *String,
4618 IN BOOLEAN CaseInSensitive,
4619 IN ULONG HashAlgorithm,
4620 OUT PULONG HashValue);
4621
4622 NTOSAPI
4623 VOID
4624 DDKAPI
4625 RtlInitAnsiString(
4626 IN OUT PANSI_STRING DestinationString,
4627 IN PCSZ SourceString);
4628
4629 NTOSAPI
4630 VOID
4631 DDKAPI
4632 RtlInitializeBitMap(
4633 IN PRTL_BITMAP BitMapHeader,
4634 IN PULONG BitMapBuffer,
4635 IN ULONG SizeOfBitMap);
4636
4637 NTOSAPI
4638 VOID
4639 DDKAPI
4640 RtlInitializeRangeList(
4641 IN OUT PRTL_RANGE_LIST RangeList);
4642
4643 NTOSAPI
4644 VOID
4645 DDKAPI
4646 RtlInitString(
4647 IN OUT PSTRING DestinationString,
4648 IN PCSZ SourceString);
4649
4650 NTOSAPI
4651 VOID
4652 DDKAPI
4653 RtlInitUnicodeString(
4654 IN OUT PUNICODE_STRING DestinationString,
4655 IN PCWSTR SourceString);
4656
4657 NTOSAPI
4658 NTSTATUS
4659 DDKAPI
4660 RtlInt64ToUnicodeString(
4661 IN ULONGLONG Value,
4662 IN ULONG Base OPTIONAL,
4663 IN OUT PUNICODE_STRING String);
4664
4665 NTOSAPI
4666 NTSTATUS
4667 DDKAPI
4668 RtlIntegerToUnicodeString(
4669 IN ULONG Value,
4670 IN ULONG Base OPTIONAL,
4671 IN OUT PUNICODE_STRING String);
4672
4673 NTOSAPI
4674 NTSTATUS
4675 DDKAPI
4676 RtlIntPtrToUnicodeString(
4677 PLONG Value,
4678 ULONG Base OPTIONAL,
4679 PUNICODE_STRING String);
4680
4681 NTOSAPI
4682 NTSTATUS
4683 DDKAPI
4684 RtlInvertRangeList(
4685 OUT PRTL_RANGE_LIST InvertedRangeList,
4686 IN PRTL_RANGE_LIST RangeList);
4687
4688 NTOSAPI
4689 NTSTATUS
4690 DDKAPI
4691 RtlIsRangeAvailable(
4692 IN PRTL_RANGE_LIST RangeList,
4693 IN ULONGLONG Start,
4694 IN ULONGLONG End,
4695 IN ULONG Flags,
4696 IN UCHAR AttributeAvailableMask,
4697 IN PVOID Context OPTIONAL,
4698 IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
4699 OUT PBOOLEAN Available);
4700
4701 /*
4702 * BOOLEAN
4703 * RtlIsZeroLuid(
4704 * IN PLUID L1)
4705 */
4706 #define RtlIsZeroLuid(_L1) \
4707 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
4708
4709 NTOSAPI
4710 ULONG
4711 DDKAPI
4712 RtlLengthSecurityDescriptor(
4713 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
4714
4715 NTOSAPI
4716 VOID
4717 DDKAPI
4718 RtlMapGenericMask(
4719 IN OUT PACCESS_MASK AccessMask,
4720 IN PGENERIC_MAPPING GenericMapping);
4721
4722 NTOSAPI
4723 NTSTATUS
4724 DDKAPI
4725 RtlMergeRangeLists(
4726 OUT PRTL_RANGE_LIST MergedRangeList,
4727 IN PRTL_RANGE_LIST RangeList1,
4728 IN PRTL_RANGE_LIST RangeList2,
4729 IN ULONG Flags);
4730
4731 /*
4732 * VOID
4733 * RtlMoveMemory(
4734 * IN VOID UNALIGNED *Destination,
4735 * IN CONST VOID UNALIGNED *Source,
4736 * IN SIZE_T Length)
4737 */
4738 #define RtlMoveMemory memmove
4739
4740 NTOSAPI
4741 ULONG
4742 DDKAPI
4743 RtlNumberOfClearBits(
4744 IN PRTL_BITMAP BitMapHeader);
4745
4746 NTOSAPI
4747 ULONG
4748 DDKAPI
4749 RtlNumberOfSetBits(
4750 IN PRTL_BITMAP BitMapHeader);
4751
4752 NTOSAPI
4753 VOID
4754 DDKFASTAPI
4755 RtlPrefetchMemoryNonTemporal(
4756 IN PVOID Source,
4757 IN SIZE_T Length);
4758
4759 NTOSAPI
4760 BOOLEAN
4761 DDKAPI
4762 RtlPrefixUnicodeString(
4763 IN PUNICODE_STRING String1,
4764 IN PUNICODE_STRING String2,
4765 IN BOOLEAN CaseInSensitive);
4766
4767 NTOSAPI
4768 NTSTATUS
4769 DDKAPI
4770 RtlQueryRegistryValues(
4771 IN ULONG RelativeTo,
4772 IN PCWSTR Path,
4773 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
4774 IN PVOID Context,
4775 IN PVOID Environment OPTIONAL);
4776
4777 NTOSAPI
4778 VOID
4779 DDKAPI
4780 RtlRetrieveUlong(
4781 IN OUT PULONG DestinationAddress,
4782 IN PULONG SourceAddress);
4783
4784 NTOSAPI
4785 VOID
4786 DDKAPI
4787 RtlRetrieveUshort(
4788 IN OUT PUSHORT DestinationAddress,
4789 IN PUSHORT SourceAddress);
4790
4791 NTOSAPI
4792 VOID
4793 DDKAPI
4794 RtlSetAllBits(
4795 IN PRTL_BITMAP BitMapHeader);
4796
4797 NTOSAPI
4798 VOID
4799 DDKAPI
4800 RtlSetBit(
4801 PRTL_BITMAP BitMapHeader,
4802 ULONG BitNumber);
4803
4804 NTOSAPI
4805 VOID
4806 DDKAPI
4807 RtlSetBits(
4808 IN PRTL_BITMAP BitMapHeader,
4809 IN ULONG StartingIndex,
4810 IN ULONG NumberToSet);
4811
4812 NTOSAPI
4813 NTSTATUS
4814 DDKAPI
4815 RtlSetDaclSecurityDescriptor(
4816 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4817 IN BOOLEAN DaclPresent,
4818 IN PACL Dacl OPTIONAL,
4819 IN BOOLEAN DaclDefaulted OPTIONAL);
4820
4821 NTOSAPI
4822 VOID
4823 DDKAPI
4824 RtlStoreUlong(
4825 IN PULONG Address,
4826 IN ULONG Value);
4827
4828 NTOSAPI
4829 VOID
4830 DDKAPI
4831 RtlStoreUlonglong(
4832 IN OUT PULONGLONG Address,
4833 ULONGLONG Value);
4834
4835 NTOSAPI
4836 VOID
4837 DDKAPI
4838 RtlStoreUlongPtr(
4839 IN OUT PULONG_PTR Address,
4840 IN ULONG_PTR Value);
4841
4842 NTOSAPI
4843 VOID
4844 DDKAPI
4845 RtlStoreUshort(
4846 IN PUSHORT Address,
4847 IN USHORT Value);
4848
4849 NTOSAPI
4850 NTSTATUS
4851 DDKAPI
4852 RtlStringFromGUID(
4853 IN REFGUID Guid,
4854 OUT PUNICODE_STRING GuidString);
4855
4856 NTOSAPI
4857 BOOLEAN
4858 DDKAPI
4859 RtlTestBit(
4860 IN PRTL_BITMAP BitMapHeader,
4861 IN ULONG BitNumber);
4862
4863 NTOSAPI
4864 BOOLEAN
4865 DDKAPI
4866 RtlTimeFieldsToTime(
4867 IN PTIME_FIELDS TimeFields,
4868 IN PLARGE_INTEGER Time);
4869
4870 NTOSAPI
4871 VOID
4872 DDKAPI
4873 RtlTimeToTimeFields(
4874 IN PLARGE_INTEGER Time,
4875 IN PTIME_FIELDS TimeFields);
4876
4877 NTOSAPI
4878 ULONG
4879 DDKFASTAPI
4880 RtlUlongByteSwap(
4881 IN ULONG Source);
4882
4883 NTOSAPI
4884 ULONGLONG
4885 DDKFASTAPI
4886 RtlUlonglongByteSwap(
4887 IN ULONGLONG Source);
4888
4889 NTOSAPI
4890 ULONG
4891 DDKAPI
4892 RtlUnicodeStringToAnsiSize(
4893 IN PUNICODE_STRING UnicodeString);
4894
4895 NTOSAPI
4896 NTSTATUS
4897 DDKAPI
4898 RtlUnicodeStringToAnsiString(
4899 IN OUT PANSI_STRING DestinationString,
4900 IN PUNICODE_STRING SourceString,
4901 IN BOOLEAN AllocateDestinationString);
4902
4903 NTOSAPI
4904 NTSTATUS
4905 DDKAPI
4906 RtlUnicodeStringToInteger(
4907 IN PUNICODE_STRING String,
4908 IN ULONG Base OPTIONAL,
4909 OUT PULONG Value);
4910
4911 NTOSAPI
4912 WCHAR
4913 DDKAPI
4914 RtlUpcaseUnicodeChar(
4915 IN WCHAR SourceCharacter);
4916
4917 NTOSAPI
4918 NTSTATUS
4919 DDKAPI
4920 RtlUpcaseUnicodeString(
4921 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
4922 IN PCUNICODE_STRING SourceString,
4923 IN BOOLEAN AllocateDestinationString);
4924
4925 NTOSAPI
4926 CHAR
4927 DDKAPI
4928 RtlUpperChar(
4929 IN CHAR Character);
4930
4931 NTOSAPI
4932 VOID
4933 DDKAPI
4934 RtlUpperString(
4935 IN OUT PSTRING DestinationString,
4936 IN PSTRING SourceString);
4937
4938 NTOSAPI
4939 USHORT
4940 DDKFASTAPI
4941 RtlUshortByteSwap(
4942 IN USHORT Source);
4943
4944 NTOSAPI
4945 BOOLEAN
4946 DDKAPI
4947 RtlValidRelativeSecurityDescriptor(
4948 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
4949 IN ULONG SecurityDescriptorLength,
4950 IN SECURITY_INFORMATION RequiredInformation);
4951
4952 NTOSAPI
4953 BOOLEAN
4954 DDKAPI
4955 RtlValidSecurityDescriptor(
4956 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
4957
4958 NTOSAPI
4959 NTSTATUS
4960 DDKAPI
4961 RtlVerifyVersionInfo(
4962 IN PRTL_OSVERSIONINFOEXW VersionInfo,
4963 IN ULONG TypeMask,
4964 IN ULONGLONG ConditionMask);
4965
4966 NTOSAPI
4967 NTSTATUS
4968 DDKAPI
4969 RtlVolumeDeviceToDosName(
4970 IN PVOID VolumeDeviceObject,
4971 OUT PUNICODE_STRING DosName);
4972
4973 NTOSAPI
4974 ULONG
4975 DDKAPI
4976 RtlWalkFrameChain(
4977 OUT PVOID *Callers,
4978 IN ULONG Count,
4979 IN ULONG Flags);
4980
4981 NTOSAPI
4982 NTSTATUS
4983 DDKAPI
4984 RtlWriteRegistryValue(
4985 IN ULONG RelativeTo,
4986 IN PCWSTR Path,
4987 IN PCWSTR ValueName,
4988 IN ULONG ValueType,
4989 IN PVOID ValueData,
4990 IN ULONG ValueLength);
4991
4992 NTOSAPI
4993 ULONG
4994 DDKAPI
4995 RtlxUnicodeStringToAnsiSize(
4996 IN PUNICODE_STRING UnicodeString);
4997
4998 /*
4999 * VOID
5000 * RtlZeroMemory(
5001 * IN VOID UNALIGNED *Destination,
5002 * IN SIZE_T Length)
5003 */
5004 #ifndef RtlZeroMemory
5005 #define RtlZeroMemory(Destination, Length) \
5006 memset(Destination, 0, Length)
5007 #endif
5008
5009 #ifndef RtlZeroBytes
5010 #define RtlZeroBytes RtlZeroMemory
5011 #endif
5012
5013
5014 /** Executive support routines **/
5015
5016 NTOSAPI
5017 VOID
5018 DDKFASTAPI
5019 ExAcquireFastMutex(
5020 IN PFAST_MUTEX FastMutex);
5021
5022 NTOSAPI
5023 VOID
5024 DDKFASTAPI
5025 ExAcquireFastMutexUnsafe(
5026 IN PFAST_MUTEX FastMutex);
5027
5028 NTOSAPI
5029 BOOLEAN
5030 DDKAPI
5031 ExAcquireResourceExclusiveLite(
5032 IN PERESOURCE Resource,
5033 IN BOOLEAN Wait);
5034
5035 NTOSAPI
5036 BOOLEAN
5037 DDKAPI
5038 ExAcquireResourceSharedLite(
5039 IN PERESOURCE Resource,
5040 IN BOOLEAN Wait);
5041
5042 NTOSAPI
5043 BOOLEAN
5044 DDKAPI
5045 ExAcquireSharedStarveExclusive(
5046 IN PERESOURCE Resource,
5047 IN BOOLEAN Wait);
5048
5049 NTOSAPI
5050 BOOLEAN
5051 DDKAPI
5052 ExAcquireSharedWaitForExclusive(
5053 IN PERESOURCE Resource,
5054 IN BOOLEAN Wait);
5055
5056 static __inline PVOID
5057 ExAllocateFromNPagedLookasideList(
5058 IN PNPAGED_LOOKASIDE_LIST Lookaside)
5059 {
5060 PVOID Entry;
5061
5062 Lookaside->TotalAllocates++;
5063 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
5064 if (Entry == NULL) {
5065 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5066 Entry = (Lookaside->Allocate)(Lookaside->Type, Lookaside->Size, Lookaside->Tag);
5067 }
5068 return Entry;
5069 }
5070
5071 static __inline PVOID
5072 ExAllocateFromPagedLookasideList(
5073 IN PPAGED_LOOKASIDE_LIST Lookaside)
5074 {
5075 PVOID Entry;
5076
5077 Lookaside->TotalAllocates++;
5078 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
5079 if (Entry == NULL) {
5080 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5081 Entry = (Lookaside->Allocate)(Lookaside->Type,
5082 Lookaside->Size, Lookaside->Tag);
5083 }
5084 return Entry;
5085 }
5086
5087 NTOSAPI
5088 PVOID
5089 DDKAPI
5090 ExAllocatePoolWithQuotaTag(
5091 IN POOL_TYPE PoolType,
5092 IN SIZE_T NumberOfBytes,
5093 IN ULONG Tag);
5094
5095 NTOSAPI
5096 PVOID
5097 DDKAPI
5098 ExAllocatePoolWithTag(
5099 IN POOL_TYPE PoolType,
5100 IN SIZE_T NumberOfBytes,
5101 IN ULONG Tag);
5102
5103 #ifdef POOL_TAGGING
5104
5105 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
5106 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
5107
5108 #else /* !POOL_TAGGING */
5109
5110 NTOSAPI
5111 PVOID
5112 DDKAPI
5113 ExAllocatePool(
5114 IN POOL_TYPE PoolType,
5115 IN SIZE_T NumberOfBytes);
5116
5117 NTOSAPI
5118 PVOID
5119 DDKAPI
5120 ExAllocatePoolWithQuota(
5121 IN POOL_TYPE PoolType,
5122 IN SIZE_T NumberOfBytes);
5123
5124 #endif /* POOL_TAGGING */
5125
5126 NTOSAPI
5127 PVOID
5128 DDKAPI
5129 ExAllocatePoolWithTagPriority(
5130 IN POOL_TYPE PoolType,
5131 IN SIZE_T NumberOfBytes,
5132 IN ULONG Tag,
5133 IN EX_POOL_PRIORITY Priority);
5134
5135 NTOSAPI
5136 VOID
5137 DDKAPI
5138 ExConvertExclusiveToSharedLite(
5139 IN PERESOURCE Resource);
5140
5141 NTOSAPI
5142 NTSTATUS
5143 DDKAPI
5144 ExCreateCallback(
5145 OUT PCALLBACK_OBJECT *CallbackObject,
5146 IN POBJECT_ATTRIBUTES ObjectAttributes,
5147 IN BOOLEAN Create,
5148 IN BOOLEAN AllowMultipleCallbacks);
5149
5150 NTOSAPI
5151 VOID
5152 DDKAPI
5153 ExDeleteNPagedLookasideList(
5154 IN PNPAGED_LOOKASIDE_LIST Lookaside);
5155
5156 NTOSAPI
5157 VOID
5158 DDKAPI
5159 ExDeletePagedLookasideList(
5160 IN PPAGED_LOOKASIDE_LIST Lookaside);
5161
5162 NTOSAPI
5163 NTSTATUS
5164 DDKAPI
5165 ExDeleteResourceLite(
5166 IN PERESOURCE Resource);
5167
5168 NTOSAPI
5169 VOID
5170 DDKAPI
5171 ExFreePool(
5172 IN PVOID P);
5173
5174 #define PROTECTED_POOL 0x80000000
5175
5176 #ifdef POOL_TAGGING
5177 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
5178 #endif
5179
5180 NTOSAPI
5181 VOID
5182 DDKAPI
5183 ExFreePoolWithTag(
5184 IN PVOID P,
5185 IN ULONG Tag);
5186
5187 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
5188
5189 static __inline VOID
5190 ExFreeToNPagedLookasideList(
5191 IN PNPAGED_LOOKASIDE_LIST Lookaside,
5192 IN PVOID Entry)
5193 {
5194 Lookaside->TotalFrees++;
5195 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5196 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5197 (Lookaside->Free)(Entry);
5198 } else {
5199 InterlockedPushEntrySList(&Lookaside->ListHead,
5200 (PSLIST_ENTRY)Entry);
5201 }
5202 }
5203
5204 static __inline VOID
5205 ExFreeToPagedLookasideList(
5206 IN PPAGED_LOOKASIDE_LIST Lookaside,
5207 IN PVOID Entry)
5208 {
5209 Lookaside->TotalFrees++;
5210 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5211 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5212 (Lookaside->Free)(Entry);
5213 } else {
5214 InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry);
5215 }
5216 }
5217
5218 /*
5219 * ERESOURCE_THREAD
5220 * ExGetCurrentResourceThread(
5221 * VOID);
5222 */
5223 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
5224
5225 NTOSAPI
5226 ULONG
5227 DDKAPI
5228 ExGetExclusiveWaiterCount(
5229 IN PERESOURCE Resource);
5230
5231 NTOSAPI
5232 KPROCESSOR_MODE
5233 DDKAPI
5234 ExGetPreviousMode(
5235 VOID);
5236
5237 NTOSAPI
5238 ULONG
5239 DDKAPI
5240 ExGetSharedWaiterCount(
5241 IN PERESOURCE Resource);
5242
5243 NTOSAPI
5244 VOID
5245 DDKAPI
5246 KeInitializeEvent(
5247 IN PRKEVENT Event,
5248 IN EVENT_TYPE Type,
5249 IN BOOLEAN State);
5250
5251 /*
5252 * VOID DDKAPI
5253 * ExInitializeFastMutex(
5254 * IN PFAST_MUTEX FastMutex)
5255 */
5256 #define ExInitializeFastMutex(_FastMutex) \
5257 { \
5258 (_FastMutex)->Count = 1; \
5259 (_FastMutex)->Owner = NULL; \
5260 (_FastMutex)->Contention = 0; \
5261 KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
5262 }
5263
5264 NTOSAPI
5265 VOID
5266 DDKAPI
5267 ExInitializeNPagedLookasideList(
5268 IN PNPAGED_LOOKASIDE_LIST Lookaside,
5269 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
5270 IN PFREE_FUNCTION Free OPTIONAL,
5271 IN ULONG Flags,
5272 IN SIZE_T Size,
5273 IN ULONG Tag,
5274 IN USHORT Depth);
5275
5276 NTOSAPI
5277 VOID
5278 DDKAPI
5279 ExInitializePagedLookasideList(
5280 IN PPAGED_LOOKASIDE_LIST Lookaside,
5281 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
5282 IN PFREE_FUNCTION Free OPTIONAL,
5283 IN ULONG Flags,
5284 IN SIZE_T Size,
5285 IN ULONG Tag,
5286 IN USHORT Depth);
5287
5288 NTOSAPI
5289 NTSTATUS
5290 DDKAPI
5291 ExInitializeResourceLite(
5292 IN PERESOURCE Resource);
5293
5294 /*
5295 * VOID
5296 * InitializeSListHead(
5297 * IN PSLIST_HEADER SListHead)
5298 */
5299 #define InitializeSListHead(_SListHead) \
5300 (_SListHead)->Alignment = 0
5301
5302 #define ExInitializeSListHead InitializeSListHead
5303
5304 NTOSAPI
5305 LARGE_INTEGER
5306 DDKAPI
5307 ExInterlockedAddLargeInteger(
5308 IN PLARGE_INTEGER Addend,
5309 IN LARGE_INTEGER Increment,
5310 IN PKSPIN_LOCK Lock);
5311
5312 NTOSAPI
5313 VOID
5314 DDKFASTAPI
5315 ExInterlockedAddLargeStatistic(
5316 IN PLARGE_INTEGER Addend,
5317 IN ULONG Increment);
5318
5319 NTOSAPI
5320 ULONG
5321 DDKFASTAPI
5322 ExInterlockedAddUlong(
5323 IN PULONG Addend,
5324 IN ULONG Increment,
5325 PKSPIN_LOCK Lock);
5326
5327 NTOSAPI
5328 LONGLONG
5329 DDKFASTAPI
5330 ExInterlockedCompareExchange64(
5331 IN OUT PLONGLONG Destination,
5332 IN PLONGLONG Exchange,
5333 IN PLONGLONG Comparand,
5334 IN PKSPIN_LOCK Lock);
5335
5336 NTOSAPI
5337 PSINGLE_LIST_ENTRY
5338 DDKFASTAPI
5339 ExInterlockedFlushSList(
5340 IN PSLIST_HEADER ListHead);
5341
5342 NTOSAPI
5343 PLIST_ENTRY
5344 DDKFASTAPI
5345 ExInterlockedInsertHeadList(
5346 IN PLIST_ENTRY ListHead,
5347 IN PLIST_ENTRY ListEntry,
5348 IN PKSPIN_LOCK Lock);
5349
5350 NTOSAPI
5351 PLIST_ENTRY
5352 DDKFASTAPI
5353 ExInterlockedInsertTailList(
5354 IN PLIST_ENTRY ListHead,
5355 IN PLIST_ENTRY ListEntry,
5356 IN PKSPIN_LOCK Lock);
5357
5358 NTOSAPI
5359 PSINGLE_LIST_ENTRY
5360 DDKFASTAPI
5361 ExInterlockedPopEntryList(
5362 IN PSINGLE_LIST_ENTRY ListHead,
5363 IN PKSPIN_LOCK Lock);
5364
5365 /*
5366 * PSINGLE_LIST_ENTRY
5367 * ExInterlockedPopEntrySList(
5368 * IN PSLIST_HEADER ListHead,
5369 * IN PKSPIN_LOCK Lock)
5370 */
5371 #define ExInterlockedPopEntrySList(_ListHead, \
5372 _Lock) \
5373 InterlockedPopEntrySList(_ListHead)
5374
5375 NTOSAPI
5376 PSINGLE_LIST_ENTRY
5377 DDKFASTAPI
5378 ExInterlockedPushEntryList(
5379 IN PSINGLE_LIST_ENTRY ListHead,
5380 IN PSINGLE_LIST_ENTRY ListEntry,
5381 IN PKSPIN_LOCK Lock);
5382
5383 /*
5384 * PSINGLE_LIST_ENTRY FASTCALL
5385 * ExInterlockedPushEntrySList(
5386 * IN PSLIST_HEADER ListHead,
5387 * IN PSINGLE_LIST_ENTRY ListEntry,
5388 * IN PKSPIN_LOCK Lock)
5389 */
5390 #define ExInterlockedPushEntrySList(_ListHead, \
5391 _ListEntry, \
5392 _Lock) \
5393 InterlockedPushEntrySList(_ListHead, _ListEntry)
5394
5395 NTOSAPI
5396 PLIST_ENTRY
5397 DDKFASTAPI
5398 ExInterlockedRemoveHeadList(
5399 IN PLIST_ENTRY ListHead,
5400 IN PKSPIN_LOCK Lock);
5401
5402 NTOSAPI
5403 BOOLEAN
5404 DDKAPI
5405 ExIsProcessorFeaturePresent(
5406 IN ULONG ProcessorFeature);
5407
5408 NTOSAPI
5409 BOOLEAN
5410 DDKAPI
5411 ExIsResourceAcquiredExclusiveLite(
5412 IN PERESOURCE Resource);
5413
5414 NTOSAPI
5415 USHORT
5416 DDKAPI
5417 ExIsResourceAcquiredLite(
5418 IN PERESOURCE Resource);
5419
5420 NTOSAPI
5421 USHORT
5422 DDKAPI
5423 ExIsResourceAcquiredSharedLite(
5424 IN PERESOURCE Resource);
5425
5426 NTOSAPI
5427 VOID
5428 DDKAPI
5429 ExLocalTimeToSystemTime(
5430 IN PLARGE_INTEGER LocalTime,
5431 OUT PLARGE_INTEGER SystemTime);
5432
5433 NTOSAPI
5434 VOID
5435 DDKAPI
5436 ExNotifyCallback(
5437 IN PCALLBACK_OBJECT CallbackObject,
5438 IN PVOID Argument1,
5439 IN PVOID Argument2);
5440
5441 NTOSAPI
5442 VOID
5443 DDKAPI
5444 ExRaiseAccessViolation(
5445 VOID);
5446
5447 NTOSAPI
5448 VOID
5449 DDKAPI
5450 ExRaiseDatatypeMisalignment(
5451 VOID);
5452
5453 NTOSAPI
5454 VOID
5455 DDKAPI
5456 ExRaiseStatus(
5457 IN NTSTATUS Status);
5458
5459 NTOSAPI
5460 PVOID
5461 DDKAPI
5462 ExRegisterCallback(
5463 IN PCALLBACK_OBJECT CallbackObject,
5464 IN PCALLBACK_FUNCTION CallbackFunction,
5465 IN PVOID CallbackContext);
5466
5467 NTOSAPI
5468 VOID
5469 DDKAPI
5470 ExReinitializeResourceLite(
5471 IN PERESOURCE Resource);
5472
5473 NTOSAPI
5474 VOID
5475 DDKFASTAPI
5476 ExReleaseFastMutex(
5477 IN PFAST_MUTEX FastMutex);
5478
5479 NTOSAPI
5480 VOID
5481 DDKFASTAPI
5482 ExReleaseFastMutexUnsafe(
5483 IN PFAST_MUTEX FastMutex);
5484
5485 NTOSAPI
5486 VOID
5487 DDKAPI
5488 ExReleaseResourceForThreadLite(
5489 IN PERESOURCE Resource,
5490 IN ERESOURCE_THREAD ResourceThreadId);
5491
5492 NTOSAPI
5493 VOID
5494 DDKFASTAPI
5495 ExReleaseResourceLite(
5496 IN PERESOURCE Resource);
5497
5498 NTOSAPI
5499 VOID
5500 DDKAPI
5501 ExSetResourceOwnerPointer(
5502 IN PERESOURCE Resource,
5503 IN PVOID OwnerPointer);
5504
5505 NTOSAPI
5506 ULONG
5507 DDKAPI
5508 ExSetTimerResolution(
5509 IN ULONG DesiredTime,
5510 IN BOOLEAN SetResolution);
5511
5512 NTOSAPI
5513 VOID
5514 DDKAPI
5515 ExSystemTimeToLocalTime(
5516 IN PLARGE_INTEGER SystemTime,
5517 OUT PLARGE_INTEGER LocalTime);
5518
5519 NTOSAPI
5520 BOOLEAN
5521 DDKFASTAPI
5522 ExTryToAcquireFastMutex(
5523 IN PFAST_MUTEX FastMutex);
5524
5525 NTOSAPI
5526 BOOLEAN
5527 DDKAPI
5528 ExTryToAcquireResourceExclusiveLite(
5529 IN PERESOURCE Resource);
5530
5531 NTOSAPI
5532 VOID
5533 DDKAPI
5534 ExUnregisterCallback(
5535 IN PVOID CbRegistration);
5536
5537 NTOSAPI
5538 NTSTATUS
5539 DDKAPI
5540 ExUuidCreate(
5541 OUT UUID *Uuid);
5542
5543 NTOSAPI
5544 BOOLEAN
5545 DDKAPI
5546 ExVerifySuite(
5547 IN SUITE_TYPE SuiteType);
5548
5549 #ifdef DBG
5550
5551 #define PAGED_CODE() { \
5552 if (KeGetCurrentIrql() > APC_LEVEL) { \
5553 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
5554 assert(FALSE); \
5555 } \
5556 }
5557
5558 #else
5559
5560 #define PAGED_CODE()
5561
5562 #endif
5563
5564 NTOSAPI
5565 VOID
5566 DDKAPI
5567 ProbeForRead(
5568 IN CONST VOID *Address,
5569 IN ULONG Length,
5570 IN ULONG Alignment);
5571
5572 NTOSAPI
5573 VOID
5574 DDKAPI
5575 ProbeForWrite(
5576 IN CONST VOID *Address,
5577 IN ULONG Length,
5578 IN ULONG Alignment);
5579
5580
5581
5582 /** Configuration manager routines **/
5583
5584 NTOSAPI
5585 NTSTATUS
5586 DDKAPI
5587 CmRegisterCallback(
5588 IN PEX_CALLBACK_FUNCTION Function,
5589 IN PVOID Context,
5590 IN OUT PLARGE_INTEGER Cookie);
5591
5592 NTOSAPI
5593 NTSTATUS
5594 DDKAPI
5595 CmUnRegisterCallback(
5596 IN LARGE_INTEGER Cookie);
5597
5598
5599
5600 /** Filesystem runtime library routines **/
5601
5602 NTOSAPI
5603 BOOLEAN
5604 DDKAPI
5605 FsRtlIsTotalDeviceFailure(
5606 IN NTSTATUS Status);
5607
5608
5609
5610 /** Hardware abstraction layer routines **/
5611
5612 NTOSAPI
5613 VOID
5614 DDKFASTAPI
5615 HalExamineMBR(
5616 IN PDEVICE_OBJECT DeviceObject,
5617 IN ULONG SectorSize,
5618 IN ULONG MBRTypeIdentifier,
5619 OUT PVOID Buffer);
5620
5621 NTOSAPI
5622 VOID
5623 DDKAPI
5624 READ_PORT_BUFFER_UCHAR(
5625 IN PUCHAR Port,
5626 IN PUCHAR Buffer,
5627 IN ULONG Count);
5628
5629 NTOSAPI
5630 VOID
5631 DDKAPI
5632 READ_PORT_BUFFER_ULONG(
5633 IN PULONG Port,
5634 IN PULONG Buffer,
5635 IN ULONG Count);
5636
5637 NTOSAPI
5638 VOID
5639 DDKAPI
5640 READ_PORT_BUFFER_USHORT(
5641 IN PUSHORT Port,
5642 IN PUSHORT Buffer,
5643 IN ULONG Count);
5644
5645 NTOSAPI
5646 UCHAR
5647 DDKAPI
5648 READ_PORT_UCHAR(
5649 IN PUCHAR Port);
5650
5651 NTOSAPI
5652 ULONG
5653 DDKAPI
5654 READ_PORT_ULONG(
5655 IN PULONG Port);
5656
5657 NTOSAPI
5658 USHORT
5659 DDKAPI
5660 READ_PORT_USHORT(
5661 IN PUSHORT Port);
5662
5663 NTOSAPI
5664 VOID
5665 DDKAPI
5666 READ_REGISTER_BUFFER_UCHAR(
5667 IN PUCHAR Register,
5668 IN PUCHAR Buffer,
5669 IN ULONG Count);
5670
5671 NTOSAPI
5672 VOID
5673 DDKAPI
5674 READ_REGISTER_BUFFER_ULONG(
5675 IN PULONG Register,
5676 IN PULONG Buffer,
5677 IN ULONG Count);
5678
5679 NTOSAPI
5680 VOID
5681 DDKAPI
5682 READ_REGISTER_BUFFER_USHORT(
5683 IN PUSHORT Register,
5684 IN PUSHORT Buffer,
5685 IN ULONG Count);
5686
5687 NTOSAPI
5688 UCHAR
5689 DDKAPI
5690 READ_REGISTER_UCHAR(
5691 IN PUCHAR Register);
5692
5693 NTOSAPI
5694 ULONG
5695 DDKAPI
5696 READ_REGISTER_ULONG(
5697 IN PULONG Register);
5698
5699 NTOSAPI
5700 USHORT
5701 DDKAPI
5702 READ_REGISTER_USHORT(
5703 IN PUSHORT Register);
5704
5705 NTOSAPI
5706 VOID
5707 DDKAPI
5708 WRITE_PORT_BUFFER_UCHAR(
5709 IN PUCHAR Port,
5710 IN PUCHAR Buffer,
5711 IN ULONG Count);
5712
5713 NTOSAPI
5714 VOID
5715 DDKAPI
5716 WRITE_PORT_BUFFER_ULONG(
5717 IN PULONG Port,
5718 IN PULONG Buffer,
5719 IN ULONG Count);
5720
5721 NTOSAPI
5722 VOID
5723 DDKAPI
5724 WRITE_PORT_BUFFER_USHORT(
5725 IN PUSHORT Port,
5726 IN PUSHORT Buffer,
5727 IN ULONG Count);
5728
5729 NTOSAPI
5730 VOID
5731 DDKAPI
5732 WRITE_PORT_UCHAR(
5733 IN PUCHAR Port,
5734 IN UCHAR Value);
5735
5736 NTOSAPI
5737 VOID
5738 DDKAPI
5739 WRITE_PORT_ULONG(
5740 IN PULONG Port,
5741 IN ULONG Value);
5742
5743 NTOSAPI
5744 VOID
5745 DDKAPI
5746 WRITE_PORT_USHORT(
5747 IN PUSHORT Port,
5748 IN USHORT Value);
5749
5750 NTOSAPI
5751 VOID
5752 DDKAPI
5753 WRITE_REGISTER_BUFFER_UCHAR(
5754 IN PUCHAR Register,
5755 IN PUCHAR Buffer,
5756 IN ULONG Count);
5757
5758 NTOSAPI
5759 VOID
5760 DDKAPI
5761 WRITE_REGISTER_BUFFER_ULONG(
5762 IN PULONG Register,
5763 IN PULONG Buffer,
5764 IN ULONG Count);
5765
5766 NTOSAPI
5767 VOID
5768 DDKAPI
5769 WRITE_REGISTER_BUFFER_USHORT(
5770 IN PUSHORT Register,
5771 IN PUSHORT Buffer,
5772 IN ULONG Count);
5773
5774 NTOSAPI
5775 VOID
5776 DDKAPI
5777 WRITE_REGISTER_UCHAR(
5778 IN PUCHAR Register,
5779 IN UCHAR Value);
5780
5781 NTOSAPI
5782 VOID
5783 DDKAPI
5784 WRITE_REGISTER_ULONG(
5785 IN PULONG Register,
5786 IN ULONG Value);
5787
5788 NTOSAPI
5789 VOID
5790 DDKAPI
5791 WRITE_REGISTER_USHORT(
5792 IN PUSHORT Register,
5793 IN USHORT Value);
5794
5795
5796
5797 /** I/O manager routines **/
5798
5799 NTOSAPI
5800 VOID
5801 DDKAPI
5802 IoAcquireCancelSpinLock(
5803 OUT PKIRQL Irql);
5804
5805 NTOSAPI
5806 NTSTATUS
5807 DDKAPI
5808 IoAcquireRemoveLockEx(
5809 IN PIO_REMOVE_LOCK RemoveLock,
5810 IN OPTIONAL PVOID Tag OPTIONAL,
5811 IN PCSTR File,
5812 IN ULONG Line,
5813 IN ULONG RemlockSize);
5814
5815 /*
5816 * NTSTATUS
5817 * IoAcquireRemoveLock(
5818 * IN PIO_REMOVE_LOCK RemoveLock,
5819 * IN OPTIONAL PVOID Tag)
5820 */
5821 #define IoAcquireRemoveLock(_RemoveLock, \
5822 _Tag) \
5823 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
5824
5825 /*
5826 * VOID
5827 * IoAdjustPagingPathCount(
5828 * IN PLONG Count,
5829 * IN BOOLEAN Increment)
5830 */
5831 #define IoAdjustPagingPathCount(_Count, \
5832 _Increment) \
5833 { \
5834 if (_Increment) \
5835 { \
5836 InterlockedIncrement(_Count); \
5837 } \
5838 else \
5839 { \
5840 InterlockedDecrement(_Count); \
5841 } \
5842 }
5843
5844 NTOSAPI
5845 VOID
5846 DDKAPI
5847 IoAllocateController(
5848 IN PCONTROLLER_OBJECT ControllerObject,
5849 IN PDEVICE_OBJECT DeviceObject,
5850 IN PDRIVER_CONTROL ExecutionRoutine,
5851 IN PVOID Context);
5852
5853 NTOSAPI
5854 NTSTATUS
5855 DDKAPI
5856 IoAllocateDriverObjectExtension(
5857 IN PDRIVER_OBJECT DriverObject,
5858 IN PVOID ClientIdentificationAddress,
5859 IN ULONG DriverObjectExtensionSize,
5860 OUT PVOID *DriverObjectExtension);
5861
5862 typedef struct _IO_ERROR_LOG_PACKET {
5863 UCHAR MajorFunctionCode;
5864 UCHAR RetryCount;
5865 USHORT DumpDataSize;
5866 USHORT NumberOfStrings;
5867 USHORT StringOffset;
5868 USHORT EventCategory;
5869 NTSTATUS ErrorCode;
5870 ULONG UniqueErrorValue;
5871 NTSTATUS FinalStatus;
5872 ULONG SequenceNumber;
5873 ULONG IoControlCode;
5874 LARGE_INTEGER DeviceOffset;
5875 ULONG DumpData[1];
5876 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
5877
5878 NTOSAPI
5879 PVOID
5880 DDKAPI
5881 IoAllocateErrorLogEntry(
5882 IN PVOID IoObject,
5883 IN UCHAR EntrySize);
5884
5885 NTOSAPI
5886 PIRP
5887 DDKAPI
5888 IoAllocateIrp(
5889 IN CCHAR StackSize,
5890 IN BOOLEAN ChargeQuota);
5891
5892 NTOSAPI
5893 PMDL
5894 DDKAPI
5895 IoAllocateMdl(
5896 IN PVOID VirtualAddress,
5897 IN ULONG Length,
5898 IN BOOLEAN SecondaryBuffer,
5899 IN BOOLEAN ChargeQuota,
5900 IN OUT PIRP Irp OPTIONAL);
5901
5902 NTOSAPI
5903 PIO_WORKITEM
5904 DDKAPI
5905 IoAllocateWorkItem(
5906 IN PDEVICE_OBJECT DeviceObject);
5907
5908 /*
5909 * VOID IoAssignArcName(
5910 * IN PUNICODE_STRING ArcName,
5911 * IN PUNICODE_STRING DeviceName);
5912 */
5913 #define IoAssignArcName(_ArcName, _DeviceName) ( \
5914 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
5915
5916 NTOSAPI
5917 NTSTATUS
5918 DDKAPI
5919 IoAttachDevice(
5920 IN PDEVICE_OBJECT SourceDevice,
5921 IN PUNICODE_STRING TargetDevice,
5922 OUT PDEVICE_OBJECT *AttachedDevice);
5923
5924 NTOSAPI
5925 PDEVICE_OBJECT
5926 DDKAPI
5927 IoAttachDeviceToDeviceStack(
5928 IN PDEVICE_OBJECT SourceDevice,
5929 IN PDEVICE_OBJECT TargetDevice);
5930
5931 NTOSAPI
5932 PIRP
5933 DDKAPI
5934 IoBuildAsynchronousFsdRequest(
5935 IN ULONG MajorFunction,
5936 IN PDEVICE_OBJECT DeviceObject,
5937 IN OUT PVOID Buffer OPTIONAL,
5938 IN ULONG Length OPTIONAL,
5939 IN PLARGE_INTEGER StartingOffset OPTIONAL,
5940 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
5941
5942 NTOSAPI
5943 PIRP
5944 DDKAPI
5945 IoBuildDeviceIoControlRequest(
5946 IN ULONG IoControlCode,
5947 IN PDEVICE_OBJECT DeviceObject,
5948 IN PVOID InputBuffer OPTIONAL,
5949 IN ULONG InputBufferLength,
5950 OUT PVOID OutputBuffer OPTIONAL,
5951 IN ULONG OutputBufferLength,
5952 IN BOOLEAN InternalDeviceIoControl,
5953 IN PKEVENT Event,
5954 OUT PIO_STATUS_BLOCK IoStatusBlock);
5955
5956 NTOSAPI
5957 VOID
5958 DDKAPI
5959 IoBuildPartialMdl(
5960 IN PMDL SourceMdl,
5961 IN OUT PMDL TargetMdl,
5962 IN PVOID VirtualAddress,
5963 IN ULONG Length);
5964
5965 NTOSAPI
5966 PIRP
5967 DDKAPI
5968 IoBuildSynchronousFsdRequest(
5969 IN ULONG MajorFunction,
5970 IN PDEVICE_OBJECT DeviceObject,
5971 IN OUT PVOID Buffer OPTIONAL,
5972 IN ULONG Length OPTIONAL,
5973 IN PLARGE_INTEGER StartingOffset OPTIONAL,
5974 IN PKEVENT Event,
5975 OUT PIO_STATUS_BLOCK IoStatusBlock);
5976
5977 NTOSAPI
5978 NTSTATUS
5979 DDKFASTAPI
5980 IofCallDriver(
5981 IN PDEVICE_OBJECT DeviceObject,
5982 IN OUT PIRP Irp);
5983
5984 /*
5985 * NTSTATUS
5986 * IoCallDriver(
5987 * IN PDEVICE_OBJECT DeviceObject,
5988 * IN OUT PIRP Irp)
5989 */
5990 #define IoCallDriver IofCallDriver
5991
5992 NTOSAPI
5993 VOID
5994 DDKAPI
5995 IoCancelFileOpen(
5996 IN PDEVICE_OBJECT DeviceObject,
5997 IN PFILE_OBJECT FileObject);
5998
5999 NTOSAPI
6000 BOOLEAN
6001 DDKAPI
6002 IoCancelIrp(
6003 IN PIRP Irp);
6004
6005 NTOSAPI
6006 NTSTATUS
6007 DDKAPI
6008 IoCheckShareAccess(
6009 IN ACCESS_MASK DesiredAccess,
6010 IN ULONG DesiredShareAccess,
6011 IN OUT PFILE_OBJECT FileObject,
6012 IN OUT PSHARE_ACCESS ShareAccess,
6013 IN BOOLEAN Update);
6014
6015 NTOSAPI
6016 VOID
6017 DDKFASTAPI
6018 IofCompleteRequest(
6019 IN PIRP Irp,
6020 IN CCHAR PriorityBoost);
6021
6022 /*
6023 * VOID
6024 * IoCompleteRequest(
6025 * IN PIRP Irp,
6026 * IN CCHAR PriorityBoost)
6027 */
6028 #define IoCompleteRequest IofCompleteRequest
6029
6030 NTOSAPI
6031 NTSTATUS
6032 DDKAPI
6033 IoConnectInterrupt(
6034 OUT PKINTERRUPT *InterruptObject,
6035 IN PKSERVICE_ROUTINE ServiceRoutine,
6036 IN PVOID ServiceContext,
6037 IN PKSPIN_LOCK SpinLock OPTIONAL,
6038 IN ULONG Vector,
6039 IN KIRQL Irql,
6040 IN KIRQL SynchronizeIrql,
6041 IN KINTERRUPT_MODE InterruptMode,
6042 IN BOOLEAN ShareVector,
6043 IN KAFFINITY ProcessorEnableMask,
6044 IN BOOLEAN FloatingSave);
6045
6046 /*
6047 * PIO_STACK_LOCATION
6048 * IoGetCurrentIrpStackLocation(
6049 * IN PIRP Irp)
6050 */
6051 #define IoGetCurrentIrpStackLocation(_Irp) \
6052 ((_Irp)->Tail.Overlay.CurrentStackLocation)
6053
6054 /*
6055 * PIO_STACK_LOCATION
6056 * IoGetNextIrpStackLocation(
6057 * IN PIRP Irp)
6058 */
6059 #define IoGetNextIrpStackLocation(_Irp) \
6060 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
6061
6062 /*
6063 * VOID
6064 * IoCopyCurrentIrpStackLocationToNext(
6065 * IN PIRP Irp)
6066 */
6067 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
6068 { \
6069 PIO_STACK_LOCATION _IrpSp; \
6070 PIO_STACK_LOCATION _NextIrpSp; \
6071 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
6072 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
6073 RtlCopyMemory(_NextIrpSp, _IrpSp, \
6074 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
6075 _NextIrpSp->Control = 0; \
6076 }
6077
6078 NTOSAPI
6079 PCONTROLLER_OBJECT
6080 DDKAPI
6081 IoCreateController(
6082 IN ULONG Size);
6083
6084 NTOSAPI
6085 NTSTATUS
6086 DDKAPI
6087 IoCreateDevice(
6088 IN PDRIVER_OBJECT DriverObject,
6089 IN ULONG DeviceExtensionSize,
6090 IN PUNICODE_STRING DeviceName OPTIONAL,
6091 IN DEVICE_TYPE DeviceType,
6092 IN ULONG DeviceCharacteristics,
6093 IN BOOLEAN Exclusive,
6094 OUT PDEVICE_OBJECT *DeviceObject);
6095
6096 NTOSAPI
6097 NTSTATUS
6098 DDKAPI
6099 IoCreateDisk(
6100 IN PDEVICE_OBJECT DeviceObject,
6101 IN PCREATE_DISK Disk);
6102
6103 NTOSAPI
6104 NTSTATUS
6105 DDKAPI
6106 IoCreateFile(
6107 OUT PHANDLE FileHandle,
6108 IN ACCESS_MASK DesiredAccess,
6109 IN POBJECT_ATTRIBUTES ObjectAttributes,
6110 OUT PIO_STATUS_BLOCK IoStatusBlock,
6111 IN PLARGE_INTEGER AllocationSize OPTIONAL,
6112 IN ULONG FileAttributes,
6113 IN ULONG ShareAccess,
6114 IN ULONG Disposition,
6115 IN ULONG CreateOptions,
6116 IN PVOID EaBuffer OPTIONAL,
6117 IN ULONG EaLength,
6118 IN CREATE_FILE_TYPE CreateFileType,
6119 IN PVOID ExtraCreateParameters OPTIONAL,
6120 IN ULONG Options);
6121
6122 NTOSAPI
6123 PKEVENT
6124 DDKAPI
6125 IoCreateNotificationEvent(
6126 IN PUNICODE_STRING EventName,
6127 OUT PHANDLE EventHandle);
6128
6129 NTOSAPI
6130 NTSTATUS
6131 DDKAPI
6132 IoCreateSymbolicLink(
6133 IN PUNICODE_STRING SymbolicLinkName,
6134 IN PUNICODE_STRING DeviceName);
6135
6136 NTOSAPI
6137 PKEVENT
6138 DDKAPI
6139 IoCreateSynchronizationEvent(
6140 IN PUNICODE_STRING EventName,
6141 OUT PHANDLE EventHandle);
6142
6143 NTOSAPI
6144 NTSTATUS
6145 DDKAPI
6146 IoCreateUnprotectedSymbolicLink(
6147 IN PUNICODE_STRING SymbolicLinkName,
6148 IN PUNICODE_STRING DeviceName);
6149
6150 NTOSAPI
6151 VOID
6152 DDKAPI
6153 IoCsqInitialize(
6154 PIO_CSQ Csq,
6155 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
6156 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
6157 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
6158 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
6159 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
6160 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
6161
6162 NTOSAPI
6163 VOID
6164 DDKAPI
6165 IoCsqInsertIrp(
6166 IN PIO_CSQ Csq,
6167 IN PIRP Irp,
6168 IN PIO_CSQ_IRP_CONTEXT Context);
6169
6170 NTOSAPI
6171 PIRP
6172 DDKAPI
6173 IoCsqRemoveIrp(
6174 IN PIO_CSQ Csq,
6175 IN PIO_CSQ_IRP_CONTEXT Context);
6176
6177 NTOSAPI
6178 PIRP
6179 DDKAPI
6180 IoCsqRemoveNextIrp(
6181 IN PIO_CSQ Csq,
6182 IN PVOID PeekContext);
6183
6184 NTOSAPI
6185 VOID
6186 DDKAPI
6187 IoDeleteController(
6188 IN PCONTROLLER_OBJECT ControllerObject);
6189
6190 NTOSAPI
6191 VOID
6192 DDKAPI
6193 IoDeleteDevice(
6194 IN PDEVICE_OBJECT DeviceObject);
6195
6196 NTOSAPI
6197 NTSTATUS
6198 DDKAPI
6199 IoDeleteSymbolicLink(
6200 IN PUNICODE_STRING SymbolicLinkName);
6201
6202 /*
6203 * VOID
6204 * IoDeassignArcName(
6205 * IN PUNICODE_STRING ArcName)
6206 */
6207 #define IoDeassignArcName IoDeleteSymbolicLink
6208
6209 NTOSAPI
6210 VOID
6211 DDKAPI
6212 IoDetachDevice(
6213 IN OUT PDEVICE_OBJECT TargetDevice);
6214
6215 NTOSAPI
6216 VOID
6217 DDKAPI
6218 IoDisconnectInterrupt(
6219 IN PKINTERRUPT InterruptObject);
6220
6221 NTOSAPI
6222 BOOLEAN
6223 DDKAPI
6224 IoForwardIrpSynchronously(
6225 IN PDEVICE_OBJECT DeviceObject,
6226 IN PIRP Irp);
6227
6228 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
6229
6230 NTOSAPI
6231 VOID
6232 DDKAPI
6233 IoFreeController(
6234 IN PCONTROLLER_OBJECT ControllerObject);
6235
6236 NTOSAPI
6237 VOID
6238 DDKAPI
6239 IoFreeErrorLogEntry(
6240 PVOID ElEntry);
6241
6242 NTOSAPI
6243 VOID
6244 DDKAPI
6245 IoFreeIrp(
6246 IN PIRP Irp);
6247
6248 NTOSAPI
6249 VOID
6250 DDKAPI
6251 IoFreeMdl(
6252 IN PMDL Mdl);
6253
6254 NTOSAPI
6255 VOID
6256 DDKAPI
6257 IoFreeWorkItem(
6258 IN PIO_WORKITEM pIOWorkItem);
6259
6260 NTOSAPI
6261 PDEVICE_OBJECT
6262 DDKAPI
6263 IoGetAttachedDevice(
6264 IN PDEVICE_OBJECT DeviceObject);
6265
6266 NTOSAPI
6267 PDEVICE_OBJECT
6268 DDKAPI
6269 IoGetAttachedDeviceReference(
6270 IN PDEVICE_OBJECT DeviceObject);
6271
6272 NTOSAPI
6273 NTSTATUS
6274 DDKAPI
6275 IoGetBootDiskInformation(
6276 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
6277 IN ULONG Size);
6278
6279 NTOSAPI
6280 PCONFIGURATION_INFORMATION
6281 DDKAPI
6282 IoGetConfigurationInformation(
6283 VOID);
6284
6285 NTOSAPI
6286 PEPROCESS
6287 DDKAPI
6288 IoGetCurrentProcess(
6289 VOID);
6290
6291 NTOSAPI
6292 NTSTATUS
6293 DDKAPI
6294 IoGetDeviceInterfaceAlias(
6295 IN PUNICODE_STRING SymbolicLinkName,
6296 IN CONST GUID *AliasInterfaceClassGuid,
6297 OUT PUNICODE_STRING AliasSymbolicLinkName);
6298
6299 NTOSAPI
6300 NTSTATUS
6301 DDKAPI
6302 IoGetDeviceInterfaces(
6303 IN CONST GUID *InterfaceClassGuid,
6304 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
6305 IN ULONG Flags,
6306 OUT PWSTR *SymbolicLinkList);
6307
6308 NTOSAPI
6309 NTSTATUS
6310 DDKAPI
6311 IoGetDeviceObjectPointer(
6312 IN PUNICODE_STRING ObjectName,
6313 IN ACCESS_MASK DesiredAccess,
6314 OUT PFILE_OBJECT *FileObject,
6315 OUT PDEVICE_OBJECT *DeviceObject);
6316
6317 NTOSAPI
6318 NTSTATUS
6319 DDKAPI
6320 IoGetDeviceProperty(
6321 IN PDEVICE_OBJECT DeviceObject,
6322 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
6323 IN ULONG BufferLength,
6324 OUT PVOID PropertyBuffer,
6325 OUT PULONG ResultLength);
6326
6327 NTOSAPI
6328 PDEVICE_OBJECT
6329 DDKAPI
6330 IoGetDeviceToVerify(
6331 IN PETHREAD Thread);
6332
6333 NTOSAPI
6334 PDMA_ADAPTER
6335 DDKAPI
6336 IoGetDmaAdapter(
6337 IN PDEVICE_OBJECT PhysicalDeviceObject,
6338 IN PDEVICE_DESCRIPTION DeviceDescription,
6339 IN OUT PULONG NumberOfMapRegisters);
6340
6341 NTOSAPI
6342 PVOID
6343 DDKAPI
6344 IoGetDriverObjectExtension(
6345 IN PDRIVER_OBJECT DriverObject,
6346 IN PVOID ClientIdentificationAddress);
6347
6348 NTOSAPI
6349 PGENERIC_MAPPING
6350 DDKAPI
6351 IoGetFileObjectGenericMapping(
6352 VOID);
6353
6354 /*
6355 * ULONG
6356 * IoGetFunctionCodeFromCtlCode(
6357 * IN ULONG ControlCode)
6358 */
6359 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
6360 (((_ControlCode) >> 2) & 0x00000FFF)
6361
6362 NTOSAPI
6363 PVOID
6364 DDKAPI
6365 IoGetInitialStack(
6366 VOID);
6367
6368 NTOSAPI
6369 PDEVICE_OBJECT
6370 DDKAPI
6371 IoGetRelatedDeviceObject(
6372 IN PFILE_OBJECT FileObject);
6373
6374 NTOSAPI
6375 ULONG
6376 DDKAPI
6377 IoGetRemainingStackSize(
6378 VOID);
6379
6380 NTOSAPI
6381 VOID
6382 DDKAPI
6383 IoGetStackLimits(
6384 OUT PULONG_PTR LowLimit,
6385 OUT PULONG_PTR HighLimit);
6386
6387 NTOSAPI
6388 VOID
6389 DDKAPI
6390 KeInitializeDpc(
6391 IN PRKDPC Dpc,
6392 IN PKDEFERRED_ROUTINE DeferredRoutine,
6393 IN PVOID DeferredContext);
6394
6395 /*
6396 * VOID
6397 * IoInitializeDpcRequest(
6398 * IN PDEVICE_OBJECT DeviceObject,
6399 * IN PIO_DPC_ROUTINE DpcRoutine)
6400 */
6401 #define IoInitializeDpcRequest(_DeviceObject, \
6402 _DpcRoutine) \
6403 KeInitializeDpc(&(_DeviceObject)->Dpc, \
6404 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
6405 _DeviceObject)
6406
6407 NTOSAPI
6408 VOID
6409 DDKAPI
6410 IoInitializeIrp(
6411 IN OUT PIRP Irp,
6412 IN USHORT PacketSize,
6413 IN CCHAR StackSize);
6414
6415 NTOSAPI
6416 VOID
6417 DDKAPI
6418 IoInitializeRemoveLockEx(
6419 IN PIO_REMOVE_LOCK Lock,
6420 IN ULONG AllocateTag,
6421 IN ULONG MaxLockedMinutes,
6422 IN ULONG HighWatermark,
6423 IN ULONG RemlockSize);
6424
6425 /* VOID
6426 * IoInitializeRemoveLock(
6427 * IN PIO_REMOVE_LOCK Lock,
6428 * IN ULONG AllocateTag,
6429 * IN ULONG MaxLockedMinutes,
6430 * IN ULONG HighWatermark)
6431 */
6432 #define IoInitializeRemoveLock( \
6433 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
6434 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
6435 HighWatermark, sizeof(IO_REMOVE_LOCK))
6436
6437 NTOSAPI
6438 NTSTATUS
6439 DDKAPI
6440 IoInitializeTimer(
6441 IN PDEVICE_OBJECT DeviceObject,
6442 IN PIO_TIMER_ROUTINE TimerRoutine,
6443 IN PVOID Context);
6444
6445 NTOSAPI
6446 VOID
6447 DDKAPI
6448 IoInvalidateDeviceRelations(
6449 IN PDEVICE_OBJECT DeviceObject,
6450 IN DEVICE_RELATION_TYPE Type);
6451
6452 NTOSAPI
6453 VOID
6454 DDKAPI
6455 IoInvalidateDeviceState(
6456 IN PDEVICE_OBJECT PhysicalDeviceObject);
6457
6458 NTOSAPI
6459 BOOLEAN
6460 DDKAPI
6461 IoIs32bitProcess(
6462 IN PIRP Irp OPTIONAL);
6463
6464 /*
6465 * BOOLEAN
6466 * IoIsErrorUserInduced(
6467 * IN NTSTATUS Status);
6468 */
6469 #define IoIsErrorUserInduced(Status) \
6470 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
6471 ((Status) == STATUS_IO_TIMEOUT) || \
6472 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
6473 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
6474 ((Status) == STATUS_VERIFY_REQUIRED) || \
6475 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
6476 ((Status) == STATUS_WRONG_VOLUME)))
6477
6478 NTOSAPI
6479 BOOLEAN
6480 DDKAPI
6481 IoIsWdmVersionAvailable(
6482 IN UCHAR MajorVersion,
6483 IN UCHAR MinorVersion);
6484
6485 NTOSAPI
6486 PIRP
6487 DDKAPI
6488 IoMakeAssociatedIrp(
6489 IN PIRP Irp,
6490 IN CCHAR StackSize);
6491
6492 /*
6493 * VOID
6494 * IoMarkIrpPending(
6495 * IN OUT PIRP Irp)
6496 */
6497 #define IoMarkIrpPending(_Irp) \
6498 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
6499
6500 NTOSAPI
6501 NTSTATUS
6502 DDKAPI
6503 IoOpenDeviceInterfaceRegistryKey(
6504 IN PUNICODE_STRING SymbolicLinkName,
6505 IN ACCESS_MASK DesiredAccess,
6506 OUT PHANDLE DeviceInterfaceKey);
6507
6508 NTOSAPI
6509 NTSTATUS
6510 DDKAPI
6511 IoOpenDeviceRegistryKey(
6512 IN PDEVICE_OBJECT DeviceObject,
6513 IN ULONG DevInstKeyType,
6514 IN ACCESS_MASK DesiredAccess,
6515 OUT PHANDLE DevInstRegKey);
6516
6517 NTOSAPI
6518 NTSTATUS
6519 DDKAPI
6520 IoQueryDeviceDescription(
6521 IN PINTERFACE_TYPE BusType OPTIONAL,
6522 IN PULONG BusNumber OPTIONAL,
6523 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
6524 IN PULONG ControllerNumber OPTIONAL,
6525 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
6526 IN PULONG PeripheralNumber OPTIONAL,
6527 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
6528 IN PVOID Context);
6529
6530 NTOSAPI
6531 VOID
6532 DDKAPI
6533 IoQueueWorkItem(
6534 IN PIO_WORKITEM pIOWorkItem,
6535 IN PIO_WORKITEM_ROUTINE Routine,
6536 IN WORK_QUEUE_TYPE QueueType,
6537 IN PVOID Context);
6538
6539 NTOSAPI
6540 VOID
6541 DDKAPI
6542 IoRaiseHardError(
6543 IN PIRP Irp,
6544 IN PVPB Vpb OPTIONAL,
6545 IN PDEVICE_OBJECT RealDeviceObject);
6546
6547 NTOSAPI
6548 BOOLEAN
6549 DDKAPI
6550 IoRaiseInformationalHardError(
6551 IN NTSTATUS ErrorStatus,
6552 IN PUNICODE_STRING String OPTIONAL,
6553 IN PKTHREAD Thread OPTIONAL);
6554
6555 NTOSAPI
6556 NTSTATUS
6557 DDKAPI
6558 IoReadDiskSignature(
6559 IN PDEVICE_OBJECT DeviceObject,
6560 IN ULONG BytesPerSector,
6561 OUT PDISK_SIGNATURE Signature);
6562
6563 NTOSAPI
6564 NTSTATUS
6565 DDKAPI
6566 IoReadPartitionTableEx(
6567 IN PDEVICE_OBJECT DeviceObject,
6568 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
6569
6570 NTOSAPI
6571 VOID
6572 DDKAPI
6573 IoRegisterBootDriverReinitialization(
6574 IN PDRIVER_OBJECT DriverObject,
6575 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6576 IN PVOID Context);
6577
6578 NTOSAPI
6579 VOID
6580 DDKAPI
6581 IoRegisterBootDriverReinitialization(
6582 IN PDRIVER_OBJECT DriverObject,
6583 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6584 IN PVOID Context);
6585
6586 NTOSAPI
6587 NTSTATUS
6588 DDKAPI
6589 IoRegisterDeviceInterface(
6590 IN PDEVICE_OBJECT PhysicalDeviceObject,
6591 IN CONST GUID *InterfaceClassGuid,
6592 IN PUNICODE_STRING ReferenceString OPTIONAL,
6593 OUT PUNICODE_STRING SymbolicLinkName);
6594
6595 NTOSAPI
6596 VOID
6597 DDKAPI
6598 IoRegisterDriverReinitialization(
6599 IN PDRIVER_OBJECT DriverObject,
6600 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6601 IN PVOID Context);
6602
6603 NTOSAPI
6604 NTSTATUS
6605 DDKAPI
6606 IoRegisterPlugPlayNotification(
6607 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
6608 IN ULONG EventCategoryFlags,
6609 IN PVOID EventCategoryData OPTIONAL,
6610 IN PDRIVER_OBJECT DriverObject,
6611 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
6612 IN PVOID Context,
6613 OUT PVOID *NotificationEntry);
6614
6615 NTOSAPI
6616 NTSTATUS
6617 DDKAPI
6618 IoRegisterShutdownNotification(
6619 IN PDEVICE_OBJECT DeviceObject);
6620
6621 NTOSAPI
6622 VOID
6623 DDKAPI
6624 IoReleaseCancelSpinLock(
6625 IN KIRQL Irql);
6626
6627 NTOSAPI
6628 VOID
6629 DDKAPI
6630 IoReleaseRemoveLockAndWaitEx(
6631 IN PIO_REMOVE_LOCK RemoveLock,
6632 IN PVOID Tag,
6633 IN ULONG RemlockSize);
6634
6635 NTOSAPI
6636 VOID
6637 DDKAPI
6638 IoReleaseRemoveLockEx(
6639 IN PIO_REMOVE_LOCK RemoveLock,
6640 IN PVOID Tag,
6641 IN ULONG RemlockSize);
6642
6643 /*
6644 * VOID
6645 * IoReleaseRemoveLockAndWait(
6646 * IN PIO_REMOVE_LOCK RemoveLock,
6647 * IN PVOID Tag)
6648 */
6649 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
6650 _Tag) \
6651 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6652
6653 NTOSAPI
6654 VOID
6655 DDKAPI
6656 IoRemoveShareAccess(
6657 IN PFILE_OBJECT FileObject,
6658 IN OUT PSHARE_ACCESS ShareAccess);
6659
6660 NTOSAPI
6661 NTSTATUS
6662 DDKAPI
6663 IoReportDetectedDevice(
6664 IN PDRIVER_OBJECT DriverObject,
6665 IN INTERFACE_TYPE LegacyBusType,
6666 IN ULONG BusNumber,
6667 IN ULONG SlotNumber,
6668 IN PCM_RESOURCE_LIST ResourceList,
6669 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
6670 IN BOOLEAN ResourceAssigned,
6671 IN OUT PDEVICE_OBJECT *DeviceObject);
6672
6673 NTOSAPI
6674 NTSTATUS
6675 DDKAPI
6676 IoReportResourceForDetection(
6677 IN PDRIVER_OBJECT DriverObject,
6678 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
6679 IN ULONG DriverListSize OPTIONAL,
6680 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
6681 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
6682 IN ULONG DeviceListSize OPTIONAL,
6683 OUT PBOOLEAN ConflictDetected);
6684
6685 NTOSAPI
6686 NTSTATUS
6687 DDKAPI
6688 IoReportResourceUsage(
6689 IN PUNICODE_STRING DriverClassName OPTIONAL,
6690 IN PDRIVER_OBJECT DriverObject,
6691 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
6692 IN ULONG DriverListSize OPTIONAL,
6693 IN PDEVICE_OBJECT DeviceObject,
6694 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
6695 IN ULONG DeviceListSize OPTIONAL,
6696 IN BOOLEAN OverrideConflict,
6697 OUT PBOOLEAN ConflictDetected);
6698
6699 NTOSAPI
6700 NTSTATUS
6701 DDKAPI
6702 IoReportTargetDeviceChange(
6703 IN PDEVICE_OBJECT PhysicalDeviceObject,
6704 IN PVOID NotificationStructure);
6705
6706 NTOSAPI
6707 NTSTATUS
6708 DDKAPI
6709 IoReportTargetDeviceChangeAsynchronous(
6710 IN PDEVICE_OBJECT PhysicalDeviceObject,
6711 IN PVOID NotificationStructure,
6712 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
6713 IN PVOID Context OPTIONAL);
6714
6715 NTOSAPI
6716 VOID
6717 DDKAPI
6718 IoRequestDeviceEject(
6719 IN PDEVICE_OBJECT PhysicalDeviceObject);
6720
6721 /*
6722 * VOID
6723 * IoRequestDpc(
6724 * IN PDEVICE_OBJECT DeviceObject,
6725 * IN PIRP Irp,
6726 * IN PVOID Context);
6727 */
6728 #define IoRequestDpc(DeviceObject, Irp, Context)( \
6729 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
6730
6731 NTOSAPI
6732 VOID
6733 DDKAPI
6734 IoReuseIrp(
6735 IN OUT PIRP Irp,
6736 IN NTSTATUS Status);
6737
6738 /*
6739 * PDRIVER_CANCEL
6740 * IoSetCancelRoutine(
6741 * IN PIRP Irp,
6742 * IN PDRIVER_CANCEL CancelRoutine)
6743 */
6744 #define IoSetCancelRoutine(_Irp, \
6745 _CancelRoutine) \
6746 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
6747 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
6748
6749 /*
6750 * VOID
6751 * IoSetCompletionRoutine(
6752 * IN PIRP Irp,
6753 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6754 * IN PVOID Context,
6755 * IN BOOLEAN InvokeOnSuccess,
6756 * IN BOOLEAN InvokeOnError,
6757 * IN BOOLEAN InvokeOnCancel)
6758 */
6759 #define IoSetCompletionRoutine(_Irp, \
6760 _CompletionRoutine, \
6761 _Context, \
6762 _InvokeOnSuccess, \
6763 _InvokeOnError, \
6764 _InvokeOnCancel) \
6765 { \
6766 PIO_STACK_LOCATION _IrpSp; \
6767 assert(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
6768 _CompletionRoutine != NULL : TRUE); \
6769 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
6770 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
6771 _IrpSp->Context = (_Context); \
6772 _IrpSp->Control = 0; \
6773 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
6774 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
6775 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
6776 }
6777
6778 NTOSAPI
6779 VOID
6780 DDKAPI
6781 IoSetCompletionRoutineEx(
6782 IN PDEVICE_OBJECT DeviceObject,
6783 IN PIRP Irp,
6784 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
6785 IN PVOID Context,
6786 IN BOOLEAN InvokeOnSuccess,
6787 IN BOOLEAN InvokeOnError,
6788 IN BOOLEAN InvokeOnCancel);
6789
6790 NTOSAPI
6791 NTSTATUS
6792 DDKAPI
6793 IoSetDeviceInterfaceState(
6794 IN PUNICODE_STRING SymbolicLinkName,
6795 IN BOOLEAN Enable);
6796
6797 NTOSAPI
6798 VOID
6799 DDKAPI
6800 IoSetHardErrorOrVerifyDevice(
6801 IN PIRP Irp,
6802 IN PDEVICE_OBJECT DeviceObject);
6803
6804 /*
6805 * VOID
6806 * IoSetNextIrpStackLocation(
6807 * IN OUT PIRP Irp)
6808 */
6809 #define IoSetNextIrpStackLocation(_Irp) \
6810 { \
6811 (_Irp)->CurrentLocation--; \
6812 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
6813 }
6814
6815 NTOSAPI
6816 NTSTATUS
6817 DDKAPI
6818 IoSetPartitionInformationEx(
6819 IN PDEVICE_OBJECT DeviceObject,
6820 IN ULONG PartitionNumber,
6821 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
6822
6823 NTOSAPI
6824 VOID
6825 DDKAPI
6826 IoSetShareAccess(
6827 IN ACCESS_MASK DesiredAccess,
6828 IN ULONG DesiredShareAccess,
6829 IN OUT PFILE_OBJECT FileObject,
6830 OUT PSHARE_ACCESS ShareAccess);
6831
6832 NTOSAPI
6833 VOID
6834 DDKAPI
6835 IoSetStartIoAttributes(
6836 IN PDEVICE_OBJECT DeviceObject,
6837 IN BOOLEAN DeferredStartIo,
6838 IN BOOLEAN NonCancelable);
6839
6840 NTOSAPI
6841 NTSTATUS
6842 DDKAPI
6843 IoSetSystemPartition(
6844 IN PUNICODE_STRING VolumeNameString);
6845
6846 NTOSAPI
6847 BOOLEAN
6848 DDKAPI
6849 IoSetThreadHardErrorMode(
6850 IN BOOLEAN EnableHardErrors);
6851
6852 /*
6853 * USHORT
6854 * IoSizeOfIrp(
6855 * IN CCHAR StackSize)
6856 */
6857 #define IoSizeOfIrp(_StackSize) \
6858 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
6859
6860 /*
6861 * VOID
6862 * IoSkipCurrentIrpStackLocation(
6863 * IN PIRP Irp)
6864 */
6865 #define IoSkipCurrentIrpStackLocation(_Irp) \
6866 { \
6867 (_Irp)->CurrentLocation++; \
6868 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
6869 }
6870
6871 NTOSAPI
6872 VOID
6873 DDKAPI
6874 IoStartNextPacket(
6875 IN PDEVICE_OBJECT DeviceObject,
6876 IN BOOLEAN Cancelable);
6877
6878 NTOSAPI
6879 VOID
6880 DDKAPI
6881 IoStartNextPacketByKey(
6882 IN PDEVICE_OBJECT DeviceObject,
6883 IN BOOLEAN Cancelable,
6884 IN ULONG Key);
6885
6886 NTOSAPI
6887 VOID
6888 DDKAPI
6889 IoStartPacket(
6890 IN PDEVICE_OBJECT DeviceObject,
6891 IN PIRP Irp,
6892 IN PULONG Key OPTIONAL,
6893 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
6894
6895 NTOSAPI
6896 VOID
6897 DDKAPI
6898 IoStartTimer(
6899 IN PDEVICE_OBJECT DeviceObject);
6900
6901 NTOSAPI
6902 VOID
6903 DDKAPI
6904 IoStopTimer(
6905 IN PDEVICE_OBJECT DeviceObject);
6906
6907 NTOSAPI
6908 NTSTATUS
6909 DDKAPI
6910 IoUnregisterPlugPlayNotification(
6911 IN PVOID NotificationEntry);
6912
6913 NTOSAPI
6914 VOID
6915 DDKAPI
6916 IoUnregisterShutdownNotification(
6917 IN PDEVICE_OBJECT DeviceObject);
6918
6919 NTOSAPI
6920 VOID
6921 DDKAPI
6922 IoUpdateShareAccess(
6923 IN PFILE_OBJECT FileObject,
6924 IN OUT PSHARE_ACCESS ShareAccess);
6925
6926 NTOSAPI
6927 NTSTATUS
6928 DDKAPI
6929 IoVerifyPartitionTable(
6930 IN PDEVICE_OBJECT DeviceObject,
6931 IN BOOLEAN FixErrors);
6932
6933 NTOSAPI
6934 NTSTATUS
6935 DDKAPI
6936 IoVolumeDeviceToDosName(
6937 IN PVOID VolumeDeviceObject,
6938 OUT PUNICODE_STRING DosName);
6939
6940 NTOSAPI
6941 NTSTATUS
6942 DDKAPI
6943 IoWMIAllocateInstanceIds(
6944 IN GUID *Guid,
6945 IN ULONG InstanceCount,
6946 OUT ULONG *FirstInstanceId);
6947
6948 NTOSAPI
6949 ULONG
6950 DDKAPI
6951 IoWMIDeviceObjectToProviderId(
6952 IN PDEVICE_OBJECT DeviceObject);
6953
6954 NTOSAPI
6955 NTSTATUS
6956 DDKAPI
6957 IoWMIDeviceObjectToInstanceName(
6958 IN PVOID DataBlockObject,
6959 IN PDEVICE_OBJECT DeviceObject,
6960 OUT PUNICODE_STRING InstanceName);
6961
6962 NTOSAPI
6963 NTSTATUS
6964 DDKAPI
6965 IoWMIExecuteMethod(
6966 IN PVOID DataBlockObject,
6967 IN PUNICODE_STRING InstanceName,
6968 IN ULONG MethodId,
6969 IN ULONG InBufferSize,
6970 IN OUT PULONG OutBufferSize,
6971 IN OUT PUCHAR InOutBuffer);
6972
6973 NTOSAPI
6974 NTSTATUS
6975 DDKAPI
6976 IoWMIHandleToInstanceName(
6977 IN PVOID DataBlockObject,
6978 IN HANDLE FileHandle,
6979 OUT PUNICODE_STRING InstanceName);
6980
6981 NTOSAPI
6982 NTSTATUS
6983 DDKAPI
6984 IoWMIOpenBlock(
6985 IN GUID *DataBlockGuid,
6986 IN ULONG DesiredAccess,
6987 OUT PVOID *DataBlockObject);
6988
6989 NTOSAPI
6990 NTSTATUS
6991 DDKAPI
6992 IoWMIQueryAllData(
6993 IN PVOID DataBlockObject,
6994 IN OUT ULONG *InOutBufferSize,
6995 OUT PVOID OutBuffer);
6996
6997 NTOSAPI
6998 NTSTATUS
6999 DDKAPI
7000 IoWMIQueryAllDataMultiple(
7001 IN PVOID *DataBlockObjectList,
7002 IN ULONG ObjectCount,
7003 IN OUT ULONG *InOutBufferSize,
7004 OUT PVOID OutBuffer);
7005
7006 NTOSAPI
7007 NTSTATUS
7008 DDKAPI
7009 IoWMIQuerySingleInstance(
7010 IN PVOID DataBlockObject,
7011 IN PUNICODE_STRING InstanceName,
7012 IN OUT ULONG *InOutBufferSize,
7013 OUT PVOID OutBuffer);
7014
7015 NTOSAPI
7016 NTSTATUS
7017 DDKAPI
7018 IoWMIQuerySingleInstanceMultiple(
7019 IN PVOID *DataBlockObjectList,
7020 IN PUNICODE_STRING InstanceNames,
7021 IN ULONG ObjectCount,
7022 IN OUT ULONG *InOutBufferSize,
7023 OUT PVOID OutBuffer);
7024
7025 NTOSAPI
7026 NTSTATUS
7027 DDKAPI
7028 IoWMIRegistrationControl(
7029 IN PDEVICE_OBJECT DeviceObject,
7030 IN ULONG Action);
7031
7032 NTOSAPI
7033 NTSTATUS
7034 DDKAPI
7035 IoWMISetNotificationCallback(
7036 IN PVOID Object,
7037 IN WMI_NOTIFICATION_CALLBACK Callback,
7038 IN PVOID Context);
7039
7040 NTOSAPI
7041 NTSTATUS
7042 DDKAPI
7043 IoWMISetSingleInstance(
7044 IN PVOID DataBlockObject,
7045 IN PUNICODE_STRING InstanceName,
7046 IN ULONG Version,
7047 IN ULONG ValueBufferSize,
7048 IN PVOID ValueBuffer);
7049
7050 NTOSAPI
7051 NTSTATUS
7052 DDKAPI
7053 IoWMISetSingleItem(
7054 IN PVOID DataBlockObject,
7055 IN PUNICODE_STRING InstanceName,
7056 IN ULONG DataItemId,
7057 IN ULONG Version,
7058 IN ULONG ValueBufferSize,
7059 IN PVOID ValueBuffer);
7060
7061 NTOSAPI
7062 NTSTATUS
7063 DDKAPI
7064 IoWMISuggestInstanceName(
7065 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7066 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
7067 IN BOOLEAN CombineNames,
7068 OUT PUNICODE_STRING SuggestedInstanceName);
7069
7070 NTOSAPI
7071 NTSTATUS
7072 DDKAPI
7073 IoWMIWriteEvent(
7074 IN PVOID WnodeEventItem);
7075
7076 NTOSAPI
7077 VOID
7078 DDKAPI
7079 IoWriteErrorLogEntry(
7080 IN PVOID ElEntry);
7081
7082 NTOSAPI
7083 NTSTATUS
7084 DDKAPI
7085 IoWritePartitionTableEx(
7086 IN PDEVICE_OBJECT DeviceObject,
7087 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
7088
7089
7090
7091 /** Kernel routines **/
7092
7093 NTOSAPI
7094 VOID
7095 DDKFASTAPI
7096 KeAcquireInStackQueuedSpinLock(
7097 IN PKSPIN_LOCK SpinLock,
7098 IN PKLOCK_QUEUE_HANDLE LockHandle);
7099
7100 NTOSAPI
7101 VOID
7102 DDKFASTAPI
7103 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7104 IN PKSPIN_LOCK SpinLock,
7105 IN PKLOCK_QUEUE_HANDLE LockHandle);
7106
7107 NTOSAPI
7108 KIRQL
7109 DDKAPI
7110 KeAcquireInterruptSpinLock(
7111 IN PKINTERRUPT Interrupt);
7112
7113 NTOSAPI
7114 VOID
7115 DDKAPI
7116 KeAcquireSpinLock(
7117 IN PKSPIN_LOCK SpinLock,
7118 OUT PKIRQL OldIrql);
7119
7120 /* System Service Dispatch Table */
7121 typedef struct _SSDT {
7122 ULONG SysCallPtr;
7123 } SSDT, *PSSDT;
7124
7125 /* System Service Parameters Table */
7126 typedef struct _SSPT {
7127 ULONG ParamBytes;
7128 } SSPT, *PSSPT;
7129
7130 typedef struct _SSDT_ENTRY {
7131 PSSDT SSDT;
7132 PULONG ServiceCounterTable;
7133 ULONG NumberOfServices;
7134 PSSPT SSPT;
7135 } SSDT_ENTRY, *PSSDT_ENTRY;
7136
7137 NTOSAPI
7138 BOOLEAN
7139 DDKAPI
7140 KeAddSystemServiceTable(
7141 IN PSSDT SSDT,
7142 IN PULONG ServiceCounterTable,
7143 IN ULONG NumberOfServices,
7144 IN PSSPT SSPT,
7145 IN ULONG TableIndex);
7146
7147 NTOSAPI
7148 BOOLEAN
7149 DDKAPI
7150 KeAreApcsDisabled(
7151 VOID);
7152
7153 NTOSAPI
7154 VOID
7155 DDKAPI
7156 KeAttachProcess(
7157 IN PEPROCESS Process);
7158
7159 NTOSAPI
7160 VOID
7161 DDKAPI
7162 KeBugCheck(
7163 IN ULONG BugCheckCode);
7164
7165 NTOSAPI
7166 VOID
7167 DDKAPI
7168 KeBugCheckEx(
7169 IN ULONG BugCheckCode,
7170 IN ULONG_PTR BugCheckParameter1,
7171 IN ULONG_PTR BugCheckParameter2,
7172 IN ULONG_PTR BugCheckParameter3,
7173 IN ULONG_PTR BugCheckParameter4);
7174
7175 NTOSAPI
7176 BOOLEAN
7177 DDKAPI
7178 KeCancelTimer(
7179 IN PKTIMER Timer);
7180
7181 NTOSAPI
7182 VOID
7183 DDKAPI
7184 KeClearEvent(
7185 IN PRKEVENT Event);
7186
7187 NTOSAPI
7188 NTSTATUS
7189 DDKAPI
7190 KeDelayExecutionThread(
7191 IN KPROCESSOR_MODE WaitMode,
7192 IN BOOLEAN Alertable,
7193 IN PLARGE_INTEGER Interval);
7194
7195 NTOSAPI
7196 BOOLEAN
7197 DDKAPI
7198 KeDeregisterBugCheckCallback(
7199 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
7200
7201 NTOSAPI
7202 VOID
7203 DDKAPI
7204 KeDetachProcess(
7205 VOID);
7206
7207 NTOSAPI
7208 VOID
7209 DDKAPI
7210 KeEnterCriticalRegion(
7211 VOID);
7212
7213 /*
7214 * VOID
7215 * KeFlushIoBuffers(
7216 * IN PMDL Mdl,
7217 * IN BOOLEAN ReadOperation,
7218 * IN BOOLEAN DmaOperation)
7219 */
7220 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7221
7222 NTOSAPI
7223 PRKTHREAD
7224 DDKAPI
7225 KeGetCurrentThread(
7226 VOID);
7227
7228 NTOSAPI
7229 KPROCESSOR_MODE
7230 DDKAPI
7231 KeGetPreviousMode(
7232 VOID);
7233
7234 NTOSAPI
7235 ULONG
7236 DDKAPI
7237 KeGetRecommendedSharedDataAlignment(
7238 VOID);
7239
7240 NTOSAPI
7241 VOID
7242 DDKAPI
7243 KeInitializeApc(
7244 IN PKAPC Apc,
7245 IN PKTHREAD Thread,
7246 IN UCHAR StateIndex,
7247 IN PKKERNEL_ROUTINE KernelRoutine,
7248 IN PKRUNDOWN_ROUTINE RundownRoutine,
7249 IN PKNORMAL_ROUTINE NormalRoutine,
7250 IN UCHAR Mode,
7251 IN PVOID Context);
7252
7253 NTOSAPI
7254 VOID
7255 DDKAPI
7256 KeInitializeDeviceQueue(
7257 IN PKDEVICE_QUEUE DeviceQueue);
7258
7259 NTOSAPI
7260 VOID
7261 DDKAPI
7262 KeInitializeMutex(
7263 IN PRKMUTEX Mutex,
7264 IN ULONG Level);
7265
7266 NTOSAPI
7267 VOID
7268 DDKAPI
7269 KeInitializeSemaphore(
7270 IN PRKSEMAPHORE Semaphore,
7271 IN LONG Count,
7272 IN LONG Limit);
7273
7274 NTOSAPI
7275 VOID
7276 DDKAPI
7277 KeInitializeSpinLock(
7278 IN PKSPIN_LOCK SpinLock);
7279
7280 NTOSAPI
7281 VOID
7282 DDKAPI
7283 KeInitializeTimer(
7284 IN PKTIMER Timer);
7285
7286 NTOSAPI
7287 VOID
7288 DDKAPI
7289 KeInitializeTimerEx(
7290 IN PKTIMER Timer,
7291 IN TIMER_TYPE Type);
7292
7293 NTOSAPI
7294 BOOLEAN
7295 DDKAPI
7296 KeInsertByKeyDeviceQueue(
7297 IN PKDEVICE_QUEUE DeviceQueue,
7298 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7299 IN ULONG SortKey);
7300
7301 NTOSAPI
7302 BOOLEAN
7303 DDKAPI
7304 KeInsertDeviceQueue(
7305 IN PKDEVICE_QUEUE DeviceQueue,
7306 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7307
7308 NTOSAPI
7309 BOOLEAN
7310 DDKAPI
7311 KeInsertQueueDpc(
7312 IN PRKDPC Dpc,
7313 IN PVOID SystemArgument1,
7314 IN PVOID SystemArgument2);
7315
7316 NTOSAPI
7317 VOID
7318 DDKAPI
7319 KeLeaveCriticalRegion(
7320 VOID);
7321
7322 NTOSAPI
7323 VOID
7324 DDKAPI
7325 KeLowerIrql(
7326 IN KIRQL NewIrql);
7327
7328 NTOSAPI
7329 NTSTATUS
7330 DDKAPI
7331 KePulseEvent(
7332 IN PRKEVENT Event,
7333 IN KPRIORITY Increment,
7334 IN BOOLEAN Wait);
7335
7336 NTOSAPI
7337 ULONGLONG
7338 DDKAPI
7339 KeQueryInterruptTime(
7340 VOID);
7341
7342 NTOSAPI
7343 LARGE_INTEGER
7344 DDKAPI
7345 KeQueryPerformanceCounter(
7346 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
7347
7348 NTOSAPI
7349 KPRIORITY
7350 DDKAPI
7351 KeQueryPriorityThread(
7352 IN PRKTHREAD Thread);
7353
7354 NTOSAPI
7355 VOID
7356 DDKAPI
7357 KeQuerySystemTime(
7358 OUT PLARGE_INTEGER CurrentTime);
7359
7360 NTOSAPI
7361 VOID
7362 DDKAPI
7363 KeQueryTickCount(
7364 OUT PLARGE_INTEGER TickCount);
7365
7366 NTOSAPI
7367 ULONG
7368 DDKAPI
7369 KeQueryTimeIncrement(
7370 VOID);
7371
7372 NTOSAPI
7373 VOID
7374 DDKAPI
7375 KeRaiseIrql(
7376 IN KIRQL NewIrql,
7377 OUT PKIRQL OldIrql);
7378
7379 NTOSAPI
7380 KIRQL
7381 DDKAPI
7382 KeRaiseIrqlToDpcLevel(
7383 VOID);
7384
7385 NTOSAPI
7386 LONG
7387 DDKAPI
7388 KeReadStateEvent(
7389 IN PRKEVENT Event);
7390
7391 NTOSAPI
7392 LONG
7393 DDKAPI
7394 KeReadStateMutex(
7395 IN PRKMUTEX Mutex);
7396
7397 NTOSAPI
7398 LONG
7399 DDKAPI
7400 KeReadStateSemaphore(
7401 IN PRKSEMAPHORE Semaphore);
7402
7403 NTOSAPI
7404 BOOLEAN
7405 DDKAPI
7406 KeReadStateTimer(
7407 IN PKTIMER Timer);
7408
7409 NTOSAPI
7410 BOOLEAN
7411 DDKAPI
7412 KeRegisterBugCheckCallback(
7413 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7414 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7415 IN PVOID Buffer,
7416 IN ULONG Length,
7417 IN PUCHAR Component);
7418
7419 NTOSAPI
7420 VOID
7421 DDKFASTAPI
7422 KeReleaseInStackQueuedSpinLock(
7423 IN PKLOCK_QUEUE_HANDLE LockHandle);
7424
7425 NTOSAPI
7426 VOID
7427 DDKFASTAPI
7428 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7429 IN PKLOCK_QUEUE_HANDLE LockHandle);
7430
7431 NTOSAPI
7432 VOID
7433 DDKAPI
7434 KeReleaseInterruptSpinLock(
7435 IN PKINTERRUPT Interrupt,
7436 IN KIRQL OldIrql);
7437
7438 NTOSAPI
7439 LONG
7440 DDKAPI
7441 KeReleaseMutex(
7442 IN PRKMUTEX Mutex,
7443 IN BOOLEAN Wait);
7444
7445 NTOSAPI
7446 LONG
7447 DDKAPI
7448 KeReleaseSemaphore(
7449 IN PRKSEMAPHORE Semaphore,
7450 IN KPRIORITY Increment,
7451 IN LONG Adjustment,
7452 IN BOOLEAN Wait);
7453
7454 NTOSAPI
7455 VOID
7456 DDKAPI
7457 KeReleaseSpinLock(
7458 IN PKSPIN_LOCK SpinLock,
7459 IN KIRQL NewIrql);
7460
7461 NTOSAPI
7462 PKDEVICE_QUEUE_ENTRY
7463 DDKAPI
7464 KeRemoveByKeyDeviceQueue(
7465 IN PKDEVICE_QUEUE DeviceQueue,
7466 IN ULONG SortKey);
7467
7468 NTOSAPI
7469 PKDEVICE_QUEUE_ENTRY
7470 DDKAPI
7471 KeRemoveDeviceQueue(
7472 IN PKDEVICE_QUEUE DeviceQueue);
7473
7474 NTOSAPI
7475 BOOLEAN
7476 DDKAPI
7477 KeRemoveEntryDeviceQueue(
7478 IN PKDEVICE_QUEUE DeviceQueue,
7479 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7480
7481 NTOSAPI
7482 BOOLEAN
7483 DDKAPI
7484 KeRemoveQueueDpc(
7485 IN PRKDPC Dpc);
7486
7487 NTOSAPI
7488 LONG
7489 DDKAPI
7490 KeResetEvent(
7491 IN PRKEVENT Event);
7492
7493 NTOSAPI
7494 NTSTATUS
7495 DDKAPI
7496 KeRestoreFloatingPointState(
7497 IN PKFLOATING_SAVE FloatSave);
7498
7499 NTOSAPI
7500 NTSTATUS
7501 DDKAPI
7502 KeSaveFloatingPointState(
7503 OUT PKFLOATING_SAVE FloatSave);
7504
7505 NTOSAPI
7506 LONG
7507 DDKAPI
7508 KeSetBasePriorityThread(
7509 IN PRKTHREAD Thread,
7510 IN LONG Increment);
7511
7512 NTOSAPI
7513 LONG
7514 DDKAPI
7515 KeSetEvent(
7516 IN PRKEVENT Event,
7517 IN KPRIORITY Increment,
7518 IN BOOLEAN Wait);
7519
7520 NTOSAPI
7521 VOID
7522 DDKAPI
7523 KeSetImportanceDpc(
7524 IN PRKDPC Dpc,
7525 IN KDPC_IMPORTANCE Importance);
7526
7527 NTOSAPI
7528 KPRIORITY
7529 DDKAPI
7530 KeSetPriorityThread(
7531 IN PKTHREAD Thread,
7532 IN KPRIORITY Priority);
7533
7534 NTOSAPI
7535 VOID
7536 DDKAPI
7537 KeSetTargetProcessorDpc(
7538 IN PRKDPC Dpc,
7539 IN CCHAR Number);
7540
7541 NTOSAPI
7542 BOOLEAN
7543 DDKAPI
7544 KeSetTimer(
7545 IN PKTIMER Timer,
7546 IN LARGE_INTEGER DueTime,
7547 IN PKDPC Dpc OPTIONAL);
7548
7549 NTOSAPI
7550 BOOLEAN
7551 DDKAPI
7552 KeSetTimerEx(
7553 IN PKTIMER Timer,
7554 IN LARGE_INTEGER DueTime,
7555 IN LONG Period OPTIONAL,
7556 IN PKDPC Dpc OPTIONAL);
7557
7558 NTOSAPI
7559 VOID
7560 DDKFASTAPI
7561 KeSetTimeUpdateNotifyRoutine(
7562 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
7563
7564 NTOSAPI
7565 VOID
7566 DDKAPI
7567 KeStallExecutionProcessor(
7568 IN ULONG MicroSeconds);
7569
7570 NTOSAPI
7571 BOOLEAN
7572 DDKAPI
7573 KeSynchronizeExecution(
7574 IN PKINTERRUPT Interrupt,
7575 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7576 IN PVOID SynchronizeContext);
7577
7578 NTOSAPI
7579 NTSTATUS
7580 DDKAPI
7581 KeWaitForMultipleObjects(
7582 IN ULONG Count,
7583 IN PVOID Object[],
7584 IN WAIT_TYPE WaitType,
7585 IN KWAIT_REASON WaitReason,
7586 IN KPROCESSOR_MODE WaitMode,
7587 IN BOOLEAN Alertable,
7588 IN PLARGE_INTEGER Timeout OPTIONAL,
7589 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
7590
7591 NTOSAPI
7592 NTSTATUS
7593 DDKAPI
7594 KeWaitForMutexObject(
7595 IN PRKMUTEX Mutex,
7596 IN KWAIT_REASON WaitReason,
7597 IN KPROCESSOR_MODE WaitMode,
7598 IN BOOLEAN Alertable,
7599 IN PLARGE_INTEGER Timeout OPTIONAL);
7600
7601 NTOSAPI
7602 NTSTATUS
7603 DDKAPI
7604 KeWaitForSingleObject(
7605 IN PVOID Object,
7606 IN KWAIT_REASON WaitReason,
7607 IN KPROCESSOR_MODE WaitMode,
7608 IN BOOLEAN Alertable,
7609 IN PLARGE_INTEGER Timeout OPTIONAL);
7610
7611
7612
7613 /** Memory manager routines **/
7614
7615 NTOSAPI
7616 NTSTATUS
7617 DDKAPI
7618 MmAdvanceMdl(
7619 IN PMDL Mdl,
7620 IN ULONG NumberOfBytes);
7621
7622 NTOSAPI
7623 PVOID
7624 DDKAPI
7625 MmAllocateContiguousMemory(
7626 IN ULONG NumberOfBytes,
7627 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
7628
7629 NTOSAPI
7630 PVOID
7631 DDKAPI
7632 MmAllocateContiguousMemorySpecifyCache(
7633 IN SIZE_T NumberOfBytes,
7634 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
7635 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
7636 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
7637 IN MEMORY_CACHING_TYPE CacheType);
7638
7639 NTOSAPI
7640 PVOID
7641 DDKAPI
7642 MmAllocateMappingAddress(
7643 IN SIZE_T NumberOfBytes,
7644 IN ULONG PoolTag);
7645
7646 NTOSAPI
7647 PVOID
7648 DDKAPI
7649 MmAllocateNonCachedMemory(
7650 IN ULONG NumberOfBytes);
7651
7652 NTOSAPI
7653 PMDL
7654 DDKAPI
7655 MmAllocatePagesForMdl(
7656 IN PHYSICAL_ADDRESS LowAddress,
7657 IN PHYSICAL_ADDRESS HighAddress,
7658 IN PHYSICAL_ADDRESS SkipBytes,
7659 IN SIZE_T TotalBytes);
7660
7661 NTOSAPI
7662 VOID
7663 DDKAPI
7664 MmBuildMdlForNonPagedPool(
7665 IN OUT PMDL MemoryDescriptorList);
7666
7667 NTOSAPI
7668 NTSTATUS
7669 DDKAPI
7670 MmCreateSection(
7671 OUT PSECTION_OBJECT *SectionObject,
7672 IN ACCESS_MASK DesiredAccess,
7673 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
7674 IN PLARGE_INTEGER MaximumSize,
7675 IN ULONG SectionPageProtection,
7676 IN ULONG AllocationAttributes,
7677 IN HANDLE FileHandle OPTIONAL,
7678 IN PFILE_OBJECT File OPTIONAL);
7679
7680 typedef enum _MMFLUSH_TYPE {
7681 MmFlushForDelete,
7682 MmFlushForWrite
7683 } MMFLUSH_TYPE;
7684
7685 NTOSAPI
7686 BOOLEAN
7687 DDKAPI
7688 MmFlushImageSection(
7689 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
7690 IN MMFLUSH_TYPE FlushType);
7691
7692 NTOSAPI
7693 VOID
7694 DDKAPI
7695 MmFreeContiguousMemory(
7696 IN PVOID BaseAddress);
7697
7698 NTOSAPI
7699 VOID
7700 DDKAPI
7701 MmFreeContiguousMemorySpecifyCache(
7702 IN PVOID BaseAddress,
7703 IN SIZE_T NumberOfBytes,
7704 IN MEMORY_CACHING_TYPE CacheType);
7705
7706 NTOSAPI
7707 VOID
7708 DDKAPI
7709 MmFreeMappingAddress(
7710 IN PVOID BaseAddress,
7711 IN ULONG PoolTag);
7712
7713 NTOSAPI
7714 VOID
7715 DDKAPI
7716 MmFreeNonCachedMemory(
7717 IN PVOID BaseAddress,
7718 IN SIZE_T NumberOfBytes);
7719
7720 NTOSAPI
7721 VOID
7722 DDKAPI
7723 MmFreePagesFromMdl(
7724 IN PMDL MemoryDescriptorList);
7725
7726 /*
7727 * ULONG
7728 * MmGetMdlByteCount(
7729 * IN PMDL Mdl)
7730 */
7731 #define MmGetMdlByteCount(_Mdl) \
7732 ((_Mdl)->ByteCount)
7733
7734 /*
7735 * ULONG
7736 * MmGetMdlByteOffset(
7737 * IN PMDL Mdl)
7738 */
7739 #define MmGetMdlByteOffset(_Mdl) \
7740 ((_Mdl)->ByteOffset)
7741
7742 /*
7743 * PPFN_NUMBER
7744 * MmGetMdlPfnArray(
7745 * IN PMDL Mdl)
7746 */
7747 #define MmGetMdlPfnArray(_Mdl) \
7748 ((PPFN_NUMBER) ((_Mdl) + 1))
7749
7750 /*
7751 * PVOID
7752 * MmGetMdlVirtualAddress(
7753 * IN PMDL Mdl)
7754 */
7755 #define MmGetMdlVirtualAddress(_Mdl) \
7756 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
7757
7758 NTOSAPI
7759 PHYSICAL_ADDRESS
7760 DDKAPI
7761 MmGetPhysicalAddress(
7762 IN PVOID BaseAddress);
7763
7764 NTOSAPI
7765 PPHYSICAL_MEMORY_RANGE
7766 DDKAPI
7767 MmGetPhysicalMemoryRanges(
7768 VOID);
7769
7770 NTOSAPI
7771 PVOID
7772 DDKAPI
7773 MmGetVirtualForPhysical(
7774 IN PHYSICAL_ADDRESS PhysicalAddress);
7775
7776 NTOSAPI
7777 PVOID
7778 DDKAPI
7779 MmMapLockedPagesSpecifyCache(
7780 IN PMDL MemoryDescriptorList,
7781 IN KPROCESSOR_MODE AccessMode,
7782 IN MEMORY_CACHING_TYPE CacheType,
7783 IN PVOID BaseAddress,
7784 IN ULONG BugCheckOnFailure,
7785 IN MM_PAGE_PRIORITY Priority);
7786
7787 NTOSAPI
7788 PVOID
7789 DDKAPI
7790 MmMapLockedPagesWithReservedMapping(
7791 IN PVOID MappingAddress,
7792 IN ULONG PoolTag,
7793 IN PMDL MemoryDescriptorList,
7794 IN MEMORY_CACHING_TYPE CacheType);
7795
7796 NTOSAPI
7797 NTSTATUS
7798 DDKAPI
7799 MmMapUserAddressesToPage(
7800 IN PVOID BaseAddress,
7801 IN SIZE_T NumberOfBytes,
7802 IN PVOID PageAddress);
7803
7804 NTOSAPI
7805 PVOID
7806 DDKAPI
7807 MmMapVideoDisplay(
7808 IN PHYSICAL_ADDRESS PhysicalAddress,
7809 IN SIZE_T NumberOfBytes,
7810 IN MEMORY_CACHING_TYPE CacheType);
7811
7812 NTOSAPI
7813 NTSTATUS
7814 DDKAPI
7815 MmMapViewInSessionSpace(
7816 IN PVOID Section,
7817 OUT PVOID *MappedBase,
7818 IN OUT PSIZE_T ViewSize);
7819
7820 NTOSAPI
7821 NTSTATUS
7822 DDKAPI
7823 MmMapViewInSystemSpace(
7824 IN PVOID Section,
7825 OUT PVOID *MappedBase,
7826 IN PSIZE_T ViewSize);
7827
7828 NTOSAPI
7829 NTSTATUS
7830 DDKAPI
7831 MmMarkPhysicalMemoryAsBad(
7832 IN PPHYSICAL_ADDRESS StartAddress,
7833 IN OUT PLARGE_INTEGER NumberOfBytes);
7834
7835 NTOSAPI
7836 NTSTATUS
7837 DDKAPI
7838 MmMarkPhysicalMemoryAsGood(
7839 IN PPHYSICAL_ADDRESS StartAddress,
7840 IN OUT PLARGE_INTEGER NumberOfBytes);
7841
7842 /*
7843 * PVOID
7844 * MmGetSystemAddressForMdlSafe(
7845 * IN PMDL Mdl,
7846 * IN MM_PAGE_PRIORITY Priority)
7847 */
7848 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
7849 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
7850 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
7851 (_Mdl)->MappedSystemVa : \
7852 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
7853 KernelMode, MmCached, NULL, FALSE, _Priority)
7854
7855 NTOSAPI
7856 PVOID
7857 DDKAPI
7858 MmGetSystemRoutineAddress(
7859 IN PUNICODE_STRING SystemRoutineName);
7860
7861 /*
7862 * ULONG
7863 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
7864 * IN PVOID Va,
7865 * IN ULONG Size)
7866 */
7867 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
7868 _Size) \
7869 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
7870 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
7871
7872 /*
7873 * VOID
7874 * MmInitializeMdl(
7875 * IN PMDL MemoryDescriptorList,
7876 * IN PVOID BaseVa,
7877 * IN SIZE_T Length)
7878 */
7879 #define MmInitializeMdl(_MemoryDescriptorList, \
7880 _BaseVa, \
7881 _Length) \
7882 { \
7883 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
7884 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
7885 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
7886 (_MemoryDescriptorList)->MdlFlags = 0; \
7887 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
7888 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
7889 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
7890 }
7891
7892 NTOSAPI
7893 BOOLEAN
7894 DDKAPI
7895 MmIsAddressValid(
7896 IN PVOID VirtualAddress);
7897
7898 NTOSAPI
7899 LOGICAL
7900 DDKAPI
7901 MmIsDriverVerifying(
7902 IN PDRIVER_OBJECT DriverObject);
7903
7904 NTOSAPI
7905 BOOLEAN
7906 DDKAPI
7907 MmIsThisAnNtAsSystem(
7908 VOID);
7909
7910 NTOSAPI
7911 NTSTATUS
7912 DDKAPI
7913 MmIsVerifierEnabled(
7914 OUT PULONG VerifierFlags);
7915
7916 NTOSAPI
7917 PVOID
7918 DDKAPI
7919 MmLockPagableDataSection(
7920 IN PVOID AddressWithinSection);
7921
7922 NTOSAPI
7923 PVOID
7924 DDKAPI
7925 MmLockPagableImageSection(
7926 IN PVOID AddressWithinSection);
7927
7928 /*
7929 * PVOID
7930 * MmLockPagableCodeSection(
7931 * IN PVOID AddressWithinSection)
7932 */
7933 #define MmLockPagableCodeSection MmLockPagableDataSection
7934
7935 NTOSAPI
7936 VOID
7937 DDKAPI
7938 MmLockPagableSectionByHandle(
7939 IN PVOID ImageSectionHandle);
7940
7941 NTOSAPI
7942 PVOID
7943 DDKAPI
7944 MmMapIoSpace(
7945 IN PHYSICAL_ADDRESS PhysicalAddress,
7946 IN ULONG NumberOfBytes,
7947 IN MEMORY_CACHING_TYPE CacheEnable);
7948
7949 NTOSAPI
7950 PVOID
7951 DDKAPI
7952 MmMapLockedPages(
7953 IN PMDL MemoryDescriptorList,
7954 IN KPROCESSOR_MODE AccessMode);
7955
7956 NTOSAPI
7957 VOID
7958 DDKAPI
7959 MmPageEntireDriver(
7960 IN PVOID AddressWithinSection);
7961
7962 NTOSAPI
7963 VOID
7964 DDKAPI
7965 MmProbeAndLockProcessPages(
7966 IN OUT PMDL MemoryDescriptorList,
7967 IN PEPROCESS Process,
7968 IN KPROCESSOR_MODE AccessMode,
7969 IN LOCK_OPERATION Operation);
7970
7971 NTOSAPI
7972 NTSTATUS
7973 DDKAPI
7974 MmProtectMdlSystemAddress(
7975 IN PMDL MemoryDescriptorList,
7976 IN ULONG NewProtect);
7977
7978 NTOSAPI
7979 VOID
7980 DDKAPI
7981 MmUnmapLockedPages(
7982 IN PVOID BaseAddress,
7983 IN PMDL MemoryDescriptorList);
7984
7985 NTOSAPI
7986 NTSTATUS
7987 DDKAPI
7988 MmUnmapViewInSessionSpace(
7989 IN PVOID MappedBase);
7990
7991 NTOSAPI
7992 NTSTATUS
7993 DDKAPI
7994 MmUnmapViewInSystemSpace(
7995 IN PVOID MappedBase);
7996
7997 NTOSAPI
7998 VOID
7999 DDKAPI
8000 MmUnsecureVirtualMemory(
8001 IN HANDLE SecureHandle);
8002
8003 /*
8004 * VOID
8005 * MmPrepareMdlForReuse(
8006 * IN PMDL Mdl)
8007 */
8008 #define MmPrepareMdlForReuse(_Mdl) \
8009 { \
8010 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8011 assert(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8012 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8013 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8014 assert(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8015 } \
8016 }
8017
8018 NTOSAPI
8019 VOID
8020 DDKAPI
8021 MmProbeAndLockPages(
8022 IN OUT PMDL MemoryDescriptorList,
8023 IN KPROCESSOR_MODE AccessMode,
8024 IN LOCK_OPERATION Operation);
8025
8026 NTOSAPI
8027 MM_SYSTEM_SIZE
8028 DDKAPI
8029 MmQuerySystemSize(
8030 VOID);
8031
8032 NTOSAPI
8033 NTSTATUS
8034 DDKAPI
8035 MmRemovePhysicalMemory(
8036 IN PPHYSICAL_ADDRESS StartAddress,
8037 IN OUT PLARGE_INTEGER NumberOfBytes);
8038
8039 NTOSAPI
8040 VOID
8041 DDKAPI
8042 MmResetDriverPaging(
8043 IN PVOID AddressWithinSection);
8044
8045 NTOSAPI
8046 HANDLE
8047 DDKAPI
8048 MmSecureVirtualMemory(
8049 IN PVOID Address,
8050 IN SIZE_T Size,
8051 IN ULONG ProbeMode);
8052
8053 NTOSAPI
8054 ULONG
8055 DDKAPI
8056 MmSizeOfMdl(
8057 IN PVOID Base,
8058 IN SIZE_T Length);
8059
8060 NTOSAPI
8061 VOID
8062 DDKAPI
8063 MmUnlockPagableImageSection(
8064 IN PVOID ImageSectionHandle);
8065
8066 NTOSAPI
8067 VOID
8068 DDKAPI
8069 MmUnlockPages(
8070 IN PMDL MemoryDescriptorList);
8071
8072 NTOSAPI
8073 VOID
8074 DDKAPI
8075 MmUnmapIoSpace(
8076 IN PVOID BaseAddress,
8077 IN SIZE_T NumberOfBytes);
8078
8079 NTOSAPI
8080 VOID
8081 DDKAPI
8082 MmUnmapReservedMapping(
8083 IN PVOID BaseAddress,
8084 IN ULONG PoolTag,
8085 IN PMDL MemoryDescriptorList);
8086
8087 NTOSAPI
8088 VOID
8089 DDKAPI
8090 MmUnmapVideoDisplay(
8091 IN PVOID BaseAddress,
8092 IN SIZE_T NumberOfBytes);
8093
8094
8095
8096 /** Object manager routines **/
8097
8098 NTOSAPI
8099 NTSTATUS
8100 DDKAPI
8101 ObAssignSecurity(
8102 IN PACCESS_STATE AccessState,
8103 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8104 IN PVOID Object,
8105 IN POBJECT_TYPE Type);
8106
8107 NTOSAPI
8108 VOID
8109 DDKAPI
8110 ObDereferenceSecurityDescriptor(
8111 PSECURITY_DESCRIPTOR SecurityDescriptor,
8112 ULONG Count);
8113
8114 NTOSAPI
8115 VOID
8116 DDKFASTAPI
8117 ObfDereferenceObject(
8118 IN PVOID Object);
8119
8120 /*
8121 * VOID
8122 * ObDereferenceObject(
8123 * IN PVOID Object)
8124 */
8125 #define ObDereferenceObject ObfDereferenceObject
8126
8127 NTOSAPI
8128 NTSTATUS
8129 DDKAPI
8130 ObGetObjectSecurity(
8131 IN PVOID Object,
8132 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
8133 OUT PBOOLEAN MemoryAllocated);
8134
8135 NTOSAPI
8136 NTSTATUS
8137 DDKAPI
8138 ObInsertObject(
8139 IN PVOID Object,
8140 IN PACCESS_STATE PassedAccessState OPTIONAL,
8141 IN ACCESS_MASK DesiredAccess,
8142 IN ULONG AdditionalReferences,
8143 OUT PVOID* ReferencedObject OPTIONAL,
8144 OUT PHANDLE Handle);
8145
8146 NTOSAPI
8147 VOID
8148 DDKFASTAPI
8149 ObfReferenceObject(
8150 IN PVOID Object);
8151
8152 NTOSAPI
8153 NTSTATUS
8154 DDKAPI
8155 ObLogSecurityDescriptor(
8156 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
8157 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
8158 IN ULONG RefBias);
8159 /*
8160 * VOID
8161 * ObReferenceObject(
8162 * IN PVOID Object)
8163 */
8164 #define ObReferenceObject ObfReferenceObject
8165
8166 NTOSAPI
8167 VOID
8168 DDKAPI
8169 ObMakeTemporaryObject(
8170 IN PVOID Object);
8171
8172 NTOSAPI
8173 NTSTATUS
8174 DDKAPI
8175 ObOpenObjectByName(
8176 IN POBJECT_ATTRIBUTES ObjectAttributes,
8177 IN POBJECT_TYPE ObjectType,
8178 IN OUT PVOID ParseContext OPTIONAL,
8179 IN KPROCESSOR_MODE AccessMode,
8180 IN ACCESS_MASK DesiredAccess,
8181 IN PACCESS_STATE PassedAccessState,
8182 OUT PHANDLE Handle);
8183
8184 NTOSAPI
8185 NTSTATUS
8186 DDKAPI
8187 ObOpenObjectByPointer(
8188 IN PVOID Object,
8189 IN ULONG HandleAttributes,
8190 IN PACCESS_STATE PassedAccessState OPTIONAL,
8191 IN ACCESS_MASK DesiredAccess OPTIONAL,
8192 IN POBJECT_TYPE ObjectType OPTIONAL,
8193 IN KPROCESSOR_MODE AccessMode,
8194 OUT PHANDLE Handle);
8195
8196 NTOSAPI
8197 NTSTATUS
8198 DDKAPI
8199 ObQueryObjectAuditingByHandle(
8200 IN HANDLE Handle,
8201 OUT PBOOLEAN GenerateOnClose);
8202
8203 NTOSAPI
8204 NTSTATUS
8205 DDKAPI
8206 ObReferenceObjectByHandle(
8207 IN HANDLE Handle,
8208 IN ACCESS_MASK DesiredAccess,
8209 IN POBJECT_TYPE ObjectType OPTIONAL,
8210 IN KPROCESSOR_MODE AccessMode,
8211 OUT PVOID *Object,
8212 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
8213
8214 NTOSAPI
8215 NTSTATUS
8216 DDKAPI
8217 ObReferenceObjectByName(
8218 IN PUNICODE_STRING ObjectPath,
8219 IN ULONG Attributes,
8220 IN PACCESS_STATE PassedAccessState OPTIONAL,
8221 IN ACCESS_MASK DesiredAccess OPTIONAL,
8222 IN POBJECT_TYPE ObjectType,
8223 IN KPROCESSOR_MODE AccessMode,
8224 IN OUT PVOID ParseContext OPTIONAL,
8225 OUT PVOID *Object);
8226
8227 NTOSAPI
8228 NTSTATUS
8229 DDKAPI
8230 ObReferenceObjectByPointer(
8231 IN PVOID Object,
8232 IN ACCESS_MASK DesiredAccess,
8233 IN POBJECT_TYPE ObjectType,
8234 IN KPROCESSOR_MODE AccessMode);
8235
8236 NTOSAPI
8237 VOID
8238 DDKAPI
8239 ObReferenceSecurityDescriptor(
8240 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8241 IN ULONG Count);
8242
8243 NTOSAPI
8244 VOID
8245 DDKAPI
8246 ObReleaseObjectSecurity(
8247 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8248 IN BOOLEAN MemoryAllocated);
8249
8250
8251
8252 /** Process manager routines **/
8253
8254 NTOSAPI
8255 NTSTATUS
8256 DDKAPI
8257 PsCreateSystemProcess(
8258 IN PHANDLE ProcessHandle,
8259 IN ACCESS_MASK DesiredAccess,
8260 IN POBJECT_ATTRIBUTES ObjectAttributes);
8261
8262 NTOSAPI
8263 NTSTATUS
8264 DDKAPI
8265 PsCreateSystemThread(
8266 OUT PHANDLE ThreadHandle,
8267 IN ULONG DesiredAccess,
8268 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8269 IN HANDLE ProcessHandle OPTIONAL,
8270 OUT PCLIENT_ID ClientId OPTIONAL,
8271 IN PKSTART_ROUTINE StartRoutine,
8272 IN PVOID StartContext);
8273
8274 /*
8275 * PEPROCESS
8276 * PsGetCurrentProcess(VOID)
8277 */
8278 #define PsGetCurrentProcess IoGetCurrentProcess
8279
8280 NTOSAPI
8281 HANDLE
8282 DDKAPI
8283 PsGetCurrentProcessId(
8284 VOID);
8285
8286 /*
8287 * PETHREAD
8288 * PsGetCurrentThread(VOID)
8289 */
8290 #define PsGetCurrentThread() \
8291 ((PETHREAD) KeGetCurrentThread())
8292
8293 NTOSAPI
8294 HANDLE
8295 DDKAPI
8296 PsGetCurrentThreadId(
8297 VOID);
8298
8299 NTOSAPI
8300 BOOLEAN
8301 DDKAPI
8302 PsGetVersion(
8303 PULONG MajorVersion OPTIONAL,
8304 PULONG MinorVersion OPTIONAL,
8305 PULONG BuildNumber OPTIONAL,
8306 PUNICODE_STRING CSDVersion OPTIONAL);
8307
8308 NTOSAPI
8309 NTSTATUS
8310 DDKAPI
8311 PsRemoveCreateThreadNotifyRoutine(
8312 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8313
8314 NTOSAPI
8315 NTSTATUS
8316 DDKAPI
8317 PsRemoveLoadImageNotifyRoutine(
8318 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8319
8320 NTOSAPI
8321 NTSTATUS
8322 DDKAPI
8323 PsSetCreateProcessNotifyRoutine(
8324 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
8325 IN BOOLEAN Remove);
8326
8327 NTOSAPI
8328 NTSTATUS
8329 DDKAPI
8330 PsSetCreateThreadNotifyRoutine(
8331 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8332
8333 NTOSAPI
8334 NTSTATUS
8335 DDKAPI
8336 PsSetLoadImageNotifyRoutine(
8337 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8338
8339 NTOSAPI
8340 NTSTATUS
8341 DDKAPI
8342 PsTerminateSystemThread(
8343 IN NTSTATUS ExitStatus);
8344
8345
8346
8347 /** Security reference monitor routines **/
8348
8349 NTOSAPI
8350 BOOLEAN
8351 DDKAPI
8352 SeAccessCheck(
8353 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8354 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8355 IN BOOLEAN SubjectContextLocked,
8356 IN ACCESS_MASK DesiredAccess,
8357 IN ACCESS_MASK PreviouslyGrantedAccess,
8358 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
8359 IN PGENERIC_MAPPING GenericMapping,
8360 IN KPROCESSOR_MODE AccessMode,
8361 OUT PACCESS_MASK GrantedAccess,
8362 OUT PNTSTATUS AccessStatus);
8363
8364 NTOSAPI
8365 NTSTATUS
8366 DDKAPI
8367 SeAssignSecurity(
8368 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8369 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8370 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8371 IN BOOLEAN IsDirectoryObject,
8372 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8373 IN PGENERIC_MAPPING GenericMapping,
8374 IN POOL_TYPE PoolType);
8375
8376 NTOSAPI
8377 NTSTATUS
8378 DDKAPI
8379 SeAssignSecurityEx(
8380 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8381 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8382 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8383 IN GUID *ObjectType OPTIONAL,
8384 IN BOOLEAN IsDirectoryObject,
8385 IN ULONG AutoInheritFlags,
8386 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8387 IN PGENERIC_MAPPING GenericMapping,
8388 IN POOL_TYPE PoolType);
8389
8390 NTOSAPI
8391 NTSTATUS
8392 DDKAPI
8393 SeDeassignSecurity(
8394 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
8395
8396 NTOSAPI
8397 BOOLEAN
8398 DDKAPI
8399 SeSinglePrivilegeCheck(
8400 LUID PrivilegeValue,
8401 KPROCESSOR_MODE PreviousMode);
8402
8403 NTOSAPI
8404 BOOLEAN
8405 DDKAPI
8406 SeValidSecurityDescriptor(
8407 IN ULONG Length,
8408 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8409
8410
8411
8412 /** NtXxx routines **/
8413
8414 NTOSAPI
8415 NTSTATUS
8416 DDKAPI
8417 NtOpenProcess(
8418 OUT PHANDLE ProcessHandle,
8419 IN ACCESS_MASK DesiredAccess,
8420 IN POBJECT_ATTRIBUTES ObjectAttributes,
8421 IN PCLIENT_ID ClientId OPTIONAL);
8422
8423 NTOSAPI
8424 NTSTATUS
8425 DDKAPI
8426 NtQueryInformationProcess(
8427 IN HANDLE ProcessHandle,
8428 IN PROCESSINFOCLASS ProcessInformationClass,
8429 OUT PVOID ProcessInformation,
8430 IN ULONG ProcessInformationLength,
8431 OUT PULONG ReturnLength OPTIONAL);
8432
8433
8434
8435 /** NtXxx and ZwXxx routines **/
8436
8437 NTOSAPI
8438 NTSTATUS
8439 DDKAPI
8440 ZwCancelTimer(
8441 IN HANDLE TimerHandle,
8442 OUT PBOOLEAN CurrentState OPTIONAL);
8443
8444 NTOSAPI
8445 NTSTATUS
8446 DDKAPI
8447 NtClose(
8448 IN HANDLE Handle);
8449
8450 NTOSAPI
8451 NTSTATUS
8452 DDKAPI
8453 ZwClose(
8454 IN HANDLE Handle);
8455
8456 NTOSAPI
8457 NTSTATUS
8458 DDKAPI
8459 ZwCreateDirectoryObject(
8460 OUT PHANDLE DirectoryHandle,
8461 IN ACCESS_MASK DesiredAccess,
8462 IN POBJECT_ATTRIBUTES ObjectAttributes);
8463
8464 NTOSAPI
8465 NTSTATUS
8466 DDKAPI
8467 NtCreateEvent(
8468 OUT PHANDLE EventHandle,
8469 IN ACCESS_MASK DesiredAccess,
8470 IN POBJECT_ATTRIBUTES ObjectAttributes,
8471 IN BOOLEAN ManualReset,
8472 IN BOOLEAN InitialState);
8473
8474 NTOSAPI
8475 NTSTATUS
8476 DDKAPI
8477 ZwCreateEvent(
8478 OUT PHANDLE EventHandle,
8479 IN ACCESS_MASK DesiredAccess,
8480 IN POBJECT_ATTRIBUTES ObjectAttributes,
8481 IN BOOLEAN ManualReset,
8482 IN BOOLEAN InitialState);
8483
8484 NTOSAPI
8485 NTSTATUS
8486 DDKAPI
8487 ZwCreateFile(
8488 OUT PHANDLE FileHandle,
8489 IN ACCESS_MASK DesiredAccess,
8490 IN POBJECT_ATTRIBUTES ObjectAttributes,
8491 OUT PIO_STATUS_BLOCK IoStatusBlock,
8492 IN PLARGE_INTEGER AllocationSize OPTIONAL,
8493 IN ULONG FileAttributes,
8494 IN ULONG ShareAccess,
8495 IN ULONG CreateDisposition,
8496 IN ULONG CreateOptions,
8497 IN PVOID EaBuffer OPTIONAL,
8498 IN ULONG EaLength);
8499
8500 NTOSAPI
8501 NTSTATUS
8502 DDKAPI
8503 ZwCreateKey(
8504 OUT PHANDLE KeyHandle,
8505 IN ACCESS_MASK DesiredAccess,
8506 IN POBJECT_ATTRIBUTES ObjectAttributes,
8507 IN ULONG TitleIndex,
8508 IN PUNICODE_STRING Class OPTIONAL,
8509 IN ULONG CreateOptions,
8510 OUT PULONG Disposition OPTIONAL);
8511
8512 NTOSAPI
8513 NTSTATUS
8514 DDKAPI
8515 ZwCreateTimer(
8516 OUT PHANDLE TimerHandle,
8517 IN ACCESS_MASK DesiredAccess,
8518 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8519 IN TIMER_TYPE TimerType);
8520
8521 NTOSAPI
8522 NTSTATUS
8523 DDKAPI
8524 ZwDeleteKey(
8525 IN HANDLE KeyHandle);
8526
8527 NTOSAPI
8528 NTSTATUS
8529 DDKAPI
8530 ZwDeleteValueKey(
8531 IN HANDLE KeyHandle,
8532 IN PUNICODE_STRING ValueName);
8533
8534 NTOSAPI
8535 NTSTATUS
8536 DDKAPI
8537 NtDeviceIoControlFile(
8538 IN HANDLE DeviceHandle,
8539 IN HANDLE Event OPTIONAL,
8540 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
8541 IN PVOID UserApcContext OPTIONAL,
8542 OUT PIO_STATUS_BLOCK IoStatusBlock,
8543 IN ULONG IoControlCode,
8544 IN PVOID InputBuffer,
8545 IN ULONG InputBufferSize,
8546 OUT PVOID OutputBuffer,
8547 IN ULONG OutputBufferSize);
8548
8549 NTOSAPI
8550 NTSTATUS
8551 DDKAPI
8552 ZwDeviceIoControlFile(
8553 IN HANDLE DeviceHandle,
8554 IN HANDLE Event OPTIONAL,
8555 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
8556 IN PVOID UserApcContext OPTIONAL,
8557 OUT PIO_STATUS_BLOCK IoStatusBlock,
8558 IN ULONG IoControlCode,
8559 IN PVOID InputBuffer,
8560 IN ULONG InputBufferSize,
8561 OUT PVOID OutputBuffer,
8562 IN ULONG OutputBufferSize);
8563
8564 NTOSAPI
8565 NTSTATUS
8566 DDKAPI
8567 ZwEnumerateKey(
8568 IN HANDLE KeyHandle,
8569 IN ULONG Index,
8570 IN KEY_INFORMATION_CLASS KeyInformationClass,
8571 OUT PVOID KeyInformation,
8572 IN ULONG Length,
8573 OUT PULONG ResultLength);
8574
8575 NTOSAPI
8576 NTSTATUS
8577 DDKAPI
8578 ZwEnumerateValueKey(
8579 IN HANDLE KeyHandle,
8580 IN ULONG Index,
8581 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8582 OUT PVOID KeyValueInformation,
8583 IN ULONG Length,
8584 OUT PULONG ResultLength);
8585
8586 NTOSAPI
8587 NTSTATUS
8588 DDKAPI
8589 ZwFlushKey(
8590 IN HANDLE KeyHandle);
8591
8592 NTOSAPI
8593 NTSTATUS
8594 DDKAPI
8595 ZwMakeTemporaryObject(
8596 IN HANDLE Handle);
8597
8598 NTOSAPI
8599 NTSTATUS
8600 DDKAPI
8601 NtMapViewOfSection(
8602 IN HANDLE SectionHandle,
8603 IN HANDLE ProcessHandle,
8604 IN OUT PVOID *BaseAddress,
8605 IN ULONG ZeroBits,
8606 IN ULONG CommitSize,
8607 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
8608 IN OUT PSIZE_T ViewSize,
8609 IN SECTION_INHERIT InheritDisposition,
8610 IN ULONG AllocationType,
8611 IN ULONG Protect);
8612
8613 NTOSAPI
8614 NTSTATUS
8615 DDKAPI
8616 ZwMapViewOfSection(
8617 IN HANDLE SectionHandle,
8618 IN HANDLE ProcessHandle,
8619 IN OUT PVOID *BaseAddress,
8620 IN ULONG ZeroBits,
8621 IN ULONG CommitSize,
8622 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
8623 IN OUT PSIZE_T ViewSize,
8624 IN SECTION_INHERIT InheritDisposition,
8625 IN ULONG AllocationType,
8626 IN ULONG Protect);
8627
8628 NTOSAPI
8629 NTSTATUS
8630 DDKAPI
8631 NtOpenFile(
8632 OUT PHANDLE FileHandle,
8633 IN ACCESS_MASK DesiredAccess,
8634 IN POBJECT_ATTRIBUTES ObjectAttributes,
8635 OUT PIO_STATUS_BLOCK IoStatusBlock,
8636 IN ULONG ShareAccess,
8637 IN ULONG OpenOptions);
8638
8639 NTOSAPI
8640 NTSTATUS
8641 DDKAPI
8642 ZwOpenFile(
8643 OUT PHANDLE FileHandle,
8644 IN ACCESS_MASK DesiredAccess,
8645 IN POBJECT_ATTRIBUTES ObjectAttributes,
8646 OUT PIO_STATUS_BLOCK IoStatusBlock,
8647 IN ULONG ShareAccess,
8648 IN ULONG OpenOptions);
8649
8650 NTOSAPI
8651 NTSTATUS
8652 DDKAPI
8653 ZwOpenKey(
8654 OUT PHANDLE KeyHandle,
8655 IN ACCESS_MASK DesiredAccess,
8656 IN POBJECT_ATTRIBUTES ObjectAttributes);
8657
8658 NTOSAPI
8659 NTSTATUS
8660 DDKAPI
8661 ZwOpenSection(
8662 OUT PHANDLE SectionHandle,
8663 IN ACCESS_MASK DesiredAccess,
8664 IN POBJECT_ATTRIBUTES ObjectAttributes);
8665
8666 NTOSAPI
8667 NTSTATUS
8668 DDKAPI
8669 ZwOpenSymbolicLinkObject(
8670 OUT PHANDLE LinkHandle,
8671 IN ACCESS_MASK DesiredAccess,
8672 IN POBJECT_ATTRIBUTES ObjectAttributes);
8673
8674 NTOSAPI
8675 NTSTATUS
8676 DDKAPI
8677 ZwOpenTimer(
8678 OUT PHANDLE TimerHandle,
8679 IN ACCESS_MASK DesiredAccess,
8680 IN POBJECT_ATTRIBUTES ObjectAttributes);
8681
8682 NTOSAPI
8683 NTSTATUS
8684 DDKAPI
8685 ZwQueryInformationFile(
8686 IN HANDLE FileHandle,
8687 OUT PIO_STATUS_BLOCK IoStatusBlock,
8688 OUT PVOID FileInformation,
8689 IN ULONG Length,
8690 IN FILE_INFORMATION_CLASS FileInformationClass);
8691
8692 NTOSAPI
8693 NTSTATUS
8694 DDKAPI
8695 ZwQueryKey(
8696 IN HANDLE KeyHandle,
8697 IN KEY_INFORMATION_CLASS KeyInformationClass,
8698 OUT PVOID KeyInformation,
8699 IN ULONG Length,
8700 OUT PULONG ResultLength);
8701
8702 NTOSAPI
8703 NTSTATUS
8704 DDKAPI
8705 ZwQuerySymbolicLinkObject(
8706 IN HANDLE LinkHandle,
8707 IN OUT PUNICODE_STRING LinkTarget,
8708 OUT PULONG ReturnedLength OPTIONAL);
8709
8710 NTOSAPI
8711 NTSTATUS
8712 DDKAPI
8713 ZwQueryValueKey(
8714 IN HANDLE KeyHandle,
8715 IN PUNICODE_STRING ValueName,
8716 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
8717 OUT PVOID KeyValueInformation,
8718 IN ULONG Length,
8719 OUT PULONG ResultLength);
8720
8721 NTOSAPI
8722 NTSTATUS
8723 DDKAPI
8724 NtReadFile(
8725 IN HANDLE FileHandle,
8726 IN HANDLE Event OPTIONAL,
8727 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8728 IN PVOID ApcContext OPTIONAL,
8729 OUT PIO_STATUS_BLOCK IoStatusBlock,
8730 OUT PVOID Buffer,
8731 IN ULONG Length,
8732 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8733 IN PULONG Key OPTIONAL);
8734
8735 NTOSAPI
8736 NTSTATUS
8737 DDKAPI
8738 ZwReadFile(
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 NtSetEvent(
8753 IN HANDLE EventHandle,
8754 IN PULONG NumberOfThreadsReleased);
8755
8756 NTOSAPI
8757 NTSTATUS
8758 DDKAPI
8759 ZwSetEvent(
8760 IN HANDLE EventHandle,
8761 IN PULONG NumberOfThreadsReleased);
8762
8763 NTOSAPI
8764 NTSTATUS
8765 DDKAPI
8766 ZwSetInformationFile(
8767 IN HANDLE FileHandle,
8768 OUT PIO_STATUS_BLOCK IoStatusBlock,
8769 IN PVOID FileInformation,
8770 IN ULONG Length,
8771 IN FILE_INFORMATION_CLASS FileInformationClass);
8772
8773 NTOSAPI
8774 NTSTATUS
8775 DDKAPI
8776 ZwSetInformationThread(
8777 IN HANDLE ThreadHandle,
8778 IN THREADINFOCLASS ThreadInformationClass,
8779 IN PVOID ThreadInformation,
8780 IN ULONG ThreadInformationLength);
8781
8782 NTOSAPI
8783 NTSTATUS
8784 DDKAPI
8785 ZwSetTimer(
8786 IN HANDLE TimerHandle,
8787 IN PLARGE_INTEGER DueTime,
8788 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
8789 IN PVOID TimerContext OPTIONAL,
8790 IN BOOLEAN WakeTimer,
8791 IN LONG Period OPTIONAL,
8792 OUT PBOOLEAN PreviousState OPTIONAL);
8793
8794 NTOSAPI
8795 NTSTATUS
8796 DDKAPI
8797 ZwSetValueKey(
8798 IN HANDLE KeyHandle,
8799 IN PUNICODE_STRING ValueName,
8800 IN ULONG TitleIndex OPTIONAL,
8801 IN ULONG Type,
8802 IN PVOID Data,
8803 IN ULONG DataSize);
8804
8805 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
8806 #define AT_EXTENDABLE_FILE 0x00002000
8807 #define SEC_NO_CHANGE 0x00400000
8808 #define AT_RESERVED 0x20000000
8809 #define AT_ROUND_TO_PAGE 0x40000000
8810
8811 NTOSAPI
8812 NTSTATUS
8813 DDKAPI
8814 NtUnmapViewOfSection(
8815 IN HANDLE ProcessHandle,
8816 IN PVOID BaseAddress);
8817
8818 NTOSAPI
8819 NTSTATUS
8820 DDKAPI
8821 ZwUnmapViewOfSection(
8822 IN HANDLE ProcessHandle,
8823 IN PVOID BaseAddress);
8824
8825 NTOSAPI
8826 NTSTATUS
8827 DDKAPI
8828 NtWaitForSingleObject(
8829 IN HANDLE Object,
8830 IN BOOLEAN Alertable,
8831 IN PLARGE_INTEGER Time);
8832
8833 NTOSAPI
8834 NTSTATUS
8835 DDKAPI
8836 ZwWaitForSingleObject(
8837 IN HANDLE Object,
8838 IN BOOLEAN Alertable,
8839 IN PLARGE_INTEGER Time);
8840
8841 NTOSAPI
8842 NTSTATUS
8843 DDKAPI
8844 NtWriteFile(
8845 IN HANDLE FileHandle,
8846 IN HANDLE Event OPTIONAL,
8847 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
8848 IN PVOID ApcContext OPTIONAL,
8849 OUT PIO_STATUS_BLOCK IoStatusBlock,
8850 IN PVOID Buffer,
8851 IN ULONG Length,
8852 IN PLARGE_INTEGER ByteOffset OPTIONAL,
8853 IN PULONG Key OPTIONAL);
8854
8855 NTOSAPI
8856 NTSTATUS
8857 DDKAPI
8858 ZwWriteFile(
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
8870
8871 /** Power management support routines **/
8872
8873 NTOSAPI
8874 NTSTATUS
8875 DDKAPI
8876 PoCallDriver(
8877 IN PDEVICE_OBJECT DeviceObject,
8878 IN OUT PIRP Irp);
8879
8880 NTOSAPI
8881 PULONG
8882 DDKAPI
8883 PoRegisterDeviceForIdleDetection(
8884 IN PDEVICE_OBJECT DeviceObject,
8885 IN ULONG ConservationIdleTime,
8886 IN ULONG PerformanceIdleTime,
8887 IN DEVICE_POWER_STATE State);
8888
8889 NTOSAPI
8890 PVOID
8891 DDKAPI
8892 PoRegisterSystemState(
8893 IN PVOID StateHandle,
8894 IN EXECUTION_STATE Flags);
8895
8896 NTOSAPI
8897 NTSTATUS
8898 DDKAPI
8899 PoRequestPowerIrp(
8900 IN PDEVICE_OBJECT DeviceObject,
8901 IN UCHAR MinorFunction,
8902 IN POWER_STATE PowerState,
8903 IN PREQUEST_POWER_COMPLETE CompletionFunction,
8904 IN PVOID Context,
8905 OUT PIRP *Irp OPTIONAL);
8906
8907 NTOSAPI
8908 NTSTATUS
8909 DDKAPI
8910 PoRequestShutdownEvent(
8911 OUT PVOID *Event);
8912
8913 NTOSAPI
8914 VOID
8915 DDKAPI
8916 PoSetDeviceBusy(
8917 PULONG IdlePointer);
8918
8919 NTOSAPI
8920 POWER_STATE
8921 DDKAPI
8922 PoSetPowerState(
8923 IN PDEVICE_OBJECT DeviceObject,
8924 IN POWER_STATE_TYPE Type,
8925 IN POWER_STATE State);
8926
8927 NTOSAPI
8928 VOID
8929 DDKAPI
8930 PoSetSystemState(
8931 IN EXECUTION_STATE Flags);
8932
8933 NTOSAPI
8934 VOID
8935 DDKAPI
8936 PoStartNextPowerIrp(
8937 IN PIRP Irp);
8938
8939 NTOSAPI
8940 VOID
8941 DDKAPI
8942 PoUnregisterSystemState(
8943 IN PVOID StateHandle);
8944
8945
8946
8947 /** WMI library support routines **/
8948
8949 NTOSAPI
8950 NTSTATUS
8951 DDKAPI
8952 WmiCompleteRequest(
8953 IN PDEVICE_OBJECT DeviceObject,
8954 IN PIRP Irp,
8955 IN NTSTATUS Status,
8956 IN ULONG BufferUsed,
8957 IN CCHAR PriorityBoost);
8958
8959 NTOSAPI
8960 NTSTATUS
8961 DDKAPI
8962 WmiFireEvent(
8963 IN PDEVICE_OBJECT DeviceObject,
8964 IN LPGUID Guid,
8965 IN ULONG InstanceIndex,
8966 IN ULONG EventDataSize,
8967 IN PVOID EventData);
8968
8969 NTOSAPI
8970 NTSTATUS
8971 DDKAPI
8972 WmiQueryTraceInformation(
8973 IN TRACE_INFORMATION_CLASS TraceInformationClass,
8974 OUT PVOID TraceInformation,
8975 IN ULONG TraceInformationLength,
8976 OUT PULONG RequiredLength OPTIONAL,
8977 IN PVOID Buffer OPTIONAL);
8978
8979 NTOSAPI
8980 NTSTATUS
8981 DDKAPI
8982 WmiSystemControl(
8983 IN PWMILIB_CONTEXT WmiLibInfo,
8984 IN PDEVICE_OBJECT DeviceObject,
8985 IN PIRP Irp,
8986 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
8987
8988 NTOSAPI
8989 NTSTATUS
8990 DDKCDECLAPI
8991 WmiTraceMessage(
8992 IN TRACEHANDLE LoggerHandle,
8993 IN ULONG MessageFlags,
8994 IN LPGUID MessageGuid,
8995 IN USHORT MessageNumber,
8996 IN ...);
8997
8998 #if 0
8999 /* FIXME: Get va_list from where? */
9000 NTOSAPI
9001 NTSTATUS
9002 DDKCDECLAPI
9003 WmiTraceMessageVa(
9004 IN TRACEHANDLE LoggerHandle,
9005 IN ULONG MessageFlags,
9006 IN LPGUID MessageGuid,
9007 IN USHORT MessageNumber,
9008 IN va_list MessageArgList);
9009 #endif
9010
9011
9012 /** Kernel debugger routines **/
9013
9014 NTOSAPI
9015 VOID
9016 DDKAPI
9017 KdDisableDebugger(
9018 VOID);
9019
9020 NTOSAPI
9021 VOID
9022 DDKAPI
9023 KdEnableDebugger(
9024 VOID);
9025
9026 NTOSAPI
9027 VOID
9028 DDKAPI
9029 DbgBreakPoint(
9030 VOID);
9031
9032 NTOSAPI
9033 VOID
9034 DDKAPI
9035 DbgBreakPointWithStatus(
9036 IN ULONG Status);
9037
9038 NTOSAPI
9039 ULONG
9040 DDKCDECLAPI
9041 DbgPrint(
9042 IN PCH Format,
9043 IN ...);
9044
9045 NTOSAPI
9046 ULONG
9047 DDKCDECLAPI
9048 DbgPrintEx(
9049 IN ULONG ComponentId,
9050 IN ULONG Level,
9051 IN PCH Format,
9052 IN ...);
9053
9054 NTOSAPI
9055 ULONG
9056 DDKCDECLAPI
9057 DbgPrintReturnControlC(
9058 IN PCH Format,
9059 IN ...);
9060
9061 NTOSAPI
9062 NTSTATUS
9063 DDKAPI
9064 DbgQueryDebugFilterState(
9065 IN ULONG ComponentId,
9066 IN ULONG Level);
9067
9068 NTOSAPI
9069 NTSTATUS
9070 DDKAPI
9071 DbgSetDebugFilterState(
9072 IN ULONG ComponentId,
9073 IN ULONG Level,
9074 IN BOOLEAN State);
9075
9076 #ifdef DBG
9077
9078 #define KdPrint(_x_) DbgPrint _x_
9079 #define KdPrintEx(_x_) DbgPrintEx _x_
9080 #define KdBreakPoint() DbgBreakPoint()
9081 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9082
9083 #else /* !DBG */
9084
9085 #define KdPrint(_x_)
9086 #define KdPrintEx(_x_)
9087 #define KdBreakPoint()
9088 #define KdBreakPointWithStatus(s)
9089
9090 #endif /* !DBG */
9091
9092 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
9093 extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
9094 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9095 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9096
9097 #pragma pack(pop)
9098
9099 #ifdef __cplusplus
9100 }
9101 #endif
9102
9103 #endif /* __WINDDK_H */