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