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