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