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