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