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