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