disable assert until someone fixes this
[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 #define PCI_ADDRESS_IO_SPACE 0x01
3235 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x06
3236 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x08
3237 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
3238 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
3239 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
3240
3241 #define PCI_TYPE_32BIT 0
3242 #define PCI_TYPE_20BIT 2
3243 #define PCI_TYPE_64BIT 4
3244
3245 typedef struct _PCI_SLOT_NUMBER {
3246 union {
3247 struct {
3248 ULONG DeviceNumber : 5;
3249 ULONG FunctionNumber : 3;
3250 ULONG Reserved : 24;
3251 } bits;
3252 ULONG AsULONG;
3253 } u;
3254 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
3255
3256 typedef enum _POOL_TYPE {
3257 NonPagedPool,
3258 PagedPool,
3259 NonPagedPoolMustSucceed,
3260 DontUseThisType,
3261 NonPagedPoolCacheAligned,
3262 PagedPoolCacheAligned,
3263 NonPagedPoolCacheAlignedMustS,
3264 MaxPoolType,
3265 NonPagedPoolSession = 32,
3266 PagedPoolSession,
3267 NonPagedPoolMustSucceedSession,
3268 DontUseThisTypeSession,
3269 NonPagedPoolCacheAlignedSession,
3270 PagedPoolCacheAlignedSession,
3271 NonPagedPoolCacheAlignedMustSSession
3272 } POOL_TYPE;
3273
3274 typedef enum _EX_POOL_PRIORITY {
3275 LowPoolPriority,
3276 LowPoolPrioritySpecialPoolOverrun = 8,
3277 LowPoolPrioritySpecialPoolUnderrun = 9,
3278 NormalPoolPriority = 16,
3279 NormalPoolPrioritySpecialPoolOverrun = 24,
3280 NormalPoolPrioritySpecialPoolUnderrun = 25,
3281 HighPoolPriority = 32,
3282 HighPoolPrioritySpecialPoolOverrun = 40,
3283 HighPoolPrioritySpecialPoolUnderrun = 41
3284 } EX_POOL_PRIORITY;
3285
3286 /* PRIVILEGE_SET.Control */
3287
3288 #define PRIVILEGE_SET_ALL_NECESSARY 1
3289
3290 typedef struct _RTL_OSVERSIONINFOW {
3291 ULONG dwOSVersionInfoSize;
3292 ULONG dwMajorVersion;
3293 ULONG dwMinorVersion;
3294 ULONG dwBuildNumber;
3295 ULONG dwPlatformId;
3296 WCHAR szCSDVersion[128];
3297 } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
3298
3299 typedef struct _RTL_OSVERSIONINFOEXW {
3300 ULONG dwOSVersionInfoSize;
3301 ULONG dwMajorVersion;
3302 ULONG dwMinorVersion;
3303 ULONG dwBuildNumber;
3304 ULONG dwPlatformId;
3305 WCHAR szCSDVersion[128];
3306 USHORT wServicePackMajor;
3307 USHORT wServicePackMinor;
3308 USHORT wSuiteMask;
3309 UCHAR wProductType;
3310 UCHAR wReserved;
3311 } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
3312
3313 NTOSAPI
3314 ULONGLONG
3315 DDKAPI
3316 VerSetConditionMask(
3317 IN ULONGLONG ConditionMask,
3318 IN ULONG TypeMask,
3319 IN UCHAR Condition);
3320
3321 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
3322 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
3323 (TypeBitMask), (ComparisonType)))
3324
3325 /* RtlVerifyVersionInfo() TypeMask */
3326
3327 #define VER_MINORVERSION 0x0000001
3328 #define VER_MAJORVERSION 0x0000002
3329 #define VER_BUILDNUMBER 0x0000004
3330 #define VER_PLATFORMID 0x0000008
3331 #define VER_SERVICEPACKMINOR 0x0000010
3332 #define VER_SERVICEPACKMAJOR 0x0000020
3333 #define VER_SUITENAME 0x0000040
3334 #define VER_PRODUCT_TYPE 0x0000080
3335
3336 /* RtlVerifyVersionInfo() ComparisonType */
3337
3338 #define VER_EQUAL 1
3339 #define VER_GREATER 2
3340 #define VER_GREATER_EQUAL 3
3341 #define VER_LESS 4
3342 #define VER_LESS_EQUAL 5
3343 #define VER_AND 6
3344 #define VER_OR 7
3345
3346 #define VER_CONDITION_MASK 7
3347 #define VER_NUM_BITS_PER_CONDITION_MASK 3
3348
3349 typedef struct _RTL_BITMAP {
3350 ULONG SizeOfBitMap;
3351 PULONG Buffer;
3352 } RTL_BITMAP, *PRTL_BITMAP;
3353
3354 typedef struct _RTL_BITMAP_RUN {
3355 ULONG StartingIndex;
3356 ULONG NumberOfBits;
3357 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
3358
3359 typedef NTSTATUS DDKAPI
3360 (*PRTL_QUERY_REGISTRY_ROUTINE)(
3361 IN PWSTR ValueName,
3362 IN ULONG ValueType,
3363 IN PVOID ValueData,
3364 IN ULONG ValueLength,
3365 IN PVOID Context,
3366 IN PVOID EntryContext);
3367
3368 #define RTL_REGISTRY_ABSOLUTE 0
3369 #define RTL_REGISTRY_SERVICES 1
3370 #define RTL_REGISTRY_CONTROL 2
3371 #define RTL_REGISTRY_WINDOWS_NT 3
3372 #define RTL_REGISTRY_DEVICEMAP 4
3373 #define RTL_REGISTRY_USER 5
3374 #define RTL_REGISTRY_HANDLE 0x40000000
3375 #define RTL_REGISTRY_OPTIONAL 0x80000000
3376
3377 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3378 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3379 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3380 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3381 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3382 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3383 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3384 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3385
3386 typedef struct _RTL_QUERY_REGISTRY_TABLE {
3387 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
3388 ULONG Flags;
3389 PWSTR Name;
3390 PVOID EntryContext;
3391 ULONG DefaultType;
3392 PVOID DefaultData;
3393 ULONG DefaultLength;
3394 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
3395
3396 typedef struct _TIME_FIELDS {
3397 CSHORT Year;
3398 CSHORT Month;
3399 CSHORT Day;
3400 CSHORT Hour;
3401 CSHORT Minute;
3402 CSHORT Second;
3403 CSHORT Milliseconds;
3404 CSHORT Weekday;
3405 } TIME_FIELDS, *PTIME_FIELDS;
3406
3407 typedef PVOID DDKAPI
3408 (*PALLOCATE_FUNCTION)(
3409 IN POOL_TYPE PoolType,
3410 IN SIZE_T NumberOfBytes,
3411 IN ULONG Tag);
3412
3413 typedef VOID DDKAPI
3414 (*PFREE_FUNCTION)(
3415 IN PVOID Buffer);
3416
3417 #define GENERAL_LOOKASIDE_S \
3418 SLIST_HEADER ListHead; \
3419 USHORT Depth; \
3420 USHORT MaximumDepth; \
3421 ULONG TotalAllocates; \
3422 _ANONYMOUS_UNION union { \
3423 ULONG AllocateMisses; \
3424 ULONG AllocateHits; \
3425 } DUMMYUNIONNAME; \
3426 ULONG TotalFrees; \
3427 _ANONYMOUS_UNION union { \
3428 ULONG FreeMisses; \
3429 ULONG FreeHits; \
3430 } DUMMYUNIONNAME2; \
3431 POOL_TYPE Type; \
3432 ULONG Tag; \
3433 ULONG Size; \
3434 PALLOCATE_FUNCTION Allocate; \
3435 PFREE_FUNCTION Free; \
3436 LIST_ENTRY ListEntry; \
3437 ULONG LastTotalAllocates; \
3438 _ANONYMOUS_UNION union { \
3439 ULONG LastAllocateMisses; \
3440 ULONG LastAllocateHits; \
3441 } DUMMYUNIONNAME3; \
3442 ULONG Future[2];
3443
3444 typedef struct _GENERAL_LOOKASIDE {
3445 GENERAL_LOOKASIDE_S
3446 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
3447
3448 typedef struct _NPAGED_LOOKASIDE_LIST {
3449 GENERAL_LOOKASIDE_S
3450 KSPIN_LOCK Obsoleted;
3451 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
3452
3453 typedef struct _PAGED_LOOKASIDE_LIST {
3454 GENERAL_LOOKASIDE_S
3455 FAST_MUTEX Obsoleted;
3456 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
3457
3458 typedef struct _PP_LOOKASIDE_LIST {
3459 struct _GENERAL_LOOKASIDE *P;
3460 struct _GENERAL_LOOKASIDE *L;
3461 } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST;
3462
3463 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
3464
3465 typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
3466 IN PVOID CallbackContext,
3467 IN PVOID Argument1,
3468 IN PVOID Argument2);
3469
3470 typedef enum _EVENT_TYPE {
3471 NotificationEvent,
3472 SynchronizationEvent
3473 } EVENT_TYPE;
3474
3475 typedef enum _KWAIT_REASON {
3476 Executive,
3477 FreePage,
3478 PageIn,
3479 PoolAllocation,
3480 DelayExecution,
3481 Suspended,
3482 UserRequest,
3483 WrExecutive,
3484 WrFreePage,
3485 WrPageIn,
3486 WrPoolAllocation,
3487 WrDelayExecution,
3488 WrSuspended,
3489 WrUserRequest,
3490 WrEventPair,
3491 WrQueue,
3492 WrLpcReceive,
3493 WrLpcReply,
3494 WrVirtualMemory,
3495 WrPageOut,
3496 WrRendezvous,
3497 Spare2,
3498 Spare3,
3499 Spare4,
3500 Spare5,
3501 Spare6,
3502 WrKernel,
3503 MaximumWaitReason
3504 } KWAIT_REASON;
3505
3506 typedef struct _KWAIT_BLOCK {
3507 LIST_ENTRY WaitListEntry;
3508 struct _KTHREAD * RESTRICTED_POINTER Thread;
3509 PVOID Object;
3510 struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock;
3511 USHORT WaitKey;
3512 USHORT WaitType;
3513 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
3514
3515 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
3516
3517 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
3518 BOOLEAN Removed;
3519 BOOLEAN Reserved[3];
3520 LONG IoCount;
3521 KEVENT RemoveEvent;
3522 } IO_REMOVE_LOCK_COMMON_BLOCK;
3523
3524 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
3525 LONG Signature;
3526 LONG HighWatermark;
3527 LONGLONG MaxLockedTicks;
3528 LONG AllocateTag;
3529 LIST_ENTRY LockList;
3530 KSPIN_LOCK Spin;
3531 LONG LowMemoryCount;
3532 ULONG Reserved1[4];
3533 PVOID Reserved2;
3534 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
3535 } IO_REMOVE_LOCK_DBG_BLOCK;
3536
3537 typedef struct _IO_REMOVE_LOCK {
3538 IO_REMOVE_LOCK_COMMON_BLOCK Common;
3539 #ifdef DBG
3540 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
3541 #endif
3542 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
3543
3544 typedef struct _IO_WORKITEM *PIO_WORKITEM;
3545
3546 typedef VOID DDKAPI
3547 (*PIO_WORKITEM_ROUTINE)(
3548 IN PDEVICE_OBJECT DeviceObject,
3549 IN PVOID Context);
3550
3551 typedef struct _SHARE_ACCESS {
3552 ULONG OpenCount;
3553 ULONG Readers;
3554 ULONG Writers;
3555 ULONG Deleters;
3556 ULONG SharedRead;
3557 ULONG SharedWrite;
3558 ULONG SharedDelete;
3559 } SHARE_ACCESS, *PSHARE_ACCESS;
3560
3561 typedef enum _KINTERRUPT_MODE {
3562 LevelSensitive,
3563 Latched
3564 } KINTERRUPT_MODE;
3565
3566 typedef VOID DDKAPI
3567 (*PKINTERRUPT_ROUTINE)(
3568 VOID);
3569
3570 typedef enum _KPROFILE_SOURCE {
3571 ProfileTime,
3572 ProfileAlignmentFixup,
3573 ProfileTotalIssues,
3574 ProfilePipelineDry,
3575 ProfileLoadInstructions,
3576 ProfilePipelineFrozen,
3577 ProfileBranchInstructions,
3578 ProfileTotalNonissues,
3579 ProfileDcacheMisses,
3580 ProfileIcacheMisses,
3581 ProfileCacheMisses,
3582 ProfileBranchMispredictions,
3583 ProfileStoreInstructions,
3584 ProfileFpInstructions,
3585 ProfileIntegerInstructions,
3586 Profile2Issue,
3587 Profile3Issue,
3588 Profile4Issue,
3589 ProfileSpecialInstructions,
3590 ProfileTotalCycles,
3591 ProfileIcacheIssues,
3592 ProfileDcacheAccesses,
3593 ProfileMemoryBarrierCycles,
3594 ProfileLoadLinkedIssues,
3595 ProfileMaximum
3596 } KPROFILE_SOURCE;
3597
3598 typedef enum _CREATE_FILE_TYPE {
3599 CreateFileTypeNone,
3600 CreateFileTypeNamedPipe,
3601 CreateFileTypeMailslot
3602 } CREATE_FILE_TYPE;
3603
3604 typedef struct _CONFIGURATION_INFORMATION {
3605 ULONG DiskCount;
3606 ULONG FloppyCount;
3607 ULONG CdRomCount;
3608 ULONG TapeCount;
3609 ULONG ScsiPortCount;
3610 ULONG SerialCount;
3611 ULONG ParallelCount;
3612 BOOLEAN AtDiskPrimaryAddressClaimed;
3613 BOOLEAN AtDiskSecondaryAddressClaimed;
3614 ULONG Version;
3615 ULONG MediumChangerCount;
3616 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3617
3618 typedef enum _CONFIGURATION_TYPE {
3619 ArcSystem,
3620 CentralProcessor,
3621 FloatingPointProcessor,
3622 PrimaryIcache,
3623 PrimaryDcache,
3624 SecondaryIcache,
3625 SecondaryDcache,
3626 SecondaryCache,
3627 EisaAdapter,
3628 TcAdapter,
3629 ScsiAdapter,
3630 DtiAdapter,
3631 MultiFunctionAdapter,
3632 DiskController,
3633 TapeController,
3634 CdromController,
3635 WormController,
3636 SerialController,
3637 NetworkController,
3638 DisplayController,
3639 ParallelController,
3640 PointerController,
3641 KeyboardController,
3642 AudioController,
3643 OtherController,
3644 DiskPeripheral,
3645 FloppyDiskPeripheral,
3646 TapePeripheral,
3647 ModemPeripheral,
3648 MonitorPeripheral,
3649 PrinterPeripheral,
3650 PointerPeripheral,
3651 KeyboardPeripheral,
3652 TerminalPeripheral,
3653 OtherPeripheral,
3654 LinePeripheral,
3655 NetworkPeripheral,
3656 SystemMemory,
3657 DockingInformation,
3658 RealModeIrqRoutingTable,
3659 MaximumType
3660 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
3661
3662 typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
3663 IN PVOID Context,
3664 IN PUNICODE_STRING PathName,
3665 IN INTERFACE_TYPE BusType,
3666 IN ULONG BusNumber,
3667 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
3668 IN CONFIGURATION_TYPE ControllerType,
3669 IN ULONG ControllerNumber,
3670 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3671 IN CONFIGURATION_TYPE PeripheralType,
3672 IN ULONG PeripheralNumber,
3673 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3674
3675 typedef enum _WORK_QUEUE_TYPE {
3676 CriticalWorkQueue,
3677 DelayedWorkQueue,
3678 HyperCriticalWorkQueue,
3679 MaximumWorkQueue
3680 } WORK_QUEUE_TYPE;
3681
3682 typedef VOID DDKAPI
3683 (*PWORKER_THREAD_ROUTINE)(
3684 IN PVOID Parameter);
3685
3686 typedef struct _WORK_QUEUE_ITEM {
3687 LIST_ENTRY List;
3688 PWORKER_THREAD_ROUTINE WorkerRoutine;
3689 PVOID Parameter;
3690 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
3691
3692 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
3693 BufferEmpty,
3694 BufferInserted,
3695 BufferStarted,
3696 BufferFinished,
3697 BufferIncomplete
3698 } KBUGCHECK_BUFFER_DUMP_STATE;
3699
3700 typedef VOID DDKAPI
3701 (*PKBUGCHECK_CALLBACK_ROUTINE)(
3702 IN PVOID Buffer,
3703 IN ULONG Length);
3704
3705 typedef struct _KBUGCHECK_CALLBACK_RECORD {
3706 LIST_ENTRY Entry;
3707 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
3708 PVOID Buffer;
3709 ULONG Length;
3710 PUCHAR Component;
3711 ULONG_PTR Checksum;
3712 UCHAR State;
3713 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
3714
3715 /*
3716 * VOID
3717 * KeInitializeCallbackRecord(
3718 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
3719 */
3720 #define KeInitializeCallbackRecord(CallbackRecord) \
3721 CallbackRecord->State = BufferEmpty;
3722
3723 typedef enum _KDPC_IMPORTANCE {
3724 LowImportance,
3725 MediumImportance,
3726 HighImportance
3727 } KDPC_IMPORTANCE;
3728
3729 typedef enum _MEMORY_CACHING_TYPE_ORIG {
3730 MmFrameBufferCached = 2
3731 } MEMORY_CACHING_TYPE_ORIG;
3732
3733 typedef enum _MEMORY_CACHING_TYPE {
3734 MmNonCached = FALSE,
3735 MmCached = TRUE,
3736 MmWriteCombined = MmFrameBufferCached,
3737 MmHardwareCoherentCached,
3738 MmNonCachedUnordered,
3739 MmUSWCCached,
3740 MmMaximumCacheType
3741 } MEMORY_CACHING_TYPE;
3742
3743 typedef enum _MM_PAGE_PRIORITY {
3744 LowPagePriority,
3745 NormalPagePriority = 16,
3746 HighPagePriority = 32
3747 } MM_PAGE_PRIORITY;
3748
3749 typedef enum _LOCK_OPERATION {
3750 IoReadAccess,
3751 IoWriteAccess,
3752 IoModifyAccess
3753 } LOCK_OPERATION;
3754
3755 typedef enum _MM_SYSTEM_SIZE {
3756 MmSmallSystem,
3757 MmMediumSystem,
3758 MmLargeSystem
3759 } MM_SYSTEM_SIZE;
3760
3761 typedef struct _OBJECT_HANDLE_INFORMATION {
3762 ULONG HandleAttributes;
3763 ACCESS_MASK GrantedAccess;
3764 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3765
3766 typedef struct _CLIENT_ID {
3767 HANDLE UniqueProcess;
3768 HANDLE UniqueThread;
3769 } CLIENT_ID, *PCLIENT_ID;
3770
3771 typedef VOID DDKAPI
3772 (*PKSTART_ROUTINE)(
3773 IN PVOID StartContext);
3774
3775 typedef VOID DDKAPI
3776 (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
3777 IN HANDLE ParentId,
3778 IN HANDLE ProcessId,
3779 IN BOOLEAN Create);
3780
3781 typedef VOID DDKAPI
3782 (*PCREATE_THREAD_NOTIFY_ROUTINE)(
3783 IN HANDLE ProcessId,
3784 IN HANDLE ThreadId,
3785 IN BOOLEAN Create);
3786
3787 typedef struct _IMAGE_INFO {
3788 _ANONYMOUS_UNION union {
3789 ULONG Properties;
3790 _ANONYMOUS_STRUCT struct {
3791 ULONG ImageAddressingMode : 8;
3792 ULONG SystemModeImage : 1;
3793 ULONG ImageMappedToAllPids : 1;
3794 ULONG Reserved : 22;
3795 } DUMMYSTRUCTNAME;
3796 } DUMMYUNIONNAME;
3797 PVOID ImageBase;
3798 ULONG ImageSelector;
3799 SIZE_T ImageSize;
3800 ULONG ImageSectionNumber;
3801 } IMAGE_INFO, *PIMAGE_INFO;
3802
3803 #define IMAGE_ADDRESSING_MODE_32BIT 3
3804
3805 typedef VOID DDKAPI
3806 (*PLOAD_IMAGE_NOTIFY_ROUTINE)(
3807 IN PUNICODE_STRING FullImageName,
3808 IN HANDLE ProcessId,
3809 IN PIMAGE_INFO ImageInfo);
3810
3811 typedef enum _PROCESSINFOCLASS {
3812 ProcessBasicInformation,
3813 ProcessQuotaLimits,
3814 ProcessIoCounters,
3815 ProcessVmCounters,
3816 ProcessTimes,
3817 ProcessBasePriority,
3818 ProcessRaisePriority,
3819 ProcessDebugPort,
3820 ProcessExceptionPort,
3821 ProcessAccessToken,
3822 ProcessLdtInformation,
3823 ProcessLdtSize,
3824 ProcessDefaultHardErrorMode,
3825 ProcessIoPortHandlers,
3826 ProcessPooledUsageAndLimits,
3827 ProcessWorkingSetWatch,
3828 ProcessUserModeIOPL,
3829 ProcessEnableAlignmentFaultFixup,
3830 ProcessPriorityClass,
3831 ProcessWx86Information,
3832 ProcessHandleCount,
3833 ProcessAffinityMask,
3834 ProcessPriorityBoost,
3835 ProcessDeviceMap,
3836 ProcessSessionInformation,
3837 ProcessForegroundInformation,
3838 ProcessWow64Information,
3839 ProcessImageFileName,
3840 ProcessLUIDDeviceMapsEnabled,
3841 ProcessBreakOnTermination,
3842 ProcessDebugObjectHandle,
3843 ProcessDebugFlags,
3844 ProcessHandleTracing,
3845 ProcessUnknown33,
3846 ProcessUnknown34,
3847 ProcessUnknown35,
3848 ProcessCookie,
3849 MaxProcessInfoClass
3850 } PROCESSINFOCLASS;
3851
3852 typedef enum _THREADINFOCLASS {
3853 ThreadBasicInformation,
3854 ThreadTimes,
3855 ThreadPriority,
3856 ThreadBasePriority,
3857 ThreadAffinityMask,
3858 ThreadImpersonationToken,
3859 ThreadDescriptorTableEntry,
3860 ThreadEnableAlignmentFaultFixup,
3861 ThreadEventPair_Reusable,
3862 ThreadQuerySetWin32StartAddress,
3863 ThreadZeroTlsCell,
3864 ThreadPerformanceCount,
3865 ThreadAmILastThread,
3866 ThreadIdealProcessor,
3867 ThreadPriorityBoost,
3868 ThreadSetTlsArrayAddress,
3869 ThreadIsIoPending,
3870 ThreadHideFromDebugger,
3871 ThreadBreakOnTermination,
3872 MaxThreadInfoClass
3873 } THREADINFOCLASS;
3874
3875 #define ES_SYSTEM_REQUIRED 0x00000001
3876 #define ES_DISPLAY_REQUIRED 0x00000002
3877 #define ES_USER_PRESENT 0x00000004
3878 #define ES_CONTINUOUS 0x80000000
3879
3880 typedef ULONG EXECUTION_STATE;
3881
3882 typedef VOID DDKAPI
3883 (*PREQUEST_POWER_COMPLETE)(
3884 IN PDEVICE_OBJECT DeviceObject,
3885 IN UCHAR MinorFunction,
3886 IN POWER_STATE PowerState,
3887 IN PVOID Context,
3888 IN PIO_STATUS_BLOCK IoStatus);
3889
3890 typedef enum _TRACE_INFORMATION_CLASS {
3891 TraceIdClass,
3892 TraceHandleClass,
3893 TraceEnableFlagsClass,
3894 TraceEnableLevelClass,
3895 GlobalLoggerHandleClass,
3896 EventLoggerHandleClass,
3897 AllLoggerHandlesClass,
3898 TraceHandleByNameClass
3899 } TRACE_INFORMATION_CLASS;
3900
3901 typedef NTSTATUS DDKAPI
3902 (*PEX_CALLBACK_FUNCTION)(
3903 IN PVOID CallbackContext,
3904 IN PVOID Argument1,
3905 IN PVOID Argument2);
3906
3907
3908
3909 /*
3910 ** Storage structures
3911 */
3912 typedef enum _PARTITION_STYLE {
3913 PARTITION_STYLE_MBR,
3914 PARTITION_STYLE_GPT
3915 } PARTITION_STYLE;
3916
3917 typedef struct _CREATE_DISK_MBR {
3918 ULONG Signature;
3919 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
3920
3921 typedef struct _CREATE_DISK_GPT {
3922 GUID DiskId;
3923 ULONG MaxPartitionCount;
3924 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
3925
3926 typedef struct _CREATE_DISK {
3927 PARTITION_STYLE PartitionStyle;
3928 _ANONYMOUS_UNION union {
3929 CREATE_DISK_MBR Mbr;
3930 CREATE_DISK_GPT Gpt;
3931 } DUMMYUNIONNAME;
3932 } CREATE_DISK, *PCREATE_DISK;
3933
3934 typedef struct _DISK_SIGNATURE {
3935 ULONG PartitionStyle;
3936 _ANONYMOUS_UNION union {
3937 struct {
3938 ULONG Signature;
3939 ULONG CheckSum;
3940 } Mbr;
3941 struct {
3942 GUID DiskId;
3943 } Gpt;
3944 } DUMMYUNIONNAME;
3945 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3946
3947 typedef VOID DDKFASTAPI
3948 (*PTIME_UPDATE_NOTIFY_ROUTINE)(
3949 IN HANDLE ThreadId,
3950 IN KPROCESSOR_MODE Mode);
3951
3952 #define DBG_STATUS_CONTROL_C 1
3953 #define DBG_STATUS_SYSRQ 2
3954 #define DBG_STATUS_BUGCHECK_FIRST 3
3955 #define DBG_STATUS_BUGCHECK_SECOND 4
3956 #define DBG_STATUS_FATAL 5
3957 #define DBG_STATUS_DEBUG_CONTROL 6
3958 #define DBG_STATUS_WORKER 7
3959
3960 typedef struct _PHYSICAL_MEMORY_RANGE {
3961 PHYSICAL_ADDRESS BaseAddress;
3962 LARGE_INTEGER NumberOfBytes;
3963 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
3964
3965 typedef ULONG_PTR
3966 (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
3967 IN PVOID Context);
3968
3969 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
3970 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
3971 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
3972 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
3973
3974 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
3975 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
3976 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
3977 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
3978 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
3979
3980 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
3981 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002
3982
3983 #define RTL_RANGE_LIST_SHARED_OK 0x00000001
3984 #define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
3985
3986 #define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT
3987
3988 typedef struct _RTL_RANGE {
3989 ULONGLONG Start;
3990 ULONGLONG End;
3991 PVOID UserData;
3992 PVOID Owner;
3993 UCHAR Attributes;
3994 UCHAR Flags;
3995 } RTL_RANGE, *PRTL_RANGE;
3996
3997 #define RTL_RANGE_SHARED 0x01
3998 #define RTL_RANGE_CONFLICT 0x02
3999
4000 typedef struct _RTL_RANGE_LIST {
4001 LIST_ENTRY ListHead;
4002 ULONG Flags;
4003 ULONG Count;
4004 ULONG Stamp;
4005 } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
4006
4007 typedef struct _RANGE_LIST_ITERATOR {
4008 PLIST_ENTRY RangeListHead;
4009 PLIST_ENTRY MergedHead;
4010 PVOID Current;
4011 ULONG Stamp;
4012 } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
4013
4014 typedef BOOLEAN
4015 (DDKAPI *PRTL_CONFLICT_RANGE_CALLBACK)(
4016 IN PVOID Context,
4017 IN PRTL_RANGE Range);
4018
4019 #define HASH_STRING_ALGORITHM_DEFAULT 0
4020 #define HASH_STRING_ALGORITHM_X65599 1
4021 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
4022
4023 typedef enum _SUITE_TYPE {
4024 SmallBusiness,
4025 Enterprise,
4026 BackOffice,
4027 CommunicationServer,
4028 TerminalServer,
4029 SmallBusinessRestricted,
4030 EmbeddedNT,
4031 DataCenter,
4032 SingleUserTS,
4033 Personal,
4034 Blade,
4035 MaxSuiteType
4036 } SUITE_TYPE;
4037
4038 typedef VOID DDKAPI
4039 (*PTIMER_APC_ROUTINE)(
4040 IN PVOID TimerContext,
4041 IN ULONG TimerLowValue,
4042 IN LONG TimerHighValue);
4043
4044
4045
4046 /*
4047 ** WMI structures
4048 */
4049
4050 typedef VOID DDKAPI
4051 (*WMI_NOTIFICATION_CALLBACK)(
4052 PVOID Wnode,
4053 PVOID Context);
4054
4055
4056 /*
4057 ** Architecture specific structures
4058 */
4059
4060 #ifdef _X86_
4061
4062 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
4063
4064 #define PASSIVE_LEVEL 0
4065 #define LOW_LEVEL 0
4066 #define APC_LEVEL 1
4067 #define DISPATCH_LEVEL 2
4068 #define PROFILE_LEVEL 27
4069 #define CLOCK1_LEVEL 28
4070 #define CLOCK2_LEVEL 28
4071 #define IPI_LEVEL 29
4072 #define SYNCH_LEVEL (IPI_LEVEL-1)
4073 #define POWER_LEVEL 30
4074 #define HIGH_LEVEL 31
4075
4076 typedef struct _KPCR_TIB {
4077 PVOID ExceptionList; /* 00 */
4078 PVOID StackBase; /* 04 */
4079 PVOID StackLimit; /* 08 */
4080 PVOID SubSystemTib; /* 0C */
4081 _ANONYMOUS_UNION union {
4082 PVOID FiberData; /* 10 */
4083 DWORD Version; /* 10 */
4084 } DUMMYUNIONNAME;
4085 PVOID ArbitraryUserPointer; /* 14 */
4086 struct _NT_TIB *Self; /* 18 */
4087 } KPCR_TIB, *PKPCR_TIB; /* 1C */
4088
4089 #define PCR_MINOR_VERSION 1
4090 #define PCR_MAJOR_VERSION 1
4091
4092 typedef struct _KPCR {
4093 KPCR_TIB Tib; /* 00 */
4094 struct _KPCR *Self; /* 1C */
4095 struct _KPRCB *PCRCB; /* 20 */
4096 KIRQL Irql; /* 24 */
4097 ULONG IRR; /* 28 */
4098 ULONG IrrActive; /* 2C */
4099 ULONG IDR; /* 30 */
4100 PVOID KdVersionBlock; /* 34 */
4101 PUSHORT IDT; /* 38 */
4102 PUSHORT GDT; /* 3C */
4103 struct _KTSS *TSS; /* 40 */
4104 USHORT MajorVersion; /* 44 */
4105 USHORT MinorVersion; /* 46 */
4106 KAFFINITY SetMember; /* 48 */
4107 ULONG StallScaleFactor; /* 4C */
4108 UCHAR SpareUnused; /* 50 */
4109 UCHAR Number; /* 51 */
4110 } KPCR, *PKPCR; /* 54 */
4111
4112 typedef struct _KFLOATING_SAVE {
4113 ULONG ControlWord;
4114 ULONG StatusWord;
4115 ULONG ErrorOffset;
4116 ULONG ErrorSelector;
4117 ULONG DataOffset;
4118 ULONG DataSelector;
4119 ULONG Cr0NpxState;
4120 ULONG Spare1;
4121 } KFLOATING_SAVE, *PKFLOATING_SAVE;
4122
4123 #define PAGE_SIZE 0x1000
4124 #define PAGE_SHIFT 12L
4125
4126 extern NTOSAPI PVOID *MmHighestUserAddress;
4127 extern NTOSAPI PVOID *MmSystemRangeStart;
4128 extern NTOSAPI ULONG *MmUserProbeAddress;
4129
4130 #define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress
4131 #define MM_SYSTEM_RANGE_START *MmSystemRangeStart
4132 #define MM_USER_PROBE_ADDRESS *MmUserProbeAddress
4133 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
4134 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
4135
4136 #define KI_USER_SHARED_DATA 0xffdf0000
4137 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
4138
4139 #define EFLAG_SIGN 0x8000
4140 #define EFLAG_ZERO 0x4000
4141 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
4142
4143 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4144 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
4145 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4146
4147 typedef enum _INTERLOCKED_RESULT {
4148 ResultNegative = RESULT_NEGATIVE,
4149 ResultZero = RESULT_ZERO,
4150 ResultPositive = RESULT_POSITIVE
4151 } INTERLOCKED_RESULT;
4152
4153 NTOSAPI
4154 KIRQL
4155 DDKAPI
4156 KeGetCurrentIrql(
4157 VOID);
4158
4159 /*
4160 * ULONG
4161 * KeGetCurrentProcessorNumber(
4162 * VOID)
4163 */
4164 #define KeGetCurrentProcessorNumber() \
4165 ((ULONG)KeGetCurrentKPCR()->ProcessorNumber)
4166
4167 #if !defined(__INTERLOCKED_DECLARED)
4168 #define __INTERLOCKED_DECLARED
4169
4170 NTOSAPI
4171 LONG
4172 DDKFASTAPI
4173 InterlockedIncrement(
4174 IN PLONG VOLATILE Addend);
4175
4176 NTOSAPI
4177 LONG
4178 DDKFASTAPI
4179 InterlockedDecrement(
4180 IN PLONG VOLATILE Addend);
4181
4182 NTOSAPI
4183 LONG
4184 DDKFASTAPI
4185 InterlockedCompareExchange(
4186 IN OUT PLONG VOLATILE Destination,
4187 IN LONG Exchange,
4188 IN LONG Comparand);
4189
4190 NTOSAPI
4191 LONG
4192 DDKFASTAPI
4193 InterlockedExchange(
4194 IN OUT PLONG VOLATILE Target,
4195 IN LONG Value);
4196
4197 NTOSAPI
4198 LONG
4199 DDKFASTAPI
4200 InterlockedExchangeAdd(
4201 IN OUT PLONG VOLATILE Addend,
4202 IN LONG Value);
4203
4204 /*
4205 * PVOID
4206 * InterlockedExchangePointer(
4207 * IN OUT PVOID VOLATILE *Target,
4208 * IN PVOID Value)
4209 */
4210 #define InterlockedExchangePointer(Target, Value) \
4211 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
4212
4213 /*
4214 * PVOID
4215 * InterlockedCompareExchangePointer(
4216 * IN OUT PVOID *Destination,
4217 * IN PVOID Exchange,
4218 * IN PVOID Comparand)
4219 */
4220 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
4221 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
4222
4223 #endif /* !__INTERLOCKED_DECLARED */
4224
4225 NTOSAPI
4226 VOID
4227 DDKFASTAPI
4228 KefAcquireSpinLockAtDpcLevel(
4229 IN PKSPIN_LOCK SpinLock);
4230
4231 NTOSAPI
4232 VOID
4233 DDKFASTAPI
4234 KefReleaseSpinLockFromDpcLevel(
4235 IN PKSPIN_LOCK SpinLock);
4236
4237 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
4238 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
4239
4240 #define RtlCopyMemoryNonTemporal RtlCopyMemory
4241
4242 #define KeGetDcacheFillSize() 1L
4243
4244 #endif /* _X86_ */
4245
4246
4247
4248 /*
4249 ** Utillity functions
4250 */
4251
4252 #define ARGUMENT_PRESENT(ArgumentPointer) \
4253 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
4254
4255 /*
4256 * ULONG
4257 * BYTE_OFFSET(
4258 * IN PVOID Va)
4259 */
4260 #define BYTE_OFFSET(Va) \
4261 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
4262
4263 /*
4264 * ULONG
4265 * BYTES_TO_PAGES(
4266 * IN ULONG Size)
4267 */
4268 #define BYTES_TO_PAGES(Size) \
4269 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
4270
4271 /*
4272 * PCHAR
4273 * CONTAINING_RECORD(
4274 * IN PCHAR Address,
4275 * IN TYPE Type,
4276 * IN PCHAR Field);
4277 */
4278 #ifndef CONTAINING_RECORD
4279 #define CONTAINING_RECORD(Address, Type, Field) \
4280 ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
4281 #endif
4282
4283 /* LONG
4284 * FIELD_OFFSET(
4285 * IN TYPE Type,
4286 * IN PCHAR Field);
4287 */
4288 #ifndef FIELD_OFFSET
4289 #define FIELD_OFFSET(Type, Field) \
4290 ((LONG) (&(((Type *) 0)->Field)))
4291 #endif
4292
4293 /*
4294 * PVOID
4295 * PAGE_ALIGN(
4296 * IN PVOID Va)
4297 */
4298 #define PAGE_ALIGN(Va) \
4299 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
4300
4301 /*
4302 * ULONG_PTR
4303 * ROUND_TO_PAGES(
4304 * IN ULONG_PTR Size)
4305 */
4306 #define ROUND_TO_PAGES(Size) \
4307 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
4308
4309 NTOSAPI
4310 VOID
4311 DDKAPI
4312 RtlAssert(
4313 IN PVOID FailedAssertion,
4314 IN PVOID FileName,
4315 IN ULONG LineNumber,
4316 IN PCHAR Message);
4317
4318 #ifdef DBG
4319
4320 #define ASSERT(exp) \
4321 ((!(exp)) ? \
4322 (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)
4323
4324 #define ASSERTMSG(msg, exp) \
4325 ((!(exp)) ? \
4326 (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)
4327
4328 #define RTL_SOFT_ASSERT(exp) \
4329 ((!(_exp)) ? \
4330 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)
4331
4332 #define RTL_SOFT_ASSERTMSG(msg, exp) \
4333 ((!(exp)) ? \
4334 (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE)
4335
4336 #define RTL_VERIFY(exp) ASSERT(exp)
4337 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
4338
4339 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
4340 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
4341
4342 #else /* !DBG */
4343
4344 #define ASSERT(exp) ((VOID) 0)
4345 #define ASSERTMSG(msg, exp) ((VOID) 0)
4346
4347 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
4348 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
4349
4350 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
4351 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4352
4353 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
4354 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4355
4356 #endif /* DBG */
4357
4358
4359 /*
4360 ** Driver support routines
4361 */
4362
4363 /** Runtime library routines **/
4364
4365 static __inline VOID
4366 InitializeListHead(
4367 IN PLIST_ENTRY ListHead)
4368 {
4369 ListHead->Flink = ListHead->Blink = ListHead;
4370 }
4371
4372 static __inline VOID
4373 InsertHeadList(
4374 IN PLIST_ENTRY ListHead,
4375 IN PLIST_ENTRY Entry)
4376 {
4377 PLIST_ENTRY OldFlink;
4378 OldFlink = ListHead->Flink;
4379 Entry->Flink = OldFlink;
4380 Entry->Blink = ListHead;
4381 OldFlink->Blink = Entry;
4382 ListHead->Flink = Entry;
4383 }
4384
4385 static __inline VOID
4386 InsertTailList(
4387 IN PLIST_ENTRY ListHead,
4388 IN PLIST_ENTRY Entry)
4389 {
4390 PLIST_ENTRY OldBlink;
4391 OldBlink = ListHead->Blink;
4392 Entry->Flink = ListHead;
4393 Entry->Blink = OldBlink;
4394 OldBlink->Flink = Entry;
4395 ListHead->Blink = Entry;
4396 }
4397
4398 /*
4399 * BOOLEAN
4400 * IsListEmpty(
4401 * IN PLIST_ENTRY ListHead)
4402 */
4403 #define IsListEmpty(_ListHead) \
4404 ((_ListHead)->Flink == (_ListHead))
4405
4406 /*
4407 * PSINGLE_LIST_ENTRY
4408 * PopEntryList(
4409 * IN PSINGLE_LIST_ENTRY ListHead)
4410 */
4411 #define PopEntryList(ListHead) \
4412 (ListHead)->Next; \
4413 { \
4414 PSINGLE_LIST_ENTRY _FirstEntry; \
4415 _FirstEntry = (ListHead)->Next; \
4416 if (_FirstEntry != NULL) \
4417 (ListHead)->Next = _FirstEntry->Next; \
4418 }
4419
4420 /*
4421 * VOID
4422 * PushEntryList(
4423 * IN PSINGLE_LIST_ENTRY ListHead,
4424 * IN PSINGLE_LIST_ENTRY Entry)
4425 */
4426 #define PushEntryList(_ListHead, _Entry) \
4427 (_Entry)->Next = (_ListHead)->Next; \
4428 (_ListHead)->Next = (_Entry); \
4429
4430 static __inline BOOLEAN
4431 RemoveEntryList(
4432 IN PLIST_ENTRY Entry)
4433 {
4434 PLIST_ENTRY OldFlink;
4435 PLIST_ENTRY OldBlink;
4436
4437 OldFlink = Entry->Flink;
4438 OldBlink = Entry->Blink;
4439 OldFlink->Blink = OldBlink;
4440 OldBlink->Flink = OldFlink;
4441 return (OldFlink == OldBlink);
4442 }
4443
4444 static __inline PLIST_ENTRY
4445 RemoveHeadList(
4446 IN PLIST_ENTRY ListHead)
4447 {
4448 PLIST_ENTRY Flink;
4449 PLIST_ENTRY Entry;
4450
4451 Entry = ListHead->Flink;
4452 Flink = Entry->Flink;
4453 ListHead->Flink = Flink;
4454 Flink->Blink = ListHead;
4455 return Entry;
4456 }
4457
4458 static __inline PLIST_ENTRY
4459 RemoveTailList(
4460 IN PLIST_ENTRY ListHead)
4461 {
4462 PLIST_ENTRY Blink;
4463 PLIST_ENTRY Entry;
4464
4465 Entry = ListHead->Blink;
4466 Blink = Entry->Blink;
4467 ListHead->Blink = Blink;
4468 Blink->Flink = ListHead;
4469 return Entry;
4470 }
4471
4472 #if !defined(_WINBASE_H) || _WIN32_WINNT < 0x0501
4473
4474 NTOSAPI
4475 PSLIST_ENTRY
4476 DDKFASTAPI
4477 InterlockedPopEntrySList(
4478 IN PSLIST_HEADER ListHead);
4479
4480 NTOSAPI
4481 PSLIST_ENTRY
4482 DDKFASTAPI
4483 InterlockedPushEntrySList(
4484 IN PSLIST_HEADER ListHead,
4485 IN PSLIST_ENTRY ListEntry);
4486
4487 #endif
4488
4489 /*
4490 * USHORT
4491 * QueryDepthSList(
4492 * IN PSLIST_HEADER SListHead)
4493 */
4494 #define QueryDepthSList(_SListHead) \
4495 ((USHORT) ((_SListHead)->Alignment & 0xffff))
4496
4497 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
4498
4499 NTOSAPI
4500 ULONG
4501 DDKAPI
4502 RtlAnsiStringToUnicodeSize(
4503 IN PANSI_STRING AnsiString);
4504
4505 NTOSAPI
4506 NTSTATUS
4507 DDKAPI
4508 RtlAddRange(
4509 IN OUT PRTL_RANGE_LIST RangeList,
4510 IN ULONGLONG Start,
4511 IN ULONGLONG End,
4512 IN UCHAR Attributes,
4513 IN ULONG Flags,
4514 IN PVOID UserData OPTIONAL,
4515 IN PVOID Owner OPTIONAL);
4516
4517 NTOSAPI
4518 NTSTATUS
4519 DDKAPI
4520 RtlAnsiStringToUnicodeString(
4521 IN OUT PUNICODE_STRING DestinationString,
4522 IN PANSI_STRING SourceString,
4523 IN BOOLEAN AllocateDestinationString);
4524
4525 NTOSAPI
4526 NTSTATUS
4527 DDKAPI
4528 RtlAppendUnicodeStringToString(
4529 IN OUT PUNICODE_STRING Destination,
4530 IN PUNICODE_STRING Source);
4531
4532 NTOSAPI
4533 NTSTATUS
4534 DDKAPI
4535 RtlAppendUnicodeToString(
4536 IN OUT PUNICODE_STRING Destination,
4537 IN PCWSTR Source);
4538
4539 NTOSAPI
4540 BOOLEAN
4541 DDKAPI
4542 RtlAreBitsClear(
4543 IN PRTL_BITMAP BitMapHeader,
4544 IN ULONG StartingIndex,
4545 IN ULONG Length);
4546
4547 NTOSAPI
4548 BOOLEAN
4549 DDKAPI
4550 RtlAreBitsSet(
4551 IN PRTL_BITMAP BitMapHeader,
4552 IN ULONG StartingIndex,
4553 IN ULONG Length);
4554
4555 NTOSAPI
4556 NTSTATUS
4557 DDKAPI
4558 RtlCharToInteger(
4559 IN PCSZ String,
4560 IN ULONG Base OPTIONAL,
4561 IN OUT PULONG Value);
4562
4563 NTOSAPI
4564 ULONG
4565 DDKAPI
4566 RtlCheckBit(
4567 IN PRTL_BITMAP BitMapHeader,
4568 IN ULONG BitPosition);
4569
4570 NTOSAPI
4571 NTSTATUS
4572 DDKAPI
4573 RtlCheckRegistryKey(
4574 IN ULONG RelativeTo,
4575 IN PWSTR Path);
4576
4577 NTOSAPI
4578 VOID
4579 DDKAPI
4580 RtlClearAllBits(
4581 IN PRTL_BITMAP BitMapHeader);
4582
4583 NTOSAPI
4584 VOID
4585 DDKAPI
4586 RtlClearBit(
4587 PRTL_BITMAP BitMapHeader,
4588 ULONG BitNumber);
4589
4590 NTOSAPI
4591 VOID
4592 DDKAPI
4593 RtlClearBits(
4594 IN PRTL_BITMAP BitMapHeader,
4595 IN ULONG StartingIndex,
4596 IN ULONG NumberToClear);
4597
4598 NTOSAPI
4599 SIZE_T
4600 DDKAPI
4601 RtlCompareMemory(
4602 IN CONST VOID *Source1,
4603 IN CONST VOID *Source2,
4604 IN SIZE_T Length);
4605
4606 NTOSAPI
4607 LONG
4608 DDKAPI
4609 RtlCompareString(
4610 IN PSTRING String1,
4611 IN PSTRING String2,
4612 BOOLEAN CaseInSensitive);
4613
4614 NTOSAPI
4615 LONG
4616 DDKAPI
4617 RtlCompareUnicodeString(
4618 IN PUNICODE_STRING String1,
4619 IN PUNICODE_STRING String2,
4620 IN BOOLEAN CaseInSensitive);
4621
4622 NTOSAPI
4623 LARGE_INTEGER
4624 DDKAPI
4625 RtlConvertLongToLargeInteger(
4626 IN LONG SignedInteger);
4627
4628 NTOSAPI
4629 LUID
4630 DDKAPI
4631 RtlConvertLongToLuid(
4632 IN LONG Long);
4633
4634 NTOSAPI
4635 LARGE_INTEGER
4636 DDKAPI
4637 RtlConvertUlongToLargeInteger(
4638 IN ULONG UnsignedInteger);
4639
4640 NTOSAPI
4641 LUID
4642 DDKAPI
4643 RtlConvertUlongToLuid(
4644 ULONG Ulong);
4645
4646 /*
4647 * VOID
4648 * RtlCopyMemory(
4649 * IN VOID UNALIGNED *Destination,
4650 * IN CONST VOID UNALIGNED *Source,
4651 * IN SIZE_T Length)
4652 */
4653 #ifndef RtlCopyMemory
4654 #define RtlCopyMemory(Destination, Source, Length) \
4655 memcpy(Destination, Source, Length)
4656 #endif
4657
4658 #ifndef RtlCopyBytes
4659 #define RtlCopyBytes RtlCopyMemory
4660 #endif
4661
4662 NTOSAPI
4663 VOID
4664 DDKAPI
4665 RtlCopyMemory32(
4666 IN VOID UNALIGNED *Destination,
4667 IN CONST VOID UNALIGNED *Source,
4668 IN ULONG Length);
4669
4670 NTOSAPI
4671 NTSTATUS
4672 DDKAPI
4673 RtlCopyRangeList(
4674 OUT PRTL_RANGE_LIST CopyRangeList,
4675 IN PRTL_RANGE_LIST RangeList);
4676
4677 NTOSAPI
4678 VOID
4679 DDKAPI
4680 RtlCopyString(
4681 IN OUT PSTRING DestinationString,
4682 IN PSTRING SourceString OPTIONAL);
4683
4684 NTOSAPI
4685 VOID
4686 DDKAPI
4687 RtlCopyUnicodeString(
4688 IN OUT PUNICODE_STRING DestinationString,
4689 IN PUNICODE_STRING SourceString);
4690
4691 NTOSAPI
4692 NTSTATUS
4693 DDKAPI
4694 RtlCreateRegistryKey(
4695 IN ULONG RelativeTo,
4696 IN PWSTR Path);
4697
4698 NTOSAPI
4699 NTSTATUS
4700 DDKAPI
4701 RtlCreateSecurityDescriptor(
4702 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4703 IN ULONG Revision);
4704
4705 NTOSAPI
4706 NTSTATUS
4707 DDKAPI
4708 RtlDeleteOwnersRanges(
4709 IN OUT PRTL_RANGE_LIST RangeList,
4710 IN PVOID Owner);
4711
4712 NTOSAPI
4713 NTSTATUS
4714 DDKAPI
4715 RtlDeleteRange(
4716 IN OUT PRTL_RANGE_LIST RangeList,
4717 IN ULONGLONG Start,
4718 IN ULONGLONG End,
4719 IN PVOID Owner);
4720
4721 NTOSAPI
4722 NTSTATUS
4723 DDKAPI
4724 RtlDeleteRegistryValue(
4725 IN ULONG RelativeTo,
4726 IN PCWSTR Path,
4727 IN PCWSTR ValueName);
4728
4729 /*
4730 * BOOLEAN
4731 * RtlEqualLuid(
4732 * IN PLUID Luid1,
4733 * IN PLUID Luid2)
4734 */
4735 #define RtlEqualLuid(Luid1, \
4736 Luid2) \
4737 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
4738
4739 /*
4740 * ULONG
4741 * RtlEqualMemory(
4742 * IN VOID UNALIGNED *Destination,
4743 * IN CONST VOID UNALIGNED *Source,
4744 * IN SIZE_T Length)
4745 */
4746 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
4747
4748 NTOSAPI
4749 BOOLEAN
4750 DDKAPI
4751 RtlEqualString(
4752 IN PSTRING String1,
4753 IN PSTRING String2,
4754 IN BOOLEAN CaseInSensitive);
4755
4756 NTOSAPI
4757 BOOLEAN
4758 DDKAPI
4759 RtlEqualUnicodeString(
4760 IN CONST UNICODE_STRING *String1,
4761 IN CONST UNICODE_STRING *String2,
4762 IN BOOLEAN CaseInSensitive);
4763
4764 /*
4765 * VOID
4766 * RtlFillMemory(
4767 * IN VOID UNALIGNED *Destination,
4768 * IN SIZE_T Length,
4769 * IN UCHAR Fill)
4770 */
4771 #ifndef RtlFillMemory
4772 #define RtlFillMemory(Destination, Length, Fill) \
4773 memset(Destination, Fill, Length)
4774 #endif
4775
4776 #ifndef RtlFillBytes
4777 #define RtlFillBytes RtlFillMemory
4778 #endif
4779
4780 NTOSAPI
4781 ULONG
4782 DDKAPI
4783 RtlFindClearBits(
4784 IN PRTL_BITMAP BitMapHeader,
4785 IN ULONG NumberToFind,
4786 IN ULONG HintIndex);
4787
4788 NTOSAPI
4789 ULONG
4790 DDKAPI
4791 RtlFindClearBitsAndSet(
4792 IN PRTL_BITMAP BitMapHeader,
4793 IN ULONG NumberToFind,
4794 IN ULONG HintIndex);
4795
4796 NTOSAPI
4797 ULONG
4798 DDKAPI
4799 RtlFindClearRuns(
4800 IN PRTL_BITMAP BitMapHeader,
4801 OUT PRTL_BITMAP_RUN RunArray,
4802 IN ULONG SizeOfRunArray,
4803 IN BOOLEAN LocateLongestRuns);
4804
4805 NTOSAPI
4806 ULONG
4807 DDKAPI
4808 RtlFindFirstRunClear(
4809 IN PRTL_BITMAP BitMapHeader,
4810 OUT PULONG StartingIndex);
4811
4812 NTOSAPI
4813 ULONG
4814 DDKAPI
4815 RtlFindLastBackwardRunClear(
4816 IN PRTL_BITMAP BitMapHeader,
4817 IN ULONG FromIndex,
4818 OUT PULONG StartingRunIndex);
4819
4820 NTOSAPI
4821 CCHAR
4822 DDKAPI
4823 RtlFindLeastSignificantBit(
4824 IN ULONGLONG Set);
4825
4826 NTOSAPI
4827 ULONG
4828 DDKAPI
4829 RtlFindLongestRunClear(
4830 IN PRTL_BITMAP BitMapHeader,
4831 OUT PULONG StartingIndex);
4832
4833 NTOSAPI
4834 CCHAR
4835 DDKAPI
4836 RtlFindMostSignificantBit(
4837 IN ULONGLONG Set);
4838
4839 NTOSAPI
4840 ULONG
4841 DDKAPI
4842 RtlFindNextForwardRunClear(
4843 IN PRTL_BITMAP BitMapHeader,
4844 IN ULONG FromIndex,
4845 OUT PULONG StartingRunIndex);
4846
4847 NTOSAPI
4848 NTSTATUS
4849 DDKAPI
4850 RtlFindRange(
4851 IN PRTL_RANGE_LIST RangeList,
4852 IN ULONGLONG Minimum,
4853 IN ULONGLONG Maximum,
4854 IN ULONG Length,
4855 IN ULONG Alignment,
4856 IN ULONG Flags,
4857 IN UCHAR AttributeAvailableMask,
4858 IN PVOID Context OPTIONAL,
4859 IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
4860 OUT PULONGLONG Start);
4861
4862 NTOSAPI
4863 ULONG
4864 DDKAPI
4865 RtlFindSetBits(
4866 IN PRTL_BITMAP BitMapHeader,
4867 IN ULONG NumberToFind,
4868 IN ULONG HintIndex);
4869
4870 NTOSAPI
4871 ULONG
4872 DDKAPI
4873 RtlFindSetBitsAndClear(
4874 IN PRTL_BITMAP BitMapHeader,
4875 IN ULONG NumberToFind,
4876 IN ULONG HintIndex);
4877
4878 NTOSAPI
4879 VOID
4880 DDKAPI
4881 RtlFreeAnsiString(
4882 IN PANSI_STRING AnsiString);
4883
4884 NTOSAPI
4885 VOID
4886 DDKAPI
4887 RtlFreeRangeList(
4888 IN PRTL_RANGE_LIST RangeList);
4889
4890 NTOSAPI
4891 VOID
4892 DDKAPI
4893 RtlFreeUnicodeString(
4894 IN PUNICODE_STRING UnicodeString);
4895
4896 NTOSAPI
4897 VOID
4898 DDKAPI
4899 RtlGetCallersAddress(
4900 OUT PVOID *CallersAddress,
4901 OUT PVOID *CallersCaller);
4902
4903 NTOSAPI
4904 NTSTATUS
4905 DDKAPI
4906 RtlGetVersion(
4907 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
4908
4909 NTOSAPI
4910 NTSTATUS
4911 DDKAPI
4912 RtlGetFirstRange(
4913 IN PRTL_RANGE_LIST RangeList,
4914 OUT PRTL_RANGE_LIST_ITERATOR Iterator,
4915 OUT PRTL_RANGE *Range);
4916
4917 NTOSAPI
4918 NTSTATUS
4919 DDKAPI
4920 RtlGetNextRange(
4921 IN OUT PRTL_RANGE_LIST_ITERATOR Iterator,
4922 OUT PRTL_RANGE *Range,
4923 IN BOOLEAN MoveForwards);
4924
4925 #define FOR_ALL_RANGES(RangeList, Iterator, Current) \
4926 for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
4927 (Current) != NULL; \
4928 RtlGetNextRange((Iterator), &(Current), TRUE))
4929
4930 #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
4931 for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \
4932 (Current) != NULL; \
4933 RtlGetNextRange((Iterator), &(Current), FALSE))
4934
4935 NTOSAPI
4936 NTSTATUS
4937 DDKAPI
4938 RtlGUIDFromString(
4939 IN PUNICODE_STRING GuidString,
4940 OUT GUID *Guid);
4941
4942 NTOSAPI
4943 NTSTATUS
4944 DDKAPI
4945 RtlHashUnicodeString(
4946 IN CONST UNICODE_STRING *String,
4947 IN BOOLEAN CaseInSensitive,
4948 IN ULONG HashAlgorithm,
4949 OUT PULONG HashValue);
4950
4951 NTOSAPI
4952 VOID
4953 DDKAPI
4954 RtlInitAnsiString(
4955 IN OUT PANSI_STRING DestinationString,
4956 IN PCSZ SourceString);
4957
4958 NTOSAPI
4959 VOID
4960 DDKAPI
4961 RtlInitializeBitMap(
4962 IN PRTL_BITMAP BitMapHeader,
4963 IN PULONG BitMapBuffer,
4964 IN ULONG SizeOfBitMap);
4965
4966 NTOSAPI
4967 VOID
4968 DDKAPI
4969 RtlInitializeRangeList(
4970 IN OUT PRTL_RANGE_LIST RangeList);
4971
4972 NTOSAPI
4973 VOID
4974 DDKAPI
4975 RtlInitString(
4976 IN OUT PSTRING DestinationString,
4977 IN PCSZ SourceString);
4978
4979 NTOSAPI
4980 VOID
4981 DDKAPI
4982 RtlInitUnicodeString(
4983 IN OUT PUNICODE_STRING DestinationString,
4984 IN PCWSTR SourceString);
4985
4986 NTOSAPI
4987 NTSTATUS
4988 DDKAPI
4989 RtlInt64ToUnicodeString(
4990 IN ULONGLONG Value,
4991 IN ULONG Base OPTIONAL,
4992 IN OUT PUNICODE_STRING String);
4993
4994 NTOSAPI
4995 NTSTATUS
4996 DDKAPI
4997 RtlIntegerToUnicodeString(
4998 IN ULONG Value,
4999 IN ULONG Base OPTIONAL,
5000 IN OUT PUNICODE_STRING String);
5001
5002 NTOSAPI
5003 NTSTATUS
5004 DDKAPI
5005 RtlIntPtrToUnicodeString(
5006 PLONG Value,
5007 ULONG Base OPTIONAL,
5008 PUNICODE_STRING String);
5009
5010 NTOSAPI
5011 NTSTATUS
5012 DDKAPI
5013 RtlInvertRangeList(
5014 OUT PRTL_RANGE_LIST InvertedRangeList,
5015 IN PRTL_RANGE_LIST RangeList);
5016
5017 NTOSAPI
5018 NTSTATUS
5019 DDKAPI
5020 RtlIsRangeAvailable(
5021 IN PRTL_RANGE_LIST RangeList,
5022 IN ULONGLONG Start,
5023 IN ULONGLONG End,
5024 IN ULONG Flags,
5025 IN UCHAR AttributeAvailableMask,
5026 IN PVOID Context OPTIONAL,
5027 IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
5028 OUT PBOOLEAN Available);
5029
5030 /*
5031 * BOOLEAN
5032 * RtlIsZeroLuid(
5033 * IN PLUID L1)
5034 */
5035 #define RtlIsZeroLuid(_L1) \
5036 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
5037
5038 NTOSAPI
5039 ULONG
5040 DDKAPI
5041 RtlLengthSecurityDescriptor(
5042 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5043
5044 NTOSAPI
5045 VOID
5046 DDKAPI
5047 RtlMapGenericMask(
5048 IN OUT PACCESS_MASK AccessMask,
5049 IN PGENERIC_MAPPING GenericMapping);
5050
5051 NTOSAPI
5052 NTSTATUS
5053 DDKAPI
5054 RtlMergeRangeLists(
5055 OUT PRTL_RANGE_LIST MergedRangeList,
5056 IN PRTL_RANGE_LIST RangeList1,
5057 IN PRTL_RANGE_LIST RangeList2,
5058 IN ULONG Flags);
5059
5060 /*
5061 * VOID
5062 * RtlMoveMemory(
5063 * IN VOID UNALIGNED *Destination,
5064 * IN CONST VOID UNALIGNED *Source,
5065 * IN SIZE_T Length)
5066 */
5067 #define RtlMoveMemory memmove
5068
5069 NTOSAPI
5070 ULONG
5071 DDKAPI
5072 RtlNumberOfClearBits(
5073 IN PRTL_BITMAP BitMapHeader);
5074
5075 NTOSAPI
5076 ULONG
5077 DDKAPI
5078 RtlNumberOfSetBits(
5079 IN PRTL_BITMAP BitMapHeader);
5080
5081 NTOSAPI
5082 VOID
5083 DDKFASTAPI
5084 RtlPrefetchMemoryNonTemporal(
5085 IN PVOID Source,
5086 IN SIZE_T Length);
5087
5088 NTOSAPI
5089 BOOLEAN
5090 DDKAPI
5091 RtlPrefixUnicodeString(
5092 IN PUNICODE_STRING String1,
5093 IN PUNICODE_STRING String2,
5094 IN BOOLEAN CaseInSensitive);
5095
5096 NTOSAPI
5097 NTSTATUS
5098 DDKAPI
5099 RtlQueryRegistryValues(
5100 IN ULONG RelativeTo,
5101 IN PCWSTR Path,
5102 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
5103 IN PVOID Context,
5104 IN PVOID Environment OPTIONAL);
5105
5106 NTOSAPI
5107 VOID
5108 DDKAPI
5109 RtlRetrieveUlong(
5110 IN OUT PULONG DestinationAddress,
5111 IN PULONG SourceAddress);
5112
5113 NTOSAPI
5114 VOID
5115 DDKAPI
5116 RtlRetrieveUshort(
5117 IN OUT PUSHORT DestinationAddress,
5118 IN PUSHORT SourceAddress);
5119
5120 NTOSAPI
5121 VOID
5122 DDKAPI
5123 RtlSetAllBits(
5124 IN PRTL_BITMAP BitMapHeader);
5125
5126 NTOSAPI
5127 VOID
5128 DDKAPI
5129 RtlSetBit(
5130 PRTL_BITMAP BitMapHeader,
5131 ULONG BitNumber);
5132
5133 NTOSAPI
5134 VOID
5135 DDKAPI
5136 RtlSetBits(
5137 IN PRTL_BITMAP BitMapHeader,
5138 IN ULONG StartingIndex,
5139 IN ULONG NumberToSet);
5140
5141 NTOSAPI
5142 NTSTATUS
5143 DDKAPI
5144 RtlSetDaclSecurityDescriptor(
5145 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5146 IN BOOLEAN DaclPresent,
5147 IN PACL Dacl OPTIONAL,
5148 IN BOOLEAN DaclDefaulted OPTIONAL);
5149
5150 NTOSAPI
5151 VOID
5152 DDKAPI
5153 RtlStoreUlong(
5154 IN PULONG Address,
5155 IN ULONG Value);
5156
5157 NTOSAPI
5158 VOID
5159 DDKAPI
5160 RtlStoreUlonglong(
5161 IN OUT PULONGLONG Address,
5162 ULONGLONG Value);
5163
5164 NTOSAPI
5165 VOID
5166 DDKAPI
5167 RtlStoreUlongPtr(
5168 IN OUT PULONG_PTR Address,
5169 IN ULONG_PTR Value);
5170
5171 NTOSAPI
5172 VOID
5173 DDKAPI
5174 RtlStoreUshort(
5175 IN PUSHORT Address,
5176 IN USHORT Value);
5177
5178 NTOSAPI
5179 NTSTATUS
5180 DDKAPI
5181 RtlStringFromGUID(
5182 IN REFGUID Guid,
5183 OUT PUNICODE_STRING GuidString);
5184
5185 NTOSAPI
5186 BOOLEAN
5187 DDKAPI
5188 RtlTestBit(
5189 IN PRTL_BITMAP BitMapHeader,
5190 IN ULONG BitNumber);
5191
5192 NTOSAPI
5193 BOOLEAN
5194 DDKAPI
5195 RtlTimeFieldsToTime(
5196 IN PTIME_FIELDS TimeFields,
5197 IN PLARGE_INTEGER Time);
5198
5199 NTOSAPI
5200 VOID
5201 DDKAPI
5202 RtlTimeToTimeFields(
5203 IN PLARGE_INTEGER Time,
5204 IN PTIME_FIELDS TimeFields);
5205
5206 NTOSAPI
5207 ULONG
5208 DDKFASTAPI
5209 RtlUlongByteSwap(
5210 IN ULONG Source);
5211
5212 NTOSAPI
5213 ULONGLONG
5214 DDKFASTAPI
5215 RtlUlonglongByteSwap(
5216 IN ULONGLONG Source);
5217
5218 NTOSAPI
5219 ULONG
5220 DDKAPI
5221 RtlUnicodeStringToAnsiSize(
5222 IN PUNICODE_STRING UnicodeString);
5223
5224 NTOSAPI
5225 NTSTATUS
5226 DDKAPI
5227 RtlUnicodeStringToAnsiString(
5228 IN OUT PANSI_STRING DestinationString,
5229 IN PUNICODE_STRING SourceString,
5230 IN BOOLEAN AllocateDestinationString);
5231
5232 NTOSAPI
5233 NTSTATUS
5234 DDKAPI
5235 RtlUnicodeStringToInteger(
5236 IN PUNICODE_STRING String,
5237 IN ULONG Base OPTIONAL,
5238 OUT PULONG Value);
5239
5240 NTOSAPI
5241 WCHAR
5242 DDKAPI
5243 RtlUpcaseUnicodeChar(
5244 IN WCHAR SourceCharacter);
5245
5246 NTOSAPI
5247 NTSTATUS
5248 DDKAPI
5249 RtlUpcaseUnicodeString(
5250 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
5251 IN PCUNICODE_STRING SourceString,
5252 IN BOOLEAN AllocateDestinationString);
5253
5254 NTOSAPI
5255 CHAR
5256 DDKAPI
5257 RtlUpperChar(
5258 IN CHAR Character);
5259
5260 NTOSAPI
5261 VOID
5262 DDKAPI
5263 RtlUpperString(
5264 IN OUT PSTRING DestinationString,
5265 IN PSTRING SourceString);
5266
5267 NTOSAPI
5268 USHORT
5269 DDKFASTAPI
5270 RtlUshortByteSwap(
5271 IN USHORT Source);
5272
5273 NTOSAPI
5274 BOOLEAN
5275 DDKAPI
5276 RtlValidRelativeSecurityDescriptor(
5277 IN PSECURITY_DESCRIPTOR_RELATIVE SecurityDescriptorInput,
5278 IN ULONG SecurityDescriptorLength,
5279 IN SECURITY_INFORMATION RequiredInformation);
5280
5281 NTOSAPI
5282 BOOLEAN
5283 DDKAPI
5284 RtlValidSecurityDescriptor(
5285 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5286
5287 NTOSAPI
5288 NTSTATUS
5289 DDKAPI
5290 RtlVerifyVersionInfo(
5291 IN PRTL_OSVERSIONINFOEXW VersionInfo,
5292 IN ULONG TypeMask,
5293 IN ULONGLONG ConditionMask);
5294
5295 NTOSAPI
5296 NTSTATUS
5297 DDKAPI
5298 RtlVolumeDeviceToDosName(
5299 IN PVOID VolumeDeviceObject,
5300 OUT PUNICODE_STRING DosName);
5301
5302 NTOSAPI
5303 ULONG
5304 DDKAPI
5305 RtlWalkFrameChain(
5306 OUT PVOID *Callers,
5307 IN ULONG Count,
5308 IN ULONG Flags);
5309
5310 NTOSAPI
5311 NTSTATUS
5312 DDKAPI
5313 RtlWriteRegistryValue(
5314 IN ULONG RelativeTo,
5315 IN PCWSTR Path,
5316 IN PCWSTR ValueName,
5317 IN ULONG ValueType,
5318 IN PVOID ValueData,
5319 IN ULONG ValueLength);
5320
5321 NTOSAPI
5322 ULONG
5323 DDKAPI
5324 RtlxUnicodeStringToAnsiSize(
5325 IN PUNICODE_STRING UnicodeString);
5326
5327 /*
5328 * VOID
5329 * RtlZeroMemory(
5330 * IN VOID UNALIGNED *Destination,
5331 * IN SIZE_T Length)
5332 */
5333 #ifndef RtlZeroMemory
5334 #define RtlZeroMemory(Destination, Length) \
5335 memset(Destination, 0, Length)
5336 #endif
5337
5338 #ifndef RtlZeroBytes
5339 #define RtlZeroBytes RtlZeroMemory
5340 #endif
5341
5342
5343 /** Executive support routines **/
5344
5345 NTOSAPI
5346 VOID
5347 DDKFASTAPI
5348 ExAcquireFastMutex(
5349 IN PFAST_MUTEX FastMutex);
5350
5351 NTOSAPI
5352 VOID
5353 DDKFASTAPI
5354 ExAcquireFastMutexUnsafe(
5355 IN PFAST_MUTEX FastMutex);
5356
5357 NTOSAPI
5358 BOOLEAN
5359 DDKAPI
5360 ExAcquireResourceExclusiveLite(
5361 IN PERESOURCE Resource,
5362 IN BOOLEAN Wait);
5363
5364 NTOSAPI
5365 BOOLEAN
5366 DDKAPI
5367 ExAcquireResourceSharedLite(
5368 IN PERESOURCE Resource,
5369 IN BOOLEAN Wait);
5370
5371 NTOSAPI
5372 BOOLEAN
5373 DDKAPI
5374 ExAcquireSharedStarveExclusive(
5375 IN PERESOURCE Resource,
5376 IN BOOLEAN Wait);
5377
5378 NTOSAPI
5379 BOOLEAN
5380 DDKAPI
5381 ExAcquireSharedWaitForExclusive(
5382 IN PERESOURCE Resource,
5383 IN BOOLEAN Wait);
5384
5385 static __inline PVOID
5386 ExAllocateFromNPagedLookasideList(
5387 IN PNPAGED_LOOKASIDE_LIST Lookaside)
5388 {
5389 PVOID Entry;
5390
5391 Lookaside->TotalAllocates++;
5392 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
5393 if (Entry == NULL) {
5394 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5395 Entry = (Lookaside->Allocate)(Lookaside->Type, Lookaside->Size, Lookaside->Tag);
5396 }
5397 return Entry;
5398 }
5399
5400 static __inline PVOID
5401 ExAllocateFromPagedLookasideList(
5402 IN PPAGED_LOOKASIDE_LIST Lookaside)
5403 {
5404 PVOID Entry;
5405
5406 Lookaside->TotalAllocates++;
5407 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
5408 if (Entry == NULL) {
5409 Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
5410 Entry = (Lookaside->Allocate)(Lookaside->Type,
5411 Lookaside->Size, Lookaside->Tag);
5412 }
5413 return Entry;
5414 }
5415
5416 NTOSAPI
5417 PVOID
5418 DDKAPI
5419 ExAllocatePoolWithQuotaTag(
5420 IN POOL_TYPE PoolType,
5421 IN SIZE_T NumberOfBytes,
5422 IN ULONG Tag);
5423
5424 NTOSAPI
5425 PVOID
5426 DDKAPI
5427 ExAllocatePoolWithTag(
5428 IN POOL_TYPE PoolType,
5429 IN SIZE_T NumberOfBytes,
5430 IN ULONG Tag);
5431
5432 #ifdef POOL_TAGGING
5433
5434 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
5435 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
5436
5437 #else /* !POOL_TAGGING */
5438
5439 NTOSAPI
5440 PVOID
5441 DDKAPI
5442 ExAllocatePool(
5443 IN POOL_TYPE PoolType,
5444 IN SIZE_T NumberOfBytes);
5445
5446 NTOSAPI
5447 PVOID
5448 DDKAPI
5449 ExAllocatePoolWithQuota(
5450 IN POOL_TYPE PoolType,
5451 IN SIZE_T NumberOfBytes);
5452
5453 #endif /* POOL_TAGGING */
5454
5455 NTOSAPI
5456 PVOID
5457 DDKAPI
5458 ExAllocatePoolWithTagPriority(
5459 IN POOL_TYPE PoolType,
5460 IN SIZE_T NumberOfBytes,
5461 IN ULONG Tag,
5462 IN EX_POOL_PRIORITY Priority);
5463
5464 NTOSAPI
5465 VOID
5466 DDKAPI
5467 ExConvertExclusiveToSharedLite(
5468 IN PERESOURCE Resource);
5469
5470 NTOSAPI
5471 NTSTATUS
5472 DDKAPI
5473 ExCreateCallback(
5474 OUT PCALLBACK_OBJECT *CallbackObject,
5475 IN POBJECT_ATTRIBUTES ObjectAttributes,
5476 IN BOOLEAN Create,
5477 IN BOOLEAN AllowMultipleCallbacks);
5478
5479 NTOSAPI
5480 VOID
5481 DDKAPI
5482 ExDeleteNPagedLookasideList(
5483 IN PNPAGED_LOOKASIDE_LIST Lookaside);
5484
5485 NTOSAPI
5486 VOID
5487 DDKAPI
5488 ExDeletePagedLookasideList(
5489 IN PPAGED_LOOKASIDE_LIST Lookaside);
5490
5491 NTOSAPI
5492 NTSTATUS
5493 DDKAPI
5494 ExDeleteResourceLite(
5495 IN PERESOURCE Resource);
5496
5497 NTOSAPI
5498 VOID
5499 DDKAPI
5500 ExFreePool(
5501 IN PVOID P);
5502
5503 #define PROTECTED_POOL 0x80000000
5504
5505 #ifdef POOL_TAGGING
5506 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
5507 #endif
5508
5509 NTOSAPI
5510 VOID
5511 DDKAPI
5512 ExFreePoolWithTag(
5513 IN PVOID P,
5514 IN ULONG Tag);
5515
5516 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
5517
5518 static __inline VOID
5519 ExFreeToNPagedLookasideList(
5520 IN PNPAGED_LOOKASIDE_LIST Lookaside,
5521 IN PVOID Entry)
5522 {
5523 Lookaside->TotalFrees++;
5524 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5525 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5526 (Lookaside->Free)(Entry);
5527 } else {
5528 InterlockedPushEntrySList(&Lookaside->ListHead,
5529 (PSLIST_ENTRY)Entry);
5530 }
5531 }
5532
5533 static __inline VOID
5534 ExFreeToPagedLookasideList(
5535 IN PPAGED_LOOKASIDE_LIST Lookaside,
5536 IN PVOID Entry)
5537 {
5538 Lookaside->TotalFrees++;
5539 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
5540 Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
5541 (Lookaside->Free)(Entry);
5542 } else {
5543 InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry);
5544 }
5545 }
5546
5547 /*
5548 * ERESOURCE_THREAD
5549 * ExGetCurrentResourceThread(
5550 * VOID);
5551 */
5552 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
5553
5554 NTOSAPI
5555 ULONG
5556 DDKAPI
5557 ExGetExclusiveWaiterCount(
5558 IN PERESOURCE Resource);
5559
5560 NTOSAPI
5561 KPROCESSOR_MODE
5562 DDKAPI
5563 ExGetPreviousMode(
5564 VOID);
5565
5566 NTOSAPI
5567 ULONG
5568 DDKAPI
5569 ExGetSharedWaiterCount(
5570 IN PERESOURCE Resource);
5571
5572 NTOSAPI
5573 VOID
5574 DDKAPI
5575 KeInitializeEvent(
5576 IN PRKEVENT Event,
5577 IN EVENT_TYPE Type,
5578 IN BOOLEAN State);
5579
5580 /*
5581 * VOID DDKAPI
5582 * ExInitializeFastMutex(
5583 * IN PFAST_MUTEX FastMutex)
5584 */
5585 #define ExInitializeFastMutex(_FastMutex) \
5586 { \
5587 (_FastMutex)->Count = 1; \
5588 (_FastMutex)->Owner = NULL; \
5589 (_FastMutex)->Contention = 0; \
5590 KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
5591 }
5592
5593 NTOSAPI
5594 VOID
5595 DDKAPI
5596 ExInitializeNPagedLookasideList(
5597 IN PNPAGED_LOOKASIDE_LIST Lookaside,
5598 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
5599 IN PFREE_FUNCTION Free OPTIONAL,
5600 IN ULONG Flags,
5601 IN SIZE_T Size,
5602 IN ULONG Tag,
5603 IN USHORT Depth);
5604
5605 NTOSAPI
5606 VOID
5607 DDKAPI
5608 ExInitializePagedLookasideList(
5609 IN PPAGED_LOOKASIDE_LIST Lookaside,
5610 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
5611 IN PFREE_FUNCTION Free OPTIONAL,
5612 IN ULONG Flags,
5613 IN SIZE_T Size,
5614 IN ULONG Tag,
5615 IN USHORT Depth);
5616
5617 NTOSAPI
5618 NTSTATUS
5619 DDKAPI
5620 ExInitializeResourceLite(
5621 IN PERESOURCE Resource);
5622
5623 /*
5624 * VOID
5625 * InitializeSListHead(
5626 * IN PSLIST_HEADER SListHead)
5627 */
5628 #define InitializeSListHead(_SListHead) \
5629 (_SListHead)->Alignment = 0
5630
5631 #define ExInitializeSListHead InitializeSListHead
5632
5633 NTOSAPI
5634 LARGE_INTEGER
5635 DDKAPI
5636 ExInterlockedAddLargeInteger(
5637 IN PLARGE_INTEGER Addend,
5638 IN LARGE_INTEGER Increment,
5639 IN PKSPIN_LOCK Lock);
5640
5641 NTOSAPI
5642 VOID
5643 DDKFASTAPI
5644 ExInterlockedAddLargeStatistic(
5645 IN PLARGE_INTEGER Addend,
5646 IN ULONG Increment);
5647
5648 NTOSAPI
5649 ULONG
5650 DDKAPI
5651 ExInterlockedAddUlong(
5652 IN PULONG Addend,
5653 IN ULONG Increment,
5654 PKSPIN_LOCK Lock);
5655
5656 NTOSAPI
5657 LONGLONG
5658 DDKFASTAPI
5659 ExInterlockedCompareExchange64(
5660 IN OUT PLONGLONG Destination,
5661 IN PLONGLONG Exchange,
5662 IN PLONGLONG Comparand,
5663 IN PKSPIN_LOCK Lock);
5664
5665 NTOSAPI
5666 PSINGLE_LIST_ENTRY
5667 DDKFASTAPI
5668 ExInterlockedFlushSList(
5669 IN PSLIST_HEADER ListHead);
5670
5671 NTOSAPI
5672 PLIST_ENTRY
5673 DDKAPI
5674 ExInterlockedInsertHeadList(
5675 IN PLIST_ENTRY ListHead,
5676 IN PLIST_ENTRY ListEntry,
5677 IN PKSPIN_LOCK Lock);
5678
5679 NTOSAPI
5680 PLIST_ENTRY
5681 DDKAPI
5682 ExInterlockedInsertTailList(
5683 IN PLIST_ENTRY ListHead,
5684 IN PLIST_ENTRY ListEntry,
5685 IN PKSPIN_LOCK Lock);
5686
5687 NTOSAPI
5688 PSINGLE_LIST_ENTRY
5689 DDKAPI
5690 ExInterlockedPopEntryList(
5691 IN PSINGLE_LIST_ENTRY ListHead,
5692 IN PKSPIN_LOCK Lock);
5693
5694 /*
5695 * PSINGLE_LIST_ENTRY
5696 * ExInterlockedPopEntrySList(
5697 * IN PSLIST_HEADER ListHead,
5698 * IN PKSPIN_LOCK Lock)
5699 */
5700 #define ExInterlockedPopEntrySList(_ListHead, \
5701 _Lock) \
5702 InterlockedPopEntrySList(_ListHead)
5703
5704 NTOSAPI
5705 PSINGLE_LIST_ENTRY
5706 DDKAPI
5707 ExInterlockedPushEntryList(
5708 IN PSINGLE_LIST_ENTRY ListHead,
5709 IN PSINGLE_LIST_ENTRY ListEntry,
5710 IN PKSPIN_LOCK Lock);
5711
5712 /*
5713 * PSINGLE_LIST_ENTRY FASTCALL
5714 * ExInterlockedPushEntrySList(
5715 * IN PSLIST_HEADER ListHead,
5716 * IN PSINGLE_LIST_ENTRY ListEntry,
5717 * IN PKSPIN_LOCK Lock)
5718 */
5719 #define ExInterlockedPushEntrySList(_ListHead, \
5720 _ListEntry, \
5721 _Lock) \
5722 InterlockedPushEntrySList(_ListHead, _ListEntry)
5723
5724 NTOSAPI
5725 PLIST_ENTRY
5726 DDKAPI
5727 ExInterlockedRemoveHeadList(
5728 IN PLIST_ENTRY ListHead,
5729 IN PKSPIN_LOCK Lock);
5730
5731 NTOSAPI
5732 BOOLEAN
5733 DDKAPI
5734 ExIsProcessorFeaturePresent(
5735 IN ULONG ProcessorFeature);
5736
5737 NTOSAPI
5738 BOOLEAN
5739 DDKAPI
5740 ExIsResourceAcquiredExclusiveLite(
5741 IN PERESOURCE Resource);
5742
5743 NTOSAPI
5744 USHORT
5745 DDKAPI
5746 ExIsResourceAcquiredLite(
5747 IN PERESOURCE Resource);
5748
5749 NTOSAPI
5750 USHORT
5751 DDKAPI
5752 ExIsResourceAcquiredSharedLite(
5753 IN PERESOURCE Resource);
5754
5755 NTOSAPI
5756 VOID
5757 DDKAPI
5758 ExLocalTimeToSystemTime(
5759 IN PLARGE_INTEGER LocalTime,
5760 OUT PLARGE_INTEGER SystemTime);
5761
5762 NTOSAPI
5763 VOID
5764 DDKAPI
5765 ExNotifyCallback(
5766 IN PCALLBACK_OBJECT CallbackObject,
5767 IN PVOID Argument1,
5768 IN PVOID Argument2);
5769
5770 NTOSAPI
5771 VOID
5772 DDKAPI
5773 ExRaiseAccessViolation(
5774 VOID);
5775
5776 NTOSAPI
5777 VOID
5778 DDKAPI
5779 ExRaiseDatatypeMisalignment(
5780 VOID);
5781
5782 NTOSAPI
5783 VOID
5784 DDKAPI
5785 ExRaiseStatus(
5786 IN NTSTATUS Status);
5787
5788 NTOSAPI
5789 PVOID
5790 DDKAPI
5791 ExRegisterCallback(
5792 IN PCALLBACK_OBJECT CallbackObject,
5793 IN PCALLBACK_FUNCTION CallbackFunction,
5794 IN PVOID CallbackContext);
5795
5796 NTOSAPI
5797 VOID
5798 DDKAPI
5799 ExReinitializeResourceLite(
5800 IN PERESOURCE Resource);
5801
5802 NTOSAPI
5803 VOID
5804 DDKFASTAPI
5805 ExReleaseFastMutex(
5806 IN PFAST_MUTEX FastMutex);
5807
5808 NTOSAPI
5809 VOID
5810 DDKFASTAPI
5811 ExReleaseFastMutexUnsafe(
5812 IN PFAST_MUTEX FastMutex);
5813
5814 NTOSAPI
5815 VOID
5816 DDKAPI
5817 ExReleaseResourceForThreadLite(
5818 IN PERESOURCE Resource,
5819 IN ERESOURCE_THREAD ResourceThreadId);
5820
5821 NTOSAPI
5822 VOID
5823 DDKFASTAPI
5824 ExReleaseResourceLite(
5825 IN PERESOURCE Resource);
5826
5827 NTOSAPI
5828 VOID
5829 DDKAPI
5830 ExSetResourceOwnerPointer(
5831 IN PERESOURCE Resource,
5832 IN PVOID OwnerPointer);
5833
5834 NTOSAPI
5835 ULONG
5836 DDKAPI
5837 ExSetTimerResolution(
5838 IN ULONG DesiredTime,
5839 IN BOOLEAN SetResolution);
5840
5841 NTOSAPI
5842 VOID
5843 DDKAPI
5844 ExSystemTimeToLocalTime(
5845 IN PLARGE_INTEGER SystemTime,
5846 OUT PLARGE_INTEGER LocalTime);
5847
5848 NTOSAPI
5849 BOOLEAN
5850 DDKFASTAPI
5851 ExTryToAcquireFastMutex(
5852 IN PFAST_MUTEX FastMutex);
5853
5854 NTOSAPI
5855 BOOLEAN
5856 DDKAPI
5857 ExTryToAcquireResourceExclusiveLite(
5858 IN PERESOURCE Resource);
5859
5860 NTOSAPI
5861 VOID
5862 DDKAPI
5863 ExUnregisterCallback(
5864 IN PVOID CbRegistration);
5865
5866 NTOSAPI
5867 NTSTATUS
5868 DDKAPI
5869 ExUuidCreate(
5870 OUT UUID *Uuid);
5871
5872 NTOSAPI
5873 BOOLEAN
5874 DDKAPI
5875 ExVerifySuite(
5876 IN SUITE_TYPE SuiteType);
5877
5878 #ifdef DBG
5879
5880 #define PAGED_CODE() { \
5881 if (KeGetCurrentIrql() > APC_LEVEL) { \
5882 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
5883 ASSERT(FALSE); \
5884 } \
5885 }
5886
5887 #else
5888
5889 #define PAGED_CODE()
5890
5891 #endif
5892
5893 NTOSAPI
5894 VOID
5895 DDKAPI
5896 ProbeForRead(
5897 IN CONST VOID *Address,
5898 IN ULONG Length,
5899 IN ULONG Alignment);
5900
5901 NTOSAPI
5902 VOID
5903 DDKAPI
5904 ProbeForWrite(
5905 IN CONST VOID *Address,
5906 IN ULONG Length,
5907 IN ULONG Alignment);
5908
5909
5910
5911 /** Configuration manager routines **/
5912
5913 NTOSAPI
5914 NTSTATUS
5915 DDKAPI
5916 CmRegisterCallback(
5917 IN PEX_CALLBACK_FUNCTION Function,
5918 IN PVOID Context,
5919 IN OUT PLARGE_INTEGER Cookie);
5920
5921 NTOSAPI
5922 NTSTATUS
5923 DDKAPI
5924 CmUnRegisterCallback(
5925 IN LARGE_INTEGER Cookie);
5926
5927
5928
5929 /** Filesystem runtime library routines **/
5930
5931 NTOSAPI
5932 BOOLEAN
5933 DDKAPI
5934 FsRtlIsTotalDeviceFailure(
5935 IN NTSTATUS Status);
5936
5937
5938
5939 /** Hardware abstraction layer routines **/
5940
5941 NTOSAPI
5942 BOOLEAN
5943 DDKAPI
5944 HalMakeBeep(
5945 IN ULONG Frequency);
5946
5947 NTOSAPI
5948 VOID
5949 DDKFASTAPI
5950 HalExamineMBR(
5951 IN PDEVICE_OBJECT DeviceObject,
5952 IN ULONG SectorSize,
5953 IN ULONG MBRTypeIdentifier,
5954 OUT PVOID Buffer);
5955
5956 NTOSAPI
5957 VOID
5958 DDKAPI
5959 READ_PORT_BUFFER_UCHAR(
5960 IN PUCHAR Port,
5961 IN PUCHAR Buffer,
5962 IN ULONG Count);
5963
5964 NTOSAPI
5965 VOID
5966 DDKAPI
5967 READ_PORT_BUFFER_ULONG(
5968 IN PULONG Port,
5969 IN PULONG Buffer,
5970 IN ULONG Count);
5971
5972 NTOSAPI
5973 VOID
5974 DDKAPI
5975 READ_PORT_BUFFER_USHORT(
5976 IN PUSHORT Port,
5977 IN PUSHORT Buffer,
5978 IN ULONG Count);
5979
5980 NTOSAPI
5981 UCHAR
5982 DDKAPI
5983 READ_PORT_UCHAR(
5984 IN PUCHAR Port);
5985
5986 NTOSAPI
5987 ULONG
5988 DDKAPI
5989 READ_PORT_ULONG(
5990 IN PULONG Port);
5991
5992 NTOSAPI
5993 USHORT
5994 DDKAPI
5995 READ_PORT_USHORT(
5996 IN PUSHORT Port);
5997
5998 NTOSAPI
5999 VOID
6000 DDKAPI
6001 READ_REGISTER_BUFFER_UCHAR(
6002 IN PUCHAR Register,
6003 IN PUCHAR Buffer,
6004 IN ULONG Count);
6005
6006 NTOSAPI
6007 VOID
6008 DDKAPI
6009 READ_REGISTER_BUFFER_ULONG(
6010 IN PULONG Register,
6011 IN PULONG Buffer,
6012 IN ULONG Count);
6013
6014 NTOSAPI
6015 VOID
6016 DDKAPI
6017 READ_REGISTER_BUFFER_USHORT(
6018 IN PUSHORT Register,
6019 IN PUSHORT Buffer,
6020 IN ULONG Count);
6021
6022 NTOSAPI
6023 UCHAR
6024 DDKAPI
6025 READ_REGISTER_UCHAR(
6026 IN PUCHAR Register);
6027
6028 NTOSAPI
6029 ULONG
6030 DDKAPI
6031 READ_REGISTER_ULONG(
6032 IN PULONG Register);
6033
6034 NTOSAPI
6035 USHORT
6036 DDKAPI
6037 READ_REGISTER_USHORT(
6038 IN PUSHORT Register);
6039
6040 NTOSAPI
6041 VOID
6042 DDKAPI
6043 WRITE_PORT_BUFFER_UCHAR(
6044 IN PUCHAR Port,
6045 IN PUCHAR Buffer,
6046 IN ULONG Count);
6047
6048 NTOSAPI
6049 VOID
6050 DDKAPI
6051 WRITE_PORT_BUFFER_ULONG(
6052 IN PULONG Port,
6053 IN PULONG Buffer,
6054 IN ULONG Count);
6055
6056 NTOSAPI
6057 VOID
6058 DDKAPI
6059 WRITE_PORT_BUFFER_USHORT(
6060 IN PUSHORT Port,
6061 IN PUSHORT Buffer,
6062 IN ULONG Count);
6063
6064 NTOSAPI
6065 VOID
6066 DDKAPI
6067 WRITE_PORT_UCHAR(
6068 IN PUCHAR Port,
6069 IN UCHAR Value);
6070
6071 NTOSAPI
6072 VOID
6073 DDKAPI
6074 WRITE_PORT_ULONG(
6075 IN PULONG Port,
6076 IN ULONG Value);
6077
6078 NTOSAPI
6079 VOID
6080 DDKAPI
6081 WRITE_PORT_USHORT(
6082 IN PUSHORT Port,
6083 IN USHORT Value);
6084
6085 NTOSAPI
6086 VOID
6087 DDKAPI
6088 WRITE_REGISTER_BUFFER_UCHAR(
6089 IN PUCHAR Register,
6090 IN PUCHAR Buffer,
6091 IN ULONG Count);
6092
6093 NTOSAPI
6094 VOID
6095 DDKAPI
6096 WRITE_REGISTER_BUFFER_ULONG(
6097 IN PULONG Register,
6098 IN PULONG Buffer,
6099 IN ULONG Count);
6100
6101 NTOSAPI
6102 VOID
6103 DDKAPI
6104 WRITE_REGISTER_BUFFER_USHORT(
6105 IN PUSHORT Register,
6106 IN PUSHORT Buffer,
6107 IN ULONG Count);
6108
6109 NTOSAPI
6110 VOID
6111 DDKAPI
6112 WRITE_REGISTER_UCHAR(
6113 IN PUCHAR Register,
6114 IN UCHAR Value);
6115
6116 NTOSAPI
6117 VOID
6118 DDKAPI
6119 WRITE_REGISTER_ULONG(
6120 IN PULONG Register,
6121 IN ULONG Value);
6122
6123 NTOSAPI
6124 VOID
6125 DDKAPI
6126 WRITE_REGISTER_USHORT(
6127 IN PUSHORT Register,
6128 IN USHORT Value);
6129
6130 /** I/O manager routines **/
6131
6132 NTOSAPI
6133 VOID
6134 DDKAPI
6135 IoAcquireCancelSpinLock(
6136 OUT PKIRQL Irql);
6137
6138 NTOSAPI
6139 NTSTATUS
6140 DDKAPI
6141 IoAcquireRemoveLockEx(
6142 IN PIO_REMOVE_LOCK RemoveLock,
6143 IN OPTIONAL PVOID Tag OPTIONAL,
6144 IN PCSTR File,
6145 IN ULONG Line,
6146 IN ULONG RemlockSize);
6147
6148 /*
6149 * NTSTATUS
6150 * IoAcquireRemoveLock(
6151 * IN PIO_REMOVE_LOCK RemoveLock,
6152 * IN OPTIONAL PVOID Tag)
6153 */
6154 #define IoAcquireRemoveLock(_RemoveLock, \
6155 _Tag) \
6156 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
6157
6158 /*
6159 * VOID
6160 * IoAdjustPagingPathCount(
6161 * IN PLONG Count,
6162 * IN BOOLEAN Increment)
6163 */
6164 #define IoAdjustPagingPathCount(_Count, \
6165 _Increment) \
6166 { \
6167 if (_Increment) \
6168 { \
6169 InterlockedIncrement(_Count); \
6170 } \
6171 else \
6172 { \
6173 InterlockedDecrement(_Count); \
6174 } \
6175 }
6176
6177 NTOSAPI
6178 VOID
6179 DDKAPI
6180 IoAllocateController(
6181 IN PCONTROLLER_OBJECT ControllerObject,
6182 IN PDEVICE_OBJECT DeviceObject,
6183 IN PDRIVER_CONTROL ExecutionRoutine,
6184 IN PVOID Context);
6185
6186 NTOSAPI
6187 NTSTATUS
6188 DDKAPI
6189 IoAllocateDriverObjectExtension(
6190 IN PDRIVER_OBJECT DriverObject,
6191 IN PVOID ClientIdentificationAddress,
6192 IN ULONG DriverObjectExtensionSize,
6193 OUT PVOID *DriverObjectExtension);
6194
6195 typedef struct _IO_ERROR_LOG_PACKET {
6196 UCHAR MajorFunctionCode;
6197 UCHAR RetryCount;
6198 USHORT DumpDataSize;
6199 USHORT NumberOfStrings;
6200 USHORT StringOffset;
6201 USHORT EventCategory;
6202 NTSTATUS ErrorCode;
6203 ULONG UniqueErrorValue;
6204 NTSTATUS FinalStatus;
6205 ULONG SequenceNumber;
6206 ULONG IoControlCode;
6207 LARGE_INTEGER DeviceOffset;
6208 ULONG DumpData[1];
6209 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
6210
6211 NTOSAPI
6212 PVOID
6213 DDKAPI
6214 IoAllocateErrorLogEntry(
6215 IN PVOID IoObject,
6216 IN UCHAR EntrySize);
6217
6218 NTOSAPI
6219 PIRP
6220 DDKAPI
6221 IoAllocateIrp(
6222 IN CCHAR StackSize,
6223 IN BOOLEAN ChargeQuota);
6224
6225 NTOSAPI
6226 PMDL
6227 DDKAPI
6228 IoAllocateMdl(
6229 IN PVOID VirtualAddress,
6230 IN ULONG Length,
6231 IN BOOLEAN SecondaryBuffer,
6232 IN BOOLEAN ChargeQuota,
6233 IN OUT PIRP Irp OPTIONAL);
6234
6235 NTOSAPI
6236 PIO_WORKITEM
6237 DDKAPI
6238 IoAllocateWorkItem(
6239 IN PDEVICE_OBJECT DeviceObject);
6240
6241 /*
6242 * VOID IoAssignArcName(
6243 * IN PUNICODE_STRING ArcName,
6244 * IN PUNICODE_STRING DeviceName);
6245 */
6246 #define IoAssignArcName(_ArcName, _DeviceName) ( \
6247 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
6248
6249 NTOSAPI
6250 NTSTATUS
6251 DDKAPI
6252 IoAttachDevice(
6253 IN PDEVICE_OBJECT SourceDevice,
6254 IN PUNICODE_STRING TargetDevice,
6255 OUT PDEVICE_OBJECT *AttachedDevice);
6256
6257 NTOSAPI
6258 PDEVICE_OBJECT
6259 DDKAPI
6260 IoAttachDeviceToDeviceStack(
6261 IN PDEVICE_OBJECT SourceDevice,
6262 IN PDEVICE_OBJECT TargetDevice);
6263
6264 NTOSAPI
6265 PIRP
6266 DDKAPI
6267 IoBuildAsynchronousFsdRequest(
6268 IN ULONG MajorFunction,
6269 IN PDEVICE_OBJECT DeviceObject,
6270 IN OUT PVOID Buffer OPTIONAL,
6271 IN ULONG Length OPTIONAL,
6272 IN PLARGE_INTEGER StartingOffset OPTIONAL,
6273 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
6274
6275 NTOSAPI
6276 PIRP
6277 DDKAPI
6278 IoBuildDeviceIoControlRequest(
6279 IN ULONG IoControlCode,
6280 IN PDEVICE_OBJECT DeviceObject,
6281 IN PVOID InputBuffer OPTIONAL,
6282 IN ULONG InputBufferLength,
6283 OUT PVOID OutputBuffer OPTIONAL,
6284 IN ULONG OutputBufferLength,
6285 IN BOOLEAN InternalDeviceIoControl,
6286 IN PKEVENT Event,
6287 OUT PIO_STATUS_BLOCK IoStatusBlock);
6288
6289 NTOSAPI
6290 VOID
6291 DDKAPI
6292 IoBuildPartialMdl(
6293 IN PMDL SourceMdl,
6294 IN OUT PMDL TargetMdl,
6295 IN PVOID VirtualAddress,
6296 IN ULONG Length);
6297
6298 NTOSAPI
6299 PIRP
6300 DDKAPI
6301 IoBuildSynchronousFsdRequest(
6302 IN ULONG MajorFunction,
6303 IN PDEVICE_OBJECT DeviceObject,
6304 IN OUT PVOID Buffer OPTIONAL,
6305 IN ULONG Length OPTIONAL,
6306 IN PLARGE_INTEGER StartingOffset OPTIONAL,
6307 IN PKEVENT Event,
6308 OUT PIO_STATUS_BLOCK IoStatusBlock);
6309
6310 NTOSAPI
6311 NTSTATUS
6312 DDKFASTAPI
6313 IofCallDriver(
6314 IN PDEVICE_OBJECT DeviceObject,
6315 IN OUT PIRP Irp);
6316
6317 /*
6318 * NTSTATUS
6319 * IoCallDriver(
6320 * IN PDEVICE_OBJECT DeviceObject,
6321 * IN OUT PIRP Irp)
6322 */
6323 #define IoCallDriver IofCallDriver
6324
6325 NTOSAPI
6326 VOID
6327 DDKAPI
6328 IoCancelFileOpen(
6329 IN PDEVICE_OBJECT DeviceObject,
6330 IN PFILE_OBJECT FileObject);
6331
6332 NTOSAPI
6333 BOOLEAN
6334 DDKAPI
6335 IoCancelIrp(
6336 IN PIRP Irp);
6337
6338 NTOSAPI
6339 NTSTATUS
6340 DDKAPI
6341 IoCheckShareAccess(
6342 IN ACCESS_MASK DesiredAccess,
6343 IN ULONG DesiredShareAccess,
6344 IN OUT PFILE_OBJECT FileObject,
6345 IN OUT PSHARE_ACCESS ShareAccess,
6346 IN BOOLEAN Update);
6347
6348 NTOSAPI
6349 VOID
6350 DDKFASTAPI
6351 IofCompleteRequest(
6352 IN PIRP Irp,
6353 IN CCHAR PriorityBoost);
6354
6355 /*
6356 * VOID
6357 * IoCompleteRequest(
6358 * IN PIRP Irp,
6359 * IN CCHAR PriorityBoost)
6360 */
6361 #define IoCompleteRequest IofCompleteRequest
6362
6363 NTOSAPI
6364 NTSTATUS
6365 DDKAPI
6366 IoConnectInterrupt(
6367 OUT PKINTERRUPT *InterruptObject,
6368 IN PKSERVICE_ROUTINE ServiceRoutine,
6369 IN PVOID ServiceContext,
6370 IN PKSPIN_LOCK SpinLock OPTIONAL,
6371 IN ULONG Vector,
6372 IN KIRQL Irql,
6373 IN KIRQL SynchronizeIrql,
6374 IN KINTERRUPT_MODE InterruptMode,
6375 IN BOOLEAN ShareVector,
6376 IN KAFFINITY ProcessorEnableMask,
6377 IN BOOLEAN FloatingSave);
6378
6379 /*
6380 * PIO_STACK_LOCATION
6381 * IoGetCurrentIrpStackLocation(
6382 * IN PIRP Irp)
6383 */
6384 #define IoGetCurrentIrpStackLocation(_Irp) \
6385 ((_Irp)->Tail.Overlay.CurrentStackLocation)
6386
6387 /*
6388 * PIO_STACK_LOCATION
6389 * IoGetNextIrpStackLocation(
6390 * IN PIRP Irp)
6391 */
6392 #define IoGetNextIrpStackLocation(_Irp) \
6393 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
6394
6395 /*
6396 * VOID
6397 * IoCopyCurrentIrpStackLocationToNext(
6398 * IN PIRP Irp)
6399 */
6400 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
6401 { \
6402 PIO_STACK_LOCATION _IrpSp; \
6403 PIO_STACK_LOCATION _NextIrpSp; \
6404 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
6405 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
6406 RtlCopyMemory(_NextIrpSp, _IrpSp, \
6407 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
6408 _NextIrpSp->Control = 0; \
6409 }
6410
6411 NTOSAPI
6412 PCONTROLLER_OBJECT
6413 DDKAPI
6414 IoCreateController(
6415 IN ULONG Size);
6416
6417 NTOSAPI
6418 NTSTATUS
6419 DDKAPI
6420 IoCreateDevice(
6421 IN PDRIVER_OBJECT DriverObject,
6422 IN ULONG DeviceExtensionSize,
6423 IN PUNICODE_STRING DeviceName OPTIONAL,
6424 IN DEVICE_TYPE DeviceType,
6425 IN ULONG DeviceCharacteristics,
6426 IN BOOLEAN Exclusive,
6427 OUT PDEVICE_OBJECT *DeviceObject);
6428
6429 NTOSAPI
6430 NTSTATUS
6431 DDKAPI
6432 IoCreateDisk(
6433 IN PDEVICE_OBJECT DeviceObject,
6434 IN PCREATE_DISK Disk);
6435
6436 NTOSAPI
6437 NTSTATUS
6438 DDKAPI
6439 IoCreateFile(
6440 OUT PHANDLE FileHandle,
6441 IN ACCESS_MASK DesiredAccess,
6442 IN POBJECT_ATTRIBUTES ObjectAttributes,
6443 OUT PIO_STATUS_BLOCK IoStatusBlock,
6444 IN PLARGE_INTEGER AllocationSize OPTIONAL,
6445 IN ULONG FileAttributes,
6446 IN ULONG ShareAccess,
6447 IN ULONG Disposition,
6448 IN ULONG CreateOptions,
6449 IN PVOID EaBuffer OPTIONAL,
6450 IN ULONG EaLength,
6451 IN CREATE_FILE_TYPE CreateFileType,
6452 IN PVOID ExtraCreateParameters OPTIONAL,
6453 IN ULONG Options);
6454
6455 NTOSAPI
6456 PKEVENT
6457 DDKAPI
6458 IoCreateNotificationEvent(
6459 IN PUNICODE_STRING EventName,
6460 OUT PHANDLE EventHandle);
6461
6462 NTOSAPI
6463 NTSTATUS
6464 DDKAPI
6465 IoCreateSymbolicLink(
6466 IN PUNICODE_STRING SymbolicLinkName,
6467 IN PUNICODE_STRING DeviceName);
6468
6469 NTOSAPI
6470 PKEVENT
6471 DDKAPI
6472 IoCreateSynchronizationEvent(
6473 IN PUNICODE_STRING EventName,
6474 OUT PHANDLE EventHandle);
6475
6476 NTOSAPI
6477 NTSTATUS
6478 DDKAPI
6479 IoCreateUnprotectedSymbolicLink(
6480 IN PUNICODE_STRING SymbolicLinkName,
6481 IN PUNICODE_STRING DeviceName);
6482
6483 NTOSAPI
6484 VOID
6485 DDKAPI
6486 IoCsqInitialize(
6487 PIO_CSQ Csq,
6488 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
6489 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
6490 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
6491 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
6492 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
6493 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
6494
6495 NTOSAPI
6496 VOID
6497 DDKAPI
6498 IoCsqInsertIrp(
6499 IN PIO_CSQ Csq,
6500 IN PIRP Irp,
6501 IN PIO_CSQ_IRP_CONTEXT Context);
6502
6503 NTOSAPI
6504 PIRP
6505 DDKAPI
6506 IoCsqRemoveIrp(
6507 IN PIO_CSQ Csq,
6508 IN PIO_CSQ_IRP_CONTEXT Context);
6509
6510 NTOSAPI
6511 PIRP
6512 DDKAPI
6513 IoCsqRemoveNextIrp(
6514 IN PIO_CSQ Csq,
6515 IN PVOID PeekContext);
6516
6517 NTOSAPI
6518 VOID
6519 DDKAPI
6520 IoDeleteController(
6521 IN PCONTROLLER_OBJECT ControllerObject);
6522
6523 NTOSAPI
6524 VOID
6525 DDKAPI
6526 IoDeleteDevice(
6527 IN PDEVICE_OBJECT DeviceObject);
6528
6529 NTOSAPI
6530 NTSTATUS
6531 DDKAPI
6532 IoDeleteSymbolicLink(
6533 IN PUNICODE_STRING SymbolicLinkName);
6534
6535 /*
6536 * VOID
6537 * IoDeassignArcName(
6538 * IN PUNICODE_STRING ArcName)
6539 */
6540 #define IoDeassignArcName IoDeleteSymbolicLink
6541
6542 NTOSAPI
6543 VOID
6544 DDKAPI
6545 IoDetachDevice(
6546 IN OUT PDEVICE_OBJECT TargetDevice);
6547
6548 NTOSAPI
6549 VOID
6550 DDKAPI
6551 IoDisconnectInterrupt(
6552 IN PKINTERRUPT InterruptObject);
6553
6554 NTOSAPI
6555 BOOLEAN
6556 DDKAPI
6557 IoForwardIrpSynchronously(
6558 IN PDEVICE_OBJECT DeviceObject,
6559 IN PIRP Irp);
6560
6561 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
6562
6563 NTOSAPI
6564 VOID
6565 DDKAPI
6566 IoFreeController(
6567 IN PCONTROLLER_OBJECT ControllerObject);
6568
6569 NTOSAPI
6570 VOID
6571 DDKAPI
6572 IoFreeErrorLogEntry(
6573 PVOID ElEntry);
6574
6575 NTOSAPI
6576 VOID
6577 DDKAPI
6578 IoFreeIrp(
6579 IN PIRP Irp);
6580
6581 NTOSAPI
6582 VOID
6583 DDKAPI
6584 IoFreeMdl(
6585 IN PMDL Mdl);
6586
6587 NTOSAPI
6588 VOID
6589 DDKAPI
6590 IoFreeWorkItem(
6591 IN PIO_WORKITEM pIOWorkItem);
6592
6593 NTOSAPI
6594 PDEVICE_OBJECT
6595 DDKAPI
6596 IoGetAttachedDevice(
6597 IN PDEVICE_OBJECT DeviceObject);
6598
6599 NTOSAPI
6600 PDEVICE_OBJECT
6601 DDKAPI
6602 IoGetAttachedDeviceReference(
6603 IN PDEVICE_OBJECT DeviceObject);
6604
6605 NTOSAPI
6606 NTSTATUS
6607 DDKAPI
6608 IoGetBootDiskInformation(
6609 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
6610 IN ULONG Size);
6611
6612 NTOSAPI
6613 PCONFIGURATION_INFORMATION
6614 DDKAPI
6615 IoGetConfigurationInformation(
6616 VOID);
6617
6618 NTOSAPI
6619 PEPROCESS
6620 DDKAPI
6621 IoGetCurrentProcess(
6622 VOID);
6623
6624 NTOSAPI
6625 NTSTATUS
6626 DDKAPI
6627 IoGetDeviceInterfaceAlias(
6628 IN PUNICODE_STRING SymbolicLinkName,
6629 IN CONST GUID *AliasInterfaceClassGuid,
6630 OUT PUNICODE_STRING AliasSymbolicLinkName);
6631
6632 NTOSAPI
6633 NTSTATUS
6634 DDKAPI
6635 IoGetDeviceInterfaces(
6636 IN CONST GUID *InterfaceClassGuid,
6637 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
6638 IN ULONG Flags,
6639 OUT PWSTR *SymbolicLinkList);
6640
6641 NTOSAPI
6642 NTSTATUS
6643 DDKAPI
6644 IoGetDeviceObjectPointer(
6645 IN PUNICODE_STRING ObjectName,
6646 IN ACCESS_MASK DesiredAccess,
6647 OUT PFILE_OBJECT *FileObject,
6648 OUT PDEVICE_OBJECT *DeviceObject);
6649
6650 NTOSAPI
6651 NTSTATUS
6652 DDKAPI
6653 IoGetDeviceProperty(
6654 IN PDEVICE_OBJECT DeviceObject,
6655 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
6656 IN ULONG BufferLength,
6657 OUT PVOID PropertyBuffer,
6658 OUT PULONG ResultLength);
6659
6660 NTOSAPI
6661 PDEVICE_OBJECT
6662 DDKAPI
6663 IoGetDeviceToVerify(
6664 IN PETHREAD Thread);
6665
6666 NTOSAPI
6667 PDMA_ADAPTER
6668 DDKAPI
6669 IoGetDmaAdapter(
6670 IN PDEVICE_OBJECT PhysicalDeviceObject,
6671 IN PDEVICE_DESCRIPTION DeviceDescription,
6672 IN OUT PULONG NumberOfMapRegisters);
6673
6674 NTOSAPI
6675 PVOID
6676 DDKAPI
6677 IoGetDriverObjectExtension(
6678 IN PDRIVER_OBJECT DriverObject,
6679 IN PVOID ClientIdentificationAddress);
6680
6681 NTOSAPI
6682 PGENERIC_MAPPING
6683 DDKAPI
6684 IoGetFileObjectGenericMapping(
6685 VOID);
6686
6687 /*
6688 * ULONG
6689 * IoGetFunctionCodeFromCtlCode(
6690 * IN ULONG ControlCode)
6691 */
6692 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
6693 (((_ControlCode) >> 2) & 0x00000FFF)
6694
6695 NTOSAPI
6696 PVOID
6697 DDKAPI
6698 IoGetInitialStack(
6699 VOID);
6700
6701 NTOSAPI
6702 PDEVICE_OBJECT
6703 DDKAPI
6704 IoGetRelatedDeviceObject(
6705 IN PFILE_OBJECT FileObject);
6706
6707 NTOSAPI
6708 ULONG
6709 DDKAPI
6710 IoGetRemainingStackSize(
6711 VOID);
6712
6713 NTOSAPI
6714 VOID
6715 DDKAPI
6716 IoGetStackLimits(
6717 OUT PULONG_PTR LowLimit,
6718 OUT PULONG_PTR HighLimit);
6719
6720 NTOSAPI
6721 VOID
6722 DDKAPI
6723 KeInitializeDpc(
6724 IN PRKDPC Dpc,
6725 IN PKDEFERRED_ROUTINE DeferredRoutine,
6726 IN PVOID DeferredContext);
6727
6728 /*
6729 * VOID
6730 * IoInitializeDpcRequest(
6731 * IN PDEVICE_OBJECT DeviceObject,
6732 * IN PIO_DPC_ROUTINE DpcRoutine)
6733 */
6734 #define IoInitializeDpcRequest(_DeviceObject, \
6735 _DpcRoutine) \
6736 KeInitializeDpc(&(_DeviceObject)->Dpc, \
6737 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
6738 _DeviceObject)
6739
6740 NTOSAPI
6741 VOID
6742 DDKAPI
6743 IoInitializeIrp(
6744 IN OUT PIRP Irp,
6745 IN USHORT PacketSize,
6746 IN CCHAR StackSize);
6747
6748 NTOSAPI
6749 VOID
6750 DDKAPI
6751 IoInitializeRemoveLockEx(
6752 IN PIO_REMOVE_LOCK Lock,
6753 IN ULONG AllocateTag,
6754 IN ULONG MaxLockedMinutes,
6755 IN ULONG HighWatermark,
6756 IN ULONG RemlockSize);
6757
6758 /* VOID
6759 * IoInitializeRemoveLock(
6760 * IN PIO_REMOVE_LOCK Lock,
6761 * IN ULONG AllocateTag,
6762 * IN ULONG MaxLockedMinutes,
6763 * IN ULONG HighWatermark)
6764 */
6765 #define IoInitializeRemoveLock( \
6766 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
6767 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
6768 HighWatermark, sizeof(IO_REMOVE_LOCK))
6769
6770 NTOSAPI
6771 NTSTATUS
6772 DDKAPI
6773 IoInitializeTimer(
6774 IN PDEVICE_OBJECT DeviceObject,
6775 IN PIO_TIMER_ROUTINE TimerRoutine,
6776 IN PVOID Context);
6777
6778 NTOSAPI
6779 VOID
6780 DDKAPI
6781 IoInvalidateDeviceRelations(
6782 IN PDEVICE_OBJECT DeviceObject,
6783 IN DEVICE_RELATION_TYPE Type);
6784
6785 NTOSAPI
6786 VOID
6787 DDKAPI
6788 IoInvalidateDeviceState(
6789 IN PDEVICE_OBJECT PhysicalDeviceObject);
6790
6791 NTOSAPI
6792 BOOLEAN
6793 DDKAPI
6794 IoIs32bitProcess(
6795 IN PIRP Irp OPTIONAL);
6796
6797 /*
6798 * BOOLEAN
6799 * IoIsErrorUserInduced(
6800 * IN NTSTATUS Status);
6801 */
6802 #define IoIsErrorUserInduced(Status) \
6803 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
6804 ((Status) == STATUS_IO_TIMEOUT) || \
6805 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
6806 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
6807 ((Status) == STATUS_VERIFY_REQUIRED) || \
6808 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
6809 ((Status) == STATUS_WRONG_VOLUME)))
6810
6811 NTOSAPI
6812 BOOLEAN
6813 DDKAPI
6814 IoIsWdmVersionAvailable(
6815 IN UCHAR MajorVersion,
6816 IN UCHAR MinorVersion);
6817
6818 NTOSAPI
6819 PIRP
6820 DDKAPI
6821 IoMakeAssociatedIrp(
6822 IN PIRP Irp,
6823 IN CCHAR StackSize);
6824
6825 /*
6826 * VOID
6827 * IoMarkIrpPending(
6828 * IN OUT PIRP Irp)
6829 */
6830 #define IoMarkIrpPending(_Irp) \
6831 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
6832
6833 NTOSAPI
6834 NTSTATUS
6835 DDKAPI
6836 IoOpenDeviceInterfaceRegistryKey(
6837 IN PUNICODE_STRING SymbolicLinkName,
6838 IN ACCESS_MASK DesiredAccess,
6839 OUT PHANDLE DeviceInterfaceKey);
6840
6841 #define PLUGPLAY_REGKEY_DEVICE 1
6842 #define PLUGPLAY_REGKEY_DRIVER 2
6843 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
6844
6845 NTOSAPI
6846 NTSTATUS
6847 DDKAPI
6848 IoOpenDeviceRegistryKey(
6849 IN PDEVICE_OBJECT DeviceObject,
6850 IN ULONG DevInstKeyType,
6851 IN ACCESS_MASK DesiredAccess,
6852 OUT PHANDLE DevInstRegKey);
6853
6854 NTOSAPI
6855 NTSTATUS
6856 DDKAPI
6857 IoQueryDeviceDescription(
6858 IN PINTERFACE_TYPE BusType OPTIONAL,
6859 IN PULONG BusNumber OPTIONAL,
6860 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
6861 IN PULONG ControllerNumber OPTIONAL,
6862 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
6863 IN PULONG PeripheralNumber OPTIONAL,
6864 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
6865 IN PVOID Context);
6866
6867 NTOSAPI
6868 VOID
6869 DDKAPI
6870 IoQueueWorkItem(
6871 IN PIO_WORKITEM pIOWorkItem,
6872 IN PIO_WORKITEM_ROUTINE Routine,
6873 IN WORK_QUEUE_TYPE QueueType,
6874 IN PVOID Context);
6875
6876 NTOSAPI
6877 VOID
6878 DDKAPI
6879 IoRaiseHardError(
6880 IN PIRP Irp,
6881 IN PVPB Vpb OPTIONAL,
6882 IN PDEVICE_OBJECT RealDeviceObject);
6883
6884 NTOSAPI
6885 BOOLEAN
6886 DDKAPI
6887 IoRaiseInformationalHardError(
6888 IN NTSTATUS ErrorStatus,
6889 IN PUNICODE_STRING String OPTIONAL,
6890 IN PKTHREAD Thread OPTIONAL);
6891
6892 NTOSAPI
6893 NTSTATUS
6894 DDKAPI
6895 IoReadDiskSignature(
6896 IN PDEVICE_OBJECT DeviceObject,
6897 IN ULONG BytesPerSector,
6898 OUT PDISK_SIGNATURE Signature);
6899
6900 NTOSAPI
6901 NTSTATUS
6902 DDKAPI
6903 IoReadPartitionTableEx(
6904 IN PDEVICE_OBJECT DeviceObject,
6905 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
6906
6907 NTOSAPI
6908 VOID
6909 DDKAPI
6910 IoRegisterBootDriverReinitialization(
6911 IN PDRIVER_OBJECT DriverObject,
6912 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6913 IN PVOID Context);
6914
6915 NTOSAPI
6916 VOID
6917 DDKAPI
6918 IoRegisterBootDriverReinitialization(
6919 IN PDRIVER_OBJECT DriverObject,
6920 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6921 IN PVOID Context);
6922
6923 NTOSAPI
6924 NTSTATUS
6925 DDKAPI
6926 IoRegisterDeviceInterface(
6927 IN PDEVICE_OBJECT PhysicalDeviceObject,
6928 IN CONST GUID *InterfaceClassGuid,
6929 IN PUNICODE_STRING ReferenceString OPTIONAL,
6930 OUT PUNICODE_STRING SymbolicLinkName);
6931
6932 NTOSAPI
6933 VOID
6934 DDKAPI
6935 IoRegisterDriverReinitialization(
6936 IN PDRIVER_OBJECT DriverObject,
6937 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
6938 IN PVOID Context);
6939
6940 NTOSAPI
6941 NTSTATUS
6942 DDKAPI
6943 IoRegisterPlugPlayNotification(
6944 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
6945 IN ULONG EventCategoryFlags,
6946 IN PVOID EventCategoryData OPTIONAL,
6947 IN PDRIVER_OBJECT DriverObject,
6948 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
6949 IN PVOID Context,
6950 OUT PVOID *NotificationEntry);
6951
6952 NTOSAPI
6953 NTSTATUS
6954 DDKAPI
6955 IoRegisterShutdownNotification(
6956 IN PDEVICE_OBJECT DeviceObject);
6957
6958 NTOSAPI
6959 VOID
6960 DDKAPI
6961 IoReleaseCancelSpinLock(
6962 IN KIRQL Irql);
6963
6964 NTOSAPI
6965 VOID
6966 DDKAPI
6967 IoReleaseRemoveLockAndWaitEx(
6968 IN PIO_REMOVE_LOCK RemoveLock,
6969 IN PVOID Tag,
6970 IN ULONG RemlockSize);
6971
6972 NTOSAPI
6973 VOID
6974 DDKAPI
6975 IoReleaseRemoveLockEx(
6976 IN PIO_REMOVE_LOCK RemoveLock,
6977 IN PVOID Tag,
6978 IN ULONG RemlockSize);
6979
6980 /*
6981 * VOID
6982 * IoReleaseRemoveLock(
6983 * IN PIO_REMOVE_LOCK RemoveLock,
6984 * IN PVOID Tag)
6985 */
6986 #define IoReleaseRemoveLock(_RemoveLock, \
6987 _Tag) \
6988 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6989
6990 /*
6991 * VOID
6992 * IoReleaseRemoveLockAndWait(
6993 * IN PIO_REMOVE_LOCK RemoveLock,
6994 * IN PVOID Tag)
6995 */
6996 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
6997 _Tag) \
6998 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
6999
7000 NTOSAPI
7001 VOID
7002 DDKAPI
7003 IoRemoveShareAccess(
7004 IN PFILE_OBJECT FileObject,
7005 IN OUT PSHARE_ACCESS ShareAccess);
7006
7007 NTOSAPI
7008 NTSTATUS
7009 DDKAPI
7010 IoReportDetectedDevice(
7011 IN PDRIVER_OBJECT DriverObject,
7012 IN INTERFACE_TYPE LegacyBusType,
7013 IN ULONG BusNumber,
7014 IN ULONG SlotNumber,
7015 IN PCM_RESOURCE_LIST ResourceList,
7016 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
7017 IN BOOLEAN ResourceAssigned,
7018 IN OUT PDEVICE_OBJECT *DeviceObject);
7019
7020 NTOSAPI
7021 NTSTATUS
7022 DDKAPI
7023 IoReportResourceForDetection(
7024 IN PDRIVER_OBJECT DriverObject,
7025 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7026 IN ULONG DriverListSize OPTIONAL,
7027 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
7028 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7029 IN ULONG DeviceListSize OPTIONAL,
7030 OUT PBOOLEAN ConflictDetected);
7031
7032 NTOSAPI
7033 NTSTATUS
7034 DDKAPI
7035 IoReportResourceUsage(
7036 IN PUNICODE_STRING DriverClassName OPTIONAL,
7037 IN PDRIVER_OBJECT DriverObject,
7038 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7039 IN ULONG DriverListSize OPTIONAL,
7040 IN PDEVICE_OBJECT DeviceObject,
7041 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7042 IN ULONG DeviceListSize OPTIONAL,
7043 IN BOOLEAN OverrideConflict,
7044 OUT PBOOLEAN ConflictDetected);
7045
7046 NTOSAPI
7047 NTSTATUS
7048 DDKAPI
7049 IoReportTargetDeviceChange(
7050 IN PDEVICE_OBJECT PhysicalDeviceObject,
7051 IN PVOID NotificationStructure);
7052
7053 NTOSAPI
7054 NTSTATUS
7055 DDKAPI
7056 IoReportTargetDeviceChangeAsynchronous(
7057 IN PDEVICE_OBJECT PhysicalDeviceObject,
7058 IN PVOID NotificationStructure,
7059 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
7060 IN PVOID Context OPTIONAL);
7061
7062 NTOSAPI
7063 VOID
7064 DDKAPI
7065 IoRequestDeviceEject(
7066 IN PDEVICE_OBJECT PhysicalDeviceObject);
7067
7068 /*
7069 * VOID
7070 * IoRequestDpc(
7071 * IN PDEVICE_OBJECT DeviceObject,
7072 * IN PIRP Irp,
7073 * IN PVOID Context);
7074 */
7075 #define IoRequestDpc(DeviceObject, Irp, Context)( \
7076 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
7077
7078 NTOSAPI
7079 VOID
7080 DDKAPI
7081 IoReuseIrp(
7082 IN OUT PIRP Irp,
7083 IN NTSTATUS Status);
7084
7085 /*
7086 * PDRIVER_CANCEL
7087 * IoSetCancelRoutine(
7088 * IN PIRP Irp,
7089 * IN PDRIVER_CANCEL CancelRoutine)
7090 */
7091 #define IoSetCancelRoutine(_Irp, \
7092 _CancelRoutine) \
7093 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
7094 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
7095
7096 /*
7097 * VOID
7098 * IoSetCompletionRoutine(
7099 * IN PIRP Irp,
7100 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7101 * IN PVOID Context,
7102 * IN BOOLEAN InvokeOnSuccess,
7103 * IN BOOLEAN InvokeOnError,
7104 * IN BOOLEAN InvokeOnCancel)
7105 */
7106 #define IoSetCompletionRoutine(_Irp, \
7107 _CompletionRoutine, \
7108 _Context, \
7109 _InvokeOnSuccess, \
7110 _InvokeOnError, \
7111 _InvokeOnCancel) \
7112 { \
7113 PIO_STACK_LOCATION _IrpSp; \
7114 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
7115 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
7116 _IrpSp->Context = (_Context); \
7117 _IrpSp->Control = 0; \
7118 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
7119 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
7120 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
7121 }
7122
7123 NTOSAPI
7124 VOID
7125 DDKAPI
7126 IoSetCompletionRoutineEx(
7127 IN PDEVICE_OBJECT DeviceObject,
7128 IN PIRP Irp,
7129 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7130 IN PVOID Context,
7131 IN BOOLEAN InvokeOnSuccess,
7132 IN BOOLEAN InvokeOnError,
7133 IN BOOLEAN InvokeOnCancel);
7134
7135 NTOSAPI
7136 NTSTATUS
7137 DDKAPI
7138 IoSetDeviceInterfaceState(
7139 IN PUNICODE_STRING SymbolicLinkName,
7140 IN BOOLEAN Enable);
7141
7142 NTOSAPI
7143 VOID
7144 DDKAPI
7145 IoSetHardErrorOrVerifyDevice(
7146 IN PIRP Irp,
7147 IN PDEVICE_OBJECT DeviceObject);
7148
7149 /*
7150 * VOID
7151 * IoSetNextIrpStackLocation(
7152 * IN OUT PIRP Irp)
7153 */
7154 #define IoSetNextIrpStackLocation(_Irp) \
7155 { \
7156 (_Irp)->CurrentLocation--; \
7157 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
7158 }
7159
7160 NTOSAPI
7161 NTSTATUS
7162 DDKAPI
7163 IoSetPartitionInformationEx(
7164 IN PDEVICE_OBJECT DeviceObject,
7165 IN ULONG PartitionNumber,
7166 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
7167
7168 NTOSAPI
7169 VOID
7170 DDKAPI
7171 IoSetShareAccess(
7172 IN ACCESS_MASK DesiredAccess,
7173 IN ULONG DesiredShareAccess,
7174 IN OUT PFILE_OBJECT FileObject,
7175 OUT PSHARE_ACCESS ShareAccess);
7176
7177 NTOSAPI
7178 VOID
7179 DDKAPI
7180 IoSetStartIoAttributes(
7181 IN PDEVICE_OBJECT DeviceObject,
7182 IN BOOLEAN DeferredStartIo,
7183 IN BOOLEAN NonCancelable);
7184
7185 NTOSAPI
7186 NTSTATUS
7187 DDKAPI
7188 IoSetSystemPartition(
7189 IN PUNICODE_STRING VolumeNameString);
7190
7191 NTOSAPI
7192 BOOLEAN
7193 DDKAPI
7194 IoSetThreadHardErrorMode(
7195 IN BOOLEAN EnableHardErrors);
7196
7197 /*
7198 * USHORT
7199 * IoSizeOfIrp(
7200 * IN CCHAR StackSize)
7201 */
7202 #define IoSizeOfIrp(_StackSize) \
7203 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
7204
7205 /*
7206 * VOID
7207 * IoSkipCurrentIrpStackLocation(
7208 * IN PIRP Irp)
7209 */
7210 #define IoSkipCurrentIrpStackLocation(_Irp) \
7211 { \
7212 (_Irp)->CurrentLocation++; \
7213 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
7214 }
7215
7216 NTOSAPI
7217 VOID
7218 DDKAPI
7219 IoStartNextPacket(
7220 IN PDEVICE_OBJECT DeviceObject,
7221 IN BOOLEAN Cancelable);
7222
7223 NTOSAPI
7224 VOID
7225 DDKAPI
7226 IoStartNextPacketByKey(
7227 IN PDEVICE_OBJECT DeviceObject,
7228 IN BOOLEAN Cancelable,
7229 IN ULONG Key);
7230
7231 NTOSAPI
7232 VOID
7233 DDKAPI
7234 IoStartPacket(
7235 IN PDEVICE_OBJECT DeviceObject,
7236 IN PIRP Irp,
7237 IN PULONG Key OPTIONAL,
7238 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
7239
7240 NTOSAPI
7241 VOID
7242 DDKAPI
7243 IoStartTimer(
7244 IN PDEVICE_OBJECT DeviceObject);
7245
7246 NTOSAPI
7247 VOID
7248 DDKAPI
7249 IoStopTimer(
7250 IN PDEVICE_OBJECT DeviceObject);
7251
7252 NTOSAPI
7253 NTSTATUS
7254 DDKAPI
7255 IoUnregisterPlugPlayNotification(
7256 IN PVOID NotificationEntry);
7257
7258 NTOSAPI
7259 VOID
7260 DDKAPI
7261 IoUnregisterShutdownNotification(
7262 IN PDEVICE_OBJECT DeviceObject);
7263
7264 NTOSAPI
7265 VOID
7266 DDKAPI
7267 IoUpdateShareAccess(
7268 IN PFILE_OBJECT FileObject,
7269 IN OUT PSHARE_ACCESS ShareAccess);
7270
7271 NTOSAPI
7272 NTSTATUS
7273 DDKAPI
7274 IoVerifyPartitionTable(
7275 IN PDEVICE_OBJECT DeviceObject,
7276 IN BOOLEAN FixErrors);
7277
7278 NTOSAPI
7279 NTSTATUS
7280 DDKAPI
7281 IoVolumeDeviceToDosName(
7282 IN PVOID VolumeDeviceObject,
7283 OUT PUNICODE_STRING DosName);
7284
7285 NTOSAPI
7286 NTSTATUS
7287 DDKAPI
7288 IoWMIAllocateInstanceIds(
7289 IN GUID *Guid,
7290 IN ULONG InstanceCount,
7291 OUT ULONG *FirstInstanceId);
7292
7293 NTOSAPI
7294 ULONG
7295 DDKAPI
7296 IoWMIDeviceObjectToProviderId(
7297 IN PDEVICE_OBJECT DeviceObject);
7298
7299 NTOSAPI
7300 NTSTATUS
7301 DDKAPI
7302 IoWMIDeviceObjectToInstanceName(
7303 IN PVOID DataBlockObject,
7304 IN PDEVICE_OBJECT DeviceObject,
7305 OUT PUNICODE_STRING InstanceName);
7306
7307 NTOSAPI
7308 NTSTATUS
7309 DDKAPI
7310 IoWMIExecuteMethod(
7311 IN PVOID DataBlockObject,
7312 IN PUNICODE_STRING InstanceName,
7313 IN ULONG MethodId,
7314 IN ULONG InBufferSize,
7315 IN OUT PULONG OutBufferSize,
7316 IN OUT PUCHAR InOutBuffer);
7317
7318 NTOSAPI
7319 NTSTATUS
7320 DDKAPI
7321 IoWMIHandleToInstanceName(
7322 IN PVOID DataBlockObject,
7323 IN HANDLE FileHandle,
7324 OUT PUNICODE_STRING InstanceName);
7325
7326 NTOSAPI
7327 NTSTATUS
7328 DDKAPI
7329 IoWMIOpenBlock(
7330 IN GUID *DataBlockGuid,
7331 IN ULONG DesiredAccess,
7332 OUT PVOID *DataBlockObject);
7333
7334 NTOSAPI
7335 NTSTATUS
7336 DDKAPI
7337 IoWMIQueryAllData(
7338 IN PVOID DataBlockObject,
7339 IN OUT ULONG *InOutBufferSize,
7340 OUT PVOID OutBuffer);
7341
7342 NTOSAPI
7343 NTSTATUS
7344 DDKAPI
7345 IoWMIQueryAllDataMultiple(
7346 IN PVOID *DataBlockObjectList,
7347 IN ULONG ObjectCount,
7348 IN OUT ULONG *InOutBufferSize,
7349 OUT PVOID OutBuffer);
7350
7351 NTOSAPI
7352 NTSTATUS
7353 DDKAPI
7354 IoWMIQuerySingleInstance(
7355 IN PVOID DataBlockObject,
7356 IN PUNICODE_STRING InstanceName,
7357 IN OUT ULONG *InOutBufferSize,
7358 OUT PVOID OutBuffer);
7359
7360 NTOSAPI
7361 NTSTATUS
7362 DDKAPI
7363 IoWMIQuerySingleInstanceMultiple(
7364 IN PVOID *DataBlockObjectList,
7365 IN PUNICODE_STRING InstanceNames,
7366 IN ULONG ObjectCount,
7367 IN OUT ULONG *InOutBufferSize,
7368 OUT PVOID OutBuffer);
7369
7370 NTOSAPI
7371 NTSTATUS
7372 DDKAPI
7373 IoWMIRegistrationControl(
7374 IN PDEVICE_OBJECT DeviceObject,
7375 IN ULONG Action);
7376
7377 NTOSAPI
7378 NTSTATUS
7379 DDKAPI
7380 IoWMISetNotificationCallback(
7381 IN PVOID Object,
7382 IN WMI_NOTIFICATION_CALLBACK Callback,
7383 IN PVOID Context);
7384
7385 NTOSAPI
7386 NTSTATUS
7387 DDKAPI
7388 IoWMISetSingleInstance(
7389 IN PVOID DataBlockObject,
7390 IN PUNICODE_STRING InstanceName,
7391 IN ULONG Version,
7392 IN ULONG ValueBufferSize,
7393 IN PVOID ValueBuffer);
7394
7395 NTOSAPI
7396 NTSTATUS
7397 DDKAPI
7398 IoWMISetSingleItem(
7399 IN PVOID DataBlockObject,
7400 IN PUNICODE_STRING InstanceName,
7401 IN ULONG DataItemId,
7402 IN ULONG Version,
7403 IN ULONG ValueBufferSize,
7404 IN PVOID ValueBuffer);
7405
7406 NTOSAPI
7407 NTSTATUS
7408 DDKAPI
7409 IoWMISuggestInstanceName(
7410 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7411 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
7412 IN BOOLEAN CombineNames,
7413 OUT PUNICODE_STRING SuggestedInstanceName);
7414
7415 NTOSAPI
7416 NTSTATUS
7417 DDKAPI
7418 IoWMIWriteEvent(
7419 IN PVOID WnodeEventItem);
7420
7421 NTOSAPI
7422 VOID
7423 DDKAPI
7424 IoWriteErrorLogEntry(
7425 IN PVOID ElEntry);
7426
7427 NTOSAPI
7428 NTSTATUS
7429 DDKAPI
7430 IoWritePartitionTableEx(
7431 IN PDEVICE_OBJECT DeviceObject,
7432 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
7433
7434
7435
7436 /** Kernel routines **/
7437
7438 NTOSAPI
7439 VOID
7440 DDKFASTAPI
7441 KeAcquireInStackQueuedSpinLock(
7442 IN PKSPIN_LOCK SpinLock,
7443 IN PKLOCK_QUEUE_HANDLE LockHandle);
7444
7445 NTOSAPI
7446 VOID
7447 DDKFASTAPI
7448 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7449 IN PKSPIN_LOCK SpinLock,
7450 IN PKLOCK_QUEUE_HANDLE LockHandle);
7451
7452 NTOSAPI
7453 KIRQL
7454 DDKAPI
7455 KeAcquireInterruptSpinLock(
7456 IN PKINTERRUPT Interrupt);
7457
7458 NTOSAPI
7459 VOID
7460 DDKAPI
7461 KeAcquireSpinLock(
7462 IN PKSPIN_LOCK SpinLock,
7463 OUT PKIRQL OldIrql);
7464
7465 /* System Service Dispatch Table */
7466 typedef PVOID (NTAPI * SSDT)(VOID);
7467 typedef SSDT * PSSDT;
7468
7469 /* System Service Parameters Table */
7470 typedef UCHAR SSPT, * PSSPT;
7471
7472 typedef struct _SSDT_ENTRY {
7473 PSSDT SSDT;
7474 PULONG ServiceCounterTable;
7475 ULONG NumberOfServices;
7476 PSSPT SSPT;
7477 } SSDT_ENTRY, *PSSDT_ENTRY;
7478
7479 NTOSAPI
7480 BOOLEAN
7481 DDKAPI
7482 KeAddSystemServiceTable(
7483 IN PSSDT SSDT,
7484 IN PULONG ServiceCounterTable,
7485 IN ULONG NumberOfServices,
7486 IN PSSPT SSPT,
7487 IN ULONG TableIndex);
7488
7489 NTOSAPI
7490 BOOLEAN
7491 DDKAPI
7492 KeAreApcsDisabled(
7493 VOID);
7494
7495 NTOSAPI
7496 VOID
7497 DDKAPI
7498 KeAttachProcess(
7499 IN PEPROCESS Process);
7500
7501 NTOSAPI
7502 VOID
7503 DDKAPI
7504 KeBugCheck(
7505 IN ULONG BugCheckCode);
7506
7507 NTOSAPI
7508 VOID
7509 DDKAPI
7510 KeBugCheckEx(
7511 IN ULONG BugCheckCode,
7512 IN ULONG_PTR BugCheckParameter1,
7513 IN ULONG_PTR BugCheckParameter2,
7514 IN ULONG_PTR BugCheckParameter3,
7515 IN ULONG_PTR BugCheckParameter4);
7516
7517 NTOSAPI
7518 BOOLEAN
7519 DDKAPI
7520 KeCancelTimer(
7521 IN PKTIMER Timer);
7522
7523 NTOSAPI
7524 VOID
7525 DDKAPI
7526 KeClearEvent(
7527 IN PRKEVENT Event);
7528
7529 NTOSAPI
7530 NTSTATUS
7531 DDKAPI
7532 KeDelayExecutionThread(
7533 IN KPROCESSOR_MODE WaitMode,
7534 IN BOOLEAN Alertable,
7535 IN PLARGE_INTEGER Interval);
7536
7537 NTOSAPI
7538 BOOLEAN
7539 DDKAPI
7540 KeDeregisterBugCheckCallback(
7541 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
7542
7543 NTOSAPI
7544 VOID
7545 DDKAPI
7546 KeDetachProcess(
7547 VOID);
7548
7549 NTOSAPI
7550 VOID
7551 DDKAPI
7552 KeEnterCriticalRegion(
7553 VOID);
7554
7555 /*
7556 * VOID
7557 * KeFlushIoBuffers(
7558 * IN PMDL Mdl,
7559 * IN BOOLEAN ReadOperation,
7560 * IN BOOLEAN DmaOperation)
7561 */
7562 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7563
7564 NTOSAPI
7565 PRKTHREAD
7566 DDKAPI
7567 KeGetCurrentThread(
7568 VOID);
7569
7570 NTOSAPI
7571 KPROCESSOR_MODE
7572 DDKAPI
7573 KeGetPreviousMode(
7574 VOID);
7575
7576 NTOSAPI
7577 ULONG
7578 DDKAPI
7579 KeGetRecommendedSharedDataAlignment(
7580 VOID);
7581
7582 NTOSAPI
7583 VOID
7584 DDKAPI
7585 KeInitializeApc(
7586 IN PKAPC Apc,
7587 IN PKTHREAD Thread,
7588 IN UCHAR StateIndex,
7589 IN PKKERNEL_ROUTINE KernelRoutine,
7590 IN PKRUNDOWN_ROUTINE RundownRoutine,
7591 IN PKNORMAL_ROUTINE NormalRoutine,
7592 IN UCHAR Mode,
7593 IN PVOID Context);
7594
7595 NTOSAPI
7596 VOID
7597 DDKAPI
7598 KeInitializeDeviceQueue(
7599 IN PKDEVICE_QUEUE DeviceQueue);
7600
7601 NTOSAPI
7602 VOID
7603 DDKAPI
7604 KeInitializeMutex(
7605 IN PRKMUTEX Mutex,
7606 IN ULONG Level);
7607
7608 NTOSAPI
7609 VOID
7610 DDKAPI
7611 KeInitializeSemaphore(
7612 IN PRKSEMAPHORE Semaphore,
7613 IN LONG Count,
7614 IN LONG Limit);
7615
7616 NTOSAPI
7617 VOID
7618 DDKAPI
7619 KeInitializeSpinLock(
7620 IN PKSPIN_LOCK SpinLock);
7621
7622 NTOSAPI
7623 VOID
7624 DDKAPI
7625 KeInitializeTimer(
7626 IN PKTIMER Timer);
7627
7628 NTOSAPI
7629 VOID
7630 DDKAPI
7631 KeInitializeTimerEx(
7632 IN PKTIMER Timer,
7633 IN TIMER_TYPE Type);
7634
7635 NTOSAPI
7636 BOOLEAN
7637 DDKAPI
7638 KeInsertByKeyDeviceQueue(
7639 IN PKDEVICE_QUEUE DeviceQueue,
7640 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7641 IN ULONG SortKey);
7642
7643 NTOSAPI
7644 BOOLEAN
7645 DDKAPI
7646 KeInsertDeviceQueue(
7647 IN PKDEVICE_QUEUE DeviceQueue,
7648 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7649
7650 NTOSAPI
7651 BOOLEAN
7652 DDKAPI
7653 KeInsertQueueDpc(
7654 IN PRKDPC Dpc,
7655 IN PVOID SystemArgument1,
7656 IN PVOID SystemArgument2);
7657
7658 NTOSAPI
7659 VOID
7660 DDKAPI
7661 KeLeaveCriticalRegion(
7662 VOID);
7663
7664 static __inline
7665 VOID
7666 KeMemoryBarrier(
7667 VOID)
7668 {
7669 volatile LONG Barrier;
7670 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
7671 }
7672
7673 NTOSAPI
7674 LONG
7675 DDKAPI
7676 KePulseEvent(
7677 IN PRKEVENT Event,
7678 IN KPRIORITY Increment,
7679 IN BOOLEAN Wait);
7680
7681 NTOSAPI
7682 ULONGLONG
7683 DDKAPI
7684 KeQueryInterruptTime(
7685 VOID);
7686
7687 NTOSAPI
7688 LARGE_INTEGER
7689 DDKAPI
7690 KeQueryPerformanceCounter(
7691 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
7692
7693 NTOSAPI
7694 KPRIORITY
7695 DDKAPI
7696 KeQueryPriorityThread(
7697 IN PRKTHREAD Thread);
7698
7699 NTOSAPI
7700 VOID
7701 DDKAPI
7702 KeQuerySystemTime(
7703 OUT PLARGE_INTEGER CurrentTime);
7704
7705 NTOSAPI
7706 VOID
7707 DDKAPI
7708 KeQueryTickCount(
7709 OUT PLARGE_INTEGER TickCount);
7710
7711 NTOSAPI
7712 ULONG
7713 DDKAPI
7714 KeQueryTimeIncrement(
7715 VOID);
7716
7717 NTOSAPI
7718 LONG
7719 DDKAPI
7720 KeReadStateEvent(
7721 IN PRKEVENT Event);
7722
7723 NTOSAPI
7724 LONG
7725 DDKAPI
7726 KeReadStateMutex(
7727 IN PRKMUTEX Mutex);
7728
7729 NTOSAPI
7730 LONG
7731 DDKAPI
7732 KeReadStateSemaphore(
7733 IN PRKSEMAPHORE Semaphore);
7734
7735 NTOSAPI
7736 BOOLEAN
7737 DDKAPI
7738 KeReadStateTimer(
7739 IN PKTIMER Timer);
7740
7741 NTOSAPI
7742 BOOLEAN
7743 DDKAPI
7744 KeRegisterBugCheckCallback(
7745 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7746 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7747 IN PVOID Buffer,
7748 IN ULONG Length,
7749 IN PUCHAR Component);
7750
7751 NTOSAPI
7752 VOID
7753 DDKFASTAPI
7754 KeReleaseInStackQueuedSpinLock(
7755 IN PKLOCK_QUEUE_HANDLE LockHandle);
7756
7757 NTOSAPI
7758 VOID
7759 DDKFASTAPI
7760 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7761 IN PKLOCK_QUEUE_HANDLE LockHandle);
7762
7763 NTOSAPI
7764 VOID
7765 DDKAPI
7766 KeReleaseInterruptSpinLock(
7767 IN PKINTERRUPT Interrupt,
7768 IN KIRQL OldIrql);
7769
7770 NTOSAPI
7771 LONG
7772 DDKAPI
7773 KeReleaseMutex(
7774 IN PRKMUTEX Mutex,
7775 IN BOOLEAN Wait);
7776
7777 NTOSAPI
7778 LONG
7779 DDKAPI
7780 KeReleaseSemaphore(
7781 IN PRKSEMAPHORE Semaphore,
7782 IN KPRIORITY Increment,
7783 IN LONG Adjustment,
7784 IN BOOLEAN Wait);
7785
7786 NTOSAPI
7787 VOID
7788 DDKAPI
7789 KeReleaseSpinLock(
7790 IN PKSPIN_LOCK SpinLock,
7791 IN KIRQL NewIrql);
7792
7793 NTOSAPI
7794 PKDEVICE_QUEUE_ENTRY
7795 DDKAPI
7796 KeRemoveByKeyDeviceQueue(
7797 IN PKDEVICE_QUEUE DeviceQueue,
7798 IN ULONG SortKey);
7799
7800 NTOSAPI
7801 PKDEVICE_QUEUE_ENTRY
7802 DDKAPI
7803 KeRemoveDeviceQueue(
7804 IN PKDEVICE_QUEUE DeviceQueue);
7805
7806 NTOSAPI
7807 BOOLEAN
7808 DDKAPI
7809 KeRemoveEntryDeviceQueue(
7810 IN PKDEVICE_QUEUE DeviceQueue,
7811 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7812
7813 NTOSAPI
7814 BOOLEAN
7815 DDKAPI
7816 KeRemoveQueueDpc(
7817 IN PRKDPC Dpc);
7818
7819 NTOSAPI
7820 LONG
7821 DDKAPI
7822 KeResetEvent(
7823 IN PRKEVENT Event);
7824
7825 NTOSAPI
7826 NTSTATUS
7827 DDKAPI
7828 KeRestoreFloatingPointState(
7829 IN PKFLOATING_SAVE FloatSave);
7830
7831 NTOSAPI
7832 NTSTATUS
7833 DDKAPI
7834 KeSaveFloatingPointState(
7835 OUT PKFLOATING_SAVE FloatSave);
7836
7837 NTOSAPI
7838 LONG
7839 DDKAPI
7840 KeSetBasePriorityThread(
7841 IN PRKTHREAD Thread,
7842 IN LONG Increment);
7843
7844 NTOSAPI
7845 LONG
7846 DDKAPI
7847 KeSetEvent(
7848 IN PRKEVENT Event,
7849 IN KPRIORITY Increment,
7850 IN BOOLEAN Wait);
7851
7852 NTOSAPI
7853 VOID
7854 DDKAPI
7855 KeSetImportanceDpc(
7856 IN PRKDPC Dpc,
7857 IN KDPC_IMPORTANCE Importance);
7858
7859 NTOSAPI
7860 KPRIORITY
7861 DDKAPI
7862 KeSetPriorityThread(
7863 IN PKTHREAD Thread,
7864 IN KPRIORITY Priority);
7865
7866 NTOSAPI
7867 VOID
7868 DDKAPI
7869 KeSetTargetProcessorDpc(
7870 IN PRKDPC Dpc,
7871 IN CCHAR Number);
7872
7873 NTOSAPI
7874 BOOLEAN
7875 DDKAPI
7876 KeSetTimer(
7877 IN PKTIMER Timer,
7878 IN LARGE_INTEGER DueTime,
7879 IN PKDPC Dpc OPTIONAL);
7880
7881 NTOSAPI
7882 BOOLEAN
7883 DDKAPI
7884 KeSetTimerEx(
7885 IN PKTIMER Timer,
7886 IN LARGE_INTEGER DueTime,
7887 IN LONG Period OPTIONAL,
7888 IN PKDPC Dpc OPTIONAL);
7889
7890 NTOSAPI
7891 VOID
7892 DDKFASTAPI
7893 KeSetTimeUpdateNotifyRoutine(
7894 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
7895
7896 NTOSAPI
7897 VOID
7898 DDKAPI
7899 KeStallExecutionProcessor(
7900 IN ULONG MicroSeconds);
7901
7902 NTOSAPI
7903 BOOLEAN
7904 DDKAPI
7905 KeSynchronizeExecution(
7906 IN PKINTERRUPT Interrupt,
7907 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7908 IN PVOID SynchronizeContext);
7909
7910 NTOSAPI
7911 NTSTATUS
7912 DDKAPI
7913 KeWaitForMultipleObjects(
7914 IN ULONG Count,
7915 IN PVOID Object[],
7916 IN WAIT_TYPE WaitType,
7917 IN KWAIT_REASON WaitReason,
7918 IN KPROCESSOR_MODE WaitMode,
7919 IN BOOLEAN Alertable,
7920 IN PLARGE_INTEGER Timeout OPTIONAL,
7921 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
7922
7923 NTOSAPI
7924 NTSTATUS
7925 DDKAPI
7926 KeWaitForMutexObject(
7927 IN PRKMUTEX Mutex,
7928 IN KWAIT_REASON WaitReason,
7929 IN KPROCESSOR_MODE WaitMode,
7930 IN BOOLEAN Alertable,
7931 IN PLARGE_INTEGER Timeout OPTIONAL);
7932
7933 NTOSAPI
7934 NTSTATUS
7935 DDKAPI
7936 KeWaitForSingleObject(
7937 IN PVOID Object,
7938 IN KWAIT_REASON WaitReason,
7939 IN KPROCESSOR_MODE WaitMode,
7940 IN BOOLEAN Alertable,
7941 IN PLARGE_INTEGER Timeout OPTIONAL);
7942
7943 #if defined(_X86_)
7944
7945 NTOSAPI
7946 VOID
7947 FASTCALL
7948 KfLowerIrql(
7949 IN KIRQL NewIrql);
7950
7951 NTOSAPI
7952 KIRQL
7953 FASTCALL
7954 KfRaiseIrql(
7955 IN KIRQL NewIrql);
7956
7957 #define KeLowerIrql(a) KfLowerIrql(a)
7958 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7959
7960 #else
7961
7962 NTOSAPI
7963 VOID
7964 DDKAPI
7965 KeLowerIrql(
7966 IN KIRQL NewIrql);
7967
7968 NTOSAPI
7969 KIRQL
7970 DDKAPI
7971 KeRaiseIrql(
7972 IN KIRQL NewIrql);
7973
7974 #endif
7975
7976 NTOSAPI
7977 KIRQL
7978 DDKAPI
7979 KeRaiseIrqlToDpcLevel(
7980 VOID);
7981
7982 /** Memory manager routines **/
7983
7984 NTOSAPI
7985 NTSTATUS
7986 DDKAPI
7987 MmAdvanceMdl(
7988 IN PMDL Mdl,
7989 IN ULONG NumberOfBytes);
7990
7991 NTOSAPI
7992 PVOID
7993 DDKAPI
7994 MmAllocateContiguousMemory(
7995 IN ULONG NumberOfBytes,
7996 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
7997
7998 NTOSAPI
7999 PVOID
8000 DDKAPI
8001 MmAllocateContiguousMemorySpecifyCache(
8002 IN SIZE_T NumberOfBytes,
8003 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
8004 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
8005 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
8006 IN MEMORY_CACHING_TYPE CacheType);
8007
8008 NTOSAPI
8009 PVOID
8010 DDKAPI
8011 MmAllocateMappingAddress(
8012 IN SIZE_T NumberOfBytes,
8013 IN ULONG PoolTag);
8014
8015 NTOSAPI
8016 PVOID
8017 DDKAPI
8018 MmAllocateNonCachedMemory(
8019 IN ULONG NumberOfBytes);
8020
8021 NTOSAPI
8022 PMDL
8023 DDKAPI
8024 MmAllocatePagesForMdl(
8025 IN PHYSICAL_ADDRESS LowAddress,
8026 IN PHYSICAL_ADDRESS HighAddress,
8027 IN PHYSICAL_ADDRESS SkipBytes,
8028 IN SIZE_T TotalBytes);
8029
8030 NTOSAPI
8031 VOID
8032 DDKAPI
8033 MmBuildMdlForNonPagedPool(
8034 IN OUT PMDL MemoryDescriptorList);
8035
8036 NTOSAPI
8037 NTSTATUS
8038 DDKAPI
8039 MmCreateSection(
8040 OUT PSECTION_OBJECT *SectionObject,
8041 IN ACCESS_MASK DesiredAccess,
8042 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8043 IN PLARGE_INTEGER MaximumSize,
8044 IN ULONG SectionPageProtection,
8045 IN ULONG AllocationAttributes,
8046 IN HANDLE FileHandle OPTIONAL,
8047 IN PFILE_OBJECT File OPTIONAL);
8048
8049 typedef enum _MMFLUSH_TYPE {
8050 MmFlushForDelete,
8051 MmFlushForWrite
8052 } MMFLUSH_TYPE;
8053
8054 NTOSAPI
8055 BOOLEAN
8056 DDKAPI
8057 MmFlushImageSection(
8058 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8059 IN MMFLUSH_TYPE FlushType);
8060
8061 NTOSAPI
8062 VOID
8063 DDKAPI
8064 MmFreeContiguousMemory(
8065 IN PVOID BaseAddress);
8066
8067 NTOSAPI
8068 VOID
8069 DDKAPI
8070 MmFreeContiguousMemorySpecifyCache(
8071 IN PVOID BaseAddress,
8072 IN SIZE_T NumberOfBytes,
8073 IN MEMORY_CACHING_TYPE CacheType);
8074
8075 NTOSAPI
8076 VOID
8077 DDKAPI
8078 MmFreeMappingAddress(
8079 IN PVOID BaseAddress,
8080 IN ULONG PoolTag);
8081
8082 NTOSAPI
8083 VOID
8084 DDKAPI
8085 MmFreeNonCachedMemory(
8086 IN PVOID BaseAddress,
8087 IN SIZE_T NumberOfBytes);
8088
8089 NTOSAPI
8090 VOID
8091 DDKAPI
8092 MmFreePagesFromMdl(
8093 IN PMDL MemoryDescriptorList);
8094
8095 /*
8096 * ULONG
8097 * MmGetMdlByteCount(
8098 * IN PMDL Mdl)
8099 */
8100 #define MmGetMdlByteCount(_Mdl) \
8101 ((_Mdl)->ByteCount)
8102
8103 /*
8104 * ULONG
8105 * MmGetMdlByteOffset(
8106 * IN PMDL Mdl)
8107 */
8108 #define MmGetMdlByteOffset(_Mdl) \
8109 ((_Mdl)->ByteOffset)
8110
8111 /*
8112 * PPFN_NUMBER
8113 * MmGetMdlPfnArray(
8114 * IN PMDL Mdl)
8115 */
8116 #define MmGetMdlPfnArray(_Mdl) \
8117 ((PPFN_NUMBER) ((_Mdl) + 1))
8118
8119 /*
8120 * PVOID
8121 * MmGetMdlVirtualAddress(
8122 * IN PMDL Mdl)
8123 */
8124 #define MmGetMdlVirtualAddress(_Mdl) \
8125 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
8126
8127 NTOSAPI
8128 PHYSICAL_ADDRESS
8129 DDKAPI
8130 MmGetPhysicalAddress(
8131 IN PVOID BaseAddress);
8132
8133 NTOSAPI
8134 PPHYSICAL_MEMORY_RANGE
8135 DDKAPI
8136 MmGetPhysicalMemoryRanges(
8137 VOID);
8138
8139 NTOSAPI
8140 PVOID
8141 DDKAPI
8142 MmGetVirtualForPhysical(
8143 IN PHYSICAL_ADDRESS PhysicalAddress);
8144
8145 NTOSAPI
8146 PVOID
8147 DDKAPI
8148 MmMapLockedPagesSpecifyCache(
8149 IN PMDL MemoryDescriptorList,
8150 IN KPROCESSOR_MODE AccessMode,
8151 IN MEMORY_CACHING_TYPE CacheType,
8152 IN PVOID BaseAddress,
8153 IN ULONG BugCheckOnFailure,
8154 IN MM_PAGE_PRIORITY Priority);
8155
8156 NTOSAPI
8157 PVOID
8158 DDKAPI
8159 MmMapLockedPagesWithReservedMapping(
8160 IN PVOID MappingAddress,
8161 IN ULONG PoolTag,
8162 IN PMDL MemoryDescriptorList,
8163 IN MEMORY_CACHING_TYPE CacheType);
8164
8165 NTOSAPI
8166 NTSTATUS
8167 DDKAPI
8168 MmMapUserAddressesToPage(
8169 IN PVOID BaseAddress,
8170 IN SIZE_T NumberOfBytes,
8171 IN PVOID PageAddress);
8172
8173 NTOSAPI
8174 PVOID
8175 DDKAPI
8176 MmMapVideoDisplay(
8177 IN PHYSICAL_ADDRESS PhysicalAddress,
8178 IN SIZE_T NumberOfBytes,
8179 IN MEMORY_CACHING_TYPE CacheType);
8180
8181 NTOSAPI
8182 NTSTATUS
8183 DDKAPI
8184 MmMapViewInSessionSpace(
8185 IN PVOID Section,
8186 OUT PVOID *MappedBase,
8187 IN OUT PSIZE_T ViewSize);
8188
8189 NTOSAPI
8190 NTSTATUS
8191 DDKAPI
8192 MmMapViewInSystemSpace(
8193 IN PVOID Section,
8194 OUT PVOID *MappedBase,
8195 IN PSIZE_T ViewSize);
8196
8197 NTOSAPI
8198 NTSTATUS
8199 DDKAPI
8200 MmMarkPhysicalMemoryAsBad(
8201 IN PPHYSICAL_ADDRESS StartAddress,
8202 IN OUT PLARGE_INTEGER NumberOfBytes);
8203
8204 NTOSAPI
8205 NTSTATUS
8206 DDKAPI
8207 MmMarkPhysicalMemoryAsGood(
8208 IN PPHYSICAL_ADDRESS StartAddress,
8209 IN OUT PLARGE_INTEGER NumberOfBytes);
8210
8211 /*
8212 * PVOID
8213 * MmGetSystemAddressForMdlSafe(
8214 * IN PMDL Mdl,
8215 * IN MM_PAGE_PRIORITY Priority)
8216 */
8217 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
8218 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
8219 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
8220 (_Mdl)->MappedSystemVa : \
8221 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
8222 KernelMode, MmCached, NULL, FALSE, _Priority)
8223
8224 NTOSAPI
8225 PVOID
8226 DDKAPI
8227 MmGetSystemRoutineAddress(
8228 IN PUNICODE_STRING SystemRoutineName);
8229
8230 /*
8231 * ULONG
8232 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
8233 * IN PVOID Va,
8234 * IN ULONG Size)
8235 */
8236 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
8237 _Size) \
8238 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
8239 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
8240
8241 /*
8242 * VOID
8243 * MmInitializeMdl(
8244 * IN PMDL MemoryDescriptorList,
8245 * IN PVOID BaseVa,
8246 * IN SIZE_T Length)
8247 */
8248 #define MmInitializeMdl(_MemoryDescriptorList, \
8249 _BaseVa, \
8250 _Length) \
8251 { \
8252 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
8253 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
8254 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
8255 (_MemoryDescriptorList)->MdlFlags = 0; \
8256 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
8257 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
8258 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
8259 }
8260
8261 NTOSAPI
8262 BOOLEAN
8263 DDKAPI
8264 MmIsAddressValid(
8265 IN PVOID VirtualAddress);
8266
8267 NTOSAPI
8268 LOGICAL
8269 DDKAPI
8270 MmIsDriverVerifying(
8271 IN PDRIVER_OBJECT DriverObject);
8272
8273 NTOSAPI
8274 BOOLEAN
8275 DDKAPI
8276 MmIsThisAnNtAsSystem(
8277 VOID);
8278
8279 NTOSAPI
8280 NTSTATUS
8281 DDKAPI
8282 MmIsVerifierEnabled(
8283 OUT PULONG VerifierFlags);
8284
8285 NTOSAPI
8286 PVOID
8287 DDKAPI
8288 MmLockPagableDataSection(
8289 IN PVOID AddressWithinSection);
8290
8291 NTOSAPI
8292 PVOID
8293 DDKAPI
8294 MmLockPagableImageSection(
8295 IN PVOID AddressWithinSection);
8296
8297 /*
8298 * PVOID
8299 * MmLockPagableCodeSection(
8300 * IN PVOID AddressWithinSection)
8301 */
8302 #define MmLockPagableCodeSection MmLockPagableDataSection
8303
8304 NTOSAPI
8305 VOID
8306 DDKAPI
8307 MmLockPagableSectionByHandle(
8308 IN PVOID ImageSectionHandle);
8309
8310 NTOSAPI
8311 PVOID
8312 DDKAPI
8313 MmMapIoSpace(
8314 IN PHYSICAL_ADDRESS PhysicalAddress,
8315 IN ULONG NumberOfBytes,
8316 IN MEMORY_CACHING_TYPE CacheEnable);
8317
8318 NTOSAPI
8319 PVOID
8320 DDKAPI
8321 MmMapLockedPages(
8322 IN PMDL MemoryDescriptorList,
8323 IN KPROCESSOR_MODE AccessMode);
8324
8325 NTOSAPI
8326 VOID
8327 DDKAPI
8328 MmPageEntireDriver(
8329 IN PVOID AddressWithinSection);
8330
8331 NTOSAPI
8332 VOID
8333 DDKAPI
8334 MmProbeAndLockProcessPages(
8335 IN OUT PMDL MemoryDescriptorList,
8336 IN PEPROCESS Process,
8337 IN KPROCESSOR_MODE AccessMode,
8338 IN LOCK_OPERATION Operation);
8339
8340 NTOSAPI
8341 NTSTATUS
8342 DDKAPI
8343 MmProtectMdlSystemAddress(
8344 IN PMDL MemoryDescriptorList,
8345 IN ULONG NewProtect);
8346
8347 NTOSAPI
8348 VOID
8349 DDKAPI
8350 MmUnmapLockedPages(
8351 IN PVOID BaseAddress,
8352 IN PMDL MemoryDescriptorList);
8353
8354 NTOSAPI
8355 NTSTATUS
8356 DDKAPI
8357 MmUnmapViewInSessionSpace(
8358 IN PVOID MappedBase);
8359
8360 NTOSAPI
8361 NTSTATUS
8362 DDKAPI
8363 MmUnmapViewInSystemSpace(
8364 IN PVOID MappedBase);
8365
8366 NTOSAPI
8367 VOID
8368 DDKAPI
8369 MmUnsecureVirtualMemory(
8370 IN HANDLE SecureHandle);
8371
8372 /*
8373 * VOID
8374 * MmPrepareMdlForReuse(
8375 * IN PMDL Mdl)
8376 */
8377 #define MmPrepareMdlForReuse(_Mdl) \
8378 { \
8379 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8380 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8381 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8382 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8383 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8384 } \
8385 }
8386
8387 NTOSAPI
8388 VOID
8389 DDKAPI
8390 MmProbeAndLockPages(
8391 IN OUT PMDL MemoryDescriptorList,
8392 IN KPROCESSOR_MODE AccessMode,
8393 IN LOCK_OPERATION Operation);
8394
8395 NTOSAPI
8396 MM_SYSTEM_SIZE
8397 DDKAPI
8398 MmQuerySystemSize(
8399 VOID);
8400
8401 NTOSAPI
8402 NTSTATUS
8403 DDKAPI
8404 MmRemovePhysicalMemory(
8405 IN PPHYSICAL_ADDRESS StartAddress,
8406 IN OUT PLARGE_INTEGER NumberOfBytes);
8407
8408 NTOSAPI
8409 VOID
8410 DDKAPI
8411 MmResetDriverPaging(
8412 IN PVOID AddressWithinSection);
8413
8414 NTOSAPI
8415 HANDLE
8416 DDKAPI
8417 MmSecureVirtualMemory(
8418 IN PVOID Address,
8419 IN SIZE_T Size,
8420 IN ULONG ProbeMode);
8421
8422 NTOSAPI
8423 ULONG
8424 DDKAPI
8425 MmSizeOfMdl(
8426 IN PVOID Base,
8427 IN SIZE_T Length);
8428
8429 NTOSAPI
8430 VOID
8431 DDKAPI
8432 MmUnlockPagableImageSection(
8433 IN PVOID ImageSectionHandle);
8434
8435 NTOSAPI
8436 VOID
8437 DDKAPI
8438 MmUnlockPages(
8439 IN PMDL MemoryDescriptorList);
8440
8441 NTOSAPI
8442 VOID
8443 DDKAPI
8444 MmUnmapIoSpace(
8445 IN PVOID BaseAddress,
8446 IN SIZE_T NumberOfBytes);
8447
8448 NTOSAPI
8449 VOID
8450 DDKAPI
8451 MmUnmapReservedMapping(
8452 IN PVOID BaseAddress,
8453 IN ULONG PoolTag,
8454 IN PMDL MemoryDescriptorList);
8455
8456 NTOSAPI
8457 VOID
8458 DDKAPI
8459 MmUnmapVideoDisplay(
8460 IN PVOID BaseAddress,
8461 IN SIZE_T NumberOfBytes);
8462
8463
8464
8465 /** Object manager **/
8466
8467 typedef enum _OB_OPEN_REASON
8468 {
8469 ObCreateHandle,
8470 ObOpenHandle,
8471 ObDuplicateHandle,
8472 ObInheritHandle,
8473 ObMaxOpenReason
8474 } OB_OPEN_REASON;
8475
8476 /* TEMPORARY HACK */
8477 typedef NTSTATUS
8478 (DDKAPI *OB_CREATE_METHOD)(PVOID ObjectBody,
8479 PVOID Parent,
8480 PWSTR RemainingPath,
8481 struct _OBJECT_ATTRIBUTES* ObjectAttributes);
8482
8483 /* Object Callbacks */
8484 typedef NTSTATUS
8485 (DDKAPI *OB_OPEN_METHOD)(OB_OPEN_REASON Reason,
8486 PVOID ObjectBody,
8487 PEPROCESS Process,
8488 ULONG HandleCount,
8489 ACCESS_MASK GrantedAccess);
8490
8491 typedef NTSTATUS
8492 (DDKAPI *OB_PARSE_METHOD)(PVOID Object,
8493 PVOID *NextObject,
8494 PUNICODE_STRING FullPath,
8495 PWSTR *Path,
8496 ULONG Attributes);
8497
8498 typedef VOID
8499 (DDKAPI *OB_DELETE_METHOD)(PVOID DeletedObject);
8500
8501 typedef VOID
8502 (DDKAPI *OB_CLOSE_METHOD)(PVOID ClosedObject, ULONG HandleCount);
8503
8504 typedef VOID
8505 (DDKAPI *OB_DUMP_METHOD)(VOID);
8506
8507 typedef NTSTATUS
8508 (DDKAPI *OB_OKAYTOCLOSE_METHOD)(VOID);
8509
8510 typedef NTSTATUS
8511 (DDKAPI *OB_QUERYNAME_METHOD)(PVOID ObjectBody,
8512 POBJECT_NAME_INFORMATION ObjectNameInfo,
8513 ULONG Length,
8514 PULONG ReturnLength);
8515
8516 typedef PVOID
8517 (DDKAPI *OB_FIND_METHOD)(PVOID WinStaObject,
8518 PWSTR Name,
8519 ULONG Attributes);
8520
8521 typedef NTSTATUS
8522 (DDKAPI *OB_SECURITY_METHOD)(PVOID ObjectBody,
8523 SECURITY_OPERATION_CODE OperationCode,
8524 SECURITY_INFORMATION SecurityInformation,
8525 PSECURITY_DESCRIPTOR SecurityDescriptor,
8526 PULONG BufferLength);
8527
8528 typedef struct _OBJECT_HEADER_NAME_INFO
8529 {
8530 struct _DIRECTORY_OBJECT *Directory;
8531 UNICODE_STRING Name;
8532 ULONG QueryReferences;
8533 ULONG Reserved2;
8534 ULONG DbgReferenceCount;
8535 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
8536
8537 typedef struct _OBJECT_CREATE_INFORMATION
8538 {
8539 ULONG Attributes;
8540 HANDLE RootDirectory;
8541 PVOID ParseContext;
8542 KPROCESSOR_MODE ProbeMode;
8543 ULONG PagedPoolCharge;
8544 ULONG NonPagedPoolCharge;
8545 ULONG SecurityDescriptorCharge;
8546 PSECURITY_DESCRIPTOR SecurityDescriptor;
8547 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
8548 SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
8549 } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
8550
8551 typedef struct _OBJECT_TYPE_INITIALIZER
8552 {
8553 WORD Length;
8554 UCHAR UseDefaultObject;
8555 UCHAR CaseInsensitive;
8556 ULONG InvalidAttributes;
8557 GENERIC_MAPPING GenericMapping;
8558 ULONG ValidAccessMask;
8559 UCHAR SecurityRequired;
8560 UCHAR MaintainHandleCount;
8561 UCHAR MaintainTypeList;
8562 POOL_TYPE PoolType;
8563 ULONG DefaultPagedPoolCharge;
8564 ULONG DefaultNonPagedPoolCharge;
8565 OB_DUMP_METHOD DumpProcedure;
8566 OB_OPEN_METHOD OpenProcedure;
8567 OB_CLOSE_METHOD CloseProcedure;
8568 OB_DELETE_METHOD DeleteProcedure;
8569 OB_PARSE_METHOD ParseProcedure;
8570 OB_SECURITY_METHOD SecurityProcedure;
8571 OB_QUERYNAME_METHOD QueryNameProcedure;
8572 OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
8573 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
8574
8575 typedef struct _OBJECT_TYPE
8576 {
8577 ERESOURCE Mutex; /* Used to lock the Object Type */
8578 LIST_ENTRY TypeList; /* Links all the Types Together for Debugging */
8579 UNICODE_STRING Name; /* Name of the Type */
8580 PVOID DefaultObject; /* What Object to use during a Wait (ie, FileObjects wait on FileObject->Event) */
8581 ULONG Index; /* Index of this Type in the Object Directory */
8582 ULONG TotalNumberOfObjects; /* Total number of objects of this type */
8583 ULONG TotalNumberOfHandles; /* Total number of handles of this type */
8584 ULONG HighWaterNumberOfObjects; /* Peak number of objects of this type */
8585 ULONG HighWaterNumberOfHandles; /* Peak number of handles of this type */
8586 OBJECT_TYPE_INITIALIZER TypeInfo; /* Information captured during type creation */
8587 ULONG Key; /* Key to use when allocating objects of this type */
8588 ERESOURCE ObjectLocks[4]; /* Locks for locking the Objects */
8589 } OBJECT_TYPE;
8590
8591 NTOSAPI
8592 NTSTATUS
8593 DDKAPI
8594 ObAssignSecurity(
8595 IN PACCESS_STATE AccessState,
8596 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8597 IN PVOID Object,
8598 IN POBJECT_TYPE Type);
8599
8600 NTOSAPI
8601 VOID
8602 DDKAPI
8603 ObDereferenceSecurityDescriptor(
8604 PSECURITY_DESCRIPTOR SecurityDescriptor,
8605 ULONG Count);
8606
8607 NTOSAPI
8608 VOID
8609 DDKFASTAPI
8610 ObfDereferenceObject(
8611 IN PVOID Object);
8612
8613 /*
8614 * VOID
8615 * ObDereferenceObject(
8616 * IN PVOID Object)
8617 */
8618 #define ObDereferenceObject ObfDereferenceObject
8619
8620 NTOSAPI
8621 NTSTATUS
8622 DDKAPI
8623 ObGetObjectSecurity(
8624 IN PVOID Object,
8625 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
8626 OUT PBOOLEAN MemoryAllocated);
8627
8628 NTOSAPI
8629 NTSTATUS
8630 DDKAPI
8631 ObInsertObject(
8632 IN PVOID Object,
8633 IN PACCESS_STATE PassedAccessState OPTIONAL,
8634 IN ACCESS_MASK DesiredAccess,
8635 IN ULONG AdditionalReferences,
8636 OUT PVOID* ReferencedObject OPTIONAL,
8637 OUT PHANDLE Handle);
8638
8639 NTOSAPI
8640 VOID
8641 DDKFASTAPI
8642 ObfReferenceObject(
8643 IN PVOID Object);
8644
8645 NTOSAPI
8646 NTSTATUS
8647 DDKAPI
8648 ObLogSecurityDescriptor(
8649 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
8650 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
8651 IN ULONG RefBias);
8652 /*
8653 * VOID
8654 * ObReferenceObject(
8655 * IN PVOID Object)
8656 */
8657 #define ObReferenceObject ObfReferenceObject
8658
8659 NTOSAPI
8660 VOID
8661 DDKAPI
8662 ObMakeTemporaryObject(
8663 IN PVOID Object);
8664
8665 NTOSAPI
8666 NTSTATUS
8667 DDKAPI
8668 ObOpenObjectByName(
8669 IN POBJECT_ATTRIBUTES ObjectAttributes,
8670 IN POBJECT_TYPE ObjectType,
8671 IN OUT PVOID ParseContext OPTIONAL,
8672 IN KPROCESSOR_MODE AccessMode,
8673 IN ACCESS_MASK DesiredAccess,
8674 IN PACCESS_STATE PassedAccessState,
8675 OUT PHANDLE Handle);
8676
8677 NTOSAPI
8678 NTSTATUS
8679 DDKAPI
8680 ObOpenObjectByPointer(
8681 IN PVOID Object,
8682 IN ULONG HandleAttributes,
8683 IN PACCESS_STATE PassedAccessState OPTIONAL,
8684 IN ACCESS_MASK DesiredAccess OPTIONAL,
8685 IN POBJECT_TYPE ObjectType OPTIONAL,
8686 IN KPROCESSOR_MODE AccessMode,
8687 OUT PHANDLE Handle);
8688
8689 NTOSAPI
8690 NTSTATUS
8691 DDKAPI
8692 ObQueryObjectAuditingByHandle(
8693 IN HANDLE Handle,
8694 OUT PBOOLEAN GenerateOnClose);
8695
8696 NTOSAPI
8697 NTSTATUS
8698 DDKAPI
8699 ObReferenceObjectByHandle(
8700 IN HANDLE Handle,
8701 IN ACCESS_MASK DesiredAccess,
8702 IN POBJECT_TYPE ObjectType OPTIONAL,
8703 IN KPROCESSOR_MODE AccessMode,
8704 OUT PVOID *Object,
8705 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
8706
8707 NTOSAPI
8708 NTSTATUS
8709 DDKAPI
8710 ObReferenceObjectByName(
8711 IN PUNICODE_STRING ObjectPath,
8712 IN ULONG Attributes,
8713 IN PACCESS_STATE PassedAccessState OPTIONAL,
8714 IN ACCESS_MASK DesiredAccess OPTIONAL,
8715 IN POBJECT_TYPE ObjectType,
8716 IN KPROCESSOR_MODE AccessMode,
8717 IN OUT PVOID ParseContext OPTIONAL,
8718 OUT PVOID *Object);
8719
8720 NTOSAPI
8721 NTSTATUS
8722 DDKAPI
8723 ObReferenceObjectByPointer(
8724 IN PVOID Object,
8725 IN ACCESS_MASK DesiredAccess,
8726 IN POBJECT_TYPE ObjectType,
8727 IN KPROCESSOR_MODE AccessMode);
8728
8729 NTOSAPI
8730 VOID
8731 DDKAPI
8732 ObReferenceSecurityDescriptor(
8733 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8734 IN ULONG Count);
8735
8736 NTOSAPI
8737 VOID
8738 DDKAPI
8739 ObReleaseObjectSecurity(
8740 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8741 IN BOOLEAN MemoryAllocated);
8742
8743
8744
8745 /** Process manager routines **/
8746
8747 NTOSAPI
8748 NTSTATUS
8749 DDKAPI
8750 PsCreateSystemProcess(
8751 IN PHANDLE ProcessHandle,
8752 IN ACCESS_MASK DesiredAccess,
8753 IN POBJECT_ATTRIBUTES ObjectAttributes);
8754
8755 NTOSAPI
8756 NTSTATUS
8757 DDKAPI
8758 PsCreateSystemThread(
8759 OUT PHANDLE ThreadHandle,
8760 IN ULONG DesiredAccess,
8761 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8762 IN HANDLE ProcessHandle OPTIONAL,
8763 OUT PCLIENT_ID ClientId OPTIONAL,
8764 IN PKSTART_ROUTINE StartRoutine,
8765 IN PVOID StartContext);
8766
8767 /*
8768 * PEPROCESS
8769 * PsGetCurrentProcess(VOID)
8770 */
8771 #define PsGetCurrentProcess IoGetCurrentProcess
8772
8773 NTOSAPI
8774 HANDLE
8775 DDKAPI
8776 PsGetCurrentProcessId(
8777 VOID);
8778
8779 /*
8780 * PETHREAD
8781 * PsGetCurrentThread(VOID)
8782 */
8783 #define PsGetCurrentThread() \
8784 ((PETHREAD) KeGetCurrentThread())
8785
8786 NTOSAPI
8787 HANDLE
8788 DDKAPI
8789 PsGetCurrentThreadId(
8790 VOID);
8791
8792 NTOSAPI
8793 BOOLEAN
8794 DDKAPI
8795 PsGetVersion(
8796 PULONG MajorVersion OPTIONAL,
8797 PULONG MinorVersion OPTIONAL,
8798 PULONG BuildNumber OPTIONAL,
8799 PUNICODE_STRING CSDVersion OPTIONAL);
8800
8801 NTOSAPI
8802 NTSTATUS
8803 DDKAPI
8804 PsRemoveCreateThreadNotifyRoutine(
8805 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8806
8807 NTOSAPI
8808 NTSTATUS
8809 DDKAPI
8810 PsRemoveLoadImageNotifyRoutine(
8811 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8812
8813 NTOSAPI
8814 NTSTATUS
8815 DDKAPI
8816 PsSetCreateProcessNotifyRoutine(
8817 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
8818 IN BOOLEAN Remove);
8819
8820 NTOSAPI
8821 NTSTATUS
8822 DDKAPI
8823 PsSetCreateThreadNotifyRoutine(
8824 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
8825
8826 NTOSAPI
8827 NTSTATUS
8828 DDKAPI
8829 PsSetLoadImageNotifyRoutine(
8830 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
8831
8832 NTOSAPI
8833 NTSTATUS
8834 DDKAPI
8835 PsTerminateSystemThread(
8836 IN NTSTATUS ExitStatus);
8837
8838
8839
8840 /** Security reference monitor routines **/
8841
8842 NTOSAPI
8843 BOOLEAN
8844 DDKAPI
8845 SeAccessCheck(
8846 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8847 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8848 IN BOOLEAN SubjectContextLocked,
8849 IN ACCESS_MASK DesiredAccess,
8850 IN ACCESS_MASK PreviouslyGrantedAccess,
8851 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
8852 IN PGENERIC_MAPPING GenericMapping,
8853 IN KPROCESSOR_MODE AccessMode,
8854 OUT PACCESS_MASK GrantedAccess,
8855 OUT PNTSTATUS AccessStatus);
8856
8857 NTOSAPI
8858 NTSTATUS
8859 DDKAPI
8860 SeAssignSecurity(
8861 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8862 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8863 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8864 IN BOOLEAN IsDirectoryObject,
8865 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8866 IN PGENERIC_MAPPING GenericMapping,
8867 IN POOL_TYPE PoolType);
8868
8869 NTOSAPI
8870 NTSTATUS
8871 DDKAPI
8872 SeAssignSecurityEx(
8873 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8874 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8875 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8876 IN GUID *ObjectType OPTIONAL,
8877 IN BOOLEAN IsDirectoryObject,
8878 IN ULONG AutoInheritFlags,
8879 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8880 IN PGENERIC_MAPPING GenericMapping,
8881 IN POOL_TYPE PoolType);
8882
8883 NTOSAPI
8884 NTSTATUS
8885 DDKAPI
8886 SeDeassignSecurity(
8887 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
8888
8889 NTOSAPI
8890 BOOLEAN
8891 DDKAPI
8892 SeSinglePrivilegeCheck(
8893 LUID PrivilegeValue,
8894 KPROCESSOR_MODE PreviousMode);
8895
8896 NTOSAPI
8897 BOOLEAN
8898 DDKAPI
8899 SeValidSecurityDescriptor(
8900 IN ULONG Length,
8901 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8902
8903
8904
8905 /** NtXxx routines **/
8906
8907 NTOSAPI
8908 NTSTATUS
8909 DDKAPI
8910 NtOpenProcess(
8911 OUT PHANDLE ProcessHandle,
8912 IN ACCESS_MASK DesiredAccess,
8913 IN POBJECT_ATTRIBUTES ObjectAttributes,
8914 IN PCLIENT_ID ClientId OPTIONAL);
8915
8916 NTOSAPI
8917 NTSTATUS
8918 DDKAPI
8919 NtQueryInformationProcess(
8920 IN HANDLE ProcessHandle,
8921 IN PROCESSINFOCLASS ProcessInformationClass,
8922 OUT PVOID ProcessInformation,
8923 IN ULONG ProcessInformationLength,
8924 OUT PULONG ReturnLength OPTIONAL);
8925
8926
8927
8928 /** NtXxx and ZwXxx routines **/
8929
8930 NTOSAPI
8931 NTSTATUS
8932 DDKAPI
8933 ZwCancelTimer(
8934 IN HANDLE TimerHandle,
8935 OUT PBOOLEAN CurrentState OPTIONAL);
8936
8937 NTOSAPI
8938 NTSTATUS
8939 DDKAPI
8940 NtClose(
8941 IN HANDLE Handle);
8942
8943 NTOSAPI
8944 NTSTATUS
8945 DDKAPI
8946 ZwClose(
8947 IN HANDLE Handle);
8948
8949 NTOSAPI
8950 NTSTATUS
8951 DDKAPI
8952 ZwCreateDirectoryObject(
8953 OUT PHANDLE DirectoryHandle,
8954 IN ACCESS_MASK DesiredAccess,
8955 IN POBJECT_ATTRIBUTES ObjectAttributes);
8956
8957 NTOSAPI
8958 NTSTATUS
8959 DDKAPI
8960 NtCreateEvent(
8961 OUT PHANDLE EventHandle,
8962 IN ACCESS_MASK DesiredAccess,
8963 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8964 IN EVENT_TYPE EventType,
8965 IN BOOLEAN InitialState);
8966
8967 NTOSAPI
8968 NTSTATUS
8969 DDKAPI
8970 ZwCreateEvent(
8971 OUT PHANDLE EventHandle,
8972 IN ACCESS_MASK DesiredAccess,
8973 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8974 IN EVENT_TYPE EventType,
8975 IN BOOLEAN InitialState);
8976
8977 NTOSAPI
8978 NTSTATUS
8979 DDKAPI
8980 ZwCreateFile(
8981 OUT PHANDLE FileHandle,
8982 IN ACCESS_MASK DesiredAccess,
8983 IN POBJECT_ATTRIBUTES ObjectAttributes,
8984 OUT PIO_STATUS_BLOCK IoStatusBlock,
8985 IN PLARGE_INTEGER AllocationSize OPTIONAL,
8986 IN ULONG FileAttributes,
8987 IN ULONG ShareAccess,
8988 IN ULONG CreateDisposition,
8989 IN ULONG CreateOptions,
8990 IN PVOID EaBuffer OPTIONAL,
8991 IN ULONG EaLength);
8992
8993 NTOSAPI
8994 NTSTATUS
8995 DDKAPI
8996 ZwCreateKey(
8997 OUT PHANDLE KeyHandle,
8998 IN ACCESS_MASK DesiredAccess,
8999 IN POBJECT_ATTRIBUTES ObjectAttributes,
9000 IN ULONG TitleIndex,
9001 IN PUNICODE_STRING Class OPTIONAL,
9002 IN ULONG CreateOptions,
9003 OUT PULONG Disposition OPTIONAL);
9004
9005 NTOSAPI
9006 NTSTATUS
9007 DDKAPI
9008 ZwCreateTimer(
9009 OUT PHANDLE TimerHandle,
9010 IN ACCESS_MASK DesiredAccess,
9011 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9012 IN TIMER_TYPE TimerType);
9013
9014 NTOSAPI
9015 NTSTATUS
9016 DDKAPI
9017 ZwDeleteKey(
9018 IN HANDLE KeyHandle);
9019
9020 NTOSAPI
9021 NTSTATUS
9022 DDKAPI
9023 ZwDeleteValueKey(
9024 IN HANDLE KeyHandle,
9025 IN PUNICODE_STRING ValueName);
9026
9027 NTOSAPI
9028 NTSTATUS
9029 DDKAPI
9030 NtDeviceIoControlFile(
9031 IN HANDLE DeviceHandle,
9032 IN HANDLE Event OPTIONAL,
9033 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9034 IN PVOID UserApcContext OPTIONAL,
9035 OUT PIO_STATUS_BLOCK IoStatusBlock,
9036 IN ULONG IoControlCode,
9037 IN PVOID InputBuffer,
9038 IN ULONG InputBufferSize,
9039 OUT PVOID OutputBuffer,
9040 IN ULONG OutputBufferSize);
9041
9042 NTOSAPI
9043 NTSTATUS
9044 DDKAPI
9045 ZwDeviceIoControlFile(
9046 IN HANDLE DeviceHandle,
9047 IN HANDLE Event OPTIONAL,
9048 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9049 IN PVOID UserApcContext OPTIONAL,
9050 OUT PIO_STATUS_BLOCK IoStatusBlock,
9051 IN ULONG IoControlCode,
9052 IN PVOID InputBuffer,
9053 IN ULONG InputBufferSize,
9054 OUT PVOID OutputBuffer,
9055 IN ULONG OutputBufferSize);
9056
9057 NTOSAPI
9058 NTSTATUS
9059 DDKAPI
9060 ZwEnumerateKey(
9061 IN HANDLE KeyHandle,
9062 IN ULONG Index,
9063 IN KEY_INFORMATION_CLASS KeyInformationClass,
9064 OUT PVOID KeyInformation,
9065 IN ULONG Length,
9066 OUT PULONG ResultLength);
9067
9068 NTOSAPI
9069 NTSTATUS
9070 DDKAPI
9071 ZwEnumerateValueKey(
9072 IN HANDLE KeyHandle,
9073 IN ULONG Index,
9074 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9075 OUT PVOID KeyValueInformation,
9076 IN ULONG Length,
9077 OUT PULONG ResultLength);
9078
9079 NTOSAPI
9080 NTSTATUS
9081 DDKAPI
9082 ZwFlushKey(
9083 IN HANDLE KeyHandle);
9084
9085 NTOSAPI
9086 NTSTATUS
9087 DDKAPI
9088 ZwMakeTemporaryObject(
9089 IN HANDLE Handle);
9090
9091 NTOSAPI
9092 NTSTATUS
9093 DDKAPI
9094 NtMapViewOfSection(
9095 IN HANDLE SectionHandle,
9096 IN HANDLE ProcessHandle,
9097 IN OUT PVOID *BaseAddress,
9098 IN ULONG ZeroBits,
9099 IN ULONG CommitSize,
9100 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9101 IN OUT PSIZE_T ViewSize,
9102 IN SECTION_INHERIT InheritDisposition,
9103 IN ULONG AllocationType,
9104 IN ULONG Protect);
9105
9106 NTOSAPI
9107 NTSTATUS
9108 DDKAPI
9109 ZwMapViewOfSection(
9110 IN HANDLE SectionHandle,
9111 IN HANDLE ProcessHandle,
9112 IN OUT PVOID *BaseAddress,
9113 IN ULONG ZeroBits,
9114 IN ULONG CommitSize,
9115 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9116 IN OUT PSIZE_T ViewSize,
9117 IN SECTION_INHERIT InheritDisposition,
9118 IN ULONG AllocationType,
9119 IN ULONG Protect);
9120
9121 NTOSAPI
9122 NTSTATUS
9123 DDKAPI
9124 NtOpenFile(
9125 OUT PHANDLE FileHandle,
9126 IN ACCESS_MASK DesiredAccess,
9127 IN POBJECT_ATTRIBUTES ObjectAttributes,
9128 OUT PIO_STATUS_BLOCK IoStatusBlock,
9129 IN ULONG ShareAccess,
9130 IN ULONG OpenOptions);
9131
9132 NTOSAPI
9133 NTSTATUS
9134 DDKAPI
9135 ZwOpenFile(
9136 OUT PHANDLE FileHandle,
9137 IN ACCESS_MASK DesiredAccess,
9138 IN POBJECT_ATTRIBUTES ObjectAttributes,
9139 OUT PIO_STATUS_BLOCK IoStatusBlock,
9140 IN ULONG ShareAccess,
9141 IN ULONG OpenOptions);
9142
9143 NTOSAPI
9144 NTSTATUS
9145 DDKAPI
9146 ZwOpenKey(
9147 OUT PHANDLE KeyHandle,
9148 IN ACCESS_MASK DesiredAccess,
9149 IN POBJECT_ATTRIBUTES ObjectAttributes);
9150
9151 NTOSAPI
9152 NTSTATUS
9153 DDKAPI
9154 ZwOpenSection(
9155 OUT PHANDLE SectionHandle,
9156 IN ACCESS_MASK DesiredAccess,
9157 IN POBJECT_ATTRIBUTES ObjectAttributes);
9158
9159 NTOSAPI
9160 NTSTATUS
9161 DDKAPI
9162 ZwOpenSymbolicLinkObject(
9163 OUT PHANDLE LinkHandle,
9164 IN ACCESS_MASK DesiredAccess,
9165 IN POBJECT_ATTRIBUTES ObjectAttributes);
9166
9167 NTOSAPI
9168 NTSTATUS
9169 DDKAPI
9170 ZwOpenTimer(
9171 OUT PHANDLE TimerHandle,
9172 IN ACCESS_MASK DesiredAccess,
9173 IN POBJECT_ATTRIBUTES ObjectAttributes);
9174
9175 NTOSAPI
9176 NTSTATUS
9177 DDKAPI
9178 ZwQueryInformationFile(
9179 IN HANDLE FileHandle,
9180 OUT PIO_STATUS_BLOCK IoStatusBlock,
9181 OUT PVOID FileInformation,
9182 IN ULONG Length,
9183 IN FILE_INFORMATION_CLASS FileInformationClass);
9184
9185 NTOSAPI
9186 NTSTATUS
9187 DDKAPI
9188 ZwQueryKey(
9189 IN HANDLE KeyHandle,
9190 IN KEY_INFORMATION_CLASS KeyInformationClass,
9191 OUT PVOID KeyInformation,
9192 IN ULONG Length,
9193 OUT PULONG ResultLength);
9194
9195 NTOSAPI
9196 NTSTATUS
9197 DDKAPI
9198 ZwQuerySymbolicLinkObject(
9199 IN HANDLE LinkHandle,
9200 IN OUT PUNICODE_STRING LinkTarget,
9201 OUT PULONG ReturnedLength OPTIONAL);
9202
9203 NTOSAPI
9204 NTSTATUS
9205 DDKAPI
9206 ZwQueryValueKey(
9207 IN HANDLE KeyHandle,
9208 IN PUNICODE_STRING ValueName,
9209 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9210 OUT PVOID KeyValueInformation,
9211 IN ULONG Length,
9212 OUT PULONG ResultLength);
9213
9214 NTOSAPI
9215 NTSTATUS
9216 DDKAPI
9217 NtReadFile(
9218 IN HANDLE FileHandle,
9219 IN HANDLE Event OPTIONAL,
9220 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
9221 IN PVOID ApcContext OPTIONAL,
9222 OUT PIO_STATUS_BLOCK IoStatusBlock,
9223 OUT PVOID Buffer,
9224 IN ULONG Length,
9225 IN PLARGE_INTEGER ByteOffset OPTIONAL,
9226 IN PULONG Key OPTIONAL);
9227
9228 NTOSAPI
9229 NTSTATUS
9230 DDKAPI
9231 ZwReadFile(
9232 IN HANDLE FileHandle,
9233 IN HANDLE Event OPTIONAL,
9234 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
9235 IN PVOID ApcContext OPTIONAL,
9236 OUT PIO_STATUS_BLOCK IoStatusBlock,
9237 OUT PVOID Buffer,
9238 IN ULONG Length,
9239 IN PLARGE_INTEGER ByteOffset OPTIONAL,
9240 IN PULONG Key OPTIONAL);
9241
9242 NTOSAPI
9243 NTSTATUS
9244 DDKAPI
9245 NtSetEvent(
9246 IN HANDLE EventHandle,
9247 OUT PLONG PreviousState OPTIONAL);
9248
9249 NTOSAPI
9250 NTSTATUS
9251 DDKAPI
9252 ZwSetEvent(
9253 IN HANDLE EventHandle,
9254 OUT PLONG PreviousState OPTIONAL);
9255
9256 NTOSAPI
9257 NTSTATUS
9258 DDKAPI
9259 ZwSetInformationFile(
9260 IN HANDLE FileHandle,
9261 OUT PIO_STATUS_BLOCK IoStatusBlock,
9262 IN PVOID FileInformation,
9263 IN ULONG Length,
9264 IN FILE_INFORMATION_CLASS FileInformationClass);
9265
9266 NTOSAPI
9267 NTSTATUS
9268 DDKAPI
9269 ZwSetInformationThread(
9270 IN HANDLE ThreadHandle,
9271 IN THREADINFOCLASS ThreadInformationClass,
9272 IN PVOID ThreadInformation,
9273 IN ULONG ThreadInformationLength);
9274
9275 NTOSAPI
9276 NTSTATUS
9277 DDKAPI
9278 ZwSetTimer(
9279 IN HANDLE TimerHandle,
9280 IN PLARGE_INTEGER DueTime,
9281 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
9282 IN PVOID TimerContext OPTIONAL,
9283 IN BOOLEAN WakeTimer,
9284 IN LONG Period OPTIONAL,
9285 OUT PBOOLEAN PreviousState OPTIONAL);
9286
9287 NTOSAPI
9288 NTSTATUS
9289 DDKAPI
9290 ZwSetValueKey(
9291 IN HANDLE KeyHandle,
9292 IN PUNICODE_STRING ValueName,
9293 IN ULONG TitleIndex OPTIONAL,
9294 IN ULONG Type,
9295 IN PVOID Data,
9296 IN ULONG DataSize);
9297
9298 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
9299 #define AT_EXTENDABLE_FILE 0x00002000
9300 #define SEC_NO_CHANGE 0x00400000
9301 #define AT_RESERVED 0x20000000
9302 #define AT_ROUND_TO_PAGE 0x40000000
9303
9304 NTOSAPI
9305 NTSTATUS
9306 DDKAPI
9307 NtUnmapViewOfSection(
9308 IN HANDLE ProcessHandle,
9309 IN PVOID BaseAddress);
9310
9311 NTOSAPI
9312 NTSTATUS
9313 DDKAPI
9314 ZwUnmapViewOfSection(
9315 IN HANDLE ProcessHandle,
9316 IN PVOID BaseAddress);
9317
9318 NTOSAPI
9319 NTSTATUS
9320 DDKAPI
9321 NtWaitForSingleObject(
9322 IN HANDLE ObjectHandle,
9323 IN BOOLEAN Alertable,
9324 IN PLARGE_INTEGER TimeOut OPTIONAL);
9325
9326 NTOSAPI
9327 NTSTATUS
9328 DDKAPI
9329 ZwWaitForSingleObject(
9330 IN HANDLE ObjectHandle,
9331 IN BOOLEAN Alertable,
9332 IN PLARGE_INTEGER TimeOut OPTIONAL);
9333
9334 NTOSAPI
9335 NTSTATUS
9336 DDKAPI
9337 NtWriteFile(
9338 IN HANDLE FileHandle,
9339 IN HANDLE Event OPTIONAL,
9340 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
9341 IN PVOID ApcContext OPTIONAL,
9342 OUT PIO_STATUS_BLOCK IoStatusBlock,
9343 IN PVOID Buffer,
9344 IN ULONG Length,
9345 IN PLARGE_INTEGER ByteOffset OPTIONAL,
9346 IN PULONG Key OPTIONAL);
9347
9348 NTOSAPI
9349 NTSTATUS
9350 DDKAPI
9351 ZwWriteFile(
9352 IN HANDLE FileHandle,
9353 IN HANDLE Event OPTIONAL,
9354 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
9355 IN PVOID ApcContext OPTIONAL,
9356 OUT PIO_STATUS_BLOCK IoStatusBlock,
9357 IN PVOID Buffer,
9358 IN ULONG Length,
9359 IN PLARGE_INTEGER ByteOffset OPTIONAL,
9360 IN PULONG Key OPTIONAL);
9361
9362
9363
9364 /** Power management support routines **/
9365
9366 NTOSAPI
9367 NTSTATUS
9368 DDKAPI
9369 PoCallDriver(
9370 IN PDEVICE_OBJECT DeviceObject,
9371 IN OUT PIRP Irp);
9372
9373 NTOSAPI
9374 PULONG
9375 DDKAPI
9376 PoRegisterDeviceForIdleDetection(
9377 IN PDEVICE_OBJECT DeviceObject,
9378 IN ULONG ConservationIdleTime,
9379 IN ULONG PerformanceIdleTime,
9380 IN DEVICE_POWER_STATE State);
9381
9382 NTOSAPI
9383 PVOID
9384 DDKAPI
9385 PoRegisterSystemState(
9386 IN PVOID StateHandle,
9387 IN EXECUTION_STATE Flags);
9388
9389 NTOSAPI
9390 NTSTATUS
9391 DDKAPI
9392 PoRequestPowerIrp(
9393 IN PDEVICE_OBJECT DeviceObject,
9394 IN UCHAR MinorFunction,
9395 IN POWER_STATE PowerState,
9396 IN PREQUEST_POWER_COMPLETE CompletionFunction,
9397 IN PVOID Context,
9398 OUT PIRP *Irp OPTIONAL);
9399
9400 NTOSAPI
9401 NTSTATUS
9402 DDKAPI
9403 PoRequestShutdownEvent(
9404 OUT PVOID *Event);
9405
9406 NTOSAPI
9407 VOID
9408 DDKAPI
9409 PoSetDeviceBusy(
9410 PULONG IdlePointer);
9411
9412 NTOSAPI
9413 POWER_STATE
9414 DDKAPI
9415 PoSetPowerState(
9416 IN PDEVICE_OBJECT DeviceObject,
9417 IN POWER_STATE_TYPE Type,
9418 IN POWER_STATE State);
9419
9420 NTOSAPI
9421 VOID
9422 DDKAPI
9423 PoSetSystemState(
9424 IN EXECUTION_STATE Flags);
9425
9426 NTOSAPI
9427 VOID
9428 DDKAPI
9429 PoStartNextPowerIrp(
9430 IN PIRP Irp);
9431
9432 NTOSAPI
9433 VOID
9434 DDKAPI
9435 PoUnregisterSystemState(
9436 IN PVOID StateHandle);
9437
9438
9439
9440 /** WMI library support routines **/
9441
9442 NTOSAPI
9443 NTSTATUS
9444 DDKAPI
9445 WmiCompleteRequest(
9446 IN PDEVICE_OBJECT DeviceObject,
9447 IN PIRP Irp,
9448 IN NTSTATUS Status,
9449 IN ULONG BufferUsed,
9450 IN CCHAR PriorityBoost);
9451
9452 NTOSAPI
9453 NTSTATUS
9454 DDKAPI
9455 WmiFireEvent(
9456 IN PDEVICE_OBJECT DeviceObject,
9457 IN LPGUID Guid,
9458 IN ULONG InstanceIndex,
9459 IN ULONG EventDataSize,
9460 IN PVOID EventData);
9461
9462 NTOSAPI
9463 NTSTATUS
9464 DDKAPI
9465 WmiQueryTraceInformation(
9466 IN TRACE_INFORMATION_CLASS TraceInformationClass,
9467 OUT PVOID TraceInformation,
9468 IN ULONG TraceInformationLength,
9469 OUT PULONG RequiredLength OPTIONAL,
9470 IN PVOID Buffer OPTIONAL);
9471
9472 NTOSAPI
9473 NTSTATUS
9474 DDKAPI
9475 WmiSystemControl(
9476 IN PWMILIB_CONTEXT WmiLibInfo,
9477 IN PDEVICE_OBJECT DeviceObject,
9478 IN PIRP Irp,
9479 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
9480
9481 NTOSAPI
9482 NTSTATUS
9483 DDKCDECLAPI
9484 WmiTraceMessage(
9485 IN TRACEHANDLE LoggerHandle,
9486 IN ULONG MessageFlags,
9487 IN LPGUID MessageGuid,
9488 IN USHORT MessageNumber,
9489 IN ...);
9490
9491 #if 0
9492 /* FIXME: Get va_list from where? */
9493 NTOSAPI
9494 NTSTATUS
9495 DDKCDECLAPI
9496 WmiTraceMessageVa(
9497 IN TRACEHANDLE LoggerHandle,
9498 IN ULONG MessageFlags,
9499 IN LPGUID MessageGuid,
9500 IN USHORT MessageNumber,
9501 IN va_list MessageArgList);
9502 #endif
9503
9504
9505 /** Kernel debugger routines **/
9506
9507 NTOSAPI
9508 VOID
9509 DDKAPI
9510 KdDisableDebugger(
9511 VOID);
9512
9513 NTOSAPI
9514 VOID
9515 DDKAPI
9516 KdEnableDebugger(
9517 VOID);
9518
9519 NTOSAPI
9520 VOID
9521 DDKAPI
9522 DbgBreakPoint(
9523 VOID);
9524
9525 NTOSAPI
9526 VOID
9527 DDKAPI
9528 DbgBreakPointWithStatus(
9529 IN ULONG Status);
9530
9531 NTOSAPI
9532 ULONG
9533 DDKCDECLAPI
9534 DbgPrint(
9535 IN PCH Format,
9536 IN ...);
9537
9538 NTOSAPI
9539 ULONG
9540 DDKCDECLAPI
9541 DbgPrintEx(
9542 IN ULONG ComponentId,
9543 IN ULONG Level,
9544 IN PCH Format,
9545 IN ...);
9546
9547 NTOSAPI
9548 ULONG
9549 DDKCDECLAPI
9550 DbgPrintReturnControlC(
9551 IN PCH Format,
9552 IN ...);
9553
9554 NTOSAPI
9555 NTSTATUS
9556 DDKAPI
9557 DbgQueryDebugFilterState(
9558 IN ULONG ComponentId,
9559 IN ULONG Level);
9560
9561 NTOSAPI
9562 NTSTATUS
9563 DDKAPI
9564 DbgSetDebugFilterState(
9565 IN ULONG ComponentId,
9566 IN ULONG Level,
9567 IN BOOLEAN State);
9568
9569 NTOSAPI
9570 BOOLEAN
9571 DDKAPI
9572 KeRosPrintAddress ( PVOID address );
9573
9574 NTOSAPI
9575 VOID
9576 DDKAPI
9577 KeRosDumpStackFrames ( PULONG Frame, ULONG FrameCount );
9578
9579 #ifdef DBG
9580
9581 #define KdPrint(_x_) DbgPrint _x_
9582 #define KdPrintEx(_x_) DbgPrintEx _x_
9583 #define KdBreakPoint() DbgBreakPoint()
9584 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9585
9586 #else /* !DBG */
9587
9588 #define KdPrint(_x_)
9589 #define KdPrintEx(_x_)
9590 #define KdBreakPoint()
9591 #define KdBreakPointWithStatus(s)
9592
9593 #endif /* !DBG */
9594
9595 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
9596 extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
9597 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9598 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9599
9600 #ifdef __cplusplus
9601 }
9602 #endif
9603
9604 #endif /* __WINDDK_H */