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