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