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