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