- Make ROS buildable with GCC 4.1
[reactos.git] / reactos / 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(_NTDRIVER_) || defined(_NTDDK_) || defined (_NTIFS_) || defined(_NTHAL_)
44 #define NTKERNELAPI DECLSPEC_IMPORT
45 #else
46 #define NTKERNELAPI
47 #endif
48 #ifndef NTOSAPI
49 #define NTOSAPI NTKERNELAPI
50 #endif
51 #if defined(_NTOSKRNL_)
52 #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
53 #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
54 #else
55 #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
56 #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
57 #endif
58
59 #if !defined(_NTHAL_)
60 #define NTHALAPI DECLSPEC_IMPORT
61 #else
62 #define NTHALAPI
63 #endif
64
65 /* Pseudo modifiers for parameters */
66 #define IN
67 #define OUT
68 #define OPTIONAL
69 #define UNALLIGNED
70
71 #define CONST const
72 #define VOLATILE volatile
73
74 #define RESTRICTED_POINTER
75 #define POINTER_ALIGNMENT
76 #define DECLSPEC_ADDRSAFE
77
78 #ifdef NONAMELESSUNION
79 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
80 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
81 #else
82 # define _DDK_DUMMYUNION_MEMBER(name) name
83 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
84 #endif
85
86 #if !defined(_NTSYSTEM_)
87 #define NTSYSAPI DECLSPEC_IMPORT
88 #define NTSYSCALLAPI DECLSPEC_IMPORT
89 #else
90 #define NTSYSAPI
91 #if defined(_NTDLLBUILD_)
92 #define NTSYSCALLAPI
93 #else
94 #define NTSYSCALLAPI DECLSPEC_ADDRSAFE
95 #endif
96 #endif
97
98 /*
99 * Alignment Macros
100 */
101 #define ALIGN_DOWN(s, t) \
102 ((ULONG)(s) & ~(sizeof(t) - 1))
103
104 #define ALIGN_UP(s, t) \
105 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
106
107 #define ALIGN_DOWN_POINTER(p, t) \
108 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
109
110 #define ALIGN_UP_POINTER(p, t) \
111 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
112
113 /*
114 ** Forward declarations
115 */
116
117 struct _IRP;
118 struct _MDL;
119 struct _KAPC;
120 struct _KDPC;
121 struct _KPCR;
122 struct _KPRCB;
123 struct _KTSS;
124 struct _FILE_OBJECT;
125 struct _DMA_ADAPTER;
126 struct _DEVICE_OBJECT;
127 struct _DRIVER_OBJECT;
128 struct _IO_STATUS_BLOCK;
129 struct _DEVICE_DESCRIPTION;
130 struct _SCATTER_GATHER_LIST;
131 struct _DRIVE_LAYOUT_INFORMATION;
132 struct _DRIVE_LAYOUT_INFORMATION_EX;
133
134 typedef PVOID PSECURITY_DESCRIPTOR;
135 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
136 typedef PVOID PSID;
137
138 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
139 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
140 DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK)
141
142 #if 1
143 /* FIXME: Unknown definitions */
144 struct _SET_PARTITION_INFORMATION_EX;
145 typedef ULONG WAIT_TYPE;
146 #define WaitAll 0
147 #define WaitAny 1
148 typedef HANDLE TRACEHANDLE;
149 typedef PVOID PWMILIB_CONTEXT;
150 typedef PVOID PSYSCTL_IRP_DISPOSITION;
151 typedef ULONG LOGICAL;
152 #endif
153
154 /*
155 ** Routines specific to this DDK
156 */
157 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
158
159 /*
160 ** Simple structures
161 */
162
163 typedef LONG KPRIORITY;
164 typedef UCHAR KIRQL, *PKIRQL;
165 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
166 typedef UCHAR KPROCESSOR_MODE;
167
168 typedef enum _MODE {
169 KernelMode,
170 UserMode,
171 MaximumMode
172 } MODE;
173
174 typedef struct _QUAD
175 {
176 union
177 {
178 LONGLONG UseThisFieldToCopy;
179 float DoNotUseThisField;
180 };
181 } QUAD, *PQUAD;
182
183 /* Structures not exposed to drivers */
184 typedef struct _IO_TIMER *PIO_TIMER;
185 typedef struct _KPROCESS *PKPROCESS;
186 typedef struct _EPROCESS *PEPROCESS;
187 typedef struct _ETHREAD *PETHREAD;
188 typedef struct _KINTERRUPT *PKINTERRUPT;
189 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
190 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
191 typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
192 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
193 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
194 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
195 typedef struct _BUS_HANDLER *PBUS_HANDLER;
196 typedef struct _PEB *PPEB;
197 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
198
199 /* Constants */
200 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
201 #define ZwCurrentProcess() NtCurrentProcess()
202 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
203 #define ZwCurrentThread() NtCurrentThread()
204
205 #define KERNEL_STACK_SIZE 12288
206 #define KERNEL_LARGE_STACK_SIZE 61440
207
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 UCHAR WaitType;
4120 UCHAR SpareByte;
4121 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
4122
4123 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
4124
4125 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
4126 BOOLEAN Removed;
4127 BOOLEAN Reserved[3];
4128 LONG IoCount;
4129 KEVENT RemoveEvent;
4130 } IO_REMOVE_LOCK_COMMON_BLOCK;
4131
4132 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
4133 LONG Signature;
4134 LONG HighWatermark;
4135 LONGLONG MaxLockedTicks;
4136 LONG AllocateTag;
4137 LIST_ENTRY LockList;
4138 KSPIN_LOCK Spin;
4139 LONG LowMemoryCount;
4140 ULONG Reserved1[4];
4141 PVOID Reserved2;
4142 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
4143 } IO_REMOVE_LOCK_DBG_BLOCK;
4144
4145 typedef struct _IO_REMOVE_LOCK {
4146 IO_REMOVE_LOCK_COMMON_BLOCK Common;
4147 #ifdef DBG
4148 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
4149 #endif
4150 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
4151
4152 typedef struct _IO_WORKITEM *PIO_WORKITEM;
4153
4154 typedef VOID
4155 (DDKAPI *PIO_WORKITEM_ROUTINE)(
4156 IN PDEVICE_OBJECT DeviceObject,
4157 IN PVOID Context);
4158
4159 typedef struct _SHARE_ACCESS {
4160 ULONG OpenCount;
4161 ULONG Readers;
4162 ULONG Writers;
4163 ULONG Deleters;
4164 ULONG SharedRead;
4165 ULONG SharedWrite;
4166 ULONG SharedDelete;
4167 } SHARE_ACCESS, *PSHARE_ACCESS;
4168
4169 typedef enum _KINTERRUPT_MODE {
4170 LevelSensitive,
4171 Latched
4172 } KINTERRUPT_MODE;
4173
4174 #define THREAD_WAIT_OBJECTS 3
4175
4176 typedef VOID
4177 (DDKAPI *PKINTERRUPT_ROUTINE)(
4178 VOID);
4179
4180 typedef enum _KPROFILE_SOURCE {
4181 ProfileTime,
4182 ProfileAlignmentFixup,
4183 ProfileTotalIssues,
4184 ProfilePipelineDry,
4185 ProfileLoadInstructions,
4186 ProfilePipelineFrozen,
4187 ProfileBranchInstructions,
4188 ProfileTotalNonissues,
4189 ProfileDcacheMisses,
4190 ProfileIcacheMisses,
4191 ProfileCacheMisses,
4192 ProfileBranchMispredictions,
4193 ProfileStoreInstructions,
4194 ProfileFpInstructions,
4195 ProfileIntegerInstructions,
4196 Profile2Issue,
4197 Profile3Issue,
4198 Profile4Issue,
4199 ProfileSpecialInstructions,
4200 ProfileTotalCycles,
4201 ProfileIcacheIssues,
4202 ProfileDcacheAccesses,
4203 ProfileMemoryBarrierCycles,
4204 ProfileLoadLinkedIssues,
4205 ProfileMaximum
4206 } KPROFILE_SOURCE;
4207
4208 typedef enum _CREATE_FILE_TYPE {
4209 CreateFileTypeNone,
4210 CreateFileTypeNamedPipe,
4211 CreateFileTypeMailslot
4212 } CREATE_FILE_TYPE;
4213
4214 typedef struct _CONFIGURATION_INFORMATION {
4215 ULONG DiskCount;
4216 ULONG FloppyCount;
4217 ULONG CdRomCount;
4218 ULONG TapeCount;
4219 ULONG ScsiPortCount;
4220 ULONG SerialCount;
4221 ULONG ParallelCount;
4222 BOOLEAN AtDiskPrimaryAddressClaimed;
4223 BOOLEAN AtDiskSecondaryAddressClaimed;
4224 ULONG Version;
4225 ULONG MediumChangerCount;
4226 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
4227
4228 typedef enum _CONFIGURATION_TYPE {
4229 ArcSystem,
4230 CentralProcessor,
4231 FloatingPointProcessor,
4232 PrimaryIcache,
4233 PrimaryDcache,
4234 SecondaryIcache,
4235 SecondaryDcache,
4236 SecondaryCache,
4237 EisaAdapter,
4238 TcAdapter,
4239 ScsiAdapter,
4240 DtiAdapter,
4241 MultiFunctionAdapter,
4242 DiskController,
4243 TapeController,
4244 CdromController,
4245 WormController,
4246 SerialController,
4247 NetworkController,
4248 DisplayController,
4249 ParallelController,
4250 PointerController,
4251 KeyboardController,
4252 AudioController,
4253 OtherController,
4254 DiskPeripheral,
4255 FloppyDiskPeripheral,
4256 TapePeripheral,
4257 ModemPeripheral,
4258 MonitorPeripheral,
4259 PrinterPeripheral,
4260 PointerPeripheral,
4261 KeyboardPeripheral,
4262 TerminalPeripheral,
4263 OtherPeripheral,
4264 LinePeripheral,
4265 NetworkPeripheral,
4266 SystemMemory,
4267 DockingInformation,
4268 RealModeIrqRoutingTable,
4269 MaximumType
4270 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
4271
4272 #define IO_FORCE_ACCESS_CHECK 0x001
4273 #define IO_NO_PARAMETER_CHECKING 0x100
4274
4275 typedef NTSTATUS
4276 (DDKAPI *PIO_QUERY_DEVICE_ROUTINE)(
4277 IN PVOID Context,
4278 IN PUNICODE_STRING PathName,
4279 IN INTERFACE_TYPE BusType,
4280 IN ULONG BusNumber,
4281 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
4282 IN CONFIGURATION_TYPE ControllerType,
4283 IN ULONG ControllerNumber,
4284 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
4285 IN CONFIGURATION_TYPE PeripheralType,
4286 IN ULONG PeripheralNumber,
4287 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
4288
4289 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
4290 IoQueryDeviceIdentifier = 0,
4291 IoQueryDeviceConfigurationData,
4292 IoQueryDeviceComponentInformation,
4293 IoQueryDeviceMaxData
4294 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
4295
4296 typedef enum _WORK_QUEUE_TYPE {
4297 CriticalWorkQueue,
4298 DelayedWorkQueue,
4299 HyperCriticalWorkQueue,
4300 MaximumWorkQueue
4301 } WORK_QUEUE_TYPE;
4302
4303 typedef VOID
4304 (DDKAPI *PWORKER_THREAD_ROUTINE)(
4305 IN PVOID Parameter);
4306
4307 typedef struct _WORK_QUEUE_ITEM {
4308 LIST_ENTRY List;
4309 PWORKER_THREAD_ROUTINE WorkerRoutine;
4310 PVOID Parameter;
4311 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
4312
4313 typedef enum _KBUGCHECK_CALLBACK_REASON {
4314 KbCallbackInvalid,
4315 KbCallbackReserved1,
4316 KbCallbackSecondaryDumpData,
4317 KbCallbackDumpIo,
4318 } KBUGCHECK_CALLBACK_REASON;
4319
4320 typedef VOID
4321 (DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
4322 IN KBUGCHECK_CALLBACK_REASON Reason,
4323 IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
4324 IN OUT PVOID ReasonSpecificData,
4325 IN ULONG ReasonSpecificDataLength);
4326
4327 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
4328 LIST_ENTRY Entry;
4329 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
4330 PUCHAR Component;
4331 ULONG_PTR Checksum;
4332 KBUGCHECK_CALLBACK_REASON Reason;
4333 UCHAR State;
4334 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
4335
4336 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
4337 BufferEmpty,
4338 BufferInserted,
4339 BufferStarted,
4340 BufferFinished,
4341 BufferIncomplete
4342 } KBUGCHECK_BUFFER_DUMP_STATE;
4343
4344 typedef VOID
4345 (DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
4346 IN PVOID Buffer,
4347 IN ULONG Length);
4348
4349 typedef struct _KBUGCHECK_CALLBACK_RECORD {
4350 LIST_ENTRY Entry;
4351 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
4352 PVOID Buffer;
4353 ULONG Length;
4354 PUCHAR Component;
4355 ULONG_PTR Checksum;
4356 UCHAR State;
4357 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
4358
4359 /*
4360 * VOID
4361 * KeInitializeCallbackRecord(
4362 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
4363 */
4364 #define KeInitializeCallbackRecord(CallbackRecord) \
4365 CallbackRecord->State = BufferEmpty;
4366
4367 typedef enum _KDPC_IMPORTANCE {
4368 LowImportance,
4369 MediumImportance,
4370 HighImportance
4371 } KDPC_IMPORTANCE;
4372
4373 typedef enum _MEMORY_CACHING_TYPE_ORIG {
4374 MmFrameBufferCached = 2
4375 } MEMORY_CACHING_TYPE_ORIG;
4376
4377 typedef enum _MEMORY_CACHING_TYPE {
4378 MmNonCached = FALSE,
4379 MmCached = TRUE,
4380 MmWriteCombined = MmFrameBufferCached,
4381 MmHardwareCoherentCached,
4382 MmNonCachedUnordered,
4383 MmUSWCCached,
4384 MmMaximumCacheType
4385 } MEMORY_CACHING_TYPE;
4386
4387 typedef enum _MM_PAGE_PRIORITY {
4388 LowPagePriority,
4389 NormalPagePriority = 16,
4390 HighPagePriority = 32
4391 } MM_PAGE_PRIORITY;
4392
4393 typedef enum _LOCK_OPERATION {
4394 IoReadAccess,
4395 IoWriteAccess,
4396 IoModifyAccess
4397 } LOCK_OPERATION;
4398
4399 typedef enum _MM_SYSTEM_SIZE {
4400 MmSmallSystem,
4401 MmMediumSystem,
4402 MmLargeSystem
4403 } MM_SYSTEM_SIZE;
4404
4405 typedef struct _OBJECT_HANDLE_INFORMATION {
4406 ULONG HandleAttributes;
4407 ACCESS_MASK GrantedAccess;
4408 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
4409
4410 typedef struct _CLIENT_ID {
4411 HANDLE UniqueProcess;
4412 HANDLE UniqueThread;
4413 } CLIENT_ID, *PCLIENT_ID;
4414
4415 typedef VOID
4416 (DDKAPI *PKSTART_ROUTINE)(
4417 IN PVOID StartContext);
4418
4419 typedef VOID
4420 (DDKAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
4421 IN HANDLE ParentId,
4422 IN HANDLE ProcessId,
4423 IN BOOLEAN Create);
4424
4425 typedef VOID
4426 (DDKAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
4427 IN HANDLE ProcessId,
4428 IN HANDLE ThreadId,
4429 IN BOOLEAN Create);
4430
4431 typedef struct _IMAGE_INFO {
4432 _ANONYMOUS_UNION union {
4433 ULONG Properties;
4434 _ANONYMOUS_STRUCT struct {
4435 ULONG ImageAddressingMode : 8;
4436 ULONG SystemModeImage : 1;
4437 ULONG ImageMappedToAllPids : 1;
4438 ULONG Reserved : 22;
4439 } DUMMYSTRUCTNAME;
4440 } DUMMYUNIONNAME;
4441 PVOID ImageBase;
4442 ULONG ImageSelector;
4443 SIZE_T ImageSize;
4444 ULONG ImageSectionNumber;
4445 } IMAGE_INFO, *PIMAGE_INFO;
4446
4447 #define IMAGE_ADDRESSING_MODE_32BIT 3
4448
4449 typedef VOID
4450 (DDKAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
4451 IN PUNICODE_STRING FullImageName,
4452 IN HANDLE ProcessId,
4453 IN PIMAGE_INFO ImageInfo);
4454
4455 typedef enum _PROCESSINFOCLASS {
4456 ProcessBasicInformation,
4457 ProcessQuotaLimits,
4458 ProcessIoCounters,
4459 ProcessVmCounters,
4460 ProcessTimes,
4461 ProcessBasePriority,
4462 ProcessRaisePriority,
4463 ProcessDebugPort,
4464 ProcessExceptionPort,
4465 ProcessAccessToken,
4466 ProcessLdtInformation,
4467 ProcessLdtSize,
4468 ProcessDefaultHardErrorMode,
4469 ProcessIoPortHandlers,
4470 ProcessPooledUsageAndLimits,
4471 ProcessWorkingSetWatch,
4472 ProcessUserModeIOPL,
4473 ProcessEnableAlignmentFaultFixup,
4474 ProcessPriorityClass,
4475 ProcessWx86Information,
4476 ProcessHandleCount,
4477 ProcessAffinityMask,
4478 ProcessPriorityBoost,
4479 ProcessDeviceMap,
4480 ProcessSessionInformation,
4481 ProcessForegroundInformation,
4482 ProcessWow64Information,
4483 ProcessImageFileName,
4484 ProcessLUIDDeviceMapsEnabled,
4485 ProcessBreakOnTermination,
4486 ProcessDebugObjectHandle,
4487 ProcessDebugFlags,
4488 ProcessHandleTracing,
4489 ProcessIoPriority,
4490 ProcessExecuteFlags,
4491 ProcessTlsInformation,
4492 ProcessCookie,
4493 ProcessImageInformation,
4494 ProcessCycleTime,
4495 ProcessPagePriority,
4496 ProcessInstrumentationCallback,
4497 MaxProcessInfoClass
4498 } PROCESSINFOCLASS;
4499
4500 typedef enum _THREADINFOCLASS {
4501 ThreadBasicInformation,
4502 ThreadTimes,
4503 ThreadPriority,
4504 ThreadBasePriority,
4505 ThreadAffinityMask,
4506 ThreadImpersonationToken,
4507 ThreadDescriptorTableEntry,
4508 ThreadEnableAlignmentFaultFixup,
4509 ThreadEventPair_Reusable,
4510 ThreadQuerySetWin32StartAddress,
4511 ThreadZeroTlsCell,
4512 ThreadPerformanceCount,
4513 ThreadAmILastThread,
4514 ThreadIdealProcessor,
4515 ThreadPriorityBoost,
4516 ThreadSetTlsArrayAddress,
4517 ThreadIsIoPending,
4518 ThreadHideFromDebugger,
4519 ThreadBreakOnTermination,
4520 ThreadSwitchLegacyState,
4521 ThreadIsTerminated,
4522 ThreadLastSystemCall,
4523 ThreadIoPriority,
4524 ThreadCycleTime,
4525 ThreadPagePriority,
4526 ThreadActualBasePriority,
4527 MaxThreadInfoClass
4528 } THREADINFOCLASS;
4529
4530 typedef struct _PROCESS_BASIC_INFORMATION
4531 {
4532 NTSTATUS ExitStatus;
4533 PPEB PebBaseAddress;
4534 ULONG_PTR AffinityMask;
4535 KPRIORITY BasePriority;
4536 ULONG_PTR UniqueProcessId;
4537 ULONG_PTR InheritedFromUniqueProcessId;
4538 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
4539
4540 typedef struct _PROCESS_WS_WATCH_INFORMATION
4541 {
4542 PVOID FaultingPc;
4543 PVOID FaultingVa;
4544 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
4545
4546 typedef struct _PROCESS_DEVICEMAP_INFORMATION
4547 {
4548 union
4549 {
4550 struct
4551 {
4552 HANDLE DirectoryHandle;
4553 } Set;
4554 struct
4555 {
4556 ULONG DriveMap;
4557 UCHAR DriveType[32];
4558 } Query;
4559 };
4560 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
4561
4562 typedef struct _KERNEL_USER_TIMES
4563 {
4564 LARGE_INTEGER CreateTime;
4565 LARGE_INTEGER ExitTime;
4566 LARGE_INTEGER KernelTime;
4567 LARGE_INTEGER UserTime;
4568 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
4569
4570 typedef struct _PROCESS_ACCESS_TOKEN
4571 {
4572 HANDLE Token;
4573 HANDLE Thread;
4574 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
4575
4576 typedef struct _PROCESS_SESSION_INFORMATION
4577 {
4578 ULONG SessionId;
4579 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
4580
4581 #define ES_SYSTEM_REQUIRED 0x00000001
4582 #define ES_DISPLAY_REQUIRED 0x00000002
4583 #define ES_USER_PRESENT 0x00000004
4584 #define ES_CONTINUOUS 0x80000000
4585
4586 typedef ULONG EXECUTION_STATE;
4587
4588 typedef VOID
4589 (DDKAPI *PREQUEST_POWER_COMPLETE)(
4590 IN PDEVICE_OBJECT DeviceObject,
4591 IN UCHAR MinorFunction,
4592 IN POWER_STATE PowerState,
4593 IN PVOID Context,
4594 IN PIO_STATUS_BLOCK IoStatus);
4595
4596 typedef enum _TRACE_INFORMATION_CLASS {
4597 TraceIdClass,
4598 TraceHandleClass,
4599 TraceEnableFlagsClass,
4600 TraceEnableLevelClass,
4601 GlobalLoggerHandleClass,
4602 EventLoggerHandleClass,
4603 AllLoggerHandlesClass,
4604 TraceHandleByNameClass
4605 } TRACE_INFORMATION_CLASS;
4606
4607 typedef enum _REG_NOTIFY_CLASS
4608 {
4609 RegNtDeleteKey,
4610 RegNtPreDeleteKey = RegNtDeleteKey,
4611 RegNtSetValueKey,
4612 RegNtPreSetValueKey = RegNtSetValueKey,
4613 RegNtDeleteValueKey,
4614 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
4615 RegNtSetInformationKey,
4616 RegNtPreSetInformationKey = RegNtSetInformationKey,
4617 RegNtRenameKey,
4618 RegNtPreRenameKey = RegNtRenameKey,
4619 RegNtEnumerateKey,
4620 RegNtPreEnumerateKey = RegNtEnumerateKey,
4621 RegNtEnumerateValueKey,
4622 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
4623 RegNtQueryKey,
4624 RegNtPreQueryKey = RegNtQueryKey,
4625 RegNtQueryValueKey,
4626 RegNtPreQueryValueKey = RegNtQueryValueKey,
4627 RegNtQueryMultipleValueKey,
4628 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
4629 RegNtPreCreateKey,
4630 RegNtPostCreateKey,
4631 RegNtPreOpenKey,
4632 RegNtPostOpenKey,
4633 RegNtKeyHandleClose,
4634 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
4635 RegNtPostDeleteKey,
4636 RegNtPostSetValueKey,
4637 RegNtPostDeleteValueKey,
4638 RegNtPostSetInformationKey,
4639 RegNtPostRenameKey,
4640 RegNtPostEnumerateKey,
4641 RegNtPostEnumerateValueKey,
4642 RegNtPostQueryKey,
4643 RegNtPostQueryValueKey,
4644 RegNtPostQueryMultipleValueKey,
4645 RegNtPostKeyHandleClose,
4646 RegNtPreCreateKeyEx,
4647 RegNtPostCreateKeyEx,
4648 RegNtPreOpenKeyEx,
4649 RegNtPostOpenKeyEx
4650 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
4651
4652 typedef NTSTATUS
4653 (DDKAPI *PEX_CALLBACK_FUNCTION)(
4654 IN PVOID CallbackContext,
4655 IN REG_NOTIFY_CLASS Argument1,
4656 IN PVOID Argument2);
4657
4658 typedef struct _REG_DELETE_KEY_INFORMATION
4659 {
4660 PVOID Object;
4661 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION;
4662
4663 typedef struct _REG_SET_VALUE_KEY_INFORMATION
4664 {
4665 PVOID Object;
4666 PUNICODE_STRING ValueName;
4667 ULONG TitleIndex;
4668 ULONG Type;
4669 PVOID Data;
4670 ULONG DataSize;
4671 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
4672
4673 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
4674 {
4675 PVOID Object;
4676 PUNICODE_STRING ValueName;
4677 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
4678
4679 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
4680 {
4681 PVOID Object;
4682 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
4683 PVOID KeySetInformation;
4684 ULONG KeySetInformationLength;
4685 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
4686
4687 typedef struct _REG_ENUMERATE_KEY_INFORMATION
4688 {
4689 PVOID Object;
4690 ULONG Index;
4691 KEY_INFORMATION_CLASS KeyInformationClass;
4692 PVOID KeyInformation;
4693 ULONG Length;
4694 PULONG ResultLength;
4695 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
4696
4697 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
4698 {
4699 PVOID Object;
4700 ULONG Index;
4701 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
4702 PVOID KeyValueInformation;
4703 ULONG Length;
4704 PULONG ResultLength;
4705 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
4706
4707 typedef struct _REG_QUERY_KEY_INFORMATION
4708 {
4709 PVOID Object;
4710 KEY_INFORMATION_CLASS KeyInformationClass;
4711 PVOID KeyInformation;
4712 ULONG Length;
4713 PULONG ResultLength;
4714 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
4715
4716 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
4717 {
4718 PVOID Object;
4719 PUNICODE_STRING ValueName;
4720 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
4721 PVOID KeyValueInformation;
4722 ULONG Length;
4723 PULONG ResultLength;
4724 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
4725
4726 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
4727 {
4728 PVOID Object;
4729 PKEY_VALUE_ENTRY ValueEntries;
4730 ULONG EntryCount;
4731 PVOID ValueBuffer;
4732 PULONG BufferLength;
4733 PULONG RequiredBufferLength;
4734 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
4735
4736 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
4737 {
4738 PUNICODE_STRING CompleteName;
4739 } REG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_CREATE_KEY_INFORMATION;
4740
4741 typedef struct _REG_POST_CREATE_KEY_INFORMATION
4742 {
4743 PUNICODE_STRING CompleteName;
4744 PVOID Object;
4745 NTSTATUS Status;
4746 } REG_POST_CREATE_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION;
4747
4748 typedef struct _REG_PRE_OPEN_KEY_INFORMATION
4749 {
4750 PUNICODE_STRING CompleteName;
4751 } REG_PRE_OPEN_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
4752
4753 typedef struct _REG_POST_OPEN_KEY_INFORMATION
4754 {
4755 PUNICODE_STRING CompleteName;
4756 PVOID Object;
4757 NTSTATUS Status;
4758 } REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
4759
4760 typedef struct _REG_POST_OPERATION_INFORMATION
4761 {
4762 PVOID Object;
4763 NTSTATUS Status;
4764 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
4765
4766 /*
4767 ** Storage structures
4768 */
4769 typedef enum _PARTITION_STYLE {
4770 PARTITION_STYLE_MBR,
4771 PARTITION_STYLE_GPT
4772 } PARTITION_STYLE;
4773
4774 typedef struct _CREATE_DISK_MBR {
4775 ULONG Signature;
4776 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
4777
4778 typedef struct _CREATE_DISK_GPT {
4779 GUID DiskId;
4780 ULONG MaxPartitionCount;
4781 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
4782
4783 typedef struct _CREATE_DISK {
4784 PARTITION_STYLE PartitionStyle;
4785 _ANONYMOUS_UNION union {
4786 CREATE_DISK_MBR Mbr;
4787 CREATE_DISK_GPT Gpt;
4788 } DUMMYUNIONNAME;
4789 } CREATE_DISK, *PCREATE_DISK;
4790
4791 typedef struct _DISK_SIGNATURE {
4792 ULONG PartitionStyle;
4793 _ANONYMOUS_UNION union {
4794 struct {
4795 ULONG Signature;
4796 ULONG CheckSum;
4797 } Mbr;
4798 struct {
4799 GUID DiskId;
4800 } Gpt;
4801 } DUMMYUNIONNAME;
4802 } DISK_SIGNATURE, *PDISK_SIGNATURE;
4803
4804 typedef VOID
4805 (DDKFASTAPI*PTIME_UPDATE_NOTIFY_ROUTINE)(
4806 IN HANDLE ThreadId,
4807 IN KPROCESSOR_MODE Mode);
4808
4809 #define DBG_STATUS_CONTROL_C 1
4810 #define DBG_STATUS_SYSRQ 2
4811 #define DBG_STATUS_BUGCHECK_FIRST 3
4812 #define DBG_STATUS_BUGCHECK_SECOND 4
4813 #define DBG_STATUS_FATAL 5
4814 #define DBG_STATUS_DEBUG_CONTROL 6
4815 #define DBG_STATUS_WORKER 7
4816
4817 typedef struct _PHYSICAL_MEMORY_RANGE {
4818 PHYSICAL_ADDRESS BaseAddress;
4819 LARGE_INTEGER NumberOfBytes;
4820 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
4821
4822 typedef ULONG_PTR
4823 (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
4824 IN PVOID Context);
4825
4826 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
4827 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
4828 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
4829 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
4830
4831 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
4832 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
4833 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
4834 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
4835 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
4836
4837 #define HASH_STRING_ALGORITHM_DEFAULT 0
4838 #define HASH_STRING_ALGORITHM_X65599 1
4839 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
4840
4841 typedef enum _SUITE_TYPE {
4842 SmallBusiness,
4843 Enterprise,
4844 BackOffice,
4845 CommunicationServer,
4846 TerminalServer,
4847 SmallBusinessRestricted,
4848 EmbeddedNT,
4849 DataCenter,
4850 SingleUserTS,
4851 Personal,
4852 Blade,
4853 MaxSuiteType
4854 } SUITE_TYPE;
4855
4856 typedef VOID
4857 (DDKAPI *PTIMER_APC_ROUTINE)(
4858 IN PVOID TimerContext,
4859 IN ULONG TimerLowValue,
4860 IN LONG TimerHighValue);
4861
4862
4863
4864 /*
4865 ** WMI structures
4866 */
4867
4868 typedef VOID
4869 (DDKAPI *WMI_NOTIFICATION_CALLBACK)(
4870 PVOID Wnode,
4871 PVOID Context);
4872
4873
4874 /*
4875 ** Architecture specific structures
4876 */
4877
4878 #ifdef _X86_
4879
4880 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
4881
4882 #define PASSIVE_LEVEL 0
4883 #define LOW_LEVEL 0
4884 #define APC_LEVEL 1
4885 #define DISPATCH_LEVEL 2
4886 #define PROFILE_LEVEL 27
4887 #define CLOCK1_LEVEL 28
4888 #define CLOCK2_LEVEL 28
4889 #define IPI_LEVEL 29
4890 #define SYNCH_LEVEL (IPI_LEVEL-1)
4891 #define POWER_LEVEL 30
4892 #define HIGH_LEVEL 31
4893
4894 typedef struct _KPCR_TIB {
4895 PVOID ExceptionList; /* 00 */
4896 PVOID StackBase; /* 04 */
4897 PVOID StackLimit; /* 08 */
4898 PVOID SubSystemTib; /* 0C */
4899 _ANONYMOUS_UNION union {
4900 PVOID FiberData; /* 10 */
4901 DWORD Version; /* 10 */
4902 } DUMMYUNIONNAME;
4903 PVOID ArbitraryUserPointer; /* 14 */
4904 struct _KPCR_TIB *Self; /* 18 */
4905 } KPCR_TIB, *PKPCR_TIB; /* 1C */
4906
4907 #define PCR_MINOR_VERSION 1
4908 #define PCR_MAJOR_VERSION 1
4909
4910 typedef struct _KPCR {
4911 KPCR_TIB Tib; /* 00 */
4912 struct _KPCR *Self; /* 1C */
4913 struct _KPRCB *Prcb; /* 20 */
4914 KIRQL Irql; /* 24 */
4915 ULONG IRR; /* 28 */
4916 ULONG IrrActive; /* 2C */
4917 ULONG IDR; /* 30 */
4918 PVOID KdVersionBlock; /* 34 */
4919 PUSHORT IDT; /* 38 */
4920 PUSHORT GDT; /* 3C */
4921 struct _KTSS *TSS; /* 40 */
4922 USHORT MajorVersion; /* 44 */
4923 USHORT MinorVersion; /* 46 */
4924 KAFFINITY SetMember; /* 48 */
4925 ULONG StallScaleFactor; /* 4C */
4926 UCHAR SpareUnused; /* 50 */
4927 UCHAR Number; /* 51 */
4928 } KPCR, *PKPCR; /* 54 */
4929
4930 typedef struct _KFLOATING_SAVE {
4931 ULONG ControlWord;
4932 ULONG StatusWord;
4933 ULONG ErrorOffset;
4934 ULONG ErrorSelector;
4935 ULONG DataOffset;
4936 ULONG DataSelector;
4937 ULONG Cr0NpxState;
4938 ULONG Spare1;
4939 } KFLOATING_SAVE, *PKFLOATING_SAVE;
4940
4941 #define PAGE_SIZE 0x1000
4942 #define PAGE_SHIFT 12L
4943
4944 extern NTOSAPI PVOID MmHighestUserAddress;
4945 extern NTOSAPI PVOID MmSystemRangeStart;
4946 extern NTOSAPI ULONG_PTR MmUserProbeAddress;
4947
4948 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
4949 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
4950 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
4951 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
4952 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
4953
4954 #define KI_USER_SHARED_DATA 0xffdf0000
4955 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
4956
4957 #define EFLAG_SIGN 0x8000
4958 #define EFLAG_ZERO 0x4000
4959 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
4960
4961 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4962 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
4963 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4964
4965 typedef enum _INTERLOCKED_RESULT {
4966 ResultNegative = RESULT_NEGATIVE,
4967 ResultZero = RESULT_ZERO,
4968 ResultPositive = RESULT_POSITIVE
4969 } INTERLOCKED_RESULT;
4970
4971 NTHALAPI
4972 KIRQL
4973 DDKAPI
4974 KeGetCurrentIrql(
4975 VOID);
4976
4977 static __inline
4978 ULONG
4979 DDKAPI
4980 KeGetCurrentProcessorNumber(VOID)
4981 {
4982 #if defined(__GNUC__)
4983 ULONG ret;
4984 __asm__ __volatile__ (
4985 "movl %%fs:%c1, %0\n"
4986 : "=r" (ret)
4987 : "i" (FIELD_OFFSET(KPCR, Number))
4988 );
4989 return ret;
4990 #elif defined(_MSC_VER)
4991 #if _MSC_FULL_VER >= 13012035
4992 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
4993 #else
4994 __asm { movzx eax, _PCR KPCR.Number }
4995 #endif
4996 #else
4997 #error Unknown compiler
4998 #endif
4999 }
5000
5001 #if !defined(__INTERLOCKED_DECLARED)
5002 #define __INTERLOCKED_DECLARED
5003
5004 NTOSAPI
5005 LONG
5006 DDKFASTAPI
5007 InterlockedIncrement(
5008 IN PLONG VOLATILE Addend);
5009
5010 NTOSAPI
5011 LONG
5012 DDKFASTAPI
5013 InterlockedDecrement(
5014 IN PLONG VOLATILE Addend);
5015
5016 NTOSAPI
5017 LONG
5018 DDKFASTAPI
5019 InterlockedCompareExchange(
5020 IN OUT PLONG VOLATILE Destination,
5021 IN LONG Exchange,
5022 IN LONG Comparand);
5023
5024 NTOSAPI
5025 LONG
5026 DDKFASTAPI
5027 InterlockedExchange(
5028 IN OUT PLONG VOLATILE Target,
5029 IN LONG Value);
5030
5031 NTOSAPI
5032 LONG
5033 DDKFASTAPI
5034 InterlockedExchangeAdd(
5035 IN OUT PLONG VOLATILE Addend,
5036 IN LONG Value);
5037
5038 /*
5039 * PVOID
5040 * InterlockedExchangePointer(
5041 * IN OUT PVOID VOLATILE *Target,
5042 * IN PVOID Value)
5043 */
5044 #define InterlockedExchangePointer(Target, Value) \
5045 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
5046
5047 /*
5048 * PVOID
5049 * InterlockedCompareExchangePointer(
5050 * IN OUT PVOID *Destination,
5051 * IN PVOID Exchange,
5052 * IN PVOID Comparand)
5053 */
5054 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
5055 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
5056
5057 #endif /* !__INTERLOCKED_DECLARED */
5058
5059 NTOSAPI
5060 VOID
5061 DDKFASTAPI
5062 KefAcquireSpinLockAtDpcLevel(
5063 IN PKSPIN_LOCK SpinLock);
5064
5065 NTOSAPI
5066 VOID
5067 DDKFASTAPI
5068 KefReleaseSpinLockFromDpcLevel(
5069 IN PKSPIN_LOCK SpinLock);
5070
5071 NTHALAPI
5072 KIRQL
5073 DDKFASTAPI
5074 KfAcquireSpinLock(
5075 IN PKSPIN_LOCK SpinLock);
5076
5077 NTHALAPI
5078 VOID
5079 DDKFASTAPI
5080 KfReleaseSpinLock(
5081 IN PKSPIN_LOCK SpinLock,
5082 IN KIRQL NewIrql);
5083
5084 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5085 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5086 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5087 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5088
5089 #define RtlCopyMemoryNonTemporal RtlCopyMemory
5090
5091 #define KeGetDcacheFillSize() 1L
5092
5093 #endif /* _X86_ */
5094
5095
5096
5097 /*
5098 ** Utillity functions
5099 */
5100
5101 #define ARGUMENT_PRESENT(ArgumentPointer) \
5102 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
5103
5104 /*
5105 * ULONG
5106 * BYTE_OFFSET(
5107 * IN PVOID Va)
5108 */
5109 #define BYTE_OFFSET(Va) \
5110 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
5111
5112 /*
5113 * ULONG
5114 * BYTES_TO_PAGES(
5115 * IN ULONG Size)
5116 */
5117 #define BYTES_TO_PAGES(Size) \
5118 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
5119
5120 /*
5121 * PCHAR
5122 * CONTAINING_RECORD(
5123 * IN PCHAR Address,
5124 * IN TYPE Type,
5125 * IN PCHAR Field);
5126 */
5127 #ifndef CONTAINING_RECORD
5128 #define CONTAINING_RECORD(address, type, field) \
5129 ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
5130 #endif
5131
5132 /* LONG
5133 * FIELD_OFFSET(
5134 * IN TYPE Type,
5135 * IN PCHAR Field);
5136 */
5137 #ifndef FIELD_OFFSET
5138 #define FIELD_OFFSET(Type, Field) \
5139 ((LONG) (&(((Type *) 0)->Field)))
5140 #endif
5141
5142 /*
5143 * PVOID
5144 * PAGE_ALIGN(
5145 * IN PVOID Va)
5146 */
5147 #define PAGE_ALIGN(Va) \
5148 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
5149
5150 /*
5151 * ULONG_PTR
5152 * ROUND_TO_PAGES(
5153 * IN ULONG_PTR Size)
5154 */
5155 #define ROUND_TO_PAGES(Size) \
5156 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
5157
5158 NTSYSAPI
5159 VOID
5160 NTAPI
5161 RtlAssert(
5162 IN PVOID FailedAssertion,
5163 IN PVOID FileName,
5164 IN ULONG LineNumber,
5165 IN PCHAR Message);
5166
5167 #ifdef DBG
5168
5169 #define ASSERT(exp) \
5170 (VOID)((!(exp)) ? \
5171 RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE : TRUE)
5172
5173 #define ASSERTMSG(msg, exp) \
5174 (VOID)((!(exp)) ? \
5175 RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE : TRUE)
5176
5177 #define RTL_SOFT_ASSERT(exp) \
5178 (VOID)((!(_exp)) ? \
5179 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5180
5181 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5182 (VOID)((!(exp)) ? \
5183 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5184
5185 #define RTL_VERIFY(exp) ASSERT(exp)
5186 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
5187
5188 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5189 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5190
5191 #else /* !DBG */
5192
5193 #define ASSERT(exp) ((VOID) 0)
5194 #define ASSERTMSG(msg, exp) ((VOID) 0)
5195
5196 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5197 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5198
5199 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5200 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5201
5202 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5203 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5204
5205 #endif /* DBG */
5206
5207 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
5208 #if defined(_NTSYSTEM_) || defined(__GNUC__)
5209 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
5210 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
5211 #else
5212 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
5213 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
5214 #endif /* _NT_SYSTEM */
5215
5216 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
5217 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
5218
5219 /*
5220 ** Driver support routines
5221 */
5222
5223 /** Runtime library routines **/
5224
5225 static __inline VOID
5226 InitializeListHead(
5227 IN PLIST_ENTRY ListHead)
5228 {
5229 ListHead->Flink = ListHead->Blink = ListHead;
5230 }
5231
5232 static __inline VOID
5233 InsertHeadList(
5234 IN PLIST_ENTRY ListHead,
5235 IN PLIST_ENTRY Entry)
5236 {
5237 PLIST_ENTRY OldFlink;
5238 OldFlink = ListHead->Flink;
5239 Entry->Flink = OldFlink;
5240 Entry->Blink = ListHead;
5241 OldFlink->Blink = Entry;
5242 ListHead->Flink = Entry;
5243 }
5244
5245 static __inline VOID
5246 InsertTailList(
5247 IN PLIST_ENTRY ListHead,
5248 IN PLIST_ENTRY Entry)
5249 {
5250 PLIST_ENTRY OldBlink;
5251 OldBlink = ListHead->Blink;
5252 Entry->Flink = ListHead;
5253 Entry->Blink = OldBlink;
5254 OldBlink->Flink = Entry;
5255 ListHead->Blink = Entry;
5256 }
5257
5258 /*
5259 * BOOLEAN
5260 * IsListEmpty(
5261 * IN PLIST_ENTRY ListHead)
5262 */
5263 #define IsListEmpty(_ListHead) \
5264 ((_ListHead)->Flink == (_ListHead))
5265
5266 /*
5267 * PSINGLE_LIST_ENTRY
5268 * PopEntryList(
5269 * IN PSINGLE_LIST_ENTRY ListHead)
5270 */
5271 #define PopEntryList(ListHead) \
5272 (ListHead)->Next; \
5273 { \
5274 PSINGLE_LIST_ENTRY _FirstEntry; \
5275 _FirstEntry = (ListHead)->Next; \
5276 if (_FirstEntry != NULL) \
5277 (ListHead)->Next = _FirstEntry->Next; \
5278 }
5279
5280 /*
5281 * VOID
5282 * PushEntryList(
5283 * IN PSINGLE_LIST_ENTRY ListHead,
5284 * IN PSINGLE_LIST_ENTRY Entry)
5285 */
5286 #define PushEntryList(_ListHead, _Entry) \
5287 (_Entry)->Next = (_ListHead)->Next; \
5288 (_ListHead)->Next = (_Entry); \
5289
5290 static __inline BOOLEAN
5291 RemoveEntryList(
5292 IN PLIST_ENTRY Entry)
5293 {
5294 PLIST_ENTRY OldFlink;
5295 PLIST_ENTRY OldBlink;
5296
5297 OldFlink = Entry->Flink;
5298 OldBlink = Entry->Blink;
5299 OldFlink->Blink = OldBlink;
5300 OldBlink->Flink = OldFlink;
5301 return (OldFlink == OldBlink);
5302 }
5303
5304 static __inline PLIST_ENTRY
5305 RemoveHeadList(
5306 IN PLIST_ENTRY ListHead)
5307 {
5308 PLIST_ENTRY Flink;
5309 PLIST_ENTRY Entry;
5310
5311 Entry = ListHead->Flink;
5312 Flink = Entry->Flink;
5313 ListHead->Flink = Flink;
5314 Flink->Blink = ListHead;
5315 return Entry;
5316 }
5317
5318 static __inline PLIST_ENTRY
5319 RemoveTailList(
5320 IN PLIST_ENTRY ListHead)
5321 {
5322 PLIST_ENTRY Blink;
5323 PLIST_ENTRY Entry;
5324
5325 Entry = ListHead->Blink;
5326 Blink = Entry->Blink;
5327 ListHead->Blink = Blink;
5328 Blink->Flink = ListHead;
5329 return Entry;
5330 }
5331
5332 #if !defined(_WINBASE_H) || _WIN32_WINNT < 0x0501
5333
5334 NTOSAPI
5335 PSLIST_ENTRY
5336 DDKFASTAPI
5337 InterlockedPopEntrySList(
5338 IN PSLIST_HEADER ListHead);
5339
5340 NTOSAPI
5341 PSLIST_ENTRY
5342 DDKFASTAPI
5343 InterlockedPushEntrySList(
5344 IN PSLIST_HEADER ListHead,
5345 IN PSLIST_ENTRY ListEntry);
5346
5347 #endif
5348
5349 /*
5350 * USHORT
5351 * QueryDepthSList(
5352 * IN PSLIST_HEADER SListHead)
5353 */
5354 #define QueryDepthSList(_SListHead) \
5355 ((USHORT) ((_SListHead)->Alignment & 0xffff))
5356
5357 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
5358
5359 NTOSAPI
5360 ULONG
5361 DDKAPI
5362 RtlxAnsiStringToUnicodeSize(
5363 IN PCANSI_STRING AnsiString);
5364
5365 #define RtlAnsiStringToUnicodeSize(STRING) ( \
5366 NLS_MB_CODE_PAGE_TAG ? \
5367 RtlxAnsiStringToUnicodeSize(STRING) : \
5368 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
5369 )
5370
5371 NTOSAPI
5372 NTSTATUS
5373 DDKAPI
5374 RtlAnsiStringToUnicodeString(
5375 IN OUT PUNICODE_STRING DestinationString,
5376 IN PANSI_STRING SourceString,
5377 IN BOOLEAN AllocateDestinationString);
5378
5379 NTOSAPI
5380 NTSTATUS
5381 DDKAPI
5382 RtlAppendUnicodeStringToString(
5383 IN OUT PUNICODE_STRING Destination,
5384 IN PCUNICODE_STRING Source);
5385
5386 NTOSAPI
5387 NTSTATUS
5388 DDKAPI
5389 RtlAppendUnicodeToString(
5390 IN OUT PUNICODE_STRING Destination,
5391 IN PCWSTR Source);
5392
5393 NTOSAPI
5394 BOOLEAN
5395 DDKAPI
5396 RtlAreBitsClear(
5397 IN PRTL_BITMAP BitMapHeader,
5398 IN ULONG StartingIndex,
5399 IN ULONG Length);
5400
5401 NTOSAPI
5402 BOOLEAN
5403 DDKAPI
5404 RtlAreBitsSet(
5405 IN PRTL_BITMAP BitMapHeader,
5406 IN ULONG StartingIndex,
5407 IN ULONG Length);
5408
5409 NTOSAPI
5410 NTSTATUS
5411 DDKAPI
5412 RtlCharToInteger(
5413 IN PCSZ String,
5414 IN ULONG Base OPTIONAL,
5415 IN OUT PULONG Value);
5416
5417 NTOSAPI
5418 ULONG
5419 DDKAPI
5420 RtlCheckBit(
5421 IN PRTL_BITMAP BitMapHeader,
5422 IN ULONG BitPosition);
5423
5424 NTOSAPI
5425 NTSTATUS
5426 DDKAPI
5427 RtlCheckRegistryKey(
5428 IN ULONG RelativeTo,
5429 IN PWSTR Path);
5430
5431 NTOSAPI
5432 VOID
5433 DDKAPI
5434 RtlClearAllBits(
5435 IN PRTL_BITMAP BitMapHeader);
5436
5437 NTOSAPI
5438 VOID
5439 DDKAPI
5440 RtlClearBit(
5441 PRTL_BITMAP BitMapHeader,
5442 ULONG BitNumber);
5443
5444 NTOSAPI
5445 VOID
5446 DDKAPI
5447 RtlClearBits(
5448 IN PRTL_BITMAP BitMapHeader,
5449 IN ULONG StartingIndex,
5450 IN ULONG NumberToClear);
5451
5452 NTOSAPI
5453 SIZE_T
5454 DDKAPI
5455 RtlCompareMemory(
5456 IN CONST VOID *Source1,
5457 IN CONST VOID *Source2,
5458 IN SIZE_T Length);
5459
5460 NTOSAPI
5461 LONG
5462 DDKAPI
5463 RtlCompareString(
5464 IN PSTRING String1,
5465 IN PSTRING String2,
5466 BOOLEAN CaseInSensitive);
5467
5468 NTOSAPI
5469 LONG
5470 DDKAPI
5471 RtlCompareUnicodeString(
5472 IN PCUNICODE_STRING String1,
5473 IN PCUNICODE_STRING String2,
5474 IN BOOLEAN CaseInSensitive);
5475
5476 static __inline
5477 LARGE_INTEGER
5478 NTAPI_INLINE
5479 RtlConvertLongToLargeInteger(LONG SignedInteger)
5480 {
5481 LARGE_INTEGER Result;
5482
5483 Result.QuadPart = SignedInteger;
5484 return Result;
5485 }
5486
5487 NTOSAPI
5488 LUID
5489 DDKAPI
5490 RtlConvertLongToLuid(
5491 IN LONG Long);
5492
5493 NTOSAPI
5494 LARGE_INTEGER
5495 DDKAPI
5496 RtlConvertUlongToLargeInteger(
5497 IN ULONG UnsignedInteger);
5498
5499 NTOSAPI
5500 LUID
5501 DDKAPI
5502 RtlConvertUlongToLuid(
5503 ULONG Ulong);
5504
5505 /*
5506 * VOID
5507 * RtlCopyMemory(
5508 * IN VOID UNALIGNED *Destination,
5509 * IN CONST VOID UNALIGNED *Source,
5510 * IN SIZE_T Length)
5511 */
5512 #ifndef RtlCopyMemory
5513 #define RtlCopyMemory(Destination, Source, Length) \
5514 memcpy(Destination, Source, Length)
5515 #endif
5516
5517 #ifndef RtlCopyBytes
5518 #define RtlCopyBytes RtlCopyMemory
5519 #endif
5520
5521 NTOSAPI
5522 VOID
5523 DDKAPI
5524 RtlCopyMemory32(
5525 IN VOID UNALIGNED *Destination,
5526 IN CONST VOID UNALIGNED *Source,
5527 IN ULONG Length);
5528
5529 NTOSAPI
5530 VOID
5531 DDKAPI
5532 RtlCopyString(
5533 IN OUT PSTRING DestinationString,
5534 IN PSTRING SourceString OPTIONAL);
5535
5536 NTOSAPI
5537 VOID
5538 DDKAPI
5539 RtlCopyUnicodeString(
5540 IN OUT PUNICODE_STRING DestinationString,
5541 IN PCUNICODE_STRING SourceString);
5542
5543 NTOSAPI
5544 NTSTATUS
5545 DDKAPI
5546 RtlCreateRegistryKey(
5547 IN ULONG RelativeTo,
5548 IN PWSTR Path);
5549
5550 NTOSAPI
5551 NTSTATUS
5552 DDKAPI
5553 RtlCreateSecurityDescriptor(
5554 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5555 IN ULONG Revision);
5556
5557 NTOSAPI
5558 NTSTATUS
5559 DDKAPI
5560 RtlDeleteRegistryValue(
5561 IN ULONG RelativeTo,
5562 IN PCWSTR Path,
5563 IN PCWSTR ValueName);
5564
5565 /*
5566 * BOOLEAN
5567 * RtlEqualLuid(
5568 * IN PLUID Luid1,
5569 * IN PLUID Luid2)
5570 */
5571 #define RtlEqualLuid(Luid1, \
5572 Luid2) \
5573 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
5574
5575 /*
5576 * ULONG
5577 * RtlEqualMemory(
5578 * IN VOID UNALIGNED *Destination,
5579 * IN CONST VOID UNALIGNED *Source,
5580 * IN SIZE_T Length)
5581 */
5582 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
5583
5584 NTOSAPI
5585 BOOLEAN
5586 DDKAPI
5587 RtlEqualString(
5588 IN PSTRING String1,
5589 IN PSTRING String2,
5590 IN BOOLEAN CaseInSensitive);
5591
5592 NTOSAPI
5593 BOOLEAN
5594 DDKAPI
5595 RtlEqualUnicodeString(
5596 IN CONST UNICODE_STRING *String1,
5597 IN CONST UNICODE_STRING *String2,
5598 IN BOOLEAN CaseInSensitive);
5599
5600 /*
5601 * VOID
5602 * RtlFillMemory(
5603 * IN VOID UNALIGNED *Destination,
5604 * IN SIZE_T Length,
5605 * IN UCHAR Fill)
5606 */
5607 #ifndef RtlFillMemory
5608 #define RtlFillMemory(Destination, Length, Fill) \
5609 memset(Destination, Fill, Length)
5610 #endif
5611
5612 #ifndef RtlFillBytes
5613 #define RtlFillBytes RtlFillMemory
5614 #endif
5615
5616 NTOSAPI
5617 ULONG
5618 DDKAPI
5619 RtlFindClearBits(
5620 IN PRTL_BITMAP BitMapHeader,
5621 IN ULONG NumberToFind,
5622 IN ULONG HintIndex);
5623
5624 NTOSAPI
5625 ULONG
5626 DDKAPI
5627 RtlFindClearBitsAndSet(
5628 IN PRTL_BITMAP BitMapHeader,
5629 IN ULONG NumberToFind,
5630 IN ULONG HintIndex);
5631
5632 NTOSAPI
5633 ULONG
5634 DDKAPI
5635 RtlFindClearRuns(
5636 IN PRTL_BITMAP BitMapHeader,
5637 OUT PRTL_BITMAP_RUN RunArray,
5638 IN ULONG SizeOfRunArray,
5639 IN BOOLEAN LocateLongestRuns);
5640
5641 NTOSAPI
5642 ULONG
5643 DDKAPI
5644 RtlFindFirstRunClear(
5645 IN PRTL_BITMAP BitMapHeader,
5646 OUT PULONG StartingIndex);
5647
5648 NTOSAPI
5649 ULONG
5650 DDKAPI
5651 RtlFindLastBackwardRunClear(
5652 IN PRTL_BITMAP BitMapHeader,
5653 IN ULONG FromIndex,
5654 OUT PULONG StartingRunIndex);
5655
5656 NTOSAPI
5657 CCHAR
5658 DDKAPI
5659 RtlFindLeastSignificantBit(
5660 IN ULONGLONG Set);
5661
5662 NTOSAPI
5663 ULONG
5664 DDKAPI
5665 RtlFindLongestRunClear(
5666 IN PRTL_BITMAP BitMapHeader,
5667 OUT PULONG StartingIndex);
5668
5669 NTOSAPI
5670 CCHAR
5671 DDKAPI
5672 RtlFindMostSignificantBit(
5673 IN ULONGLONG Set);
5674
5675 NTOSAPI
5676 ULONG
5677 DDKAPI
5678 RtlFindNextForwardRunClear(
5679 IN PRTL_BITMAP BitMapHeader,
5680 IN ULONG FromIndex,
5681 OUT PULONG StartingRunIndex);
5682
5683 NTOSAPI
5684 ULONG
5685 DDKAPI
5686 RtlFindSetBits(
5687 IN PRTL_BITMAP BitMapHeader,
5688 IN ULONG NumberToFind,
5689 IN ULONG HintIndex);
5690
5691 NTOSAPI
5692 ULONG
5693 DDKAPI
5694 RtlFindSetBitsAndClear(
5695 IN PRTL_BITMAP BitMapHeader,
5696 IN ULONG NumberToFind,
5697 IN ULONG HintIndex);
5698
5699 NTOSAPI
5700 VOID
5701 DDKAPI
5702 RtlFreeAnsiString(
5703 IN PANSI_STRING AnsiString);
5704
5705 NTOSAPI
5706 VOID
5707 DDKAPI
5708 RtlFreeUnicodeString(
5709 IN PUNICODE_STRING UnicodeString);
5710
5711 NTOSAPI
5712 VOID
5713 DDKAPI
5714 RtlGetCallersAddress(
5715 OUT PVOID *CallersAddress,
5716 OUT PVOID *CallersCaller);
5717
5718 NTOSAPI
5719 NTSTATUS
5720 DDKAPI
5721 RtlGetVersion(
5722 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
5723
5724 NTOSAPI
5725 NTSTATUS
5726 DDKAPI
5727 RtlGUIDFromString(
5728 IN PUNICODE_STRING GuidString,
5729 OUT GUID *Guid);
5730
5731 NTOSAPI
5732 NTSTATUS
5733 DDKAPI
5734 RtlHashUnicodeString(
5735 IN CONST UNICODE_STRING *String,
5736 IN BOOLEAN CaseInSensitive,
5737 IN ULONG HashAlgorithm,
5738 OUT PULONG HashValue);
5739
5740 NTOSAPI
5741 VOID
5742 DDKAPI
5743 RtlInitAnsiString(
5744 IN OUT PANSI_STRING DestinationString,
5745 IN PCSZ SourceString);
5746
5747 NTOSAPI
5748 VOID
5749 DDKAPI
5750 RtlInitializeBitMap(
5751 IN PRTL_BITMAP BitMapHeader,
5752 IN PULONG BitMapBuffer,
5753 IN ULONG SizeOfBitMap);
5754
5755 NTOSAPI
5756 VOID
5757 DDKAPI
5758 RtlInitString(
5759 IN OUT PSTRING DestinationString,
5760 IN PCSZ SourceString);
5761
5762 NTOSAPI
5763 VOID
5764 DDKAPI
5765 RtlInitUnicodeString(
5766 IN OUT PUNICODE_STRING DestinationString,
5767 IN PCWSTR SourceString);
5768
5769 NTOSAPI
5770 NTSTATUS
5771 DDKAPI
5772 RtlInt64ToUnicodeString(
5773 IN ULONGLONG Value,
5774 IN ULONG Base OPTIONAL,
5775 IN OUT PUNICODE_STRING String);
5776
5777 NTOSAPI
5778 NTSTATUS
5779 DDKAPI
5780 RtlIntegerToUnicodeString(
5781 IN ULONG Value,
5782 IN ULONG Base OPTIONAL,
5783 IN OUT PUNICODE_STRING String);
5784
5785 NTOSAPI
5786 NTSTATUS
5787 DDKAPI
5788 RtlIntPtrToUnicodeString(
5789 PLONG Value,
5790 ULONG Base OPTIONAL,
5791 PUNICODE_STRING String);
5792
5793 /*
5794 * BOOLEAN
5795 * RtlIsZeroLuid(
5796 * IN PLUID L1)
5797 */
5798 #define RtlIsZeroLuid(_L1) \
5799 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
5800
5801 NTOSAPI
5802 ULONG
5803 DDKAPI
5804 RtlLengthSecurityDescriptor(
5805 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5806
5807 NTOSAPI
5808 VOID
5809 DDKAPI
5810 RtlMapGenericMask(
5811 IN OUT PACCESS_MASK AccessMask,
5812 IN PGENERIC_MAPPING GenericMapping);
5813
5814 /*
5815 * VOID
5816 * RtlMoveMemory(
5817 * IN VOID UNALIGNED *Destination,
5818 * IN CONST VOID UNALIGNED *Source,
5819 * IN SIZE_T Length)
5820 */
5821 #define RtlMoveMemory memmove
5822
5823 NTOSAPI
5824 ULONG
5825 DDKAPI
5826 RtlNumberOfClearBits(
5827 IN PRTL_BITMAP BitMapHeader);
5828
5829 NTOSAPI
5830 ULONG
5831 DDKAPI
5832 RtlNumberOfSetBits(
5833 IN PRTL_BITMAP BitMapHeader);
5834
5835 NTOSAPI
5836 VOID
5837 DDKFASTAPI
5838 RtlPrefetchMemoryNonTemporal(
5839 IN PVOID Source,
5840 IN SIZE_T Length);
5841
5842 NTOSAPI
5843 BOOLEAN
5844 DDKAPI
5845 RtlPrefixUnicodeString(
5846 IN PCUNICODE_STRING String1,
5847 IN PCUNICODE_STRING String2,
5848 IN BOOLEAN CaseInSensitive);
5849
5850 NTOSAPI
5851 NTSTATUS
5852 DDKAPI
5853 RtlQueryRegistryValues(
5854 IN ULONG RelativeTo,
5855 IN PCWSTR Path,
5856 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
5857 IN PVOID Context,
5858 IN PVOID Environment OPTIONAL);
5859
5860
5861 #define LONG_SIZE (sizeof(LONG))
5862 #define LONG_MASK (LONG_SIZE - 1)
5863
5864 /*
5865 * VOID
5866 * RtlRetrieveUlong (
5867 * PULONG DestinationAddress,
5868 * PULONG SourceAddress
5869 * );
5870 */
5871 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
5872 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
5873 { \
5874 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
5875 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
5876 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
5877 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
5878 } \
5879 else \
5880 { \
5881 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
5882 }
5883
5884 NTOSAPI
5885 VOID
5886 DDKAPI
5887 RtlRetrieveUshort(
5888 IN OUT PUSHORT DestinationAddress,
5889 IN PUSHORT SourceAddress);
5890
5891 NTOSAPI
5892 VOID
5893 DDKAPI
5894 RtlSetAllBits(
5895 IN PRTL_BITMAP BitMapHeader);
5896
5897 NTOSAPI
5898 VOID
5899 DDKAPI
5900 RtlSetBit(
5901 PRTL_BITMAP BitMapHeader,
5902 ULONG BitNumber);
5903
5904 NTOSAPI
5905 VOID
5906 DDKAPI
5907 RtlSetBits(
5908 IN PRTL_BITMAP BitMapHeader,
5909 IN ULONG StartingIndex,
5910 IN ULONG NumberToSet);
5911
5912 NTOSAPI
5913 NTSTATUS
5914 DDKAPI
5915 RtlSetDaclSecurityDescriptor(
5916 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5917 IN BOOLEAN DaclPresent,
5918 IN PACL Dacl OPTIONAL,
5919 IN BOOLEAN DaclDefaulted OPTIONAL);
5920
5921 NTOSAPI
5922 VOID
5923 DDKAPI
5924 RtlStoreUlong(
5925 IN PULONG Address,
5926 IN ULONG Value);
5927
5928 NTOSAPI
5929 VOID
5930 DDKAPI
5931 RtlStoreUlonglong(
5932 IN OUT PULONGLONG Address,
5933 ULONGLONG Value);
5934
5935 NTOSAPI
5936 VOID
5937 DDKAPI
5938 RtlStoreUlongPtr(
5939 IN OUT PULONG_PTR Address,
5940 IN ULONG_PTR Value);
5941
5942 NTOSAPI
5943 VOID
5944 DDKAPI
5945 RtlStoreUshort(
5946 IN PUSHORT Address,
5947 IN USHORT Value);
5948
5949 NTOSAPI
5950 NTSTATUS
5951 DDKAPI
5952 RtlStringFromGUID(
5953 IN REFGUID Guid,
5954 OUT PUNICODE_STRING GuidString);
5955
5956 NTOSAPI
5957 BOOLEAN
5958 DDKAPI
5959 RtlTestBit(
5960 IN PRTL_BITMAP BitMapHeader,
5961 IN ULONG BitNumber);
5962
5963 NTOSAPI
5964 BOOLEAN
5965 DDKAPI
5966 RtlTimeFieldsToTime(
5967 IN PTIME_FIELDS TimeFields,
5968 IN PLARGE_INTEGER Time);
5969
5970 NTOSAPI
5971 VOID
5972 DDKAPI
5973 RtlTimeToTimeFields(
5974 IN PLARGE_INTEGER Time,
5975 IN PTIME_FIELDS TimeFields);
5976
5977 ULONG
5978 FASTCALL
5979 RtlUlongByteSwap(
5980 IN ULONG Source);
5981
5982 ULONGLONG
5983 FASTCALL
5984 RtlUlonglongByteSwap(
5985 IN ULONGLONG Source);
5986
5987 #define RtlUnicodeStringToAnsiSize(STRING) ( \
5988 NLS_MB_CODE_PAGE_TAG ? \
5989 RtlxUnicodeStringToAnsiSize(STRING) : \
5990 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
5991 )
5992
5993 NTOSAPI
5994 NTSTATUS
5995 DDKAPI
5996 RtlUnicodeStringToAnsiString(
5997 IN OUT PANSI_STRING DestinationString,
5998 IN PCUNICODE_STRING SourceString,
5999 IN BOOLEAN AllocateDestinationString);
6000
6001 NTOSAPI
6002 NTSTATUS
6003 DDKAPI
6004 RtlUnicodeStringToInteger(
6005 IN PCUNICODE_STRING String,
6006 IN ULONG Base OPTIONAL,
6007 OUT PULONG Value);
6008
6009 NTOSAPI
6010 WCHAR
6011 DDKAPI
6012 RtlUpcaseUnicodeChar(
6013 IN WCHAR SourceCharacter);
6014
6015 NTOSAPI
6016 NTSTATUS
6017 DDKAPI
6018 RtlUpcaseUnicodeString(
6019 IN OUT PUNICODE_STRING DestinationString OPTIONAL,
6020 IN PCUNICODE_STRING SourceString,
6021 IN BOOLEAN AllocateDestinationString);
6022
6023 NTOSAPI
6024 CHAR
6025 DDKAPI
6026 RtlUpperChar(
6027 IN CHAR Character);
6028
6029 NTOSAPI
6030 VOID
6031 DDKAPI
6032 RtlUpperString(
6033 IN OUT PSTRING DestinationString,
6034 IN PSTRING SourceString);
6035
6036 USHORT
6037 FASTCALL
6038 RtlUshortByteSwap(
6039 IN USHORT Source);
6040
6041 NTOSAPI
6042 BOOLEAN
6043 DDKAPI
6044 RtlValidRelativeSecurityDescriptor(
6045 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
6046 IN ULONG SecurityDescriptorLength,
6047 IN SECURITY_INFORMATION RequiredInformation);
6048
6049 NTOSAPI
6050 BOOLEAN
6051 DDKAPI
6052 RtlValidSecurityDescriptor(
6053 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6054
6055 NTOSAPI
6056 NTSTATUS
6057 DDKAPI
6058 RtlVerifyVersionInfo(
6059 IN PRTL_OSVERSIONINFOEXW VersionInfo,
6060 IN ULONG TypeMask,
6061 IN ULONGLONG ConditionMask);
6062
6063 NTOSAPI
6064 NTSTATUS
6065 DDKAPI
6066 RtlVolumeDeviceToDosName(
6067 IN PVOID VolumeDeviceObject,
6068 OUT PUNICODE_STRING DosName);
6069
6070 NTOSAPI
6071 ULONG
6072 DDKAPI
6073 RtlWalkFrameChain(
6074 OUT PVOID *Callers,
6075 IN ULONG Count,
6076 IN ULONG Flags);
6077
6078 NTOSAPI
6079 NTSTATUS
6080 DDKAPI
6081 RtlWriteRegistryValue(
6082 IN ULONG RelativeTo,
6083 IN PCWSTR Path,
6084 IN PCWSTR ValueName,
6085 IN ULONG ValueType,
6086 IN PVOID ValueData,
6087 IN ULONG ValueLength);
6088
6089 NTOSAPI
6090 ULONG
6091 DDKAPI
6092 RtlxUnicodeStringToAnsiSize(
6093 IN PCUNICODE_STRING UnicodeString);
6094
6095 /*
6096 * VOID
6097 * RtlZeroMemory(
6098 * IN VOID UNALIGNED *Destination,
6099 * IN SIZE_T Length)
6100 */
6101 #ifndef RtlZeroMemory
6102 #define RtlZeroMemory(Destination, Length) \
6103 memset(Destination, 0, Length)
6104 #endif
6105
6106 #ifndef RtlZeroBytes
6107 #define RtlZeroBytes RtlZeroMemory
6108 #endif
6109
6110
6111 /* Guarded Mutex routines */
6112
6113 VOID
6114 FASTCALL
6115 KeAcquireGuardedMutex(
6116 PKGUARDED_MUTEX GuardedMutex
6117 );
6118
6119 VOID
6120 FASTCALL
6121 KeAcquireGuardedMutexUnsafe(
6122 PKGUARDED_MUTEX GuardedMutex
6123 );
6124
6125 VOID
6126 STDCALL
6127 KeEnterGuardedRegion(VOID);
6128
6129 VOID
6130 STDCALL
6131 KeLeaveGuardedRegion(VOID);
6132
6133 VOID
6134 FASTCALL
6135 KeInitializeGuardedMutex(
6136 PKGUARDED_MUTEX GuardedMutex
6137 );
6138
6139 VOID
6140 FASTCALL
6141 KeReleaseGuardedMutexUnsafe(
6142 PKGUARDED_MUTEX GuardedMutex
6143 );
6144
6145 VOID
6146 FASTCALL
6147 KeReleaseGuardedMutex(
6148 PKGUARDED_MUTEX GuardedMutex
6149 );
6150
6151 BOOL
6152 FASTCALL
6153 KeTryToAcquireGuardedMutex(
6154 PKGUARDED_MUTEX GuardedMutex
6155 );
6156
6157 /* Fast Mutex */
6158 #define ExInitializeFastMutex(_FastMutex) \
6159 { \
6160 (_FastMutex)->Count = FM_LOCK_BIT; \
6161 (_FastMutex)->Owner = NULL; \
6162 (_FastMutex)->Contention = 0; \
6163 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
6164 }
6165
6166 NTOSAPI
6167 VOID
6168 FASTCALL
6169 ExAcquireFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
6170
6171 NTOSAPI
6172 VOID
6173 FASTCALL
6174 ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex);
6175
6176 #if defined(_NTHAL_) && defined(_X86_)
6177 NTOSAPI
6178 VOID
6179 FASTCALL
6180 ExiAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6181
6182 NTOSAPI
6183 VOID
6184 FASTCALL
6185 ExiReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
6186
6187 NTOSAPI
6188 BOOLEAN
6189 FASTCALL
6190 ExiTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6191
6192 #define ExAcquireFastMutex(FastMutex) ExiAcquireFastMutex(FastMutex)
6193 #define ExReleaseFastMutex(FastMutex) ExiReleaseFastMutex(FastMutex)
6194 #define ExTryToAcquireFastMutex(FastMutex) ExiTryToAcquireFastMutex(FastMutex)
6195
6196 #else
6197
6198 NTOSAPI
6199 VOID
6200 FASTCALL
6201 ExAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6202
6203 NTOSAPI
6204 VOID
6205 FASTCALL
6206 ExReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex);
6207
6208 NTOSAPI
6209 BOOLEAN
6210 FASTCALL
6211 ExTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex);
6212 #endif
6213
6214 /** Executive support routines **/
6215
6216 NTOSAPI
6217 BOOLEAN
6218 DDKAPI
6219 ExAcquireResourceExclusiveLite(
6220 IN PERESOURCE Resource,
6221 IN BOOLEAN Wait);
6222
6223 NTOSAPI
6224 BOOLEAN
6225 DDKAPI
6226 ExAcquireResourceSharedLite(
6227 IN PERESOURCE Resource,
6228 IN BOOLEAN Wait);
6229
6230 NTOSAPI
6231 BOOLEAN
6232 DDKAPI
6233 ExAcquireSharedStarveExclusive(
6234 IN PERESOURCE Resource,
6235 IN BOOLEAN Wait);
6236
6237 NTOSAPI
6238 BOOLEAN
6239 DDKAPI
6240 ExAcquireSharedWaitForExclusive(
6241 IN PERESOURCE Resource,
6242 IN BOOLEAN Wait);
6243
6244 static __inline PVOID
6245 ExAllocateFromNPagedLookasideList(
6246 IN PNPAGED_LOOKASIDE_LIST Lookaside)
6247 {
6248 PVOID Entry;
6249
6250 Lookaside->L.TotalAllocates++;
6251 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6252 if (Entry == NULL) {
6253 Lookaside->L.AllocateMisses++;
6254 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, Lookaside->L.Tag);
6255 }
6256 return Entry;
6257 }
6258
6259 static __inline PVOID
6260 ExAllocateFromPagedLookasideList(
6261 IN PPAGED_LOOKASIDE_LIST Lookaside)
6262 {
6263 PVOID Entry;
6264
6265 Lookaside->L.TotalAllocates++;
6266 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6267 if (Entry == NULL) {
6268 Lookaside->L.AllocateMisses++;
6269 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, Lookaside->L.Tag);
6270 }
6271 return Entry;
6272 }
6273
6274 NTOSAPI
6275 PVOID
6276 DDKAPI
6277 ExAllocatePoolWithQuotaTag(
6278 IN POOL_TYPE PoolType,
6279 IN SIZE_T NumberOfBytes,
6280 IN ULONG Tag);
6281
6282 NTOSAPI
6283 PVOID
6284 DDKAPI
6285 ExAllocatePoolWithTag(
6286 IN POOL_TYPE PoolType,
6287 IN SIZE_T NumberOfBytes,
6288 IN ULONG Tag);
6289
6290 #ifdef POOL_TAGGING
6291
6292 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
6293 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
6294
6295 #else /* !POOL_TAGGING */
6296
6297 NTOSAPI
6298 PVOID
6299 DDKAPI
6300 ExAllocatePool(
6301 IN POOL_TYPE PoolType,
6302 IN SIZE_T NumberOfBytes);
6303
6304 NTOSAPI
6305 PVOID
6306 DDKAPI
6307 ExAllocatePoolWithQuota(
6308 IN POOL_TYPE PoolType,
6309 IN SIZE_T NumberOfBytes);
6310
6311 #endif /* POOL_TAGGING */
6312
6313 NTOSAPI
6314 PVOID
6315 DDKAPI
6316 ExAllocatePoolWithTagPriority(
6317 IN POOL_TYPE PoolType,
6318 IN SIZE_T NumberOfBytes,
6319 IN ULONG Tag,
6320 IN EX_POOL_PRIORITY Priority);
6321
6322 NTOSAPI
6323 VOID
6324 DDKAPI
6325 ExConvertExclusiveToSharedLite(
6326 IN PERESOURCE Resource);
6327
6328 NTOSAPI
6329 NTSTATUS
6330 DDKAPI
6331 ExCreateCallback(
6332 OUT PCALLBACK_OBJECT *CallbackObject,
6333 IN POBJECT_ATTRIBUTES ObjectAttributes,
6334 IN BOOLEAN Create,
6335 IN BOOLEAN AllowMultipleCallbacks);
6336
6337 NTOSAPI
6338 VOID
6339 DDKAPI
6340 ExDeleteNPagedLookasideList(
6341 IN PNPAGED_LOOKASIDE_LIST Lookaside);
6342
6343 NTOSAPI
6344 VOID
6345 DDKAPI
6346 ExDeletePagedLookasideList(
6347 IN PPAGED_LOOKASIDE_LIST Lookaside);
6348
6349 NTOSAPI
6350 NTSTATUS
6351 DDKAPI
6352 ExDeleteResourceLite(
6353 IN PERESOURCE Resource);
6354
6355 NTOSAPI
6356 VOID
6357 DDKAPI
6358 ExFreePool(
6359 IN PVOID P);
6360
6361 #define PROTECTED_POOL 0x80000000
6362
6363 #ifdef POOL_TAGGING
6364 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
6365 #endif
6366
6367 NTOSAPI
6368 VOID
6369 DDKAPI
6370 ExFreePoolWithTag(
6371 IN PVOID P,
6372 IN ULONG Tag);
6373
6374 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
6375
6376 static __inline VOID
6377 ExFreeToNPagedLookasideList(
6378 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6379 IN PVOID Entry)
6380 {
6381 Lookaside->L.TotalFrees++;
6382 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6383 Lookaside->L.FreeMisses++;
6384 (Lookaside->L.Free)(Entry);
6385 } else {
6386 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6387 }
6388 }
6389
6390 static __inline VOID
6391 ExFreeToPagedLookasideList(
6392 IN PPAGED_LOOKASIDE_LIST Lookaside,
6393 IN PVOID Entry)
6394 {
6395 Lookaside->L.TotalFrees++;
6396 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6397 Lookaside->L.FreeMisses++;
6398 (Lookaside->L.Free)(Entry);
6399 } else {
6400 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6401 }
6402 }
6403
6404 /*
6405 * ERESOURCE_THREAD
6406 * ExGetCurrentResourceThread(
6407 * VOID);
6408 */
6409 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
6410
6411 NTOSAPI
6412 ULONG
6413 DDKAPI
6414 ExGetExclusiveWaiterCount(
6415 IN PERESOURCE Resource);
6416
6417 NTOSAPI
6418 KPROCESSOR_MODE
6419 DDKAPI
6420 ExGetPreviousMode(
6421 VOID);
6422
6423 NTOSAPI
6424 ULONG
6425 DDKAPI
6426 ExGetSharedWaiterCount(
6427 IN PERESOURCE Resource);
6428
6429 NTOSAPI
6430 VOID
6431 DDKAPI
6432 KeInitializeEvent(
6433 IN PRKEVENT Event,
6434 IN EVENT_TYPE Type,
6435 IN BOOLEAN State);
6436
6437 NTOSAPI
6438 VOID
6439 DDKAPI
6440 ExInitializeNPagedLookasideList(
6441 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6442 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6443 IN PFREE_FUNCTION Free OPTIONAL,
6444 IN ULONG Flags,
6445 IN SIZE_T Size,
6446 IN ULONG Tag,
6447 IN USHORT Depth);
6448
6449 NTOSAPI
6450 VOID
6451 DDKAPI
6452 ExInitializePagedLookasideList(
6453 IN PPAGED_LOOKASIDE_LIST Lookaside,
6454 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6455 IN PFREE_FUNCTION Free OPTIONAL,
6456 IN ULONG Flags,
6457 IN SIZE_T Size,
6458 IN ULONG Tag,
6459 IN USHORT Depth);
6460
6461 NTOSAPI
6462 NTSTATUS
6463 DDKAPI
6464 ExInitializeResourceLite(
6465 IN PERESOURCE Resource);
6466
6467 /*
6468 * VOID
6469 * InitializeSListHead(
6470 * IN PSLIST_HEADER SListHead)
6471 */
6472 #define InitializeSListHead(_SListHead) \
6473 (_SListHead)->Alignment = 0
6474
6475 #define ExInitializeSListHead InitializeSListHead
6476
6477 NTOSAPI
6478 LARGE_INTEGER
6479 DDKAPI
6480 ExInterlockedAddLargeInteger(
6481 IN PLARGE_INTEGER Addend,
6482 IN LARGE_INTEGER Increment,
6483 IN PKSPIN_LOCK Lock);
6484
6485 NTOSAPI
6486 VOID
6487 DDKFASTAPI
6488 ExInterlockedAddLargeStatistic(
6489 IN PLARGE_INTEGER Addend,
6490 IN ULONG Increment);
6491
6492 NTOSAPI
6493 ULONG
6494 DDKAPI
6495 ExInterlockedAddUlong(
6496 IN PULONG Addend,
6497 IN ULONG Increment,
6498 PKSPIN_LOCK Lock);
6499
6500 NTOSAPI
6501 LONGLONG
6502 DDKFASTAPI
6503 ExInterlockedCompareExchange64(
6504 IN OUT PLONGLONG Destination,
6505 IN PLONGLONG Exchange,
6506 IN PLONGLONG Comparand,
6507 IN PKSPIN_LOCK Lock);
6508
6509 NTOSAPI
6510 LONGLONG
6511 DDKFASTAPI
6512 ExfInterlockedCompareExchange64(
6513 IN OUT LONGLONG volatile *Destination,
6514 IN PLONGLONG Exchange,
6515 IN PLONGLONG Comperand);
6516
6517 NTOSAPI
6518 PSINGLE_LIST_ENTRY
6519 DDKFASTAPI
6520 ExInterlockedFlushSList(
6521 IN PSLIST_HEADER ListHead);
6522
6523 NTOSAPI
6524 PLIST_ENTRY
6525 DDKAPI
6526 ExInterlockedInsertHeadList(
6527 IN PLIST_ENTRY ListHead,
6528 IN PLIST_ENTRY ListEntry,
6529 IN PKSPIN_LOCK Lock);
6530
6531 NTOSAPI
6532 PLIST_ENTRY
6533 DDKAPI
6534 ExInterlockedInsertTailList(
6535 IN PLIST_ENTRY ListHead,
6536 IN PLIST_ENTRY ListEntry,
6537 IN PKSPIN_LOCK Lock);
6538
6539 NTOSAPI
6540 PSINGLE_LIST_ENTRY
6541 DDKAPI
6542 ExInterlockedPopEntryList(
6543 IN PSINGLE_LIST_ENTRY ListHead,
6544 IN PKSPIN_LOCK Lock);
6545
6546 /*
6547 * PSINGLE_LIST_ENTRY
6548 * ExInterlockedPopEntrySList(
6549 * IN PSLIST_HEADER ListHead,
6550 * IN PKSPIN_LOCK Lock)
6551 */
6552 #define ExInterlockedPopEntrySList(_ListHead, \
6553 _Lock) \
6554 InterlockedPopEntrySList(_ListHead)
6555
6556 NTOSAPI
6557 PSINGLE_LIST_ENTRY
6558 DDKAPI
6559 ExInterlockedPushEntryList(
6560 IN PSINGLE_LIST_ENTRY ListHead,
6561 IN PSINGLE_LIST_ENTRY ListEntry,
6562 IN PKSPIN_LOCK Lock);
6563
6564 /*
6565 * PSINGLE_LIST_ENTRY FASTCALL
6566 * ExInterlockedPushEntrySList(
6567 * IN PSLIST_HEADER ListHead,
6568 * IN PSINGLE_LIST_ENTRY ListEntry,
6569 * IN PKSPIN_LOCK Lock)
6570 */
6571 #define ExInterlockedPushEntrySList(_ListHead, \
6572 _ListEntry, \
6573 _Lock) \
6574 InterlockedPushEntrySList(_ListHead, _ListEntry)
6575
6576 NTOSAPI
6577 PLIST_ENTRY
6578 DDKAPI
6579 ExInterlockedRemoveHeadList(
6580 IN PLIST_ENTRY ListHead,
6581 IN PKSPIN_LOCK Lock);
6582
6583 NTOSAPI
6584 BOOLEAN
6585 DDKAPI
6586 ExIsProcessorFeaturePresent(
6587 IN ULONG ProcessorFeature);
6588
6589 NTOSAPI
6590 BOOLEAN
6591 DDKAPI
6592 ExIsResourceAcquiredExclusiveLite(
6593 IN PERESOURCE Resource);
6594
6595 NTOSAPI
6596 USHORT
6597 DDKAPI
6598 ExIsResourceAcquiredLite(
6599 IN PERESOURCE Resource);
6600
6601 NTOSAPI
6602 ULONG
6603 DDKAPI
6604 ExIsResourceAcquiredSharedLite(
6605 IN PERESOURCE Resource);
6606
6607 NTOSAPI
6608 VOID
6609 DDKAPI
6610 ExLocalTimeToSystemTime(
6611 IN PLARGE_INTEGER LocalTime,
6612 OUT PLARGE_INTEGER SystemTime);
6613
6614 NTOSAPI
6615 VOID
6616 DDKAPI
6617 ExNotifyCallback(
6618 IN PCALLBACK_OBJECT CallbackObject,
6619 IN PVOID Argument1,
6620 IN PVOID Argument2);
6621
6622 NTOSAPI
6623 VOID
6624 DDKAPI
6625 ExRaiseAccessViolation(
6626 VOID);
6627
6628 NTOSAPI
6629 VOID
6630 DDKAPI
6631 ExRaiseDatatypeMisalignment(
6632 VOID);
6633
6634 NTOSAPI
6635 VOID
6636 DDKAPI
6637 ExRaiseStatus(
6638 IN NTSTATUS Status);
6639
6640 NTOSAPI
6641 PVOID
6642 DDKAPI
6643 ExRegisterCallback(
6644 IN PCALLBACK_OBJECT CallbackObject,
6645 IN PCALLBACK_FUNCTION CallbackFunction,
6646 IN PVOID CallbackContext);
6647
6648 NTOSAPI
6649 NTSTATUS
6650 DDKAPI
6651 ExReinitializeResourceLite(
6652 IN PERESOURCE Resource);
6653
6654 NTOSAPI
6655 VOID
6656 DDKAPI
6657 ExReleaseResourceForThreadLite(
6658 IN PERESOURCE Resource,
6659 IN ERESOURCE_THREAD ResourceThreadId);
6660
6661 NTOSAPI
6662 VOID
6663 DDKFASTAPI
6664 ExReleaseResourceLite(
6665 IN PERESOURCE Resource);
6666
6667 NTOSAPI
6668 VOID
6669 DDKAPI
6670 ExSetResourceOwnerPointer(
6671 IN PERESOURCE Resource,
6672 IN PVOID OwnerPointer);
6673
6674 NTOSAPI
6675 ULONG
6676 DDKAPI
6677 ExSetTimerResolution(
6678 IN ULONG DesiredTime,
6679 IN BOOLEAN SetResolution);
6680
6681 NTOSAPI
6682 VOID
6683 DDKAPI
6684 ExSystemTimeToLocalTime(
6685 IN PLARGE_INTEGER SystemTime,
6686 OUT PLARGE_INTEGER LocalTime);
6687
6688 NTOSAPI
6689 BOOLEAN
6690 DDKAPI
6691 ExTryToAcquireResourceExclusiveLite(
6692 IN PERESOURCE Resource);
6693
6694 NTOSAPI
6695 VOID
6696 DDKAPI
6697 ExUnregisterCallback(
6698 IN PVOID CbRegistration);
6699
6700 NTOSAPI
6701 NTSTATUS
6702 DDKAPI
6703 ExUuidCreate(
6704 OUT UUID *Uuid);
6705
6706 NTOSAPI
6707 BOOLEAN
6708 DDKAPI
6709 ExVerifySuite(
6710 IN SUITE_TYPE SuiteType);
6711
6712 #ifdef DBG
6713
6714 #define PAGED_CODE() { \
6715 if (KeGetCurrentIrql() > APC_LEVEL) { \
6716 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
6717 ASSERT(FALSE); \
6718 } \
6719 }
6720
6721 #else
6722
6723 #define PAGED_CODE()
6724
6725 #endif
6726
6727 NTOSAPI
6728 VOID
6729 DDKAPI
6730 ProbeForRead(
6731 IN CONST VOID *Address,
6732 IN ULONG Length,
6733 IN ULONG Alignment);
6734
6735 NTOSAPI
6736 VOID
6737 DDKAPI
6738 ProbeForWrite(
6739 IN PVOID Address,
6740 IN ULONG Length,
6741 IN ULONG Alignment);
6742
6743
6744
6745 /** Configuration manager routines **/
6746
6747 NTOSAPI
6748 NTSTATUS
6749 DDKAPI
6750 CmRegisterCallback(
6751 IN PEX_CALLBACK_FUNCTION Function,
6752 IN PVOID Context,
6753 IN OUT PLARGE_INTEGER Cookie);
6754
6755 NTOSAPI
6756 NTSTATUS
6757 DDKAPI
6758 CmUnRegisterCallback(
6759 IN LARGE_INTEGER Cookie);
6760
6761
6762
6763 /** Filesystem runtime library routines **/
6764
6765 NTOSAPI
6766 BOOLEAN
6767 DDKAPI
6768 FsRtlIsTotalDeviceFailure(
6769 IN NTSTATUS Status);
6770
6771
6772
6773 /** Hardware abstraction layer routines **/
6774
6775 NTHALAPI
6776 BOOLEAN
6777 DDKAPI
6778 HalMakeBeep(
6779 IN ULONG Frequency);
6780
6781 NTOSAPI
6782 VOID
6783 DDKFASTAPI
6784 HalExamineMBR(
6785 IN PDEVICE_OBJECT DeviceObject,
6786 IN ULONG SectorSize,
6787 IN ULONG MBRTypeIdentifier,
6788 OUT PVOID *Buffer);
6789
6790 VOID
6791 NTAPI
6792 HalPutDmaAdapter(
6793 PADAPTER_OBJECT AdapterObject
6794 );
6795
6796 NTKERNELAPI
6797 NTSTATUS
6798 NTAPI
6799 IoAllocateAdapterChannel(
6800 IN PADAPTER_OBJECT AdapterObject,
6801 IN PDEVICE_OBJECT DeviceObject,
6802 IN ULONG NumberOfMapRegisters,
6803 IN PDRIVER_CONTROL ExecutionRoutine,
6804 IN PVOID Context
6805 );
6806
6807 NTHALAPI
6808 VOID
6809 DDKAPI
6810 READ_PORT_BUFFER_UCHAR(
6811 IN PUCHAR Port,
6812 IN PUCHAR Buffer,
6813 IN ULONG Count);
6814
6815 NTHALAPI
6816 VOID
6817 DDKAPI
6818 READ_PORT_BUFFER_ULONG(
6819 IN PULONG Port,
6820 IN PULONG Buffer,
6821 IN ULONG Count);
6822
6823 NTHALAPI
6824 VOID
6825 DDKAPI
6826 READ_PORT_BUFFER_USHORT(
6827 IN PUSHORT Port,
6828 IN PUSHORT Buffer,
6829 IN ULONG Count);
6830
6831 NTHALAPI
6832 UCHAR
6833 DDKAPI
6834 READ_PORT_UCHAR(
6835 IN PUCHAR Port);
6836
6837 NTHALAPI
6838 ULONG
6839 DDKAPI
6840 READ_PORT_ULONG(
6841 IN PULONG Port);
6842
6843 NTHALAPI
6844 USHORT
6845 DDKAPI
6846 READ_PORT_USHORT(
6847 IN PUSHORT Port);
6848
6849 NTOSAPI
6850 VOID
6851 DDKAPI
6852 READ_REGISTER_BUFFER_UCHAR(
6853 IN PUCHAR Register,
6854 IN PUCHAR Buffer,
6855 IN ULONG Count);
6856
6857 NTOSAPI
6858 VOID
6859 DDKAPI
6860 READ_REGISTER_BUFFER_ULONG(
6861 IN PULONG Register,
6862 IN PULONG Buffer,
6863 IN ULONG Count);
6864
6865 NTOSAPI
6866 VOID
6867 DDKAPI
6868 READ_REGISTER_BUFFER_USHORT(
6869 IN PUSHORT Register,
6870 IN PUSHORT Buffer,
6871 IN ULONG Count);
6872
6873 NTOSAPI
6874 UCHAR
6875 DDKAPI
6876 READ_REGISTER_UCHAR(
6877 IN PUCHAR Register);
6878
6879 NTOSAPI
6880 ULONG
6881 DDKAPI
6882 READ_REGISTER_ULONG(
6883 IN PULONG Register);
6884
6885 NTOSAPI
6886 USHORT
6887 DDKAPI
6888 READ_REGISTER_USHORT(
6889 IN PUSHORT Register);
6890
6891 NTHALAPI
6892 VOID
6893 DDKAPI
6894 WRITE_PORT_BUFFER_UCHAR(
6895 IN PUCHAR Port,
6896 IN PUCHAR Buffer,
6897 IN ULONG Count);
6898
6899 NTHALAPI
6900 VOID
6901 DDKAPI
6902 WRITE_PORT_BUFFER_ULONG(
6903 IN PULONG Port,
6904 IN PULONG Buffer,
6905 IN ULONG Count);
6906
6907 NTHALAPI
6908 VOID
6909 DDKAPI
6910 WRITE_PORT_BUFFER_USHORT(
6911 IN PUSHORT Port,
6912 IN PUSHORT Buffer,
6913 IN ULONG Count);
6914
6915 NTHALAPI
6916 VOID
6917 DDKAPI
6918 WRITE_PORT_UCHAR(
6919 IN PUCHAR Port,
6920 IN UCHAR Value);
6921
6922 NTHALAPI
6923 VOID
6924 DDKAPI
6925 WRITE_PORT_ULONG(
6926 IN PULONG Port,
6927 IN ULONG Value);
6928
6929 NTHALAPI
6930 VOID
6931 DDKAPI
6932 WRITE_PORT_USHORT(
6933 IN PUSHORT Port,
6934 IN USHORT Value);
6935
6936 NTOSAPI
6937 VOID
6938 DDKAPI
6939 WRITE_REGISTER_BUFFER_UCHAR(
6940 IN PUCHAR Register,
6941 IN PUCHAR Buffer,
6942 IN ULONG Count);
6943
6944 NTOSAPI
6945 VOID
6946 DDKAPI
6947 WRITE_REGISTER_BUFFER_ULONG(
6948 IN PULONG Register,
6949 IN PULONG Buffer,
6950 IN ULONG Count);
6951
6952 NTOSAPI
6953 VOID
6954 DDKAPI
6955 WRITE_REGISTER_BUFFER_USHORT(
6956 IN PUSHORT Register,
6957 IN PUSHORT Buffer,
6958 IN ULONG Count);
6959
6960 NTOSAPI
6961 VOID
6962 DDKAPI
6963 WRITE_REGISTER_UCHAR(
6964 IN PUCHAR Register,
6965 IN UCHAR Value);
6966
6967 NTOSAPI
6968 VOID
6969 DDKAPI
6970 WRITE_REGISTER_ULONG(
6971 IN PULONG Register,
6972 IN ULONG Value);
6973
6974 NTOSAPI
6975 VOID
6976 DDKAPI
6977 WRITE_REGISTER_USHORT(
6978 IN PUSHORT Register,
6979 IN USHORT Value);
6980
6981 /** I/O manager routines **/
6982
6983 NTOSAPI
6984 VOID
6985 DDKAPI
6986 IoAcquireCancelSpinLock(
6987 OUT PKIRQL Irql);
6988
6989 NTOSAPI
6990 NTSTATUS
6991 DDKAPI
6992 IoAcquireRemoveLockEx(
6993 IN PIO_REMOVE_LOCK RemoveLock,
6994 IN OPTIONAL PVOID Tag OPTIONAL,
6995 IN PCSTR File,
6996 IN ULONG Line,
6997 IN ULONG RemlockSize);
6998
6999 /*
7000 * NTSTATUS
7001 * IoAcquireRemoveLock(
7002 * IN PIO_REMOVE_LOCK RemoveLock,
7003 * IN OPTIONAL PVOID Tag)
7004 */
7005 #define IoAcquireRemoveLock(_RemoveLock, \
7006 _Tag) \
7007 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
7008
7009 /*
7010 * VOID
7011 * IoAdjustPagingPathCount(
7012 * IN PLONG Count,
7013 * IN BOOLEAN Increment)
7014 */
7015 #define IoAdjustPagingPathCount(_Count, \
7016 _Increment) \
7017 { \
7018 if (_Increment) \
7019 { \
7020 InterlockedIncrement(_Count); \
7021 } \
7022 else \
7023 { \
7024 InterlockedDecrement(_Count); \
7025 } \
7026 }
7027
7028 NTOSAPI
7029 VOID
7030 DDKAPI
7031 IoAllocateController(
7032 IN PCONTROLLER_OBJECT ControllerObject,
7033 IN PDEVICE_OBJECT DeviceObject,
7034 IN PDRIVER_CONTROL ExecutionRoutine,
7035 IN PVOID Context);
7036
7037 NTOSAPI
7038 NTSTATUS
7039 DDKAPI
7040 IoAllocateDriverObjectExtension(
7041 IN PDRIVER_OBJECT DriverObject,
7042 IN PVOID ClientIdentificationAddress,
7043 IN ULONG DriverObjectExtensionSize,
7044 OUT PVOID *DriverObjectExtension);
7045
7046 NTOSAPI
7047 PVOID
7048 DDKAPI
7049 IoAllocateErrorLogEntry(
7050 IN PVOID IoObject,
7051 IN UCHAR EntrySize);
7052
7053 NTOSAPI
7054 PIRP
7055 DDKAPI
7056 IoAllocateIrp(
7057 IN CCHAR StackSize,
7058 IN BOOLEAN ChargeQuota);
7059
7060 NTOSAPI
7061 PMDL
7062 DDKAPI
7063 IoAllocateMdl(
7064 IN PVOID VirtualAddress,
7065 IN ULONG Length,
7066 IN BOOLEAN SecondaryBuffer,
7067 IN BOOLEAN ChargeQuota,
7068 IN OUT PIRP Irp OPTIONAL);
7069
7070 NTOSAPI
7071 PIO_WORKITEM
7072 DDKAPI
7073 IoAllocateWorkItem(
7074 IN PDEVICE_OBJECT DeviceObject);
7075
7076 /*
7077 * VOID IoAssignArcName(
7078 * IN PUNICODE_STRING ArcName,
7079 * IN PUNICODE_STRING DeviceName);
7080 */
7081 #define IoAssignArcName(_ArcName, _DeviceName) ( \
7082 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
7083
7084 NTOSAPI
7085 NTSTATUS
7086 DDKAPI
7087 IoAttachDevice(
7088 IN PDEVICE_OBJECT SourceDevice,
7089 IN PUNICODE_STRING TargetDevice,
7090 OUT PDEVICE_OBJECT *AttachedDevice);
7091
7092 NTOSAPI
7093 PDEVICE_OBJECT
7094 DDKAPI
7095 IoAttachDeviceToDeviceStack(
7096 IN PDEVICE_OBJECT SourceDevice,
7097 IN PDEVICE_OBJECT TargetDevice);
7098
7099 NTOSAPI
7100 PIRP
7101 DDKAPI
7102 IoBuildAsynchronousFsdRequest(
7103 IN ULONG MajorFunction,
7104 IN PDEVICE_OBJECT DeviceObject,
7105 IN OUT PVOID Buffer OPTIONAL,
7106 IN ULONG Length OPTIONAL,
7107 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7108 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
7109
7110 NTOSAPI
7111 PIRP
7112 DDKAPI
7113 IoBuildDeviceIoControlRequest(
7114 IN ULONG IoControlCode,
7115 IN PDEVICE_OBJECT DeviceObject,
7116 IN PVOID InputBuffer OPTIONAL,
7117 IN ULONG InputBufferLength,
7118 OUT PVOID OutputBuffer OPTIONAL,
7119 IN ULONG OutputBufferLength,
7120 IN BOOLEAN InternalDeviceIoControl,
7121 IN PKEVENT Event,
7122 OUT PIO_STATUS_BLOCK IoStatusBlock);
7123
7124 NTOSAPI
7125 VOID
7126 DDKAPI
7127 IoBuildPartialMdl(
7128 IN PMDL SourceMdl,
7129 IN OUT PMDL TargetMdl,
7130 IN PVOID VirtualAddress,
7131 IN ULONG Length);
7132
7133 NTOSAPI
7134 PIRP
7135 DDKAPI
7136 IoBuildSynchronousFsdRequest(
7137 IN ULONG MajorFunction,
7138 IN PDEVICE_OBJECT DeviceObject,
7139 IN OUT PVOID Buffer OPTIONAL,
7140 IN ULONG Length OPTIONAL,
7141 IN PLARGE_INTEGER StartingOffset OPTIONAL,
7142 IN PKEVENT Event,
7143 OUT PIO_STATUS_BLOCK IoStatusBlock);
7144
7145 NTOSAPI
7146 NTSTATUS
7147 DDKFASTAPI
7148 IofCallDriver(
7149 IN PDEVICE_OBJECT DeviceObject,
7150 IN OUT PIRP Irp);
7151
7152 /*
7153 * NTSTATUS
7154 * IoCallDriver(
7155 * IN PDEVICE_OBJECT DeviceObject,
7156 * IN OUT PIRP Irp)
7157 */
7158 #define IoCallDriver IofCallDriver
7159
7160 NTOSAPI
7161 VOID
7162 DDKAPI
7163 IoCancelFileOpen(
7164 IN PDEVICE_OBJECT DeviceObject,
7165 IN PFILE_OBJECT FileObject);
7166
7167 NTOSAPI
7168 BOOLEAN
7169 DDKAPI
7170 IoCancelIrp(
7171 IN PIRP Irp);
7172
7173 NTOSAPI
7174 NTSTATUS
7175 DDKAPI
7176 IoCheckShareAccess(
7177 IN ACCESS_MASK DesiredAccess,
7178 IN ULONG DesiredShareAccess,
7179 IN OUT PFILE_OBJECT FileObject,
7180 IN OUT PSHARE_ACCESS ShareAccess,
7181 IN BOOLEAN Update);
7182
7183 NTOSAPI
7184 VOID
7185 DDKFASTAPI
7186 IofCompleteRequest(
7187 IN PIRP Irp,
7188 IN CCHAR PriorityBoost);
7189
7190 /*
7191 * VOID
7192 * IoCompleteRequest(
7193 * IN PIRP Irp,
7194 * IN CCHAR PriorityBoost)
7195 */
7196 #define IoCompleteRequest IofCompleteRequest
7197
7198 NTOSAPI
7199 NTSTATUS
7200 DDKAPI
7201 IoConnectInterrupt(
7202 OUT PKINTERRUPT *InterruptObject,
7203 IN PKSERVICE_ROUTINE ServiceRoutine,
7204 IN PVOID ServiceContext,
7205 IN PKSPIN_LOCK SpinLock OPTIONAL,
7206 IN ULONG Vector,
7207 IN KIRQL Irql,
7208 IN KIRQL SynchronizeIrql,
7209 IN KINTERRUPT_MODE InterruptMode,
7210 IN BOOLEAN ShareVector,
7211 IN KAFFINITY ProcessorEnableMask,
7212 IN BOOLEAN FloatingSave);
7213
7214 /*
7215 * PIO_STACK_LOCATION
7216 * IoGetCurrentIrpStackLocation(
7217 * IN PIRP Irp)
7218 */
7219 #define IoGetCurrentIrpStackLocation(_Irp) \
7220 ((_Irp)->Tail.Overlay.CurrentStackLocation)
7221
7222 /*
7223 * PIO_STACK_LOCATION
7224 * IoGetNextIrpStackLocation(
7225 * IN PIRP Irp)
7226 */
7227 #define IoGetNextIrpStackLocation(_Irp) \
7228 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
7229
7230 /*
7231 * VOID
7232 * IoCopyCurrentIrpStackLocationToNext(
7233 * IN PIRP Irp)
7234 */
7235 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
7236 { \
7237 PIO_STACK_LOCATION _IrpSp; \
7238 PIO_STACK_LOCATION _NextIrpSp; \
7239 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
7240 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
7241 RtlCopyMemory(_NextIrpSp, _IrpSp, \
7242 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
7243 _NextIrpSp->Control = 0; \
7244 }
7245
7246 NTOSAPI
7247 PCONTROLLER_OBJECT
7248 DDKAPI
7249 IoCreateController(
7250 IN ULONG Size);
7251
7252 NTOSAPI
7253 NTSTATUS
7254 DDKAPI
7255 IoCreateDevice(
7256 IN PDRIVER_OBJECT DriverObject,
7257 IN ULONG DeviceExtensionSize,
7258 IN PUNICODE_STRING DeviceName OPTIONAL,
7259 IN DEVICE_TYPE DeviceType,
7260 IN ULONG DeviceCharacteristics,
7261 IN BOOLEAN Exclusive,
7262 OUT PDEVICE_OBJECT *DeviceObject);
7263
7264 NTOSAPI
7265 NTSTATUS
7266 DDKAPI
7267 IoCreateDisk(
7268 IN PDEVICE_OBJECT DeviceObject,
7269 IN PCREATE_DISK Disk);
7270
7271 NTOSAPI
7272 NTSTATUS
7273 DDKAPI
7274 IoCreateFile(
7275 OUT PHANDLE FileHandle,
7276 IN ACCESS_MASK DesiredAccess,
7277 IN POBJECT_ATTRIBUTES ObjectAttributes,
7278 OUT PIO_STATUS_BLOCK IoStatusBlock,
7279 IN PLARGE_INTEGER AllocationSize OPTIONAL,
7280 IN ULONG FileAttributes,
7281 IN ULONG ShareAccess,
7282 IN ULONG Disposition,
7283 IN ULONG CreateOptions,
7284 IN PVOID EaBuffer OPTIONAL,
7285 IN ULONG EaLength,
7286 IN CREATE_FILE_TYPE CreateFileType,
7287 IN PVOID ExtraCreateParameters OPTIONAL,
7288 IN ULONG Options);
7289
7290 NTOSAPI
7291 PKEVENT
7292 DDKAPI
7293 IoCreateNotificationEvent(
7294 IN PUNICODE_STRING EventName,
7295 OUT PHANDLE EventHandle);
7296
7297 NTOSAPI
7298 NTSTATUS
7299 DDKAPI
7300 IoCreateSymbolicLink(
7301 IN PUNICODE_STRING SymbolicLinkName,
7302 IN PUNICODE_STRING DeviceName);
7303
7304 NTOSAPI
7305 PKEVENT
7306 DDKAPI
7307 IoCreateSynchronizationEvent(
7308 IN PUNICODE_STRING EventName,
7309 OUT PHANDLE EventHandle);
7310
7311 NTOSAPI
7312 NTSTATUS
7313 DDKAPI
7314 IoCreateUnprotectedSymbolicLink(
7315 IN PUNICODE_STRING SymbolicLinkName,
7316 IN PUNICODE_STRING DeviceName);
7317
7318 NTOSAPI
7319 NTSTATUS
7320 DDKAPI
7321 IoCsqInitialize(
7322 PIO_CSQ Csq,
7323 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
7324 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
7325 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
7326 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
7327 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
7328 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
7329
7330 NTOSAPI
7331 VOID
7332 DDKAPI
7333 IoCsqInsertIrp(
7334 IN PIO_CSQ Csq,
7335 IN PIRP Irp,
7336 IN PIO_CSQ_IRP_CONTEXT Context);
7337
7338 NTOSAPI
7339 PIRP
7340 DDKAPI
7341 IoCsqRemoveIrp(
7342 IN PIO_CSQ Csq,
7343 IN PIO_CSQ_IRP_CONTEXT Context);
7344
7345 NTOSAPI
7346 PIRP
7347 DDKAPI
7348 IoCsqRemoveNextIrp(
7349 IN PIO_CSQ Csq,
7350 IN PVOID PeekContext);
7351
7352 NTOSAPI
7353 VOID
7354 DDKAPI
7355 IoDeleteController(
7356 IN PCONTROLLER_OBJECT ControllerObject);
7357
7358 NTOSAPI
7359 VOID
7360 DDKAPI
7361 IoDeleteDevice(
7362 IN PDEVICE_OBJECT DeviceObject);
7363
7364 NTOSAPI
7365 NTSTATUS
7366 DDKAPI
7367 IoDeleteSymbolicLink(
7368 IN PUNICODE_STRING SymbolicLinkName);
7369
7370 /*
7371 * VOID
7372 * IoDeassignArcName(
7373 * IN PUNICODE_STRING ArcName)
7374 */
7375 #define IoDeassignArcName IoDeleteSymbolicLink
7376
7377 NTOSAPI
7378 VOID
7379 DDKAPI
7380 IoDetachDevice(
7381 IN OUT PDEVICE_OBJECT TargetDevice);
7382
7383 NTOSAPI
7384 VOID
7385 DDKAPI
7386 IoDisconnectInterrupt(
7387 IN PKINTERRUPT InterruptObject);
7388
7389 NTOSAPI
7390 BOOLEAN
7391 DDKAPI
7392 IoForwardIrpSynchronously(
7393 IN PDEVICE_OBJECT DeviceObject,
7394 IN PIRP Irp);
7395
7396 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
7397
7398 NTOSAPI
7399 VOID
7400 DDKAPI
7401 IoFreeController(
7402 IN PCONTROLLER_OBJECT ControllerObject);
7403
7404 NTOSAPI
7405 VOID
7406 DDKAPI
7407 IoFreeErrorLogEntry(
7408 PVOID ElEntry);
7409
7410 NTOSAPI
7411 VOID
7412 DDKAPI
7413 IoFreeIrp(
7414 IN PIRP Irp);
7415
7416 NTOSAPI
7417 VOID
7418 DDKAPI
7419 IoFreeMdl(
7420 IN PMDL Mdl);
7421
7422 NTOSAPI
7423 VOID
7424 DDKAPI
7425 IoFreeWorkItem(
7426 IN PIO_WORKITEM pIOWorkItem);
7427
7428 NTOSAPI
7429 PDEVICE_OBJECT
7430 DDKAPI
7431 IoGetAttachedDevice(
7432 IN PDEVICE_OBJECT DeviceObject);
7433
7434 NTOSAPI
7435 PDEVICE_OBJECT
7436 DDKAPI
7437 IoGetAttachedDeviceReference(
7438 IN PDEVICE_OBJECT DeviceObject);
7439
7440 NTOSAPI
7441 NTSTATUS
7442 DDKAPI
7443 IoGetBootDiskInformation(
7444 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
7445 IN ULONG Size);
7446
7447 NTOSAPI
7448 PCONFIGURATION_INFORMATION
7449 DDKAPI
7450 IoGetConfigurationInformation(
7451 VOID);
7452
7453 NTOSAPI
7454 PEPROCESS
7455 DDKAPI
7456 IoGetCurrentProcess(
7457 VOID);
7458
7459 NTOSAPI
7460 NTSTATUS
7461 DDKAPI
7462 IoGetDeviceInterfaceAlias(
7463 IN PUNICODE_STRING SymbolicLinkName,
7464 IN CONST GUID *AliasInterfaceClassGuid,
7465 OUT PUNICODE_STRING AliasSymbolicLinkName);
7466
7467 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
7468
7469 NTOSAPI
7470 NTSTATUS
7471 DDKAPI
7472 IoGetDeviceInterfaces(
7473 IN CONST GUID *InterfaceClassGuid,
7474 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
7475 IN ULONG Flags,
7476 OUT PWSTR *SymbolicLinkList);
7477
7478 NTOSAPI
7479 NTSTATUS
7480 DDKAPI
7481 IoGetDeviceObjectPointer(
7482 IN PUNICODE_STRING ObjectName,
7483 IN ACCESS_MASK DesiredAccess,
7484 OUT PFILE_OBJECT *FileObject,
7485 OUT PDEVICE_OBJECT *DeviceObject);
7486
7487 NTOSAPI
7488 NTSTATUS
7489 DDKAPI
7490 IoGetDeviceProperty(
7491 IN PDEVICE_OBJECT DeviceObject,
7492 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
7493 IN ULONG BufferLength,
7494 OUT PVOID PropertyBuffer,
7495 OUT PULONG ResultLength);
7496
7497 NTOSAPI
7498 PDEVICE_OBJECT
7499 DDKAPI
7500 IoGetDeviceToVerify(
7501 IN PETHREAD Thread);
7502
7503 NTOSAPI
7504 PDMA_ADAPTER
7505 DDKAPI
7506 IoGetDmaAdapter(
7507 IN PDEVICE_OBJECT PhysicalDeviceObject,
7508 IN PDEVICE_DESCRIPTION DeviceDescription,
7509 IN OUT PULONG NumberOfMapRegisters);
7510
7511 NTOSAPI
7512 PVOID
7513 DDKAPI
7514 IoGetDriverObjectExtension(
7515 IN PDRIVER_OBJECT DriverObject,
7516 IN PVOID ClientIdentificationAddress);
7517
7518 NTOSAPI
7519 PGENERIC_MAPPING
7520 DDKAPI
7521 IoGetFileObjectGenericMapping(
7522 VOID);
7523
7524 /*
7525 * ULONG
7526 * IoGetFunctionCodeFromCtlCode(
7527 * IN ULONG ControlCode)
7528 */
7529 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7530 (((_ControlCode) >> 2) & 0x00000FFF)
7531
7532 NTOSAPI
7533 PVOID
7534 DDKAPI
7535 IoGetInitialStack(
7536 VOID);
7537
7538 NTOSAPI
7539 PDEVICE_OBJECT
7540 DDKAPI
7541 IoGetRelatedDeviceObject(
7542 IN PFILE_OBJECT FileObject);
7543
7544 NTOSAPI
7545 ULONG
7546 DDKAPI
7547 IoGetRemainingStackSize(
7548 VOID);
7549
7550 NTOSAPI
7551 VOID
7552 DDKAPI
7553 IoGetStackLimits(
7554 OUT PULONG_PTR LowLimit,
7555 OUT PULONG_PTR HighLimit);
7556
7557 NTOSAPI
7558 VOID
7559 DDKAPI
7560 KeInitializeDpc(
7561 IN PRKDPC Dpc,
7562 IN PKDEFERRED_ROUTINE DeferredRoutine,
7563 IN PVOID DeferredContext);
7564
7565 /*
7566 * VOID
7567 * IoInitializeDpcRequest(
7568 * IN PDEVICE_OBJECT DeviceObject,
7569 * IN PIO_DPC_ROUTINE DpcRoutine)
7570 */
7571 #define IoInitializeDpcRequest(_DeviceObject, \
7572 _DpcRoutine) \
7573 KeInitializeDpc(&(_DeviceObject)->Dpc, \
7574 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
7575 _DeviceObject)
7576
7577 NTOSAPI
7578 VOID
7579 DDKAPI
7580 IoInitializeIrp(
7581 IN OUT PIRP Irp,
7582 IN USHORT PacketSize,
7583 IN CCHAR StackSize);
7584
7585 NTOSAPI
7586 VOID
7587 DDKAPI
7588 IoInitializeRemoveLockEx(
7589 IN PIO_REMOVE_LOCK Lock,
7590 IN ULONG AllocateTag,
7591 IN ULONG MaxLockedMinutes,
7592 IN ULONG HighWatermark,
7593 IN ULONG RemlockSize);
7594
7595 /* VOID
7596 * IoInitializeRemoveLock(
7597 * IN PIO_REMOVE_LOCK Lock,
7598 * IN ULONG AllocateTag,
7599 * IN ULONG MaxLockedMinutes,
7600 * IN ULONG HighWatermark)
7601 */
7602 #define IoInitializeRemoveLock( \
7603 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7604 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7605 HighWatermark, sizeof(IO_REMOVE_LOCK))
7606
7607 NTOSAPI
7608 NTSTATUS
7609 DDKAPI
7610 IoInitializeTimer(
7611 IN PDEVICE_OBJECT DeviceObject,
7612 IN PIO_TIMER_ROUTINE TimerRoutine,
7613 IN PVOID Context);
7614
7615 NTOSAPI
7616 VOID
7617 DDKAPI
7618 IoInvalidateDeviceRelations(
7619 IN PDEVICE_OBJECT DeviceObject,
7620 IN DEVICE_RELATION_TYPE Type);
7621
7622 NTOSAPI
7623 VOID
7624 DDKAPI
7625 IoInvalidateDeviceState(
7626 IN PDEVICE_OBJECT PhysicalDeviceObject);
7627
7628 NTOSAPI
7629 BOOLEAN
7630 DDKAPI
7631 IoIs32bitProcess(
7632 IN PIRP Irp OPTIONAL);
7633
7634 /*
7635 * BOOLEAN
7636 * IoIsErrorUserInduced(
7637 * IN NTSTATUS Status);
7638 */
7639 #define IoIsErrorUserInduced(Status) \
7640 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7641 ((Status) == STATUS_IO_TIMEOUT) || \
7642 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7643 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7644 ((Status) == STATUS_VERIFY_REQUIRED) || \
7645 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
7646 ((Status) == STATUS_WRONG_VOLUME)))
7647
7648 NTOSAPI
7649 BOOLEAN
7650 DDKAPI
7651 IoIsWdmVersionAvailable(
7652 IN UCHAR MajorVersion,
7653 IN UCHAR MinorVersion);
7654
7655 NTOSAPI
7656 PIRP
7657 DDKAPI
7658 IoMakeAssociatedIrp(
7659 IN PIRP Irp,
7660 IN CCHAR StackSize);
7661
7662 /*
7663 * VOID
7664 * IoMarkIrpPending(
7665 * IN OUT PIRP Irp)
7666 */
7667 #define IoMarkIrpPending(_Irp) \
7668 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
7669
7670 NTOSAPI
7671 NTSTATUS
7672 DDKAPI
7673 IoOpenDeviceInterfaceRegistryKey(
7674 IN PUNICODE_STRING SymbolicLinkName,
7675 IN ACCESS_MASK DesiredAccess,
7676 OUT PHANDLE DeviceInterfaceKey);
7677
7678 #define PLUGPLAY_REGKEY_DEVICE 1
7679 #define PLUGPLAY_REGKEY_DRIVER 2
7680 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
7681
7682 NTOSAPI
7683 NTSTATUS
7684 DDKAPI
7685 IoOpenDeviceRegistryKey(
7686 IN PDEVICE_OBJECT DeviceObject,
7687 IN ULONG DevInstKeyType,
7688 IN ACCESS_MASK DesiredAccess,
7689 OUT PHANDLE DevInstRegKey);
7690
7691 NTOSAPI
7692 NTSTATUS
7693 DDKAPI
7694 IoQueryDeviceDescription(
7695 IN PINTERFACE_TYPE BusType OPTIONAL,
7696 IN PULONG BusNumber OPTIONAL,
7697 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
7698 IN PULONG ControllerNumber OPTIONAL,
7699 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
7700 IN PULONG PeripheralNumber OPTIONAL,
7701 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
7702 IN PVOID Context);
7703
7704 NTOSAPI
7705 VOID
7706 DDKAPI
7707 IoQueueWorkItem(
7708 IN PIO_WORKITEM pIOWorkItem,
7709 IN PIO_WORKITEM_ROUTINE Routine,
7710 IN WORK_QUEUE_TYPE QueueType,
7711 IN PVOID Context);
7712
7713 NTOSAPI
7714 VOID
7715 DDKAPI
7716 IoRaiseHardError(
7717 IN PIRP Irp,
7718 IN PVPB Vpb OPTIONAL,
7719 IN PDEVICE_OBJECT RealDeviceObject);
7720
7721 NTOSAPI
7722 BOOLEAN
7723 DDKAPI
7724 IoRaiseInformationalHardError(
7725 IN NTSTATUS ErrorStatus,
7726 IN PUNICODE_STRING String OPTIONAL,
7727 IN PKTHREAD Thread OPTIONAL);
7728
7729 NTOSAPI
7730 NTSTATUS
7731 DDKAPI
7732 IoReadDiskSignature(
7733 IN PDEVICE_OBJECT DeviceObject,
7734 IN ULONG BytesPerSector,
7735 OUT PDISK_SIGNATURE Signature);
7736
7737 NTOSAPI
7738 NTSTATUS
7739 DDKAPI
7740 IoReadPartitionTableEx(
7741 IN PDEVICE_OBJECT DeviceObject,
7742 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
7743
7744 NTOSAPI
7745 VOID
7746 DDKAPI
7747 IoRegisterBootDriverReinitialization(
7748 IN PDRIVER_OBJECT DriverObject,
7749 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7750 IN PVOID Context);
7751
7752 NTOSAPI
7753 VOID
7754 DDKAPI
7755 IoRegisterBootDriverReinitialization(
7756 IN PDRIVER_OBJECT DriverObject,
7757 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7758 IN PVOID Context);
7759
7760 NTOSAPI
7761 NTSTATUS
7762 DDKAPI
7763 IoRegisterDeviceInterface(
7764 IN PDEVICE_OBJECT PhysicalDeviceObject,
7765 IN CONST GUID *InterfaceClassGuid,
7766 IN PUNICODE_STRING ReferenceString OPTIONAL,
7767 OUT PUNICODE_STRING SymbolicLinkName);
7768
7769 NTOSAPI
7770 VOID
7771 DDKAPI
7772 IoRegisterDriverReinitialization(
7773 IN PDRIVER_OBJECT DriverObject,
7774 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
7775 IN PVOID Context);
7776
7777 NTOSAPI
7778 NTSTATUS
7779 DDKAPI
7780 IoRegisterPlugPlayNotification(
7781 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
7782 IN ULONG EventCategoryFlags,
7783 IN PVOID EventCategoryData OPTIONAL,
7784 IN PDRIVER_OBJECT DriverObject,
7785 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
7786 IN PVOID Context,
7787 OUT PVOID *NotificationEntry);
7788
7789 NTOSAPI
7790 NTSTATUS
7791 DDKAPI
7792 IoRegisterShutdownNotification(
7793 IN PDEVICE_OBJECT DeviceObject);
7794
7795 NTOSAPI
7796 VOID
7797 DDKAPI
7798 IoReleaseCancelSpinLock(
7799 IN KIRQL Irql);
7800
7801 NTOSAPI
7802 VOID
7803 DDKAPI
7804 IoReleaseRemoveLockAndWaitEx(
7805 IN PIO_REMOVE_LOCK RemoveLock,
7806 IN PVOID Tag,
7807 IN ULONG RemlockSize);
7808
7809 NTOSAPI
7810 VOID
7811 DDKAPI
7812 IoReleaseRemoveLockEx(
7813 IN PIO_REMOVE_LOCK RemoveLock,
7814 IN PVOID Tag,
7815 IN ULONG RemlockSize);
7816
7817 /*
7818 * VOID
7819 * IoReleaseRemoveLock(
7820 * IN PIO_REMOVE_LOCK RemoveLock,
7821 * IN PVOID Tag)
7822 */
7823 #define IoReleaseRemoveLock(_RemoveLock, \
7824 _Tag) \
7825 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7826
7827 /*
7828 * VOID
7829 * IoReleaseRemoveLockAndWait(
7830 * IN PIO_REMOVE_LOCK RemoveLock,
7831 * IN PVOID Tag)
7832 */
7833 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
7834 _Tag) \
7835 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7836
7837 NTOSAPI
7838 VOID
7839 DDKAPI
7840 IoRemoveShareAccess(
7841 IN PFILE_OBJECT FileObject,
7842 IN OUT PSHARE_ACCESS ShareAccess);
7843
7844 NTOSAPI
7845 NTSTATUS
7846 DDKAPI
7847 IoReportDetectedDevice(
7848 IN PDRIVER_OBJECT DriverObject,
7849 IN INTERFACE_TYPE LegacyBusType,
7850 IN ULONG BusNumber,
7851 IN ULONG SlotNumber,
7852 IN PCM_RESOURCE_LIST ResourceList,
7853 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
7854 IN BOOLEAN ResourceAssigned,
7855 IN OUT PDEVICE_OBJECT *DeviceObject);
7856
7857 NTOSAPI
7858 NTSTATUS
7859 DDKAPI
7860 IoReportResourceForDetection(
7861 IN PDRIVER_OBJECT DriverObject,
7862 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7863 IN ULONG DriverListSize OPTIONAL,
7864 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
7865 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7866 IN ULONG DeviceListSize OPTIONAL,
7867 OUT PBOOLEAN ConflictDetected);
7868
7869 NTOSAPI
7870 NTSTATUS
7871 DDKAPI
7872 IoReportResourceUsage(
7873 IN PUNICODE_STRING DriverClassName OPTIONAL,
7874 IN PDRIVER_OBJECT DriverObject,
7875 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
7876 IN ULONG DriverListSize OPTIONAL,
7877 IN PDEVICE_OBJECT DeviceObject,
7878 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
7879 IN ULONG DeviceListSize OPTIONAL,
7880 IN BOOLEAN OverrideConflict,
7881 OUT PBOOLEAN ConflictDetected);
7882
7883 NTOSAPI
7884 NTSTATUS
7885 DDKAPI
7886 IoReportTargetDeviceChange(
7887 IN PDEVICE_OBJECT PhysicalDeviceObject,
7888 IN PVOID NotificationStructure);
7889
7890 NTOSAPI
7891 NTSTATUS
7892 DDKAPI
7893 IoReportTargetDeviceChangeAsynchronous(
7894 IN PDEVICE_OBJECT PhysicalDeviceObject,
7895 IN PVOID NotificationStructure,
7896 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
7897 IN PVOID Context OPTIONAL);
7898
7899 NTOSAPI
7900 VOID
7901 DDKAPI
7902 IoRequestDeviceEject(
7903 IN PDEVICE_OBJECT PhysicalDeviceObject);
7904
7905 /*
7906 * VOID
7907 * IoRequestDpc(
7908 * IN PDEVICE_OBJECT DeviceObject,
7909 * IN PIRP Irp,
7910 * IN PVOID Context);
7911 */
7912 #define IoRequestDpc(DeviceObject, Irp, Context)( \
7913 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
7914
7915 NTOSAPI
7916 VOID
7917 DDKAPI
7918 IoReuseIrp(
7919 IN OUT PIRP Irp,
7920 IN NTSTATUS Status);
7921
7922 /*
7923 * PDRIVER_CANCEL
7924 * IoSetCancelRoutine(
7925 * IN PIRP Irp,
7926 * IN PDRIVER_CANCEL CancelRoutine)
7927 */
7928 #define IoSetCancelRoutine(_Irp, \
7929 _CancelRoutine) \
7930 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
7931 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
7932
7933 /*
7934 * VOID
7935 * IoSetCompletionRoutine(
7936 * IN PIRP Irp,
7937 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7938 * IN PVOID Context,
7939 * IN BOOLEAN InvokeOnSuccess,
7940 * IN BOOLEAN InvokeOnError,
7941 * IN BOOLEAN InvokeOnCancel)
7942 */
7943 #define IoSetCompletionRoutine(_Irp, \
7944 _CompletionRoutine, \
7945 _Context, \
7946 _InvokeOnSuccess, \
7947 _InvokeOnError, \
7948 _InvokeOnCancel) \
7949 { \
7950 PIO_STACK_LOCATION _IrpSp; \
7951 ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
7952 _CompletionRoutine != NULL : TRUE); \
7953 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
7954 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
7955 _IrpSp->Context = (_Context); \
7956 _IrpSp->Control = 0; \
7957 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
7958 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
7959 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
7960 }
7961
7962 NTOSAPI
7963 NTSTATUS
7964 DDKAPI
7965 IoSetCompletionRoutineEx(
7966 IN PDEVICE_OBJECT DeviceObject,
7967 IN PIRP Irp,
7968 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7969 IN PVOID Context,
7970 IN BOOLEAN InvokeOnSuccess,
7971 IN BOOLEAN InvokeOnError,
7972 IN BOOLEAN InvokeOnCancel);
7973
7974 NTOSAPI
7975 NTSTATUS
7976 DDKAPI
7977 IoSetDeviceInterfaceState(
7978 IN PUNICODE_STRING SymbolicLinkName,
7979 IN BOOLEAN Enable);
7980
7981 NTOSAPI
7982 VOID
7983 DDKAPI
7984 IoSetHardErrorOrVerifyDevice(
7985 IN PIRP Irp,
7986 IN PDEVICE_OBJECT DeviceObject);
7987
7988 /*
7989 * VOID
7990 * IoSetNextIrpStackLocation(
7991 * IN OUT PIRP Irp)
7992 */
7993 #define IoSetNextIrpStackLocation(_Irp) \
7994 { \
7995 (_Irp)->CurrentLocation--; \
7996 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
7997 }
7998
7999 NTOSAPI
8000 NTSTATUS
8001 DDKAPI
8002 IoSetPartitionInformationEx(
8003 IN PDEVICE_OBJECT DeviceObject,
8004 IN ULONG PartitionNumber,
8005 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
8006
8007 NTOSAPI
8008 VOID
8009 DDKAPI
8010 IoSetShareAccess(
8011 IN ACCESS_MASK DesiredAccess,
8012 IN ULONG DesiredShareAccess,
8013 IN OUT PFILE_OBJECT FileObject,
8014 OUT PSHARE_ACCESS ShareAccess);
8015
8016 NTOSAPI
8017 VOID
8018 DDKAPI
8019 IoSetStartIoAttributes(
8020 IN PDEVICE_OBJECT DeviceObject,
8021 IN BOOLEAN DeferredStartIo,
8022 IN BOOLEAN NonCancelable);
8023
8024 NTOSAPI
8025 NTSTATUS
8026 DDKAPI
8027 IoSetSystemPartition(
8028 IN PUNICODE_STRING VolumeNameString);
8029
8030 NTOSAPI
8031 BOOLEAN
8032 DDKAPI
8033 IoSetThreadHardErrorMode(
8034 IN BOOLEAN EnableHardErrors);
8035
8036 /*
8037 * USHORT
8038 * IoSizeOfIrp(
8039 * IN CCHAR StackSize)
8040 */
8041 #define IoSizeOfIrp(_StackSize) \
8042 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8043
8044 /*
8045 * VOID
8046 * IoSkipCurrentIrpStackLocation(
8047 * IN PIRP Irp)
8048 */
8049 #define IoSkipCurrentIrpStackLocation(_Irp) \
8050 { \
8051 (_Irp)->CurrentLocation++; \
8052 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
8053 }
8054
8055 NTOSAPI
8056 VOID
8057 DDKAPI
8058 IoStartNextPacket(
8059 IN PDEVICE_OBJECT DeviceObject,
8060 IN BOOLEAN Cancelable);
8061
8062 NTOSAPI
8063 VOID
8064 DDKAPI
8065 IoStartNextPacketByKey(
8066 IN PDEVICE_OBJECT DeviceObject,
8067 IN BOOLEAN Cancelable,
8068 IN ULONG Key);
8069
8070 NTOSAPI
8071 VOID
8072 DDKAPI
8073 IoStartPacket(
8074 IN PDEVICE_OBJECT DeviceObject,
8075 IN PIRP Irp,
8076 IN PULONG Key OPTIONAL,
8077 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
8078
8079 NTOSAPI
8080 VOID
8081 DDKAPI
8082 IoStartTimer(
8083 IN PDEVICE_OBJECT DeviceObject);
8084
8085 NTOSAPI
8086 VOID
8087 DDKAPI
8088 IoStopTimer(
8089 IN PDEVICE_OBJECT DeviceObject);
8090
8091 NTOSAPI
8092 NTSTATUS
8093 DDKAPI
8094 IoUnregisterPlugPlayNotification(
8095 IN PVOID NotificationEntry);
8096
8097 NTOSAPI
8098 VOID
8099 DDKAPI
8100 IoUnregisterShutdownNotification(
8101 IN PDEVICE_OBJECT DeviceObject);
8102
8103 NTOSAPI
8104 VOID
8105 DDKAPI
8106 IoUpdateShareAccess(
8107 IN PFILE_OBJECT FileObject,
8108 IN OUT PSHARE_ACCESS ShareAccess);
8109
8110 NTOSAPI
8111 NTSTATUS
8112 DDKAPI
8113 IoVerifyPartitionTable(
8114 IN PDEVICE_OBJECT DeviceObject,
8115 IN BOOLEAN FixErrors);
8116
8117 NTOSAPI
8118 NTSTATUS
8119 DDKAPI
8120 IoVolumeDeviceToDosName(
8121 IN PVOID VolumeDeviceObject,
8122 OUT PUNICODE_STRING DosName);
8123
8124 NTOSAPI
8125 NTSTATUS
8126 DDKAPI
8127 IoWMIAllocateInstanceIds(
8128 IN GUID *Guid,
8129 IN ULONG InstanceCount,
8130 OUT ULONG *FirstInstanceId);
8131
8132 NTOSAPI
8133 ULONG
8134 DDKAPI
8135 IoWMIDeviceObjectToProviderId(
8136 IN PDEVICE_OBJECT DeviceObject);
8137
8138 NTOSAPI
8139 NTSTATUS
8140 DDKAPI
8141 IoWMIDeviceObjectToInstanceName(
8142 IN PVOID DataBlockObject,
8143 IN PDEVICE_OBJECT DeviceObject,
8144 OUT PUNICODE_STRING InstanceName);
8145
8146 NTOSAPI
8147 NTSTATUS
8148 DDKAPI
8149 IoWMIExecuteMethod(
8150 IN PVOID DataBlockObject,
8151 IN PUNICODE_STRING InstanceName,
8152 IN ULONG MethodId,
8153 IN ULONG InBufferSize,
8154 IN OUT PULONG OutBufferSize,
8155 IN OUT PUCHAR InOutBuffer);
8156
8157 NTOSAPI
8158 NTSTATUS
8159 DDKAPI
8160 IoWMIHandleToInstanceName(
8161 IN PVOID DataBlockObject,
8162 IN HANDLE FileHandle,
8163 OUT PUNICODE_STRING InstanceName);
8164
8165 NTOSAPI
8166 NTSTATUS
8167 DDKAPI
8168 IoWMIOpenBlock(
8169 IN GUID *DataBlockGuid,
8170 IN ULONG DesiredAccess,
8171 OUT PVOID *DataBlockObject);
8172
8173 NTOSAPI
8174 NTSTATUS
8175 DDKAPI
8176 IoWMIQueryAllData(
8177 IN PVOID DataBlockObject,
8178 IN OUT ULONG *InOutBufferSize,
8179 OUT PVOID OutBuffer);
8180
8181 NTOSAPI
8182 NTSTATUS
8183 DDKAPI
8184 IoWMIQueryAllDataMultiple(
8185 IN PVOID *DataBlockObjectList,
8186 IN ULONG ObjectCount,
8187 IN OUT ULONG *InOutBufferSize,
8188 OUT PVOID OutBuffer);
8189
8190 NTOSAPI
8191 NTSTATUS
8192 DDKAPI
8193 IoWMIQuerySingleInstance(
8194 IN PVOID DataBlockObject,
8195 IN PUNICODE_STRING InstanceName,
8196 IN OUT ULONG *InOutBufferSize,
8197 OUT PVOID OutBuffer);
8198
8199 NTOSAPI
8200 NTSTATUS
8201 DDKAPI
8202 IoWMIQuerySingleInstanceMultiple(
8203 IN PVOID *DataBlockObjectList,
8204 IN PUNICODE_STRING InstanceNames,
8205 IN ULONG ObjectCount,
8206 IN OUT ULONG *InOutBufferSize,
8207 OUT PVOID OutBuffer);
8208
8209 NTOSAPI
8210 NTSTATUS
8211 DDKAPI
8212 IoWMIRegistrationControl(
8213 IN PDEVICE_OBJECT DeviceObject,
8214 IN ULONG Action);
8215
8216 NTOSAPI
8217 NTSTATUS
8218 DDKAPI
8219 IoWMISetNotificationCallback(
8220 IN PVOID Object,
8221 IN WMI_NOTIFICATION_CALLBACK Callback,
8222 IN PVOID Context);
8223
8224 NTOSAPI
8225 NTSTATUS
8226 DDKAPI
8227 IoWMISetSingleInstance(
8228 IN PVOID DataBlockObject,
8229 IN PUNICODE_STRING InstanceName,
8230 IN ULONG Version,
8231 IN ULONG ValueBufferSize,
8232 IN PVOID ValueBuffer);
8233
8234 NTOSAPI
8235 NTSTATUS
8236 DDKAPI
8237 IoWMISetSingleItem(
8238 IN PVOID DataBlockObject,
8239 IN PUNICODE_STRING InstanceName,
8240 IN ULONG DataItemId,
8241 IN ULONG Version,
8242 IN ULONG ValueBufferSize,
8243 IN PVOID ValueBuffer);
8244
8245 NTOSAPI
8246 NTSTATUS
8247 DDKAPI
8248 IoWMISuggestInstanceName(
8249 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8250 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
8251 IN BOOLEAN CombineNames,
8252 OUT PUNICODE_STRING SuggestedInstanceName);
8253
8254 NTOSAPI
8255 NTSTATUS
8256 DDKAPI
8257 IoWMIWriteEvent(
8258 IN PVOID WnodeEventItem);
8259
8260 NTOSAPI
8261 VOID
8262 DDKAPI
8263 IoWriteErrorLogEntry(
8264 IN PVOID ElEntry);
8265
8266 NTOSAPI
8267 NTSTATUS
8268 DDKAPI
8269 IoWritePartitionTableEx(
8270 IN PDEVICE_OBJECT DeviceObject,
8271 IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer);
8272
8273
8274
8275 /** Kernel routines **/
8276
8277 NTHALAPI
8278 VOID
8279 DDKFASTAPI
8280 KeAcquireInStackQueuedSpinLock(
8281 IN PKSPIN_LOCK SpinLock,
8282 IN PKLOCK_QUEUE_HANDLE LockHandle);
8283
8284 NTOSAPI
8285 VOID
8286 DDKFASTAPI
8287 KeAcquireInStackQueuedSpinLockAtDpcLevel(
8288 IN PKSPIN_LOCK SpinLock,
8289 IN PKLOCK_QUEUE_HANDLE LockHandle);
8290
8291 NTOSAPI
8292 KIRQL
8293 DDKAPI
8294 KeAcquireInterruptSpinLock(
8295 IN PKINTERRUPT Interrupt);
8296
8297 NTOSAPI
8298 BOOLEAN
8299 DDKAPI
8300 KeAreApcsDisabled(
8301 VOID);
8302
8303 NTOSAPI
8304 VOID
8305 DDKAPI
8306 KeBugCheck(
8307 IN ULONG BugCheckCode);
8308
8309 NTOSAPI
8310 VOID
8311 DDKAPI
8312 KeBugCheckEx(
8313 IN ULONG BugCheckCode,
8314 IN ULONG_PTR BugCheckParameter1,
8315 IN ULONG_PTR BugCheckParameter2,
8316 IN ULONG_PTR BugCheckParameter3,
8317 IN ULONG_PTR BugCheckParameter4);
8318
8319 NTOSAPI
8320 BOOLEAN
8321 DDKAPI
8322 KeCancelTimer(
8323 IN PKTIMER Timer);
8324
8325 NTOSAPI
8326 VOID
8327 DDKAPI
8328 KeClearEvent(
8329 IN PRKEVENT Event);
8330
8331 NTOSAPI
8332 NTSTATUS
8333 DDKAPI
8334 KeDelayExecutionThread(
8335 IN KPROCESSOR_MODE WaitMode,
8336 IN BOOLEAN Alertable,
8337 IN PLARGE_INTEGER Interval);
8338
8339 NTOSAPI
8340 BOOLEAN
8341 DDKAPI
8342 KeDeregisterBugCheckCallback(
8343 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
8344
8345 NTOSAPI
8346 VOID
8347 DDKAPI
8348 KeEnterCriticalRegion(
8349 VOID);
8350
8351 /*
8352 * VOID
8353 * KeFlushIoBuffers(
8354 * IN PMDL Mdl,
8355 * IN BOOLEAN ReadOperation,
8356 * IN BOOLEAN DmaOperation)
8357 */
8358 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8359
8360 NTHALAPI
8361 VOID
8362 DDKAPI
8363 KeFlushWriteBuffer(VOID);
8364
8365 NTOSAPI
8366 PRKTHREAD
8367 DDKAPI
8368 KeGetCurrentThread(
8369 VOID);
8370
8371 NTOSAPI
8372 KPROCESSOR_MODE
8373 DDKAPI
8374 KeGetPreviousMode(
8375 VOID);
8376
8377 NTOSAPI
8378 ULONG
8379 DDKAPI
8380 KeGetRecommendedSharedDataAlignment(
8381 VOID);
8382
8383 NTOSAPI
8384 VOID
8385 DDKAPI
8386 KeInitializeDeviceQueue(
8387 IN PKDEVICE_QUEUE DeviceQueue);
8388
8389 NTOSAPI
8390 VOID
8391 DDKAPI
8392 KeInitializeMutex(
8393 IN PRKMUTEX Mutex,
8394 IN ULONG Level);
8395
8396 NTOSAPI
8397 VOID
8398 DDKAPI
8399 KeInitializeSemaphore(
8400 IN PRKSEMAPHORE Semaphore,
8401 IN LONG Count,
8402 IN LONG Limit);
8403
8404 NTOSAPI
8405 VOID
8406 DDKAPI
8407 KeInitializeSpinLock(
8408 IN PKSPIN_LOCK SpinLock);
8409
8410 NTOSAPI
8411 VOID
8412 DDKAPI
8413 KeInitializeTimer(
8414 IN PKTIMER Timer);
8415
8416 NTOSAPI
8417 VOID
8418 DDKAPI
8419 KeInitializeTimerEx(
8420 IN PKTIMER Timer,
8421 IN TIMER_TYPE Type);
8422
8423 NTOSAPI
8424 BOOLEAN
8425 DDKAPI
8426 KeInsertByKeyDeviceQueue(
8427 IN PKDEVICE_QUEUE DeviceQueue,
8428 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
8429 IN ULONG SortKey);
8430
8431 NTOSAPI
8432 BOOLEAN
8433 DDKAPI
8434 KeInsertDeviceQueue(
8435 IN PKDEVICE_QUEUE DeviceQueue,
8436 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8437
8438 NTOSAPI
8439 BOOLEAN
8440 DDKAPI
8441 KeInsertQueueDpc(
8442 IN PRKDPC Dpc,
8443 IN PVOID SystemArgument1,
8444 IN PVOID SystemArgument2);
8445
8446 NTOSAPI
8447 VOID
8448 DDKAPI
8449 KeLeaveCriticalRegion(
8450 VOID);
8451
8452 #ifdef _X86_
8453
8454 static __inline
8455 VOID
8456 KeMemoryBarrier(
8457 VOID)
8458 {
8459 volatile LONG Barrier;
8460 #if defined(__GNUC__)
8461 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
8462 #elif defined(_MSC_VER)
8463 __asm xchg [Barrier], eax
8464 #endif
8465 }
8466
8467 #endif
8468
8469 NTOSAPI
8470 LONG
8471 DDKAPI
8472 KePulseEvent(
8473 IN PRKEVENT Event,
8474 IN KPRIORITY Increment,
8475 IN BOOLEAN Wait);
8476
8477 NTOSAPI
8478 ULONGLONG
8479 DDKAPI
8480 KeQueryInterruptTime(
8481 VOID);
8482
8483 NTHALAPI
8484 LARGE_INTEGER
8485 DDKAPI
8486 KeQueryPerformanceCounter(
8487 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
8488
8489 NTOSAPI
8490 KPRIORITY
8491 DDKAPI
8492 KeQueryPriorityThread(
8493 IN PRKTHREAD Thread);
8494
8495 NTOSAPI
8496 VOID
8497 DDKAPI
8498 KeQuerySystemTime(
8499 OUT PLARGE_INTEGER CurrentTime);
8500
8501 NTOSAPI
8502 VOID
8503 DDKAPI
8504 KeQueryTickCount(
8505 OUT PLARGE_INTEGER TickCount);
8506
8507 NTOSAPI
8508 ULONG
8509 DDKAPI
8510 KeQueryTimeIncrement(
8511 VOID);
8512
8513 NTOSAPI
8514 LONG
8515 DDKAPI
8516 KeReadStateEvent(
8517 IN PRKEVENT Event);
8518
8519 NTOSAPI
8520 LONG
8521 DDKAPI
8522 KeReadStateMutex(
8523 IN PRKMUTEX Mutex);
8524
8525
8526 NTOSAPI
8527 LONG
8528 DDKAPI
8529 KeReadStateSemaphore(
8530 IN PRKSEMAPHORE Semaphore);
8531
8532 NTOSAPI
8533 BOOLEAN
8534 DDKAPI
8535 KeReadStateTimer(
8536 IN PKTIMER Timer);
8537
8538 NTOSAPI
8539 BOOLEAN
8540 DDKAPI
8541 KeRegisterBugCheckCallback(
8542 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
8543 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
8544 IN PVOID Buffer,
8545 IN ULONG Length,
8546 IN PUCHAR Component);
8547
8548 NTHALAPI
8549 VOID
8550 DDKFASTAPI
8551 KeReleaseInStackQueuedSpinLock(
8552 IN PKLOCK_QUEUE_HANDLE LockHandle);
8553
8554 NTOSAPI
8555 VOID
8556 DDKFASTAPI
8557 KeReleaseInStackQueuedSpinLockFromDpcLevel(
8558 IN PKLOCK_QUEUE_HANDLE LockHandle);
8559
8560 NTOSAPI
8561 VOID
8562 DDKAPI
8563 KeReleaseInterruptSpinLock(
8564 IN PKINTERRUPT Interrupt,
8565 IN KIRQL OldIrql);
8566
8567 NTOSAPI
8568 LONG
8569 DDKAPI
8570 KeReleaseMutex(
8571 IN PRKMUTEX Mutex,
8572 IN BOOLEAN Wait);
8573
8574 NTOSAPI
8575 LONG
8576 DDKAPI
8577 KeReleaseSemaphore(
8578 IN PRKSEMAPHORE Semaphore,
8579 IN KPRIORITY Increment,
8580 IN LONG Adjustment,
8581 IN BOOLEAN Wait);
8582
8583 NTOSAPI
8584 PKDEVICE_QUEUE_ENTRY
8585 DDKAPI
8586 KeRemoveByKeyDeviceQueue(
8587 IN PKDEVICE_QUEUE DeviceQueue,
8588 IN ULONG SortKey);
8589
8590 NTOSAPI
8591 PKDEVICE_QUEUE_ENTRY
8592 DDKAPI
8593 KeRemoveDeviceQueue(
8594 IN PKDEVICE_QUEUE DeviceQueue);
8595
8596 NTOSAPI
8597 BOOLEAN
8598 DDKAPI
8599 KeRemoveEntryDeviceQueue(
8600 IN PKDEVICE_QUEUE DeviceQueue,
8601 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
8602
8603 NTOSAPI
8604 BOOLEAN
8605 DDKAPI
8606 KeRemoveQueueDpc(
8607 IN PRKDPC Dpc);
8608
8609 NTOSAPI
8610 LONG
8611 DDKAPI
8612 KeResetEvent(
8613 IN PRKEVENT Event);
8614
8615 NTOSAPI
8616 NTSTATUS
8617 DDKAPI
8618 KeRestoreFloatingPointState(
8619 IN PKFLOATING_SAVE FloatSave);
8620
8621 NTOSAPI
8622 VOID
8623 DDKAPI
8624 KeRevertToUserAffinityThread(VOID);
8625
8626 NTOSAPI
8627 NTSTATUS
8628 DDKAPI
8629 KeSaveFloatingPointState(
8630 OUT PKFLOATING_SAVE FloatSave);
8631
8632 NTOSAPI
8633 LONG
8634 DDKAPI
8635 KeSetBasePriorityThread(
8636 IN PRKTHREAD Thread,
8637 IN LONG Increment);
8638
8639 NTOSAPI
8640 LONG
8641 DDKAPI
8642 KeSetEvent(
8643 IN PRKEVENT Event,
8644 IN KPRIORITY Increment,
8645 IN BOOLEAN Wait);
8646
8647 NTOSAPI
8648 VOID
8649 DDKAPI
8650 KeSetImportanceDpc(
8651 IN PRKDPC Dpc,
8652 IN KDPC_IMPORTANCE Importance);
8653
8654 NTOSAPI
8655 KPRIORITY
8656 DDKAPI
8657 KeSetPriorityThread(
8658 IN PKTHREAD Thread,
8659 IN KPRIORITY Priority);
8660
8661 NTOSAPI
8662 VOID
8663 DDKAPI
8664 KeSetSystemAffinityThread(
8665 IN KAFFINITY Affinity);
8666
8667 NTOSAPI
8668 VOID
8669 DDKAPI
8670 KeSetTargetProcessorDpc(
8671 IN PRKDPC Dpc,
8672 IN CCHAR Number);
8673
8674 NTOSAPI
8675 BOOLEAN
8676 DDKAPI
8677 KeSetTimer(
8678 IN PKTIMER Timer,
8679 IN LARGE_INTEGER DueTime,
8680 IN PKDPC Dpc OPTIONAL);
8681
8682 NTOSAPI
8683 BOOLEAN
8684 DDKAPI
8685 KeSetTimerEx(
8686 IN PKTIMER Timer,
8687 IN LARGE_INTEGER DueTime,
8688 IN LONG Period OPTIONAL,
8689 IN PKDPC Dpc OPTIONAL);
8690
8691 NTOSAPI
8692 VOID
8693 DDKFASTAPI
8694 KeSetTimeUpdateNotifyRoutine(
8695 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine);
8696
8697 NTHALAPI
8698 VOID
8699 DDKAPI
8700 KeStallExecutionProcessor(
8701 IN ULONG MicroSeconds);
8702
8703 NTOSAPI
8704 BOOLEAN
8705 DDKAPI
8706 KeSynchronizeExecution(
8707 IN PKINTERRUPT Interrupt,
8708 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
8709 IN PVOID SynchronizeContext);
8710
8711 NTOSAPI
8712 NTSTATUS
8713 DDKAPI
8714 KeWaitForMultipleObjects(
8715 IN ULONG Count,
8716 IN PVOID Object[],
8717 IN WAIT_TYPE WaitType,
8718 IN KWAIT_REASON WaitReason,
8719 IN KPROCESSOR_MODE WaitMode,
8720 IN BOOLEAN Alertable,
8721 IN PLARGE_INTEGER Timeout OPTIONAL,
8722 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL);
8723
8724 NTOSAPI
8725 NTSTATUS
8726 DDKAPI
8727 KeWaitForMutexObject(
8728 IN PRKMUTEX Mutex,
8729 IN KWAIT_REASON WaitReason,
8730 IN KPROCESSOR_MODE WaitMode,
8731 IN BOOLEAN Alertable,
8732 IN PLARGE_INTEGER Timeout OPTIONAL);
8733
8734 NTOSAPI
8735 NTSTATUS
8736 DDKAPI
8737 KeWaitForSingleObject(
8738 IN PVOID Object,
8739 IN KWAIT_REASON WaitReason,
8740 IN KPROCESSOR_MODE WaitMode,
8741 IN BOOLEAN Alertable,
8742 IN PLARGE_INTEGER Timeout OPTIONAL);
8743
8744 #if defined(_X86_)
8745
8746 NTHALAPI
8747 VOID
8748 FASTCALL
8749 KfLowerIrql(
8750 IN KIRQL NewIrql);
8751
8752 NTHALAPI
8753 KIRQL
8754 FASTCALL
8755 KfRaiseIrql(
8756 IN KIRQL NewIrql);
8757
8758 NTHALAPI
8759 KIRQL
8760 DDKAPI
8761 KeRaiseIrqlToDpcLevel(
8762 VOID);
8763
8764 NTHALAPI
8765 KIRQL
8766 DDKAPI
8767 KeRaiseIrqlToSynchLevel(
8768 VOID);
8769
8770 #define KeLowerIrql(a) KfLowerIrql(a)
8771 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8772
8773 #else
8774
8775 NTOSAPI
8776 VOID
8777 DDKAPI
8778 KeLowerIrql(
8779 IN KIRQL NewIrql);
8780
8781 NTOSAPI
8782 KIRQL
8783 DDKAPI
8784 KeRaiseIrql(
8785 IN KIRQL NewIrql);
8786
8787 NTOSAPI
8788 KIRQL
8789 DDKAPI
8790 KeRaiseIrqlToDpcLevel(
8791 VOID);
8792
8793 #endif
8794
8795 /** Memory manager routines **/
8796
8797 NTOSAPI
8798 NTSTATUS
8799 DDKAPI
8800 MmAdvanceMdl(
8801 IN PMDL Mdl,
8802 IN ULONG NumberOfBytes);
8803
8804 NTOSAPI
8805 PVOID
8806 DDKAPI
8807 MmAllocateContiguousMemory(
8808 IN ULONG NumberOfBytes,
8809 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
8810
8811 NTOSAPI
8812 PVOID
8813 DDKAPI
8814 MmAllocateContiguousMemorySpecifyCache(
8815 IN SIZE_T NumberOfBytes,
8816 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
8817 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
8818 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
8819 IN MEMORY_CACHING_TYPE CacheType);
8820
8821 NTOSAPI
8822 PVOID
8823 DDKAPI
8824 MmAllocateMappingAddress(
8825 IN SIZE_T NumberOfBytes,
8826 IN ULONG PoolTag);
8827
8828 NTOSAPI
8829 PVOID
8830 DDKAPI
8831 MmAllocateNonCachedMemory(
8832 IN ULONG NumberOfBytes);
8833
8834 NTOSAPI
8835 PMDL
8836 DDKAPI
8837 MmAllocatePagesForMdl(
8838 IN PHYSICAL_ADDRESS LowAddress,
8839 IN PHYSICAL_ADDRESS HighAddress,
8840 IN PHYSICAL_ADDRESS SkipBytes,
8841 IN SIZE_T TotalBytes);
8842
8843 NTOSAPI
8844 VOID
8845 DDKAPI
8846 MmBuildMdlForNonPagedPool(
8847 IN OUT PMDL MemoryDescriptorList);
8848
8849 NTOSAPI
8850 NTSTATUS
8851 DDKAPI
8852 MmCreateSection(
8853 OUT PVOID *SectionObject,
8854 IN ACCESS_MASK DesiredAccess,
8855 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
8856 IN PLARGE_INTEGER MaximumSize,
8857 IN ULONG SectionPageProtection,
8858 IN ULONG AllocationAttributes,
8859 IN HANDLE FileHandle OPTIONAL,
8860 IN PFILE_OBJECT File OPTIONAL);
8861
8862 typedef enum _MMFLUSH_TYPE {
8863 MmFlushForDelete,
8864 MmFlushForWrite
8865 } MMFLUSH_TYPE;
8866
8867 NTOSAPI
8868 BOOLEAN
8869 DDKAPI
8870 MmFlushImageSection(
8871 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
8872 IN MMFLUSH_TYPE FlushType);
8873
8874 NTOSAPI
8875 VOID
8876 DDKAPI
8877 MmFreeContiguousMemory(
8878 IN PVOID BaseAddress);
8879
8880 NTOSAPI
8881 VOID
8882 DDKAPI
8883 MmFreeContiguousMemorySpecifyCache(
8884 IN PVOID BaseAddress,
8885 IN SIZE_T NumberOfBytes,
8886 IN MEMORY_CACHING_TYPE CacheType);
8887
8888 NTOSAPI
8889 VOID
8890 DDKAPI
8891 MmFreeMappingAddress(
8892 IN PVOID BaseAddress,
8893 IN ULONG PoolTag);
8894
8895 NTOSAPI
8896 VOID
8897 DDKAPI
8898 MmFreeNonCachedMemory(
8899 IN PVOID BaseAddress,
8900 IN SIZE_T NumberOfBytes);
8901
8902 NTOSAPI
8903 VOID
8904 DDKAPI
8905 MmFreePagesFromMdl(
8906 IN PMDL MemoryDescriptorList);
8907
8908 /*
8909 * ULONG
8910 * MmGetMdlByteCount(
8911 * IN PMDL Mdl)
8912 */
8913 #define MmGetMdlByteCount(_Mdl) \
8914 ((_Mdl)->ByteCount)
8915
8916 /*
8917 * ULONG
8918 * MmGetMdlByteOffset(
8919 * IN PMDL Mdl)
8920 */
8921 #define MmGetMdlByteOffset(_Mdl) \
8922 ((_Mdl)->ByteOffset)
8923
8924 /*
8925 * PPFN_NUMBER
8926 * MmGetMdlPfnArray(
8927 * IN PMDL Mdl)
8928 */
8929 #define MmGetMdlPfnArray(_Mdl) \
8930 ((PPFN_NUMBER) ((_Mdl) + 1))
8931
8932 /*
8933 * PVOID
8934 * MmGetMdlVirtualAddress(
8935 * IN PMDL Mdl)
8936 */
8937 #define MmGetMdlVirtualAddress(_Mdl) \
8938 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
8939
8940 NTOSAPI
8941 PHYSICAL_ADDRESS
8942 DDKAPI
8943 MmGetPhysicalAddress(
8944 IN PVOID BaseAddress);
8945
8946 NTOSAPI
8947 PPHYSICAL_MEMORY_RANGE
8948 DDKAPI
8949 MmGetPhysicalMemoryRanges(
8950 VOID);
8951
8952 NTOSAPI
8953 PVOID
8954 DDKAPI
8955 MmGetVirtualForPhysical(
8956 IN PHYSICAL_ADDRESS PhysicalAddress);
8957
8958 NTOSAPI
8959 PVOID
8960 DDKAPI
8961 MmMapLockedPagesSpecifyCache(
8962 IN PMDL MemoryDescriptorList,
8963 IN KPROCESSOR_MODE AccessMode,
8964 IN MEMORY_CACHING_TYPE CacheType,
8965 IN PVOID BaseAddress,
8966 IN ULONG BugCheckOnFailure,
8967 IN MM_PAGE_PRIORITY Priority);
8968
8969 NTOSAPI
8970 PVOID
8971 DDKAPI
8972 MmMapLockedPagesWithReservedMapping(
8973 IN PVOID MappingAddress,
8974 IN ULONG PoolTag,
8975 IN PMDL MemoryDescriptorList,
8976 IN MEMORY_CACHING_TYPE CacheType);
8977
8978 NTOSAPI
8979 NTSTATUS
8980 DDKAPI
8981 MmMapUserAddressesToPage(
8982 IN PVOID BaseAddress,
8983 IN SIZE_T NumberOfBytes,
8984 IN PVOID PageAddress);
8985
8986 NTOSAPI
8987 PVOID
8988 DDKAPI
8989 MmMapVideoDisplay(
8990 IN PHYSICAL_ADDRESS PhysicalAddress,
8991 IN SIZE_T NumberOfBytes,
8992 IN MEMORY_CACHING_TYPE CacheType);
8993
8994 NTOSAPI
8995 NTSTATUS
8996 DDKAPI
8997 MmMapViewInSessionSpace(
8998 IN PVOID Section,
8999 OUT PVOID *MappedBase,
9000 IN OUT PSIZE_T ViewSize);
9001
9002 NTOSAPI
9003 NTSTATUS
9004 DDKAPI
9005 MmMapViewInSystemSpace(
9006 IN PVOID Section,
9007 OUT PVOID *MappedBase,
9008 IN PSIZE_T ViewSize);
9009
9010 NTOSAPI
9011 NTSTATUS
9012 DDKAPI
9013 MmMarkPhysicalMemoryAsBad(
9014 IN PPHYSICAL_ADDRESS StartAddress,
9015 IN OUT PLARGE_INTEGER NumberOfBytes);
9016
9017 NTOSAPI
9018 NTSTATUS
9019 DDKAPI
9020 MmMarkPhysicalMemoryAsGood(
9021 IN PPHYSICAL_ADDRESS StartAddress,
9022 IN OUT PLARGE_INTEGER NumberOfBytes);
9023
9024 /*
9025 * PVOID
9026 * MmGetSystemAddressForMdlSafe(
9027 * IN PMDL Mdl,
9028 * IN MM_PAGE_PRIORITY Priority)
9029 */
9030 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
9031 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
9032 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
9033 (_Mdl)->MappedSystemVa : \
9034 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
9035 KernelMode, MmCached, NULL, FALSE, _Priority)
9036
9037 NTOSAPI
9038 PVOID
9039 DDKAPI
9040 MmGetSystemRoutineAddress(
9041 IN PUNICODE_STRING SystemRoutineName);
9042
9043 /*
9044 * ULONG
9045 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
9046 * IN PVOID Va,
9047 * IN ULONG Size)
9048 */
9049 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
9050 _Size) \
9051 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
9052 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
9053
9054 /*
9055 * VOID
9056 * MmInitializeMdl(
9057 * IN PMDL MemoryDescriptorList,
9058 * IN PVOID BaseVa,
9059 * IN SIZE_T Length)
9060 */
9061 #define MmInitializeMdl(_MemoryDescriptorList, \
9062 _BaseVa, \
9063 _Length) \
9064 { \
9065 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
9066 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
9067 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
9068 (_MemoryDescriptorList)->MdlFlags = 0; \
9069 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
9070 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
9071 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
9072 }
9073
9074 NTOSAPI
9075 BOOLEAN
9076 DDKAPI
9077 MmIsAddressValid(
9078 IN PVOID VirtualAddress);
9079
9080 NTOSAPI
9081 LOGICAL
9082 DDKAPI
9083 MmIsDriverVerifying(
9084 IN PDRIVER_OBJECT DriverObject);
9085
9086 NTOSAPI
9087 BOOLEAN
9088 DDKAPI
9089 MmIsThisAnNtAsSystem(
9090 VOID);
9091
9092 NTOSAPI
9093 NTSTATUS
9094 DDKAPI
9095 MmIsVerifierEnabled(
9096 OUT PULONG VerifierFlags);
9097
9098 NTOSAPI
9099 PVOID
9100 DDKAPI
9101 MmLockPagableDataSection(
9102 IN PVOID AddressWithinSection);
9103
9104 NTOSAPI
9105 PVOID
9106 DDKAPI
9107 MmLockPagableImageSection(
9108 IN PVOID AddressWithinSection);
9109
9110 /*
9111 * PVOID
9112 * MmLockPagableCodeSection(
9113 * IN PVOID AddressWithinSection)
9114 */
9115 #define MmLockPagableCodeSection MmLockPagableDataSection
9116
9117 NTOSAPI
9118 VOID
9119 DDKAPI
9120 MmLockPagableSectionByHandle(
9121 IN PVOID ImageSectionHandle);
9122
9123 NTOSAPI
9124 PVOID
9125 DDKAPI
9126 MmMapIoSpace(
9127 IN PHYSICAL_ADDRESS PhysicalAddress,
9128 IN ULONG NumberOfBytes,
9129 IN MEMORY_CACHING_TYPE CacheEnable);
9130
9131 NTOSAPI
9132 PVOID
9133 DDKAPI
9134 MmMapLockedPages(
9135 IN PMDL MemoryDescriptorList,
9136 IN KPROCESSOR_MODE AccessMode);
9137
9138 NTOSAPI
9139 VOID
9140 DDKAPI
9141 MmPageEntireDriver(
9142 IN PVOID AddressWithinSection);
9143
9144 NTOSAPI
9145 VOID
9146 DDKAPI
9147 MmProbeAndLockProcessPages(
9148 IN OUT PMDL MemoryDescriptorList,
9149 IN PEPROCESS Process,
9150 IN KPROCESSOR_MODE AccessMode,
9151 IN LOCK_OPERATION Operation);
9152
9153 NTOSAPI
9154 NTSTATUS
9155 DDKAPI
9156 MmProtectMdlSystemAddress(
9157 IN PMDL MemoryDescriptorList,
9158 IN ULONG NewProtect);
9159
9160 NTOSAPI
9161 VOID
9162 DDKAPI
9163 MmUnmapLockedPages(
9164 IN PVOID BaseAddress,
9165 IN PMDL MemoryDescriptorList);
9166
9167 NTOSAPI
9168 NTSTATUS
9169 DDKAPI
9170 MmUnmapViewInSessionSpace(
9171 IN PVOID MappedBase);
9172
9173 NTOSAPI
9174 NTSTATUS
9175 DDKAPI
9176 MmUnmapViewInSystemSpace(
9177 IN PVOID MappedBase);
9178
9179 NTOSAPI
9180 VOID
9181 DDKAPI
9182 MmUnsecureVirtualMemory(
9183 IN HANDLE SecureHandle);
9184
9185 /*
9186 * VOID
9187 * MmPrepareMdlForReuse(
9188 * IN PMDL Mdl)
9189 */
9190 #define MmPrepareMdlForReuse(_Mdl) \
9191 { \
9192 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
9193 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
9194 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
9195 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
9196 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
9197 } \
9198 }
9199
9200 NTOSAPI
9201 VOID
9202 DDKAPI
9203 MmProbeAndLockPages(
9204 IN OUT PMDL MemoryDescriptorList,
9205 IN KPROCESSOR_MODE AccessMode,
9206 IN LOCK_OPERATION Operation);
9207
9208 NTOSAPI
9209 MM_SYSTEM_SIZE
9210 DDKAPI
9211 MmQuerySystemSize(
9212 VOID);
9213
9214 NTOSAPI
9215 NTSTATUS
9216 DDKAPI
9217 MmRemovePhysicalMemory(
9218 IN PPHYSICAL_ADDRESS StartAddress,
9219 IN OUT PLARGE_INTEGER NumberOfBytes);
9220
9221 NTOSAPI
9222 VOID
9223 DDKAPI
9224 MmResetDriverPaging(
9225 IN PVOID AddressWithinSection);
9226
9227 NTOSAPI
9228 HANDLE
9229 DDKAPI
9230 MmSecureVirtualMemory(
9231 IN PVOID Address,
9232 IN SIZE_T Size,
9233 IN ULONG ProbeMode);
9234
9235 NTOSAPI
9236 ULONG
9237 DDKAPI
9238 MmSizeOfMdl(
9239 IN PVOID Base,
9240 IN SIZE_T Length);
9241
9242 NTOSAPI
9243 VOID
9244 DDKAPI
9245 MmUnlockPagableImageSection(
9246 IN PVOID ImageSectionHandle);
9247
9248 NTOSAPI
9249 VOID
9250 DDKAPI
9251 MmUnlockPages(
9252 IN PMDL MemoryDescriptorList);
9253
9254 NTOSAPI
9255 VOID
9256 DDKAPI
9257 MmUnmapIoSpace(
9258 IN PVOID BaseAddress,
9259 IN SIZE_T NumberOfBytes);
9260
9261 NTOSAPI
9262 VOID
9263 DDKAPI
9264 MmUnmapReservedMapping(
9265 IN PVOID BaseAddress,
9266 IN ULONG PoolTag,
9267 IN PMDL MemoryDescriptorList);
9268
9269 NTOSAPI
9270 VOID
9271 DDKAPI
9272 MmUnmapVideoDisplay(
9273 IN PVOID BaseAddress,
9274 IN SIZE_T NumberOfBytes);
9275
9276
9277
9278 /** Object manager routines **/
9279
9280 NTOSAPI
9281 NTSTATUS
9282 DDKAPI
9283 ObAssignSecurity(
9284 IN PACCESS_STATE AccessState,
9285 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9286 IN PVOID Object,
9287 IN POBJECT_TYPE Type);
9288
9289 NTOSAPI
9290 VOID
9291 DDKAPI
9292 ObDereferenceSecurityDescriptor(
9293 PSECURITY_DESCRIPTOR SecurityDescriptor,
9294 ULONG Count);
9295
9296 NTOSAPI
9297 VOID
9298 DDKFASTAPI
9299 ObfDereferenceObject(
9300 IN PVOID Object);
9301
9302 /*
9303 * VOID
9304 * ObDereferenceObject(
9305 * IN PVOID Object)
9306 */
9307 #define ObDereferenceObject ObfDereferenceObject
9308
9309 NTOSAPI
9310 NTSTATUS
9311 DDKAPI
9312 ObGetObjectSecurity(
9313 IN PVOID Object,
9314 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
9315 OUT PBOOLEAN MemoryAllocated);
9316
9317 NTOSAPI
9318 NTSTATUS
9319 DDKAPI
9320 ObInsertObject(
9321 IN PVOID Object,
9322 IN PACCESS_STATE PassedAccessState OPTIONAL,
9323 IN ACCESS_MASK DesiredAccess,
9324 IN ULONG AdditionalReferences,
9325 OUT PVOID* ReferencedObject OPTIONAL,
9326 OUT PHANDLE Handle);
9327
9328 NTOSAPI
9329 VOID
9330 DDKFASTAPI
9331 ObfReferenceObject(
9332 IN PVOID Object);
9333
9334 NTOSAPI
9335 NTSTATUS
9336 DDKAPI
9337 ObLogSecurityDescriptor(
9338 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
9339 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
9340 IN ULONG RefBias);
9341 /*
9342 * VOID
9343 * ObReferenceObject(
9344 * IN PVOID Object)
9345 */
9346 #define ObReferenceObject ObfReferenceObject
9347
9348 NTOSAPI
9349 VOID
9350 DDKAPI
9351 ObMakeTemporaryObject(
9352 IN PVOID Object);
9353
9354 NTOSAPI
9355 NTSTATUS
9356 DDKAPI
9357 ObOpenObjectByName(
9358 IN POBJECT_ATTRIBUTES ObjectAttributes,
9359 IN POBJECT_TYPE ObjectType,
9360 IN OUT PVOID ParseContext OPTIONAL,
9361 IN KPROCESSOR_MODE AccessMode,
9362 IN ACCESS_MASK DesiredAccess,
9363 IN PACCESS_STATE PassedAccessState,
9364 OUT PHANDLE Handle);
9365
9366 NTOSAPI
9367 NTSTATUS
9368 DDKAPI
9369 ObOpenObjectByPointer(
9370 IN PVOID Object,
9371 IN ULONG HandleAttributes,
9372 IN PACCESS_STATE PassedAccessState OPTIONAL,
9373 IN ACCESS_MASK DesiredAccess OPTIONAL,
9374 IN POBJECT_TYPE ObjectType OPTIONAL,
9375 IN KPROCESSOR_MODE AccessMode,
9376 OUT PHANDLE Handle);
9377
9378 NTOSAPI
9379 NTSTATUS
9380 DDKAPI
9381 ObQueryObjectAuditingByHandle(
9382 IN HANDLE Handle,
9383 OUT PBOOLEAN GenerateOnClose);
9384
9385 NTOSAPI
9386 NTSTATUS
9387 DDKAPI
9388 ObReferenceObjectByHandle(
9389 IN HANDLE Handle,
9390 IN ACCESS_MASK DesiredAccess,
9391 IN POBJECT_TYPE ObjectType OPTIONAL,
9392 IN KPROCESSOR_MODE AccessMode,
9393 OUT PVOID *Object,
9394 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
9395
9396 NTOSAPI
9397 NTSTATUS
9398 DDKAPI
9399 ObReferenceObjectByName(
9400 IN PUNICODE_STRING ObjectPath,
9401 IN ULONG Attributes,
9402 IN PACCESS_STATE PassedAccessState OPTIONAL,
9403 IN ACCESS_MASK DesiredAccess OPTIONAL,
9404 IN POBJECT_TYPE ObjectType,
9405 IN KPROCESSOR_MODE AccessMode,
9406 IN OUT PVOID ParseContext OPTIONAL,
9407 OUT PVOID *Object);
9408
9409 NTOSAPI
9410 NTSTATUS
9411 DDKAPI
9412 ObReferenceObjectByPointer(
9413 IN PVOID Object,
9414 IN ACCESS_MASK DesiredAccess,
9415 IN POBJECT_TYPE ObjectType,
9416 IN KPROCESSOR_MODE AccessMode);
9417
9418 NTOSAPI
9419 VOID
9420 DDKAPI
9421 ObReferenceSecurityDescriptor(
9422 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9423 IN ULONG Count);
9424
9425 NTOSAPI
9426 VOID
9427 DDKAPI
9428 ObReleaseObjectSecurity(
9429 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9430 IN BOOLEAN MemoryAllocated);
9431
9432
9433
9434 /** Process manager routines **/
9435
9436 NTOSAPI
9437 NTSTATUS
9438 DDKAPI
9439 PsCreateSystemProcess(
9440 IN PHANDLE ProcessHandle,
9441 IN ACCESS_MASK DesiredAccess,
9442 IN POBJECT_ATTRIBUTES ObjectAttributes);
9443
9444 NTOSAPI
9445 NTSTATUS
9446 DDKAPI
9447 PsCreateSystemThread(
9448 OUT PHANDLE ThreadHandle,
9449 IN ULONG DesiredAccess,
9450 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9451 IN HANDLE ProcessHandle OPTIONAL,
9452 OUT PCLIENT_ID ClientId OPTIONAL,
9453 IN PKSTART_ROUTINE StartRoutine,
9454 IN PVOID StartContext);
9455
9456 /*
9457 * PEPROCESS
9458 * PsGetCurrentProcess(VOID)
9459 */
9460 #define PsGetCurrentProcess IoGetCurrentProcess
9461
9462 NTOSAPI
9463 HANDLE
9464 DDKAPI
9465 PsGetCurrentProcessId(
9466 VOID);
9467
9468 /*
9469 * PETHREAD
9470 * PsGetCurrentThread(VOID)
9471 */
9472 #define PsGetCurrentThread() \
9473 ((PETHREAD) KeGetCurrentThread())
9474
9475 NTOSAPI
9476 HANDLE
9477 DDKAPI
9478 PsGetCurrentThreadId(
9479 VOID);
9480
9481 NTOSAPI
9482 BOOLEAN
9483 DDKAPI
9484 PsGetVersion(
9485 PULONG MajorVersion OPTIONAL,
9486 PULONG MinorVersion OPTIONAL,
9487 PULONG BuildNumber OPTIONAL,
9488 PUNICODE_STRING CSDVersion OPTIONAL);
9489
9490 NTOSAPI
9491 NTSTATUS
9492 DDKAPI
9493 PsRemoveCreateThreadNotifyRoutine(
9494 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9495
9496 NTOSAPI
9497 NTSTATUS
9498 DDKAPI
9499 PsRemoveLoadImageNotifyRoutine(
9500 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9501
9502 NTOSAPI
9503 NTSTATUS
9504 DDKAPI
9505 PsSetCreateProcessNotifyRoutine(
9506 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
9507 IN BOOLEAN Remove);
9508
9509 NTOSAPI
9510 NTSTATUS
9511 DDKAPI
9512 PsSetCreateThreadNotifyRoutine(
9513 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
9514
9515 NTOSAPI
9516 NTSTATUS
9517 DDKAPI
9518 PsSetLoadImageNotifyRoutine(
9519 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
9520
9521 NTOSAPI
9522 NTSTATUS
9523 DDKAPI
9524 PsTerminateSystemThread(
9525 IN NTSTATUS ExitStatus);
9526
9527
9528
9529 /** Security reference monitor routines **/
9530
9531 NTOSAPI
9532 BOOLEAN
9533 DDKAPI
9534 SeAccessCheck(
9535 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
9536 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
9537 IN BOOLEAN SubjectContextLocked,
9538 IN ACCESS_MASK DesiredAccess,
9539 IN ACCESS_MASK PreviouslyGrantedAccess,
9540 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
9541 IN PGENERIC_MAPPING GenericMapping,
9542 IN KPROCESSOR_MODE AccessMode,
9543 OUT PACCESS_MASK GrantedAccess,
9544 OUT PNTSTATUS AccessStatus);
9545
9546 NTOSAPI
9547 NTSTATUS
9548 DDKAPI
9549 SeAssignSecurity(
9550 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9551 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9552 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9553 IN BOOLEAN IsDirectoryObject,
9554 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9555 IN PGENERIC_MAPPING GenericMapping,
9556 IN POOL_TYPE PoolType);
9557
9558 NTOSAPI
9559 NTSTATUS
9560 DDKAPI
9561 SeAssignSecurityEx(
9562 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
9563 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
9564 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
9565 IN GUID *ObjectType OPTIONAL,
9566 IN BOOLEAN IsDirectoryObject,
9567 IN ULONG AutoInheritFlags,
9568 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
9569 IN PGENERIC_MAPPING GenericMapping,
9570 IN POOL_TYPE PoolType);
9571
9572 NTOSAPI
9573 NTSTATUS
9574 DDKAPI
9575 SeDeassignSecurity(
9576 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
9577
9578 NTOSAPI
9579 BOOLEAN
9580 DDKAPI
9581 SeSinglePrivilegeCheck(
9582 LUID PrivilegeValue,
9583 KPROCESSOR_MODE PreviousMode);
9584
9585 NTOSAPI
9586 BOOLEAN
9587 DDKAPI
9588 SeValidSecurityDescriptor(
9589 IN ULONG Length,
9590 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
9591
9592
9593
9594 /** NtXxx routines **/
9595
9596 NTOSAPI
9597 NTSTATUS
9598 DDKAPI
9599 NtOpenProcess(
9600 OUT PHANDLE ProcessHandle,
9601 IN ACCESS_MASK DesiredAccess,
9602 IN POBJECT_ATTRIBUTES ObjectAttributes,
9603 IN PCLIENT_ID ClientId OPTIONAL);
9604
9605 NTOSAPI
9606 NTSTATUS
9607 DDKAPI
9608 NtQueryInformationProcess(
9609 IN HANDLE ProcessHandle,
9610 IN PROCESSINFOCLASS ProcessInformationClass,
9611 OUT PVOID ProcessInformation,
9612 IN ULONG ProcessInformationLength,
9613 OUT PULONG ReturnLength OPTIONAL);
9614
9615
9616
9617 /** NtXxx and ZwXxx routines **/
9618
9619 NTOSAPI
9620 NTSTATUS
9621 DDKAPI
9622 ZwCancelTimer(
9623 IN HANDLE TimerHandle,
9624 OUT PBOOLEAN CurrentState OPTIONAL);
9625
9626 NTOSAPI
9627 NTSTATUS
9628 DDKAPI
9629 NtClose(
9630 IN HANDLE Handle);
9631
9632 NTOSAPI
9633 NTSTATUS
9634 DDKAPI
9635 ZwClose(
9636 IN HANDLE Handle);
9637
9638 NTOSAPI
9639 NTSTATUS
9640 DDKAPI
9641 ZwCreateDirectoryObject(
9642 OUT PHANDLE DirectoryHandle,
9643 IN ACCESS_MASK DesiredAccess,
9644 IN POBJECT_ATTRIBUTES ObjectAttributes);
9645
9646 NTOSAPI
9647 NTSTATUS
9648 DDKAPI
9649 NtCreateEvent(
9650 OUT PHANDLE EventHandle,
9651 IN ACCESS_MASK DesiredAccess,
9652 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9653 IN EVENT_TYPE EventType,
9654 IN BOOLEAN InitialState);
9655
9656 NTOSAPI
9657 NTSTATUS
9658 DDKAPI
9659 ZwCreateEvent(
9660 OUT PHANDLE EventHandle,
9661 IN ACCESS_MASK DesiredAccess,
9662 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9663 IN EVENT_TYPE EventType,
9664 IN BOOLEAN InitialState);
9665
9666 NTOSAPI
9667 NTSTATUS
9668 DDKAPI
9669 ZwCreateFile(
9670 OUT PHANDLE FileHandle,
9671 IN ACCESS_MASK DesiredAccess,
9672 IN POBJECT_ATTRIBUTES ObjectAttributes,
9673 OUT PIO_STATUS_BLOCK IoStatusBlock,
9674 IN PLARGE_INTEGER AllocationSize OPTIONAL,
9675 IN ULONG FileAttributes,
9676 IN ULONG ShareAccess,
9677 IN ULONG CreateDisposition,
9678 IN ULONG CreateOptions,
9679 IN PVOID EaBuffer OPTIONAL,
9680 IN ULONG EaLength);
9681
9682 NTOSAPI
9683 NTSTATUS
9684 DDKAPI
9685 ZwCreateKey(
9686 OUT PHANDLE KeyHandle,
9687 IN ACCESS_MASK DesiredAccess,
9688 IN POBJECT_ATTRIBUTES ObjectAttributes,
9689 IN ULONG TitleIndex,
9690 IN PUNICODE_STRING Class OPTIONAL,
9691 IN ULONG CreateOptions,
9692 OUT PULONG Disposition OPTIONAL);
9693
9694 NTOSAPI
9695 NTSTATUS
9696 DDKAPI
9697 ZwCreateTimer(
9698 OUT PHANDLE TimerHandle,
9699 IN ACCESS_MASK DesiredAccess,
9700 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
9701 IN TIMER_TYPE TimerType);
9702
9703 NTOSAPI
9704 NTSTATUS
9705 DDKAPI
9706 ZwDeleteKey(
9707 IN HANDLE KeyHandle);
9708
9709 NTOSAPI
9710 NTSTATUS
9711 DDKAPI
9712 ZwDeleteValueKey(
9713 IN HANDLE KeyHandle,
9714 IN PUNICODE_STRING ValueName);
9715
9716 NTOSAPI
9717 NTSTATUS
9718 DDKAPI
9719 NtDeviceIoControlFile(
9720 IN HANDLE DeviceHandle,
9721 IN HANDLE Event OPTIONAL,
9722 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9723 IN PVOID UserApcContext OPTIONAL,
9724 OUT PIO_STATUS_BLOCK IoStatusBlock,
9725 IN ULONG IoControlCode,
9726 IN PVOID InputBuffer,
9727 IN ULONG InputBufferSize,
9728 OUT PVOID OutputBuffer,
9729 IN ULONG OutputBufferSize);
9730
9731 NTOSAPI
9732 NTSTATUS
9733 DDKAPI
9734 ZwDeviceIoControlFile(
9735 IN HANDLE DeviceHandle,
9736 IN HANDLE Event OPTIONAL,
9737 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
9738 IN PVOID UserApcContext OPTIONAL,
9739 OUT PIO_STATUS_BLOCK IoStatusBlock,
9740 IN ULONG IoControlCode,
9741 IN PVOID InputBuffer,
9742 IN ULONG InputBufferSize,
9743 OUT PVOID OutputBuffer,
9744 IN ULONG OutputBufferSize);
9745
9746 NTOSAPI
9747 NTSTATUS
9748 DDKAPI
9749 ZwEnumerateKey(
9750 IN HANDLE KeyHandle,
9751 IN ULONG Index,
9752 IN KEY_INFORMATION_CLASS KeyInformationClass,
9753 OUT PVOID KeyInformation,
9754 IN ULONG Length,
9755 OUT PULONG ResultLength);
9756
9757 NTOSAPI
9758 NTSTATUS
9759 DDKAPI
9760 ZwEnumerateValueKey(
9761 IN HANDLE KeyHandle,
9762 IN ULONG Index,
9763 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9764 OUT PVOID KeyValueInformation,
9765 IN ULONG Length,
9766 OUT PULONG ResultLength);
9767
9768 NTOSAPI
9769 NTSTATUS
9770 DDKAPI
9771 ZwFlushKey(
9772 IN HANDLE KeyHandle);
9773
9774 NTOSAPI
9775 NTSTATUS
9776 DDKAPI
9777 ZwMakeTemporaryObject(
9778 IN HANDLE Handle);
9779
9780 NTOSAPI
9781 NTSTATUS
9782 DDKAPI
9783 NtMapViewOfSection(
9784 IN HANDLE SectionHandle,
9785 IN HANDLE ProcessHandle,
9786 IN OUT PVOID *BaseAddress,
9787 IN ULONG ZeroBits,
9788 IN ULONG CommitSize,
9789 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9790 IN OUT PSIZE_T ViewSize,
9791 IN SECTION_INHERIT InheritDisposition,
9792 IN ULONG AllocationType,
9793 IN ULONG Protect);
9794
9795 NTOSAPI
9796 NTSTATUS
9797 DDKAPI
9798 ZwMapViewOfSection(
9799 IN HANDLE SectionHandle,
9800 IN HANDLE ProcessHandle,
9801 IN OUT PVOID *BaseAddress,
9802 IN ULONG ZeroBits,
9803 IN ULONG CommitSize,
9804 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
9805 IN OUT PSIZE_T ViewSize,
9806 IN SECTION_INHERIT InheritDisposition,
9807 IN ULONG AllocationType,
9808 IN ULONG Protect);
9809
9810 NTOSAPI
9811 NTSTATUS
9812 DDKAPI
9813 NtOpenFile(
9814 OUT PHANDLE FileHandle,
9815 IN ACCESS_MASK DesiredAccess,
9816 IN POBJECT_ATTRIBUTES ObjectAttributes,
9817 OUT PIO_STATUS_BLOCK IoStatusBlock,
9818 IN ULONG ShareAccess,
9819 IN ULONG OpenOptions);
9820
9821 NTOSAPI
9822 NTSTATUS
9823 DDKAPI
9824 ZwOpenFile(
9825 OUT PHANDLE FileHandle,
9826 IN ACCESS_MASK DesiredAccess,
9827 IN POBJECT_ATTRIBUTES ObjectAttributes,
9828 OUT PIO_STATUS_BLOCK IoStatusBlock,
9829 IN ULONG ShareAccess,
9830 IN ULONG OpenOptions);
9831
9832 NTOSAPI
9833 NTSTATUS
9834 DDKAPI
9835 ZwOpenKey(
9836 OUT PHANDLE KeyHandle,
9837 IN ACCESS_MASK DesiredAccess,
9838 IN POBJECT_ATTRIBUTES ObjectAttributes);
9839
9840 NTOSAPI
9841 NTSTATUS
9842 DDKAPI
9843 ZwOpenSection(
9844 OUT PHANDLE SectionHandle,
9845 IN ACCESS_MASK DesiredAccess,
9846 IN POBJECT_ATTRIBUTES ObjectAttributes);
9847
9848 NTOSAPI
9849 NTSTATUS
9850 DDKAPI
9851 ZwOpenSymbolicLinkObject(
9852 OUT PHANDLE LinkHandle,
9853 IN ACCESS_MASK DesiredAccess,
9854 IN POBJECT_ATTRIBUTES ObjectAttributes);
9855
9856 NTOSAPI
9857 NTSTATUS
9858 DDKAPI
9859 ZwOpenTimer(
9860 OUT PHANDLE TimerHandle,
9861 IN ACCESS_MASK DesiredAccess,
9862 IN POBJECT_ATTRIBUTES ObjectAttributes);
9863
9864 NTOSAPI
9865 NTSTATUS
9866 DDKAPI
9867 ZwQueryInformationFile(
9868 IN HANDLE FileHandle,
9869 OUT PIO_STATUS_BLOCK IoStatusBlock,
9870 OUT PVOID FileInformation,
9871 IN ULONG Length,
9872 IN FILE_INFORMATION_CLASS FileInformationClass);
9873
9874 NTOSAPI
9875 NTSTATUS
9876 DDKAPI
9877 ZwQueryKey(
9878 IN HANDLE KeyHandle,
9879 IN KEY_INFORMATION_CLASS KeyInformationClass,
9880 OUT PVOID KeyInformation,
9881 IN ULONG Length,
9882 OUT PULONG ResultLength);
9883
9884 NTOSAPI
9885 NTSTATUS
9886 DDKAPI
9887 ZwQuerySymbolicLinkObject(
9888 IN HANDLE LinkHandle,
9889 IN OUT PUNICODE_STRING LinkTarget,
9890 OUT PULONG ReturnedLength OPTIONAL);
9891
9892 NTOSAPI
9893 NTSTATUS
9894 DDKAPI
9895 ZwQueryValueKey(
9896 IN HANDLE KeyHandle,
9897 IN PUNICODE_STRING ValueName,
9898 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
9899 OUT PVOID KeyValueInformation,
9900 IN ULONG Length,
9901 OUT PULONG ResultLength);
9902
9903 NTOSAPI
9904 NTSTATUS
9905 DDKAPI
9906 NtReadFile(
9907 IN HANDLE FileHandle,
9908 IN HANDLE Event OPTIONAL,
9909 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
9910 IN PVOID ApcContext OPTIONAL,
9911 OUT PIO_STATUS_BLOCK IoStatusBlock,
9912 OUT PVOID Buffer,
9913 IN ULONG Length,
9914 IN PLARGE_INTEGER ByteOffset OPTIONAL,
9915 IN PULONG Key OPTIONAL);
9916
9917 NTOSAPI
9918 NTSTATUS
9919 DDKAPI
9920 ZwReadFile(
9921 IN HANDLE FileHandle,
9922 IN HANDLE Event OPTIONAL,
9923 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
9924 IN PVOID ApcContext OPTIONAL,
9925 OUT PIO_STATUS_BLOCK IoStatusBlock,
9926 OUT PVOID Buffer,
9927 IN ULONG Length,
9928 IN PLARGE_INTEGER ByteOffset OPTIONAL,
9929 IN PULONG Key OPTIONAL);
9930
9931 NTOSAPI
9932 NTSTATUS
9933 DDKAPI
9934 NtSetEvent(
9935 IN HANDLE EventHandle,
9936 OUT PLONG PreviousState OPTIONAL);
9937
9938 NTOSAPI
9939 NTSTATUS
9940 DDKAPI
9941 ZwSetEvent(
9942 IN HANDLE EventHandle,
9943 OUT PLONG PreviousState OPTIONAL);
9944
9945 NTOSAPI
9946 NTSTATUS
9947 DDKAPI
9948 ZwSetInformationFile(
9949 IN HANDLE FileHandle,
9950 OUT PIO_STATUS_BLOCK IoStatusBlock,
9951 IN PVOID FileInformation,
9952 IN ULONG Length,
9953 IN FILE_INFORMATION_CLASS FileInformationClass);
9954
9955 NTOSAPI
9956 NTSTATUS
9957 DDKAPI
9958 ZwSetInformationThread(
9959 IN HANDLE ThreadHandle,
9960 IN THREADINFOCLASS ThreadInformationClass,
9961 IN PVOID ThreadInformation,
9962 IN ULONG ThreadInformationLength);
9963
9964 NTOSAPI
9965 NTSTATUS
9966 DDKAPI
9967 ZwSetTimer(
9968 IN HANDLE TimerHandle,
9969 IN PLARGE_INTEGER DueTime,
9970 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
9971 IN PVOID TimerContext OPTIONAL,
9972 IN BOOLEAN WakeTimer,
9973 IN LONG Period OPTIONAL,
9974 OUT PBOOLEAN PreviousState OPTIONAL);
9975
9976 NTOSAPI
9977 NTSTATUS
9978 DDKAPI
9979 ZwSetValueKey(
9980 IN HANDLE KeyHandle,
9981 IN PUNICODE_STRING ValueName,
9982 IN ULONG TitleIndex OPTIONAL,
9983 IN ULONG Type,
9984 IN PVOID Data,
9985 IN ULONG DataSize);
9986
9987 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
9988 #define AT_EXTENDABLE_FILE 0x00002000
9989 #define SEC_NO_CHANGE 0x00400000
9990 #define AT_RESERVED 0x20000000
9991 #define AT_ROUND_TO_PAGE 0x40000000
9992
9993 NTOSAPI
9994 NTSTATUS
9995 DDKAPI
9996 NtUnmapViewOfSection(
9997 IN HANDLE ProcessHandle,
9998 IN PVOID BaseAddress);
9999
10000 NTOSAPI
10001 NTSTATUS
10002 DDKAPI
10003 ZwUnmapViewOfSection(
10004 IN HANDLE ProcessHandle,
10005 IN PVOID BaseAddress);
10006
10007 NTOSAPI
10008 NTSTATUS
10009 DDKAPI
10010 NtWaitForSingleObject(
10011 IN HANDLE ObjectHandle,
10012 IN BOOLEAN Alertable,
10013 IN PLARGE_INTEGER TimeOut OPTIONAL);
10014
10015 NTOSAPI
10016 NTSTATUS
10017 DDKAPI
10018 ZwWaitForSingleObject(
10019 IN HANDLE ObjectHandle,
10020 IN BOOLEAN Alertable,
10021 IN PLARGE_INTEGER TimeOut OPTIONAL);
10022
10023 NTOSAPI
10024 NTSTATUS
10025 DDKAPI
10026 NtWriteFile(
10027 IN HANDLE FileHandle,
10028 IN HANDLE Event OPTIONAL,
10029 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10030 IN PVOID ApcContext OPTIONAL,
10031 OUT PIO_STATUS_BLOCK IoStatusBlock,
10032 IN PVOID Buffer,
10033 IN ULONG Length,
10034 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10035 IN PULONG Key OPTIONAL);
10036
10037 NTOSAPI
10038 NTSTATUS
10039 DDKAPI
10040 ZwWriteFile(
10041 IN HANDLE FileHandle,
10042 IN HANDLE Event OPTIONAL,
10043 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10044 IN PVOID ApcContext OPTIONAL,
10045 OUT PIO_STATUS_BLOCK IoStatusBlock,
10046 IN PVOID Buffer,
10047 IN ULONG Length,
10048 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10049 IN PULONG Key OPTIONAL);
10050
10051
10052
10053 /** Power management support routines **/
10054
10055 NTOSAPI
10056 NTSTATUS
10057 DDKAPI
10058 PoCallDriver(
10059 IN PDEVICE_OBJECT DeviceObject,
10060 IN OUT PIRP Irp);
10061
10062 NTOSAPI
10063 PULONG
10064 DDKAPI
10065 PoRegisterDeviceForIdleDetection(
10066 IN PDEVICE_OBJECT DeviceObject,
10067 IN ULONG ConservationIdleTime,
10068 IN ULONG PerformanceIdleTime,
10069 IN DEVICE_POWER_STATE State);
10070
10071 NTOSAPI
10072 PVOID
10073 DDKAPI
10074 PoRegisterSystemState(
10075 IN PVOID StateHandle,
10076 IN EXECUTION_STATE Flags);
10077
10078 NTOSAPI
10079 NTSTATUS
10080 DDKAPI
10081 PoRequestPowerIrp(
10082 IN PDEVICE_OBJECT DeviceObject,
10083 IN UCHAR MinorFunction,
10084 IN POWER_STATE PowerState,
10085 IN PREQUEST_POWER_COMPLETE CompletionFunction,
10086 IN PVOID Context,
10087 OUT PIRP *Irp OPTIONAL);
10088
10089 NTOSAPI
10090 NTSTATUS
10091 DDKAPI
10092 PoRequestShutdownEvent(
10093 OUT PVOID *Event);
10094
10095 NTOSAPI
10096 VOID
10097 DDKAPI
10098 PoSetDeviceBusy(
10099 PULONG IdlePointer);
10100
10101 NTOSAPI
10102 POWER_STATE
10103 DDKAPI
10104 PoSetPowerState(
10105 IN PDEVICE_OBJECT DeviceObject,
10106 IN POWER_STATE_TYPE Type,
10107 IN POWER_STATE State);
10108
10109 NTOSAPI
10110 VOID
10111 DDKAPI
10112 PoSetSystemState(
10113 IN EXECUTION_STATE Flags);
10114
10115 NTOSAPI
10116 VOID
10117 DDKAPI
10118 PoStartNextPowerIrp(
10119 IN PIRP Irp);
10120
10121 NTOSAPI
10122 VOID
10123 DDKAPI
10124 PoUnregisterSystemState(
10125 IN PVOID StateHandle);
10126
10127
10128
10129 /** WMI library support routines **/
10130
10131 NTOSAPI
10132 NTSTATUS
10133 DDKAPI
10134 WmiCompleteRequest(
10135 IN PDEVICE_OBJECT DeviceObject,
10136 IN PIRP Irp,
10137 IN NTSTATUS Status,
10138 IN ULONG BufferUsed,
10139 IN CCHAR PriorityBoost);
10140
10141 NTOSAPI
10142 NTSTATUS
10143 DDKAPI
10144 WmiFireEvent(
10145 IN PDEVICE_OBJECT DeviceObject,
10146 IN LPGUID Guid,
10147 IN ULONG InstanceIndex,
10148 IN ULONG EventDataSize,
10149 IN PVOID EventData);
10150
10151 NTOSAPI
10152 NTSTATUS
10153 DDKAPI
10154 WmiQueryTraceInformation(
10155 IN TRACE_INFORMATION_CLASS TraceInformationClass,
10156 OUT PVOID TraceInformation,
10157 IN ULONG TraceInformationLength,
10158 OUT PULONG RequiredLength OPTIONAL,
10159 IN PVOID Buffer OPTIONAL);
10160
10161 NTOSAPI
10162 NTSTATUS
10163 DDKAPI
10164 WmiSystemControl(
10165 IN PWMILIB_CONTEXT WmiLibInfo,
10166 IN PDEVICE_OBJECT DeviceObject,
10167 IN PIRP Irp,
10168 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
10169
10170 NTOSAPI
10171 NTSTATUS
10172 DDKCDECLAPI
10173 WmiTraceMessage(
10174 IN TRACEHANDLE LoggerHandle,
10175 IN ULONG MessageFlags,
10176 IN LPGUID MessageGuid,
10177 IN USHORT MessageNumber,
10178 IN ...);
10179
10180 #if 0
10181 /* FIXME: Get va_list from where? */
10182 NTOSAPI
10183 NTSTATUS
10184 DDKCDECLAPI
10185 WmiTraceMessageVa(
10186 IN TRACEHANDLE LoggerHandle,
10187 IN ULONG MessageFlags,
10188 IN LPGUID MessageGuid,
10189 IN USHORT MessageNumber,
10190 IN va_list MessageArgList);
10191 #endif
10192
10193
10194 /** Kernel debugger routines **/
10195
10196 NTOSAPI
10197 VOID
10198 DDKAPI
10199 KdDisableDebugger(
10200 VOID);
10201
10202 NTOSAPI
10203 VOID
10204 DDKAPI
10205 KdEnableDebugger(
10206 VOID);
10207
10208 VOID
10209 NTAPI
10210 DbgBreakPoint(
10211 VOID);
10212
10213 NTOSAPI
10214 VOID
10215 DDKAPI
10216 DbgBreakPointWithStatus(
10217 IN ULONG Status);
10218
10219 ULONG
10220 __cdecl
10221 DbgPrint(
10222 IN PCH Format,
10223 IN ...);
10224
10225 ULONG
10226 __cdecl
10227 DbgPrintEx(
10228 IN ULONG ComponentId,
10229 IN ULONG Level,
10230 IN PCH Format,
10231 IN ...);
10232
10233 NTOSAPI
10234 ULONG
10235 DDKCDECLAPI
10236 DbgPrintReturnControlC(
10237 IN PCH Format,
10238 IN ...);
10239
10240 NTOSAPI
10241 BOOLEAN
10242 DDKAPI
10243 DbgQueryDebugFilterState(
10244 IN ULONG ComponentId,
10245 IN ULONG Level);
10246
10247 NTOSAPI
10248 NTSTATUS
10249 DDKAPI
10250 DbgSetDebugFilterState(
10251 IN ULONG ComponentId,
10252 IN ULONG Level,
10253 IN BOOLEAN State);
10254
10255 #ifdef DBG
10256
10257 #define KdPrint(_x_) DbgPrint _x_
10258 #define KdPrintEx(_x_) DbgPrintEx _x_
10259 #define KdBreakPoint() DbgBreakPoint()
10260 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10261
10262 #else /* !DBG */
10263
10264 #define KdPrint(_x_)
10265 #define KdPrintEx(_x_)
10266 #define KdBreakPoint()
10267 #define KdBreakPointWithStatus(s)
10268
10269 #endif /* !DBG */
10270
10271 #if defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10272
10273 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
10274 extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
10275 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10276 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
10277
10278 #else
10279
10280 extern BOOLEAN KdDebuggerNotPresent;
10281 extern BOOLEAN KdDebuggerEnabled;
10282 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10283 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10284
10285 #endif
10286
10287 /* Available as intrinsics on MSVC */
10288 static __inline void _disable(void) {__asm__("cli\n\t");}
10289 static __inline void _enable(void) {__asm__("sti\n\t");}
10290
10291 #ifdef __cplusplus
10292 }
10293 #endif
10294
10295 #endif /* __WINDDK_H */