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