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