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