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