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