- Move more stuff to wdm.h
[reactos.git] / include / ddk / wdm.h
1 #ifndef _WDMDDK_
2 #define _WDMDDK_
3
4 /* Helper macro to enable gcc's extension. */
5 #ifndef __GNU_EXTENSION
6 #ifdef __GNUC__
7 #define __GNU_EXTENSION __extension__
8 #else
9 #define __GNU_EXTENSION
10 #endif
11 #endif
12
13 //
14 // Dependencies
15 //
16 #define NT_INCLUDED
17 #include <excpt.h>
18 #include <ntdef.h>
19 #include <ntstatus.h>
20
21 #ifndef GUID_DEFINED
22 #include <guiddef.h>
23 #endif /* GUID_DEFINED */
24
25 #include "intrin.h"
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
32
33 #define NTHALAPI DECLSPEC_IMPORT
34
35 #else
36
37 #define NTHALAPI
38
39 #endif
40
41 #define NTKERNELAPI DECLSPEC_IMPORT
42
43 #if defined(_WIN64)
44 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
45 #else
46 #define POINTER_ALIGNMENT
47 #endif
48
49 #ifdef _WIN64
50 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
51 #else
52 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
53 #endif
54
55
56 #if defined(_MSC_VER)
57
58 //
59 // Indicate if #pragma alloc_text() is supported
60 //
61 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
62 #define ALLOC_PRAGMA 1
63 #endif
64
65 //
66 // Indicate if #pragma data_seg() is supported
67 //
68 #if defined(_M_IX86) || defined(_M_AMD64)
69 #define ALLOC_DATA_PRAGMA 1
70 #endif
71
72 #endif
73
74
75 /*
76 * Alignment Macros
77 */
78 #define ALIGN_DOWN(s, t) \
79 ((ULONG)(s) & ~(sizeof(t) - 1))
80
81 #define ALIGN_UP(s, t) \
82 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
83
84 #define ALIGN_DOWN_POINTER(p, t) \
85 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
86
87 #define ALIGN_UP_POINTER(p, t) \
88 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
89
90 /*
91 * GUID Comparison
92 */
93
94 #ifndef __IID_ALIGNED__
95 #define __IID_ALIGNED__
96 #ifdef __cplusplus
97 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
98 {
99 return ((*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)));
100 }
101 #else
102 #define IsEqualGUIDAligned(guid1, guid2) \
103 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
104 #endif
105 #endif
106
107 #if defined(_WIN64)
108 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
109 #else
110 #define POINTER_ALIGNMENT
111 #endif
112
113 /*
114 ** Forward declarations
115 */
116
117 struct _IRP;
118 struct _MDL;
119 struct _KAPC;
120 struct _KDPC;
121 struct _FILE_OBJECT;
122 struct _DMA_ADAPTER;
123 struct _DEVICE_OBJECT;
124 struct _DRIVER_OBJECT;
125 struct _IO_STATUS_BLOCK;
126 struct _DEVICE_DESCRIPTION;
127 struct _SCATTER_GATHER_LIST;
128 struct _DRIVE_LAYOUT_INFORMATION;
129
130 struct _COMPRESSED_DATA_INFO;
131
132 typedef PVOID PSID;
133
134 /* Simple types */
135 typedef UCHAR KPROCESSOR_MODE;
136 typedef LONG KPRIORITY;
137 typedef PVOID PSECURITY_DESCRIPTOR;
138 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
139
140 /* Structures not exposed to drivers */
141 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
142 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
143 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
144 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
145 typedef struct _BUS_HANDLER *PBUS_HANDLER;
146
147 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
148 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
149 typedef struct _ETHREAD *PETHREAD;
150 typedef struct _EPROCESS *PEPROCESS;
151 typedef struct _IO_TIMER *PIO_TIMER;
152 typedef struct _KINTERRUPT *PKINTERRUPT;
153 typedef struct _KPROCESS *PKPROCESS;
154 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
155
156
157 typedef struct _CONTEXT *PCONTEXT;
158
159 /*
160 ** Simple structures
161 */
162
163 typedef UCHAR KIRQL, *PKIRQL;
164
165 typedef enum _MODE {
166 KernelMode,
167 UserMode,
168 MaximumMode
169 } MODE;
170
171 //
172 // Power States/Levels
173 //
174 typedef enum _SYSTEM_POWER_STATE {
175 PowerSystemUnspecified,
176 PowerSystemWorking,
177 PowerSystemSleeping1,
178 PowerSystemSleeping2,
179 PowerSystemSleeping3,
180 PowerSystemHibernate,
181 PowerSystemShutdown,
182 PowerSystemMaximum
183 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
184
185 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
186
187 typedef enum _POWER_INFORMATION_LEVEL {
188 SystemPowerPolicyAc,
189 SystemPowerPolicyDc,
190 VerifySystemPolicyAc,
191 VerifySystemPolicyDc,
192 SystemPowerCapabilities,
193 SystemBatteryState,
194 SystemPowerStateHandler,
195 ProcessorStateHandler,
196 SystemPowerPolicyCurrent,
197 AdministratorPowerPolicy,
198 SystemReserveHiberFile,
199 ProcessorInformation,
200 SystemPowerInformation,
201 ProcessorStateHandler2,
202 LastWakeTime,
203 LastSleepTime,
204 SystemExecutionState,
205 SystemPowerStateNotifyHandler,
206 ProcessorPowerPolicyAc,
207 ProcessorPowerPolicyDc,
208 VerifyProcessorPowerPolicyAc,
209 VerifyProcessorPowerPolicyDc,
210 ProcessorPowerPolicyCurrent
211 } POWER_INFORMATION_LEVEL;
212
213 typedef enum {
214 PowerActionNone,
215 PowerActionReserved,
216 PowerActionSleep,
217 PowerActionHibernate,
218 PowerActionShutdown,
219 PowerActionShutdownReset,
220 PowerActionShutdownOff,
221 PowerActionWarmEject
222 } POWER_ACTION, *PPOWER_ACTION;
223
224 typedef enum _DEVICE_POWER_STATE {
225 PowerDeviceUnspecified,
226 PowerDeviceD0,
227 PowerDeviceD1,
228 PowerDeviceD2,
229 PowerDeviceD3,
230 PowerDeviceMaximum
231 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
232
233 #define ES_SYSTEM_REQUIRED 0x00000001
234 #define ES_DISPLAY_REQUIRED 0x00000002
235 #define ES_USER_PRESENT 0x00000004
236 #define ES_CONTINUOUS 0x80000000
237
238 typedef ULONG EXECUTION_STATE;
239
240 typedef enum {
241 LT_DONT_CARE,
242 LT_LOWEST_LATENCY
243 } LATENCY_TIME;
244
245 /* Constants */
246 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
247 #define ZwCurrentProcess() NtCurrentProcess()
248 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
249 #define ZwCurrentThread() NtCurrentThread()
250
251 #if (_M_IX86)
252 #define KIP0PCRADDRESS 0xffdff000
253 #endif
254
255 #if defined(_WIN64)
256 #define MAXIMUM_PROCESSORS 64
257 #else
258 #define MAXIMUM_PROCESSORS 32
259 #endif
260
261 #define MAXIMUM_WAIT_OBJECTS 64
262
263 #define EX_RUNDOWN_ACTIVE 0x1
264 #define EX_RUNDOWN_COUNT_SHIFT 0x1
265 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
266
267 #define METHOD_BUFFERED 0
268 #define METHOD_IN_DIRECT 1
269 #define METHOD_OUT_DIRECT 2
270 #define METHOD_NEITHER 3
271
272 #define LOW_PRIORITY 0
273 #define LOW_REALTIME_PRIORITY 16
274 #define HIGH_PRIORITY 31
275 #define MAXIMUM_PRIORITY 32
276
277 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
278
279 #define MAXIMUM_FILENAME_LENGTH 256
280
281 #define FILE_SUPERSEDED 0x00000000
282 #define FILE_OPENED 0x00000001
283 #define FILE_CREATED 0x00000002
284 #define FILE_OVERWRITTEN 0x00000003
285 #define FILE_EXISTS 0x00000004
286 #define FILE_DOES_NOT_EXIST 0x00000005
287
288 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
289 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
290
291 /* also in winnt.h */
292 #define FILE_LIST_DIRECTORY 0x00000001
293 #define FILE_READ_DATA 0x00000001
294 #define FILE_ADD_FILE 0x00000002
295 #define FILE_WRITE_DATA 0x00000002
296 #define FILE_ADD_SUBDIRECTORY 0x00000004
297 #define FILE_APPEND_DATA 0x00000004
298 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
299 #define FILE_READ_EA 0x00000008
300 #define FILE_WRITE_EA 0x00000010
301 #define FILE_EXECUTE 0x00000020
302 #define FILE_TRAVERSE 0x00000020
303 #define FILE_DELETE_CHILD 0x00000040
304 #define FILE_READ_ATTRIBUTES 0x00000080
305 #define FILE_WRITE_ATTRIBUTES 0x00000100
306
307 #define FILE_SHARE_READ 0x00000001
308 #define FILE_SHARE_WRITE 0x00000002
309 #define FILE_SHARE_DELETE 0x00000004
310 #define FILE_SHARE_VALID_FLAGS 0x00000007
311
312 #define FILE_ATTRIBUTE_READONLY 0x00000001
313 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
314 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
315 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
316 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
317 #define FILE_ATTRIBUTE_DEVICE 0x00000040
318 #define FILE_ATTRIBUTE_NORMAL 0x00000080
319 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
320 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
321 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
322 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
323 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
324 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
325 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
326
327 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
328 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
329
330 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
331 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
332 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
333 #define FILE_VALID_SET_FLAGS 0x00000036
334
335 #define FILE_SUPERSEDE 0x00000000
336 #define FILE_OPEN 0x00000001
337 #define FILE_CREATE 0x00000002
338 #define FILE_OPEN_IF 0x00000003
339 #define FILE_OVERWRITE 0x00000004
340 #define FILE_OVERWRITE_IF 0x00000005
341 #define FILE_MAXIMUM_DISPOSITION 0x00000005
342
343 #define FILE_DIRECTORY_FILE 0x00000001
344 #define FILE_WRITE_THROUGH 0x00000002
345 #define FILE_SEQUENTIAL_ONLY 0x00000004
346 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
347 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
348 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
349 #define FILE_NON_DIRECTORY_FILE 0x00000040
350 #define FILE_CREATE_TREE_CONNECTION 0x00000080
351 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
352 #define FILE_NO_EA_KNOWLEDGE 0x00000200
353 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
354 #define FILE_RANDOM_ACCESS 0x00000800
355 #define FILE_DELETE_ON_CLOSE 0x00001000
356 #define FILE_OPEN_BY_FILE_ID 0x00002000
357 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
358 #define FILE_NO_COMPRESSION 0x00008000
359 #define FILE_RESERVE_OPFILTER 0x00100000
360 #define FILE_OPEN_REPARSE_POINT 0x00200000
361 #define FILE_OPEN_NO_RECALL 0x00400000
362 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
363
364 #define FILE_ANY_ACCESS 0x00000000
365 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
366 #define FILE_READ_ACCESS 0x00000001
367 #define FILE_WRITE_ACCESS 0x00000002
368
369 #define FILE_ALL_ACCESS \
370 (STANDARD_RIGHTS_REQUIRED | \
371 SYNCHRONIZE | \
372 0x1FF)
373
374 #define FILE_GENERIC_EXECUTE \
375 (STANDARD_RIGHTS_EXECUTE | \
376 FILE_READ_ATTRIBUTES | \
377 FILE_EXECUTE | \
378 SYNCHRONIZE)
379
380 #define FILE_GENERIC_READ \
381 (STANDARD_RIGHTS_READ | \
382 FILE_READ_DATA | \
383 FILE_READ_ATTRIBUTES | \
384 FILE_READ_EA | \
385 SYNCHRONIZE)
386
387 #define FILE_GENERIC_WRITE \
388 (STANDARD_RIGHTS_WRITE | \
389 FILE_WRITE_DATA | \
390 FILE_WRITE_ATTRIBUTES | \
391 FILE_WRITE_EA | \
392 FILE_APPEND_DATA | \
393 SYNCHRONIZE)
394
395 /* end winnt.h */
396
397 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
398
399 #define OBJECT_TYPE_CREATE (0x0001)
400 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
401
402 #define DIRECTORY_QUERY (0x0001)
403 #define DIRECTORY_TRAVERSE (0x0002)
404 #define DIRECTORY_CREATE_OBJECT (0x0004)
405 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
406 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
407
408 #define EVENT_QUERY_STATE (0x0001)
409 #define EVENT_MODIFY_STATE (0x0002)
410 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
411
412 #define SEMAPHORE_QUERY_STATE (0x0001)
413 #define SEMAPHORE_MODIFY_STATE (0x0002)
414 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
415
416 #define FM_LOCK_BIT (0x1)
417 #define FM_LOCK_BIT_V (0x0)
418 #define FM_LOCK_WAITER_WOKEN (0x2)
419 #define FM_LOCK_WAITER_INC (0x4)
420
421 /*
422 ** System structures
423 */
424
425 #define SYMBOLIC_LINK_QUERY 0x0001
426 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
427
428 /* also in winnt,h */
429 #define DUPLICATE_CLOSE_SOURCE 0x00000001
430 #define DUPLICATE_SAME_ACCESS 0x00000002
431 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
432 /* end winnt.h */
433
434 typedef struct _OBJECT_NAME_INFORMATION {
435 UNICODE_STRING Name;
436 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
437
438 //
439 // Resource list definitions
440 //
441 typedef int CM_RESOURCE_TYPE;
442
443 #define CmResourceTypeNull 0
444 #define CmResourceTypePort 1
445 #define CmResourceTypeInterrupt 2
446 #define CmResourceTypeMemory 3
447 #define CmResourceTypeDma 4
448 #define CmResourceTypeDeviceSpecific 5
449 #define CmResourceTypeBusNumber 6
450 #define CmResourceTypeNonArbitrated 128
451 #define CmResourceTypeConfigData 128
452 #define CmResourceTypeDevicePrivate 129
453 #define CmResourceTypePcCardConfig 130
454 #define CmResourceTypeMfCardConfig 131
455
456 //
457 // Global debug flag
458 //
459 extern ULONG NtGlobalFlag;
460
461 //
462 // Section map options
463 //
464 typedef enum _SECTION_INHERIT {
465 ViewShare = 1,
466 ViewUnmap = 2
467 } SECTION_INHERIT;
468
469 //
470 // Section access rights
471 //
472 #define SECTION_QUERY 0x0001
473 #define SECTION_MAP_WRITE 0x0002
474 #define SECTION_MAP_READ 0x0004
475 #define SECTION_MAP_EXECUTE 0x0008
476 #define SECTION_EXTEND_SIZE 0x0010
477 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
478
479 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
480 SECTION_MAP_WRITE | \
481 SECTION_MAP_READ | \
482 SECTION_MAP_EXECUTE | \
483 SECTION_EXTEND_SIZE)
484
485 #define SESSION_QUERY_ACCESS 0x0001
486 #define SESSION_MODIFY_ACCESS 0x0002
487
488 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
489 SESSION_QUERY_ACCESS | \
490 SESSION_MODIFY_ACCESS)
491
492
493
494 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
495
496 #define PAGE_NOACCESS 0x01
497 #define PAGE_READONLY 0x02
498 #define PAGE_READWRITE 0x04
499 #define PAGE_WRITECOPY 0x08
500 #define PAGE_EXECUTE 0x10
501 #define PAGE_EXECUTE_READ 0x20
502 #define PAGE_EXECUTE_READWRITE 0x40
503 #define PAGE_EXECUTE_WRITECOPY 0x80
504 #define PAGE_GUARD 0x100
505 #define PAGE_NOCACHE 0x200
506 #define PAGE_WRITECOMBINE 0x400
507
508 #define MEM_COMMIT 0x1000
509 #define MEM_RESERVE 0x2000
510 #define MEM_DECOMMIT 0x4000
511 #define MEM_RELEASE 0x8000
512 #define MEM_FREE 0x10000
513 #define MEM_PRIVATE 0x20000
514 #define MEM_MAPPED 0x40000
515 #define MEM_RESET 0x80000
516 #define MEM_TOP_DOWN 0x100000
517 #define MEM_LARGE_PAGES 0x20000000
518 #define MEM_4MB_PAGES 0x80000000
519
520 #define SEC_RESERVE 0x4000000
521 #define SEC_LARGE_PAGES 0x80000000
522
523 #define PROCESS_DUP_HANDLE (0x0040)
524
525 #if (NTDDI_VERSION >= NTDDI_VISTA)
526 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
527 0xFFFF)
528 #else
529 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
530 0xFFF)
531 #endif
532
533
534
535 //
536 // Processor features
537 //
538 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
539 #define PF_FLOATING_POINT_EMULATED 1
540 #define PF_COMPARE_EXCHANGE_DOUBLE 2
541 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
542 #define PF_PPC_MOVEMEM_64BIT_OK 4
543 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
544 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
545 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
546 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
547 #define PF_PAE_ENABLED 9
548 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
549 #define PF_SSE_DAZ_MODE_AVAILABLE 11
550 #define PF_NX_ENABLED 12
551 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
552 #define PF_COMPARE_EXCHANGE128 14
553 #define PF_COMPARE64_EXCHANGE128 15
554 #define PF_CHANNELS_ENABLED 16
555
556
557
558 //
559 // Intrinsics (note: taken from our winnt.h)
560 // FIXME: 64-bit
561 //
562 #if defined(__GNUC__)
563
564 static __inline__ BOOLEAN
565 InterlockedBitTestAndSet(IN LONG volatile *Base,
566 IN LONG Bit)
567 {
568 #if defined(_M_IX86)
569 LONG OldBit;
570 __asm__ __volatile__("lock "
571 "btsl %2,%1\n\t"
572 "sbbl %0,%0\n\t"
573 :"=r" (OldBit),"+m" (*Base)
574 :"Ir" (Bit)
575 : "memory");
576 return OldBit;
577 #else
578 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
579 #endif
580 }
581
582 static __inline__ BOOLEAN
583 InterlockedBitTestAndReset(IN LONG volatile *Base,
584 IN LONG Bit)
585 {
586 #if defined(_M_IX86)
587 LONG OldBit;
588 __asm__ __volatile__("lock "
589 "btrl %2,%1\n\t"
590 "sbbl %0,%0\n\t"
591 :"=r" (OldBit),"+m" (*Base)
592 :"Ir" (Bit)
593 : "memory");
594 return OldBit;
595 #else
596 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
597 #endif
598 }
599
600 #endif
601
602 #define BitScanForward _BitScanForward
603 #define BitScanReverse _BitScanReverse
604
605 #define BitTest _bittest
606 #define BitTestAndComplement _bittestandcomplement
607 #define BitTestAndSet _bittestandset
608 #define BitTestAndReset _bittestandreset
609 #define InterlockedBitTestAndSet _interlockedbittestandset
610 #define InterlockedBitTestAndReset _interlockedbittestandreset
611
612
613 /** INTERLOCKED FUNCTIONS *****************************************************/
614
615 #if !defined(__INTERLOCKED_DECLARED)
616 #define __INTERLOCKED_DECLARED
617
618 #if defined (_X86_)
619 #if defined(NO_INTERLOCKED_INTRINSICS)
620 NTKERNELAPI
621 LONG
622 FASTCALL
623 InterlockedIncrement(
624 IN OUT LONG volatile *Addend);
625
626 NTKERNELAPI
627 LONG
628 FASTCALL
629 InterlockedDecrement(
630 IN OUT LONG volatile *Addend);
631
632 NTKERNELAPI
633 LONG
634 FASTCALL
635 InterlockedCompareExchange(
636 IN OUT LONG volatile *Destination,
637 IN LONG Exchange,
638 IN LONG Comparand);
639
640 NTKERNELAPI
641 LONG
642 FASTCALL
643 InterlockedExchange(
644 IN OUT LONG volatile *Destination,
645 IN LONG Value);
646
647 NTKERNELAPI
648 LONG
649 FASTCALL
650 InterlockedExchangeAdd(
651 IN OUT LONG volatile *Addend,
652 IN LONG Value);
653
654 #else // !defined(NO_INTERLOCKED_INTRINSICS)
655
656 #define InterlockedExchange _InterlockedExchange
657 #define InterlockedIncrement _InterlockedIncrement
658 #define InterlockedDecrement _InterlockedDecrement
659 #define InterlockedExchangeAdd _InterlockedExchangeAdd
660 #define InterlockedCompareExchange _InterlockedCompareExchange
661 #define InterlockedOr _InterlockedOr
662 #define InterlockedAnd _InterlockedAnd
663 #define InterlockedXor _InterlockedXor
664
665 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
666
667 #endif // defined (_X86_)
668
669 #if !defined (_WIN64)
670 /*
671 * PVOID
672 * InterlockedExchangePointer(
673 * IN OUT PVOID volatile *Target,
674 * IN PVOID Value)
675 */
676 #define InterlockedExchangePointer(Target, Value) \
677 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
678
679 /*
680 * PVOID
681 * InterlockedCompareExchangePointer(
682 * IN OUT PVOID *Destination,
683 * IN PVOID Exchange,
684 * IN PVOID Comparand)
685 */
686 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
687 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
688
689 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
690 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
691 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
692
693 #endif // !defined (_WIN64)
694
695 #if defined (_M_AMD64)
696
697 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
698 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
699 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
700 #define InterlockedAnd _InterlockedAnd
701 #define InterlockedOr _InterlockedOr
702 #define InterlockedXor _InterlockedXor
703 #define InterlockedIncrement _InterlockedIncrement
704 #define InterlockedDecrement _InterlockedDecrement
705 #define InterlockedAdd _InterlockedAdd
706 #define InterlockedExchange _InterlockedExchange
707 #define InterlockedExchangeAdd _InterlockedExchangeAdd
708 #define InterlockedCompareExchange _InterlockedCompareExchange
709 #define InterlockedAnd64 _InterlockedAnd64
710 #define InterlockedOr64 _InterlockedOr64
711 #define InterlockedXor64 _InterlockedXor64
712 #define InterlockedIncrement64 _InterlockedIncrement64
713 #define InterlockedDecrement64 _InterlockedDecrement64
714 #define InterlockedAdd64 _InterlockedAdd64
715 #define InterlockedExchange64 _InterlockedExchange64
716 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
717 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
718 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
719 #define InterlockedExchangePointer _InterlockedExchangePointer
720 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
721 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
722
723 #endif // _M_AMD64
724
725 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
726 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
727 FORCEINLINE
728 LONG64
729 InterlockedAdd64(
730 IN OUT LONG64 volatile *Addend,
731 IN LONG64 Value)
732 {
733 return InterlockedExchangeAdd64(Addend, Value) + Value;
734 }
735 //#endif
736 #endif
737
738 #endif /* !__INTERLOCKED_DECLARED */
739
740 #if defined(_M_IX86)
741 #define YieldProcessor _mm_pause
742 #elif defined (_M_AMD64)
743 #define YieldProcessor _mm_pause
744 #elif defined(_M_PPC)
745 #define YieldProcessor() __asm__ __volatile__("nop");
746 #elif defined(_M_MIPS)
747 #define YieldProcessor() __asm__ __volatile__("nop");
748 #elif defined(_M_ARM)
749 #define YieldProcessor()
750 #else
751 #error Unknown architecture
752 #endif
753
754 //
755 // Slist Header
756 //
757 #ifndef _SLIST_HEADER_
758 #define _SLIST_HEADER_
759
760 #if defined(_WIN64)
761 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
762 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
763 PSLIST_ENTRY Next;
764 } SLIST_ENTRY;
765 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
766 struct {
767 ULONGLONG Alignment;
768 ULONGLONG Region;
769 } DUMMYSTRUCTNAME;
770 struct {
771 ULONGLONG Depth:16;
772 ULONGLONG Sequence:9;
773 ULONGLONG NextEntry:39;
774 ULONGLONG HeaderType:1;
775 ULONGLONG Init:1;
776 ULONGLONG Reserved:59;
777 ULONGLONG Region:3;
778 } Header8;
779 struct {
780 ULONGLONG Depth:16;
781 ULONGLONG Sequence:48;
782 ULONGLONG HeaderType:1;
783 ULONGLONG Init:1;
784 ULONGLONG Reserved:2;
785 ULONGLONG NextEntry:60;
786 } Header16;
787 } SLIST_HEADER, *PSLIST_HEADER;
788 #else
789 #define SLIST_ENTRY SINGLE_LIST_ENTRY
790 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
791 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
792 typedef union _SLIST_HEADER {
793 ULONGLONG Alignment;
794 struct {
795 SLIST_ENTRY Next;
796 USHORT Depth;
797 USHORT Sequence;
798 } DUMMYSTRUCTNAME;
799 } SLIST_HEADER, *PSLIST_HEADER;
800 #endif
801
802 #endif /* _SLIST_HEADER_ */
803
804 //
805 // Thread Access Rights
806 //
807 #define THREAD_TERMINATE (0x0001)
808 #define THREAD_SUSPEND_RESUME (0x0002)
809 #define THREAD_ALERT (0x0004)
810 #define THREAD_GET_CONTEXT (0x0008)
811 #define THREAD_SET_CONTEXT (0x0010)
812 #define THREAD_SET_INFORMATION (0x0020)
813 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
814 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
815 #if (NTDDI_VERSION >= NTDDI_VISTA)
816 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
817 0xFFFF)
818 #else
819 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
820 0x3FF)
821 #endif
822
823 //
824 // Service Start Types
825 //
826 #define SERVICE_BOOT_START 0x00000000
827 #define SERVICE_SYSTEM_START 0x00000001
828 #define SERVICE_AUTO_START 0x00000002
829 #define SERVICE_DEMAND_START 0x00000003
830 #define SERVICE_DISABLED 0x00000004
831
832 //
833 // Exception Records
834 //
835 #define EXCEPTION_NONCONTINUABLE 1
836 #define EXCEPTION_MAXIMUM_PARAMETERS 15
837
838 typedef struct _EXCEPTION_RECORD {
839 NTSTATUS ExceptionCode;
840 ULONG ExceptionFlags;
841 struct _EXCEPTION_RECORD *ExceptionRecord;
842 PVOID ExceptionAddress;
843 ULONG NumberParameters;
844 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
845 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
846
847 typedef struct _EXCEPTION_RECORD32 {
848 NTSTATUS ExceptionCode;
849 ULONG ExceptionFlags;
850 ULONG ExceptionRecord;
851 ULONG ExceptionAddress;
852 ULONG NumberParameters;
853 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
854 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
855
856 typedef struct _EXCEPTION_RECORD64 {
857 NTSTATUS ExceptionCode;
858 ULONG ExceptionFlags;
859 ULONG64 ExceptionRecord;
860 ULONG64 ExceptionAddress;
861 ULONG NumberParameters;
862 ULONG __unusedAlignment;
863 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
864 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
865
866 typedef struct _EXCEPTION_POINTERS {
867 PEXCEPTION_RECORD ExceptionRecord;
868 PCONTEXT ContextRecord;
869 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
870
871
872
873 //
874 // Process Qoutas
875 //
876 typedef struct _QUOTA_LIMITS {
877 SIZE_T PagedPoolLimit;
878 SIZE_T NonPagedPoolLimit;
879 SIZE_T MinimumWorkingSetSize;
880 SIZE_T MaximumWorkingSetSize;
881 SIZE_T PagefileLimit;
882 LARGE_INTEGER TimeLimit;
883 } QUOTA_LIMITS, *PQUOTA_LIMITS;
884
885 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
886 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
887 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
888 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
889 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
890
891
892 /******************************************************************************
893 * WINBASE Functions *
894 ******************************************************************************/
895 #if !defined(_WINBASE_)
896
897 #if defined(_WIN64)
898
899 #define InterlockedPopEntrySList(Head) \
900 ExpInterlockedPopEntrySList(Head)
901
902 #define InterlockedPushEntrySList(Head, Entry) \
903 ExpInterlockedPushEntrySList(Head, Entry)
904
905 #define InterlockedFlushSList(Head) \
906 ExpInterlockedFlushSList(Head)
907
908 #define QueryDepthSList(Head) \
909 ExQueryDepthSList(Head)
910
911 #else // !defined(_WIN64)
912
913 NTKERNELAPI
914 PSLIST_ENTRY
915 FASTCALL
916 InterlockedPopEntrySList(
917 IN PSLIST_HEADER ListHead);
918
919 NTKERNELAPI
920 PSLIST_ENTRY
921 FASTCALL
922 InterlockedPushEntrySList(
923 IN PSLIST_HEADER ListHead,
924 IN PSLIST_ENTRY ListEntry);
925
926 #define InterlockedFlushSList(ListHead) \
927 ExInterlockedFlushSList(ListHead)
928
929 #define QueryDepthSList(Head) \
930 ExQueryDepthSList(Head)
931
932 #endif // !defined(_WIN64)
933
934 #endif // !defined(_WINBASE_)
935
936 /******************************************************************************
937 * Kernel Types *
938 ******************************************************************************/
939
940 #define ASSERT_APC(Object) \
941 ASSERT((Object)->Type == ApcObject)
942
943 #define ASSERT_DPC(Object) \
944 ASSERT(((Object)->Type == 0) || \
945 ((Object)->Type == DpcObject) || \
946 ((Object)->Type == ThreadedDpcObject))
947
948 #define ASSERT_DEVICE_QUEUE(Object) \
949 ASSERT((Object)->Type == DeviceQueueObject)
950
951 #define DPC_NORMAL 0
952 #define DPC_THREADED 1
953
954 #define GM_LOCK_BIT 0x1
955 #define GM_LOCK_BIT_V 0x0
956 #define GM_LOCK_WAITER_WOKEN 0x2
957 #define GM_LOCK_WAITER_INC 0x4
958
959 #define LOCK_QUEUE_WAIT 1
960 #define LOCK_QUEUE_OWNER 2
961 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
962 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
963
964 #define PROCESSOR_FEATURE_MAX 64
965
966 #define DBG_STATUS_CONTROL_C 1
967 #define DBG_STATUS_SYSRQ 2
968 #define DBG_STATUS_BUGCHECK_FIRST 3
969 #define DBG_STATUS_BUGCHECK_SECOND 4
970 #define DBG_STATUS_FATAL 5
971 #define DBG_STATUS_DEBUG_CONTROL 6
972 #define DBG_STATUS_WORKER 7
973
974 typedef enum _TRACE_INFORMATION_CLASS {
975 TraceIdClass,
976 TraceHandleClass,
977 TraceEnableFlagsClass,
978 TraceEnableLevelClass,
979 GlobalLoggerHandleClass,
980 EventLoggerHandleClass,
981 AllLoggerHandlesClass,
982 TraceHandleByNameClass,
983 LoggerEventsLostClass,
984 TraceSessionSettingsClass,
985 LoggerEventsLoggedClass,
986 MaxTraceInformationClass
987 } TRACE_INFORMATION_CLASS;
988
989 typedef enum _KINTERRUPT_POLARITY {
990 InterruptPolarityUnknown,
991 InterruptActiveHigh,
992 InterruptActiveLow
993 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
994
995 typedef enum _KPROFILE_SOURCE {
996 ProfileTime,
997 ProfileAlignmentFixup,
998 ProfileTotalIssues,
999 ProfilePipelineDry,
1000 ProfileLoadInstructions,
1001 ProfilePipelineFrozen,
1002 ProfileBranchInstructions,
1003 ProfileTotalNonissues,
1004 ProfileDcacheMisses,
1005 ProfileIcacheMisses,
1006 ProfileCacheMisses,
1007 ProfileBranchMispredictions,
1008 ProfileStoreInstructions,
1009 ProfileFpInstructions,
1010 ProfileIntegerInstructions,
1011 Profile2Issue,
1012 Profile3Issue,
1013 Profile4Issue,
1014 ProfileSpecialInstructions,
1015 ProfileTotalCycles,
1016 ProfileIcacheIssues,
1017 ProfileDcacheAccesses,
1018 ProfileMemoryBarrierCycles,
1019 ProfileLoadLinkedIssues,
1020 ProfileMaximum
1021 } KPROFILE_SOURCE;
1022
1023 typedef enum _KWAIT_REASON {
1024 Executive,
1025 FreePage,
1026 PageIn,
1027 PoolAllocation,
1028 DelayExecution,
1029 Suspended,
1030 UserRequest,
1031 WrExecutive,
1032 WrFreePage,
1033 WrPageIn,
1034 WrPoolAllocation,
1035 WrDelayExecution,
1036 WrSuspended,
1037 WrUserRequest,
1038 WrEventPair,
1039 WrQueue,
1040 WrLpcReceive,
1041 WrLpcReply,
1042 WrVirtualMemory,
1043 WrPageOut,
1044 WrRendezvous,
1045 WrKeyedEvent,
1046 WrTerminated,
1047 WrProcessInSwap,
1048 WrCpuRateControl,
1049 WrCalloutStack,
1050 WrKernel,
1051 WrResource,
1052 WrPushLock,
1053 WrMutex,
1054 WrQuantumEnd,
1055 WrDispatchInt,
1056 WrPreempted,
1057 WrYieldExecution,
1058 WrFastMutex,
1059 WrGuardedMutex,
1060 WrRundown,
1061 MaximumWaitReason
1062 } KWAIT_REASON;
1063
1064 typedef struct _KWAIT_BLOCK {
1065 LIST_ENTRY WaitListEntry;
1066 struct _KTHREAD *Thread;
1067 PVOID Object;
1068 struct _KWAIT_BLOCK *NextWaitBlock;
1069 USHORT WaitKey;
1070 UCHAR WaitType;
1071 volatile UCHAR BlockState;
1072
1073 #if defined(_WIN64)
1074
1075 LONG SpareLong;
1076
1077 #endif
1078
1079 } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
1080
1081 typedef enum _KINTERRUPT_MODE {
1082 LevelSensitive,
1083 Latched
1084 } KINTERRUPT_MODE;
1085
1086 #define THREAD_WAIT_OBJECTS 3
1087
1088 typedef VOID
1089 (DDKAPI *PKINTERRUPT_ROUTINE)(
1090 VOID);
1091
1092 typedef enum _KD_OPTION {
1093 KD_OPTION_SET_BLOCK_ENABLE,
1094 } KD_OPTION;
1095
1096 typedef enum _INTERFACE_TYPE {
1097 InterfaceTypeUndefined = -1,
1098 Internal,
1099 Isa,
1100 Eisa,
1101 MicroChannel,
1102 TurboChannel,
1103 PCIBus,
1104 VMEBus,
1105 NuBus,
1106 PCMCIABus,
1107 CBus,
1108 MPIBus,
1109 MPSABus,
1110 ProcessorInternal,
1111 InternalPowerBus,
1112 PNPISABus,
1113 PNPBus,
1114 MaximumInterfaceType
1115 } INTERFACE_TYPE, *PINTERFACE_TYPE;
1116
1117 typedef VOID
1118 (DDKAPI *PKNORMAL_ROUTINE)(
1119 IN PVOID NormalContext,
1120 IN PVOID SystemArgument1,
1121 IN PVOID SystemArgument2);
1122
1123 typedef VOID
1124 (DDKAPI *PKRUNDOWN_ROUTINE)(
1125 IN struct _KAPC *Apc);
1126
1127 typedef VOID
1128 (DDKAPI *PKKERNEL_ROUTINE)(
1129 IN struct _KAPC *Apc,
1130 IN OUT PKNORMAL_ROUTINE *NormalRoutine,
1131 IN OUT PVOID *NormalContext,
1132 IN OUT PVOID *SystemArgument1,
1133 IN OUT PVOID *SystemArgument2);
1134
1135 typedef struct _KAPC
1136 {
1137 UCHAR Type;
1138 UCHAR SpareByte0;
1139 UCHAR Size;
1140 UCHAR SpareByte1;
1141 ULONG SpareLong0;
1142 struct _KTHREAD *Thread;
1143 LIST_ENTRY ApcListEntry;
1144 PKKERNEL_ROUTINE KernelRoutine;
1145 PKRUNDOWN_ROUTINE RundownRoutine;
1146 PKNORMAL_ROUTINE NormalRoutine;
1147 PVOID NormalContext;
1148 PVOID SystemArgument1;
1149 PVOID SystemArgument2;
1150 CCHAR ApcStateIndex;
1151 KPROCESSOR_MODE ApcMode;
1152 BOOLEAN Inserted;
1153 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
1154
1155 typedef struct _KDEVICE_QUEUE_ENTRY {
1156 LIST_ENTRY DeviceListEntry;
1157 ULONG SortKey;
1158 BOOLEAN Inserted;
1159 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
1160 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
1161
1162 typedef PVOID PKIPI_CONTEXT;
1163
1164 typedef
1165 VOID
1166 (NTAPI *PKIPI_WORKER)(
1167 IN PKIPI_CONTEXT PacketContext,
1168 IN PVOID Parameter1,
1169 IN PVOID Parameter2,
1170 IN PVOID Parameter3
1171 );
1172
1173 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
1174
1175 typedef struct _KSPIN_LOCK_QUEUE {
1176 struct _KSPIN_LOCK_QUEUE *volatile Next;
1177 PKSPIN_LOCK volatile Lock;
1178 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
1179
1180 typedef struct _KLOCK_QUEUE_HANDLE {
1181 KSPIN_LOCK_QUEUE LockQueue;
1182 KIRQL OldIrql;
1183 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
1184
1185 #if defined(_AMD64_)
1186
1187 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
1188
1189 #define LockQueueDispatcherLock 0
1190 #define LockQueueExpansionLock 1
1191 #define LockQueuePfnLock 2
1192 #define LockQueueSystemSpaceLock 3
1193 #define LockQueueVacbLock 4
1194 #define LockQueueMasterLock 5
1195 #define LockQueueNonPagedPoolLock 6
1196 #define LockQueueIoCancelLock 7
1197 #define LockQueueWorkQueueLock 8
1198 #define LockQueueIoVpbLock 9
1199 #define LockQueueIoDatabaseLock 10
1200 #define LockQueueIoCompletionLock 11
1201 #define LockQueueNtfsStructLock 12
1202 #define LockQueueAfdWorkQueueLock 13
1203 #define LockQueueBcbLock 14
1204 #define LockQueueMmNonPagedPoolLock 15
1205 #define LockQueueUnusedSpare16 16
1206 #define LockQueueTimerTableLock 17
1207 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1208
1209 #else
1210
1211 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
1212 LockQueueDispatcherLock,
1213 LockQueueExpansionLock,
1214 LockQueuePfnLock,
1215 LockQueueSystemSpaceLock,
1216 LockQueueVacbLock,
1217 LockQueueMasterLock,
1218 LockQueueNonPagedPoolLock,
1219 LockQueueIoCancelLock,
1220 LockQueueWorkQueueLock,
1221 LockQueueIoVpbLock,
1222 LockQueueIoDatabaseLock,
1223 LockQueueIoCompletionLock,
1224 LockQueueNtfsStructLock,
1225 LockQueueAfdWorkQueueLock,
1226 LockQueueBcbLock,
1227 LockQueueMmNonPagedPoolLock,
1228 LockQueueUnusedSpare16,
1229 LockQueueTimerTableLock,
1230 LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
1231 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
1232
1233 #endif
1234
1235 typedef VOID
1236 (DDKAPI *PKDEFERRED_ROUTINE)(
1237 IN struct _KDPC *Dpc,
1238 IN PVOID DeferredContext,
1239 IN PVOID SystemArgument1,
1240 IN PVOID SystemArgument2);
1241
1242 typedef struct _KDPC
1243 {
1244 UCHAR Type;
1245 UCHAR Importance;
1246 volatile USHORT Number;
1247 LIST_ENTRY DpcListEntry;
1248 PKDEFERRED_ROUTINE DeferredRoutine;
1249 PVOID DeferredContext;
1250 PVOID SystemArgument1;
1251 PVOID SystemArgument2;
1252 volatile PVOID DpcData;
1253 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
1254
1255 typedef enum _IO_ALLOCATION_ACTION {
1256 KeepObject = 1,
1257 DeallocateObject,
1258 DeallocateObjectKeepRegisters
1259 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
1260
1261 typedef IO_ALLOCATION_ACTION
1262 (DDKAPI *PDRIVER_CONTROL)(
1263 IN struct _DEVICE_OBJECT *DeviceObject,
1264 IN struct _IRP *Irp,
1265 IN PVOID MapRegisterBase,
1266 IN PVOID Context);
1267
1268 typedef struct _WAIT_CONTEXT_BLOCK {
1269 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
1270 PDRIVER_CONTROL DeviceRoutine;
1271 PVOID DeviceContext;
1272 ULONG NumberOfMapRegisters;
1273 PVOID DeviceObject;
1274 PVOID CurrentIrp;
1275 PKDPC BufferChainingDpc;
1276 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
1277
1278 typedef struct _KDEVICE_QUEUE {
1279 CSHORT Type;
1280 CSHORT Size;
1281 LIST_ENTRY DeviceListHead;
1282 KSPIN_LOCK Lock;
1283 #if defined(_AMD64_)
1284 union {
1285 BOOLEAN Busy;
1286 struct {
1287 LONG64 Reserved : 8;
1288 LONG64 Hint : 56;
1289 };
1290 };
1291 #else
1292 BOOLEAN Busy;
1293 #endif
1294
1295 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
1296
1297 typedef struct _DISPATCHER_HEADER
1298 {
1299 __GNU_EXTENSION union
1300 {
1301 __GNU_EXTENSION struct
1302 {
1303 UCHAR Type;
1304 __GNU_EXTENSION union
1305 {
1306 UCHAR Absolute;
1307 UCHAR NpxIrql;
1308 };
1309 __GNU_EXTENSION union
1310 {
1311 UCHAR Size;
1312 UCHAR Hand;
1313 };
1314 __GNU_EXTENSION union
1315 {
1316 UCHAR Inserted;
1317 BOOLEAN DebugActive;
1318 };
1319 };
1320 volatile LONG Lock;
1321 };
1322 LONG SignalState;
1323 LIST_ENTRY WaitListHead;
1324 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
1325
1326 typedef struct _KGATE
1327 {
1328 DISPATCHER_HEADER Header;
1329 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
1330
1331 typedef struct _KGUARDED_MUTEX
1332 {
1333 volatile LONG Count;
1334 PKTHREAD Owner;
1335 ULONG Contention;
1336 KGATE Gate;
1337 __GNU_EXTENSION union
1338 {
1339 __GNU_EXTENSION struct
1340 {
1341 SHORT KernelApcDisable;
1342 SHORT SpecialApcDisable;
1343 };
1344 ULONG CombinedApcDisable;
1345 };
1346 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
1347
1348 typedef struct _KMUTANT {
1349 DISPATCHER_HEADER Header;
1350 LIST_ENTRY MutantListEntry;
1351 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
1352 BOOLEAN Abandoned;
1353 UCHAR ApcDisable;
1354 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
1355
1356 typedef struct _KTIMER {
1357 DISPATCHER_HEADER Header;
1358 ULARGE_INTEGER DueTime;
1359 LIST_ENTRY TimerListEntry;
1360 struct _KDPC *Dpc;
1361 #if !defined(_X86_)
1362 ULONG Processor;
1363 #endif
1364 ULONG Period;
1365 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
1366
1367 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
1368 {
1369 StandardDesign,
1370 NEC98x86,
1371 EndAlternatives
1372 } ALTERNATIVE_ARCHITECTURE_TYPE;
1373
1374 typedef struct _KSYSTEM_TIME
1375 {
1376 ULONG LowPart;
1377 LONG High1Time;
1378 LONG High2Time;
1379 } KSYSTEM_TIME, *PKSYSTEM_TIME;
1380
1381 typedef struct _KEVENT {
1382 DISPATCHER_HEADER Header;
1383 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1384
1385 typedef struct _KSEMAPHORE {
1386 DISPATCHER_HEADER Header;
1387 LONG Limit;
1388 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1389
1390 typedef struct _PNP_BUS_INFORMATION {
1391 GUID BusTypeGuid;
1392 INTERFACE_TYPE LegacyBusType;
1393 ULONG BusNumber;
1394 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
1395
1396 /******************************************************************************
1397 * Memory manager Types *
1398 ******************************************************************************/
1399
1400 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1401 #define MDL_PAGES_LOCKED 0x0002
1402 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1403 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1404 #define MDL_PARTIAL 0x0010
1405 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1406 #define MDL_IO_PAGE_READ 0x0040
1407 #define MDL_WRITE_OPERATION 0x0080
1408 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1409 #define MDL_FREE_EXTRA_PTES 0x0200
1410 #define MDL_DESCRIBES_AWE 0x0400
1411 #define MDL_IO_SPACE 0x0800
1412 #define MDL_NETWORK_HEADER 0x1000
1413 #define MDL_MAPPING_CAN_FAIL 0x2000
1414 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1415 #define MDL_INTERNAL 0x8000
1416
1417 #define MDL_MAPPING_FLAGS ( \
1418 MDL_MAPPED_TO_SYSTEM_VA | \
1419 MDL_PAGES_LOCKED | \
1420 MDL_SOURCE_IS_NONPAGED_POOL | \
1421 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1422 MDL_PARENT_MAPPED_SYSTEM_VA | \
1423 MDL_SYSTEM_VA | \
1424 MDL_IO_SPACE)
1425
1426 #define FLUSH_MULTIPLE_MAXIMUM 32
1427
1428 typedef struct _MDL {
1429 struct _MDL *Next;
1430 CSHORT Size;
1431 CSHORT MdlFlags;
1432 struct _EPROCESS *Process;
1433 PVOID MappedSystemVa;
1434 PVOID StartVa;
1435 ULONG ByteCount;
1436 ULONG ByteOffset;
1437 } MDL, *PMDL;
1438
1439 typedef enum _MEMORY_CACHING_TYPE_ORIG {
1440 MmFrameBufferCached = 2
1441 } MEMORY_CACHING_TYPE_ORIG;
1442
1443 typedef enum _MEMORY_CACHING_TYPE {
1444 MmNonCached = FALSE,
1445 MmCached = TRUE,
1446 MmWriteCombined = MmFrameBufferCached,
1447 MmHardwareCoherentCached,
1448 MmNonCachedUnordered,
1449 MmUSWCCached,
1450 MmMaximumCacheType
1451 } MEMORY_CACHING_TYPE;
1452
1453 typedef enum _MM_PAGE_PRIORITY {
1454 LowPagePriority,
1455 NormalPagePriority = 16,
1456 HighPagePriority = 32
1457 } MM_PAGE_PRIORITY;
1458
1459 typedef enum _LOCK_OPERATION {
1460 IoReadAccess,
1461 IoWriteAccess,
1462 IoModifyAccess
1463 } LOCK_OPERATION;
1464
1465 typedef enum _MM_SYSTEM_SIZE {
1466 MmSmallSystem,
1467 MmMediumSystem,
1468 MmLargeSystem
1469 } MM_SYSTEMSIZE;
1470
1471
1472
1473 /******************************************************************************
1474 * Memory manager Functions *
1475 ******************************************************************************/
1476
1477 /* PVOID MmGetSystemAddressForMdl(
1478 * IN PMDL Mdl);
1479 */
1480 #define MmGetSystemAddressForMdl(Mdl) \
1481 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
1482 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1483 ((Mdl)->MappedSystemVa) : \
1484 (MmMapLockedPages((Mdl), KernelMode)))
1485
1486 /* PVOID
1487 * MmGetSystemAddressForMdlSafe(
1488 * IN PMDL Mdl,
1489 * IN MM_PAGE_PRIORITY Priority)
1490 */
1491 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
1492 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
1493 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1494 (_Mdl)->MappedSystemVa : \
1495 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
1496 KernelMode, MmCached, NULL, FALSE, (_Priority)))
1497
1498 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1499 NTKERNELAPI
1500 PMDL
1501 NTAPI
1502 MmCreateMdl(
1503 IN PMDL MemoryDescriptorList OPTIONAL,
1504 IN PVOID Base,
1505 IN SIZE_T Length);
1506
1507 #endif
1508
1509 /******************************************************************************
1510 * Security Manager Types *
1511 ******************************************************************************/
1512
1513 //
1514 // Access/Security Stuff
1515 //
1516 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
1517 typedef PVOID PACCESS_TOKEN;
1518
1519 #define DELETE 0x00010000L
1520 #define READ_CONTROL 0x00020000L
1521 #define WRITE_DAC 0x00040000L
1522 #define WRITE_OWNER 0x00080000L
1523 #define SYNCHRONIZE 0x00100000L
1524 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1525 #define STANDARD_RIGHTS_READ READ_CONTROL
1526 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1527 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1528 #define STANDARD_RIGHTS_ALL 0x001F0000L
1529 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1530 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1531 #define MAXIMUM_ALLOWED 0x02000000L
1532 #define GENERIC_READ 0x80000000L
1533 #define GENERIC_WRITE 0x40000000L
1534 #define GENERIC_EXECUTE 0x20000000L
1535 #define GENERIC_ALL 0x10000000L
1536
1537 typedef struct _GENERIC_MAPPING {
1538 ACCESS_MASK GenericRead;
1539 ACCESS_MASK GenericWrite;
1540 ACCESS_MASK GenericExecute;
1541 ACCESS_MASK GenericAll;
1542 } GENERIC_MAPPING, *PGENERIC_MAPPING;
1543
1544 #define ACL_REVISION 2
1545 #define ACL_REVISION_DS 4
1546
1547 #define ACL_REVISION1 1
1548 #define ACL_REVISION2 2
1549 #define ACL_REVISION3 3
1550 #define ACL_REVISION4 4
1551 #define MIN_ACL_REVISION ACL_REVISION2
1552 #define MAX_ACL_REVISION ACL_REVISION4
1553
1554 typedef struct _ACL {
1555 UCHAR AclRevision;
1556 UCHAR Sbz1;
1557 USHORT AclSize;
1558 USHORT AceCount;
1559 USHORT Sbz2;
1560 } ACL, *PACL;
1561
1562 //
1563 // Current security descriptor revision value
1564 //
1565 #define SECURITY_DESCRIPTOR_REVISION (1)
1566 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1567
1568 //
1569 // Privilege attributes
1570 //
1571 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1572 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1573 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1574 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1575
1576 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1577 SE_PRIVILEGE_ENABLED | \
1578 SE_PRIVILEGE_REMOVED | \
1579 SE_PRIVILEGE_USED_FOR_ACCESS)
1580
1581 #include <pshpack4.h>
1582 typedef struct _LUID_AND_ATTRIBUTES {
1583 LUID Luid;
1584 ULONG Attributes;
1585 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
1586 #include <poppack.h>
1587
1588 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
1589 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
1590
1591 //
1592 // Privilege sets
1593 //
1594 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1595
1596 typedef struct _PRIVILEGE_SET {
1597 ULONG PrivilegeCount;
1598 ULONG Control;
1599 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
1600 } PRIVILEGE_SET,*PPRIVILEGE_SET;
1601
1602 typedef enum _SECURITY_IMPERSONATION_LEVEL {
1603 SecurityAnonymous,
1604 SecurityIdentification,
1605 SecurityImpersonation,
1606 SecurityDelegation
1607 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
1608
1609 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1610 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1611 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1612 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1613
1614 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1615 #define SECURITY_STATIC_TRACKING (FALSE)
1616
1617 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
1618
1619 typedef struct _SECURITY_QUALITY_OF_SERVICE {
1620 ULONG Length;
1621 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
1622 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
1623 BOOLEAN EffectiveOnly;
1624 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
1625
1626 typedef struct _SE_IMPERSONATION_STATE {
1627 PACCESS_TOKEN Token;
1628 BOOLEAN CopyOnOpen;
1629 BOOLEAN EffectiveOnly;
1630 SECURITY_IMPERSONATION_LEVEL Level;
1631 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
1632
1633 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1634 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1635 #define DACL_SECURITY_INFORMATION (0x00000004L)
1636 #define SACL_SECURITY_INFORMATION (0x00000008L)
1637 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1638
1639 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1640 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1641 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1642 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1643
1644 typedef enum _SECURITY_OPERATION_CODE {
1645 SetSecurityDescriptor,
1646 QuerySecurityDescriptor,
1647 DeleteSecurityDescriptor,
1648 AssignSecurityDescriptor
1649 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
1650
1651 #define INITIAL_PRIVILEGE_COUNT 3
1652
1653 typedef struct _INITIAL_PRIVILEGE_SET {
1654 ULONG PrivilegeCount;
1655 ULONG Control;
1656 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
1657 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
1658
1659 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
1660 #define SE_CREATE_TOKEN_PRIVILEGE 2
1661 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
1662 #define SE_LOCK_MEMORY_PRIVILEGE 4
1663 #define SE_INCREASE_QUOTA_PRIVILEGE 5
1664 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
1665 #define SE_TCB_PRIVILEGE 7
1666 #define SE_SECURITY_PRIVILEGE 8
1667 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
1668 #define SE_LOAD_DRIVER_PRIVILEGE 10
1669 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
1670 #define SE_SYSTEMTIME_PRIVILEGE 12
1671 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
1672 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
1673 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
1674 #define SE_CREATE_PERMANENT_PRIVILEGE 16
1675 #define SE_BACKUP_PRIVILEGE 17
1676 #define SE_RESTORE_PRIVILEGE 18
1677 #define SE_SHUTDOWN_PRIVILEGE 19
1678 #define SE_DEBUG_PRIVILEGE 20
1679 #define SE_AUDIT_PRIVILEGE 21
1680 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
1681 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
1682 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
1683 #define SE_UNDOCK_PRIVILEGE 25
1684 #define SE_SYNC_AGENT_PRIVILEGE 26
1685 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
1686 #define SE_MANAGE_VOLUME_PRIVILEGE 28
1687 #define SE_IMPERSONATE_PRIVILEGE 29
1688 #define SE_CREATE_GLOBAL_PRIVILEGE 30
1689 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
1690 #define SE_RELABEL_PRIVILEGE 32
1691 #define SE_INC_WORKING_SET_PRIVILEGE 33
1692 #define SE_TIME_ZONE_PRIVILEGE 34
1693 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
1694 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
1695
1696 typedef struct _SECURITY_SUBJECT_CONTEXT {
1697 PACCESS_TOKEN ClientToken;
1698 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
1699 PACCESS_TOKEN PrimaryToken;
1700 PVOID ProcessAuditId;
1701 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
1702
1703 #include <pshpack4.h>
1704 typedef struct _ACCESS_STATE {
1705 LUID OperationID;
1706 BOOLEAN SecurityEvaluated;
1707 BOOLEAN GenerateAudit;
1708 BOOLEAN GenerateOnClose;
1709 BOOLEAN PrivilegesAllocated;
1710 ULONG Flags;
1711 ACCESS_MASK RemainingDesiredAccess;
1712 ACCESS_MASK PreviouslyGrantedAccess;
1713 ACCESS_MASK OriginalDesiredAccess;
1714 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
1715 PSECURITY_DESCRIPTOR SecurityDescriptor;
1716 PVOID AuxData;
1717 union {
1718 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
1719 PRIVILEGE_SET PrivilegeSet;
1720 } Privileges;
1721
1722 BOOLEAN AuditPrivileges;
1723 UNICODE_STRING ObjectName;
1724 UNICODE_STRING ObjectTypeName;
1725 } ACCESS_STATE, *PACCESS_STATE;
1726 #include <poppack.h>
1727
1728 /******************************************************************************
1729 * Configuration Manager Types *
1730 ******************************************************************************/
1731
1732 /* KEY_VALUE_Xxx.Type */
1733
1734 #define REG_NONE 0
1735 #define REG_SZ 1
1736 #define REG_EXPAND_SZ 2
1737 #define REG_BINARY 3
1738 #define REG_DWORD 4
1739 #define REG_DWORD_LITTLE_ENDIAN 4
1740 #define REG_DWORD_BIG_ENDIAN 5
1741 #define REG_LINK 6
1742 #define REG_MULTI_SZ 7
1743 #define REG_RESOURCE_LIST 8
1744 #define REG_FULL_RESOURCE_DESCRIPTOR 9
1745 #define REG_RESOURCE_REQUIREMENTS_LIST 10
1746 #define REG_QWORD 11
1747 #define REG_QWORD_LITTLE_ENDIAN 11
1748
1749 //
1750 // Registry Access Rights
1751 //
1752 #define KEY_QUERY_VALUE (0x0001)
1753 #define KEY_SET_VALUE (0x0002)
1754 #define KEY_CREATE_SUB_KEY (0x0004)
1755 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
1756 #define KEY_NOTIFY (0x0010)
1757 #define KEY_CREATE_LINK (0x0020)
1758 #define KEY_WOW64_32KEY (0x0200)
1759 #define KEY_WOW64_64KEY (0x0100)
1760 #define KEY_WOW64_RES (0x0300)
1761
1762 #define KEY_READ ((STANDARD_RIGHTS_READ |\
1763 KEY_QUERY_VALUE |\
1764 KEY_ENUMERATE_SUB_KEYS |\
1765 KEY_NOTIFY) \
1766 & \
1767 (~SYNCHRONIZE))
1768
1769 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
1770 KEY_SET_VALUE |\
1771 KEY_CREATE_SUB_KEY) \
1772 & \
1773 (~SYNCHRONIZE))
1774
1775 #define KEY_EXECUTE ((KEY_READ) \
1776 & \
1777 (~SYNCHRONIZE))
1778
1779 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
1780 KEY_QUERY_VALUE |\
1781 KEY_SET_VALUE |\
1782 KEY_CREATE_SUB_KEY |\
1783 KEY_ENUMERATE_SUB_KEYS |\
1784 KEY_NOTIFY |\
1785 KEY_CREATE_LINK) \
1786 & \
1787 (~SYNCHRONIZE))
1788
1789 //
1790 // Registry Open/Create Options
1791 //
1792 #define REG_OPTION_RESERVED (0x00000000L)
1793 #define REG_OPTION_NON_VOLATILE (0x00000000L)
1794 #define REG_OPTION_VOLATILE (0x00000001L)
1795 #define REG_OPTION_CREATE_LINK (0x00000002L)
1796 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
1797 #define REG_OPTION_OPEN_LINK (0x00000008L)
1798
1799 #define REG_LEGAL_OPTION \
1800 (REG_OPTION_RESERVED |\
1801 REG_OPTION_NON_VOLATILE |\
1802 REG_OPTION_VOLATILE |\
1803 REG_OPTION_CREATE_LINK |\
1804 REG_OPTION_BACKUP_RESTORE |\
1805 REG_OPTION_OPEN_LINK)
1806
1807 //
1808 // Key creation/open disposition
1809 //
1810 #define REG_CREATED_NEW_KEY (0x00000001L)
1811 #define REG_OPENED_EXISTING_KEY (0x00000002L)
1812
1813 //
1814 // Key restore & hive load flags
1815 //
1816 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
1817 #define REG_REFRESH_HIVE (0x00000002L)
1818 #define REG_NO_LAZY_FLUSH (0x00000004L)
1819 #define REG_FORCE_RESTORE (0x00000008L)
1820 #define REG_APP_HIVE (0x00000010L)
1821 #define REG_PROCESS_PRIVATE (0x00000020L)
1822 #define REG_START_JOURNAL (0x00000040L)
1823 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
1824 #define REG_HIVE_NO_RM (0x00000100L)
1825 #define REG_HIVE_SINGLE_LOG (0x00000200L)
1826
1827 //
1828 // Unload Flags
1829 //
1830 #define REG_FORCE_UNLOAD 1
1831
1832 //
1833 // Notify Filter Values
1834 //
1835 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
1836 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
1837 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
1838 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
1839
1840 #define REG_LEGAL_CHANGE_FILTER \
1841 (REG_NOTIFY_CHANGE_NAME |\
1842 REG_NOTIFY_CHANGE_ATTRIBUTES |\
1843 REG_NOTIFY_CHANGE_LAST_SET |\
1844 REG_NOTIFY_CHANGE_SECURITY)
1845
1846 typedef struct _CM_FLOPPY_DEVICE_DATA {
1847 USHORT Version;
1848 USHORT Revision;
1849 CHAR Size[8];
1850 ULONG MaxDensity;
1851 ULONG MountDensity;
1852 UCHAR StepRateHeadUnloadTime;
1853 UCHAR HeadLoadTime;
1854 UCHAR MotorOffTime;
1855 UCHAR SectorLengthCode;
1856 UCHAR SectorPerTrack;
1857 UCHAR ReadWriteGapLength;
1858 UCHAR DataTransferLength;
1859 UCHAR FormatGapLength;
1860 UCHAR FormatFillCharacter;
1861 UCHAR HeadSettleTime;
1862 UCHAR MotorSettleTime;
1863 UCHAR MaximumTrackValue;
1864 UCHAR DataTransferRate;
1865 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
1866
1867 #include <pshpack4.h>
1868 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
1869 UCHAR Type;
1870 UCHAR ShareDisposition;
1871 USHORT Flags;
1872 union {
1873 struct {
1874 PHYSICAL_ADDRESS Start;
1875 ULONG Length;
1876 } Generic;
1877 struct {
1878 PHYSICAL_ADDRESS Start;
1879 ULONG Length;
1880 } Port;
1881 struct {
1882 ULONG Level;
1883 ULONG Vector;
1884 KAFFINITY Affinity;
1885 } Interrupt;
1886 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1887 struct {
1888 __GNU_EXTENSION union {
1889 struct {
1890 USHORT Reserved;
1891 USHORT MessageCount;
1892 ULONG Vector;
1893 KAFFINITY Affinity;
1894 } Raw;
1895 struct {
1896 ULONG Level;
1897 ULONG Vector;
1898 KAFFINITY Affinity;
1899 } Translated;
1900 };
1901 } MessageInterrupt;
1902 #endif
1903 struct {
1904 PHYSICAL_ADDRESS Start;
1905 ULONG Length;
1906 } Memory;
1907 struct {
1908 ULONG Channel;
1909 ULONG Port;
1910 ULONG Reserved1;
1911 } Dma;
1912 struct {
1913 ULONG Data[3];
1914 } DevicePrivate;
1915 struct {
1916 ULONG Start;
1917 ULONG Length;
1918 ULONG Reserved;
1919 } BusNumber;
1920 struct {
1921 ULONG DataSize;
1922 ULONG Reserved1;
1923 ULONG Reserved2;
1924 } DeviceSpecificData;
1925 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1926 struct {
1927 PHYSICAL_ADDRESS Start;
1928 ULONG Length40;
1929 } Memory40;
1930 struct {
1931 PHYSICAL_ADDRESS Start;
1932 ULONG Length48;
1933 } Memory48;
1934 struct {
1935 PHYSICAL_ADDRESS Start;
1936 ULONG Length64;
1937 } Memory64;
1938 #endif
1939 } u;
1940 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
1941 #include <poppack.h>
1942
1943 #include <pshpack1.h>
1944 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1945
1946 #define CmResourceTypeNull 0
1947 #define CmResourceTypePort 1
1948 #define CmResourceTypeInterrupt 2
1949 #define CmResourceTypeMemory 3
1950 #define CmResourceTypeDma 4
1951 #define CmResourceTypeDeviceSpecific 5
1952 #define CmResourceTypeBusNumber 6
1953 #define CmResourceTypeMemoryLarge 7
1954 #define CmResourceTypeNonArbitrated 128
1955 #define CmResourceTypeConfigData 128
1956 #define CmResourceTypeDevicePrivate 129
1957 #define CmResourceTypePcCardConfig 130
1958 #define CmResourceTypeMfCardConfig 131
1959
1960 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1961
1962 typedef enum _CM_SHARE_DISPOSITION {
1963 CmResourceShareUndetermined,
1964 CmResourceShareDeviceExclusive,
1965 CmResourceShareDriverExclusive,
1966 CmResourceShareShared
1967 } CM_SHARE_DISPOSITION;
1968
1969 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1970
1971 #define CM_RESOURCE_PORT_MEMORY 0x0000
1972 #define CM_RESOURCE_PORT_IO 0x0001
1973 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1974 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1975 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1976 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1977 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1978 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1979 #define CM_RESOURCE_PORT_BAR 0x0100
1980
1981 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1982
1983 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1984 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1985 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
1986 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
1987
1988 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1989
1990 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1991 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1992 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1993 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
1994 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1995 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1996 #define CM_RESOURCE_MEMORY_24 0x0010
1997 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1998 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
1999 #define CM_RESOURCE_MEMORY_BAR 0x0080
2000 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
2001
2002 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
2003
2004 #define CM_RESOURCE_DMA_8 0x0000
2005 #define CM_RESOURCE_DMA_16 0x0001
2006 #define CM_RESOURCE_DMA_32 0x0002
2007 #define CM_RESOURCE_DMA_8_AND_16 0x0004
2008 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
2009 #define CM_RESOURCE_DMA_TYPE_A 0x0010
2010 #define CM_RESOURCE_DMA_TYPE_B 0x0020
2011 #define CM_RESOURCE_DMA_TYPE_F 0x0040
2012
2013 typedef struct _CM_PARTIAL_RESOURCE_LIST {
2014 USHORT Version;
2015 USHORT Revision;
2016 ULONG Count;
2017 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
2018 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
2019
2020 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
2021 INTERFACE_TYPE InterfaceType;
2022 ULONG BusNumber;
2023 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
2024 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
2025
2026 typedef struct _CM_RESOURCE_LIST {
2027 ULONG Count;
2028 CM_FULL_RESOURCE_DESCRIPTOR List[1];
2029 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
2030
2031 typedef struct _CM_INT13_DRIVE_PARAMETER {
2032 USHORT DriveSelect;
2033 ULONG MaxCylinders;
2034 USHORT SectorsPerTrack;
2035 USHORT MaxHeads;
2036 USHORT NumberDrives;
2037 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
2038
2039 typedef struct _CM_PNP_BIOS_DEVICE_NODE
2040 {
2041 USHORT Size;
2042 UCHAR Node;
2043 ULONG ProductId;
2044 UCHAR DeviceType[3];
2045 USHORT DeviceAttributes;
2046 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
2047
2048 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
2049 {
2050 UCHAR Signature[4];
2051 UCHAR Revision;
2052 UCHAR Length;
2053 USHORT ControlField;
2054 UCHAR Checksum;
2055 ULONG EventFlagAddress;
2056 USHORT RealModeEntryOffset;
2057 USHORT RealModeEntrySegment;
2058 USHORT ProtectedModeEntryOffset;
2059 ULONG ProtectedModeCodeBaseAddress;
2060 ULONG OemDeviceId;
2061 USHORT RealModeDataBaseAddress;
2062 ULONG ProtectedModeDataBaseAddress;
2063 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
2064
2065 #include <poppack.h>
2066
2067 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
2068 {
2069 ULONG BytesPerSector;
2070 ULONG NumberOfCylinders;
2071 ULONG SectorsPerTrack;
2072 ULONG NumberOfHeads;
2073 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
2074
2075 typedef struct _CM_KEYBOARD_DEVICE_DATA {
2076 USHORT Version;
2077 USHORT Revision;
2078 UCHAR Type;
2079 UCHAR Subtype;
2080 USHORT KeyboardFlags;
2081 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
2082
2083 typedef struct _CM_MCA_POS_DATA {
2084 USHORT AdapterId;
2085 UCHAR PosData1;
2086 UCHAR PosData2;
2087 UCHAR PosData3;
2088 UCHAR PosData4;
2089 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
2090
2091 #if (NTDDI_VERSION >= NTDDI_WINXP)
2092 typedef struct CM_Power_Data_s {
2093 ULONG PD_Size;
2094 DEVICE_POWER_STATE PD_MostRecentPowerState;
2095 ULONG PD_Capabilities;
2096 ULONG PD_D1Latency;
2097 ULONG PD_D2Latency;
2098 ULONG PD_D3Latency;
2099 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
2100 SYSTEM_POWER_STATE PD_DeepestSystemWake;
2101 } CM_POWER_DATA, *PCM_POWER_DATA;
2102
2103 #define PDCAP_D0_SUPPORTED 0x00000001
2104 #define PDCAP_D1_SUPPORTED 0x00000002
2105 #define PDCAP_D2_SUPPORTED 0x00000004
2106 #define PDCAP_D3_SUPPORTED 0x00000008
2107 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2108 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2109 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2110 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2111 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2112
2113 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2114
2115 typedef struct _CM_SCSI_DEVICE_DATA {
2116 USHORT Version;
2117 USHORT Revision;
2118 UCHAR HostIdentifier;
2119 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
2120
2121 typedef struct _CM_SERIAL_DEVICE_DATA {
2122 USHORT Version;
2123 USHORT Revision;
2124 ULONG BaudClock;
2125 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
2126
2127 typedef enum _KEY_INFORMATION_CLASS {
2128 KeyBasicInformation,
2129 KeyNodeInformation,
2130 KeyFullInformation,
2131 KeyNameInformation,
2132 KeyCachedInformation,
2133 KeyFlagsInformation
2134 } KEY_INFORMATION_CLASS;
2135
2136 typedef struct _KEY_BASIC_INFORMATION {
2137 LARGE_INTEGER LastWriteTime;
2138 ULONG TitleIndex;
2139 ULONG NameLength;
2140 WCHAR Name[1];
2141 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2142
2143 typedef struct _KEY_FULL_INFORMATION {
2144 LARGE_INTEGER LastWriteTime;
2145 ULONG TitleIndex;
2146 ULONG ClassOffset;
2147 ULONG ClassLength;
2148 ULONG SubKeys;
2149 ULONG MaxNameLen;
2150 ULONG MaxClassLen;
2151 ULONG Values;
2152 ULONG MaxValueNameLen;
2153 ULONG MaxValueDataLen;
2154 WCHAR Class[1];
2155 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2156
2157 typedef struct _KEY_NODE_INFORMATION {
2158 LARGE_INTEGER LastWriteTime;
2159 ULONG TitleIndex;
2160 ULONG ClassOffset;
2161 ULONG ClassLength;
2162 ULONG NameLength;
2163 WCHAR Name[1];
2164 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2165
2166 typedef struct _KEY_VALUE_BASIC_INFORMATION {
2167 ULONG TitleIndex;
2168 ULONG Type;
2169 ULONG NameLength;
2170 WCHAR Name[1];
2171 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2172
2173 typedef struct _KEY_VALUE_FULL_INFORMATION {
2174 ULONG TitleIndex;
2175 ULONG Type;
2176 ULONG DataOffset;
2177 ULONG DataLength;
2178 ULONG NameLength;
2179 WCHAR Name[1];
2180 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2181
2182 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2183 ULONG TitleIndex;
2184 ULONG Type;
2185 ULONG DataLength;
2186 UCHAR Data[1];
2187 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2188
2189 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2190 ULONG Type;
2191 ULONG DataLength;
2192 UCHAR Data[1];
2193 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2194
2195 typedef struct _KEY_VALUE_ENTRY {
2196 PUNICODE_STRING ValueName;
2197 ULONG DataLength;
2198 ULONG DataOffset;
2199 ULONG Type;
2200 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2201
2202 typedef enum _KEY_VALUE_INFORMATION_CLASS {
2203 KeyValueBasicInformation,
2204 KeyValueFullInformation,
2205 KeyValuePartialInformation,
2206 KeyValueFullInformationAlign64,
2207 KeyValuePartialInformationAlign64
2208 } KEY_VALUE_INFORMATION_CLASS;
2209
2210 typedef struct _KEY_WRITE_TIME_INFORMATION {
2211 LARGE_INTEGER LastWriteTime;
2212 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
2213
2214 typedef enum _KEY_SET_INFORMATION_CLASS {
2215 KeyWriteTimeInformation,
2216 KeyWow64FlagsInformation,
2217 KeyControlFlagsInformation,
2218 KeySetVirtualizationInformation,
2219 KeySetDebugInformation,
2220 KeySetHandleTagsInformation,
2221 MaxKeySetInfoClass
2222 } KEY_SET_INFORMATION_CLASS;
2223
2224 typedef enum _REG_NOTIFY_CLASS {
2225 RegNtDeleteKey,
2226 RegNtPreDeleteKey = RegNtDeleteKey,
2227 RegNtSetValueKey,
2228 RegNtPreSetValueKey = RegNtSetValueKey,
2229 RegNtDeleteValueKey,
2230 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
2231 RegNtSetInformationKey,
2232 RegNtPreSetInformationKey = RegNtSetInformationKey,
2233 RegNtRenameKey,
2234 RegNtPreRenameKey = RegNtRenameKey,
2235 RegNtEnumerateKey,
2236 RegNtPreEnumerateKey = RegNtEnumerateKey,
2237 RegNtEnumerateValueKey,
2238 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
2239 RegNtQueryKey,
2240 RegNtPreQueryKey = RegNtQueryKey,
2241 RegNtQueryValueKey,
2242 RegNtPreQueryValueKey = RegNtQueryValueKey,
2243 RegNtQueryMultipleValueKey,
2244 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
2245 RegNtPreCreateKey,
2246 RegNtPostCreateKey,
2247 RegNtPreOpenKey,
2248 RegNtPostOpenKey,
2249 RegNtKeyHandleClose,
2250 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
2251 RegNtPostDeleteKey,
2252 RegNtPostSetValueKey,
2253 RegNtPostDeleteValueKey,
2254 RegNtPostSetInformationKey,
2255 RegNtPostRenameKey,
2256 RegNtPostEnumerateKey,
2257 RegNtPostEnumerateValueKey,
2258 RegNtPostQueryKey,
2259 RegNtPostQueryValueKey,
2260 RegNtPostQueryMultipleValueKey,
2261 RegNtPostKeyHandleClose,
2262 RegNtPreCreateKeyEx,
2263 RegNtPostCreateKeyEx,
2264 RegNtPreOpenKeyEx,
2265 RegNtPostOpenKeyEx,
2266 RegNtPreFlushKey,
2267 RegNtPostFlushKey,
2268 RegNtPreLoadKey,
2269 RegNtPostLoadKey,
2270 RegNtPreUnLoadKey,
2271 RegNtPostUnLoadKey,
2272 RegNtPreQueryKeySecurity,
2273 RegNtPostQueryKeySecurity,
2274 RegNtPreSetKeySecurity,
2275 RegNtPostSetKeySecurity,
2276 RegNtCallbackObjectContextCleanup,
2277 RegNtPreRestoreKey,
2278 RegNtPostRestoreKey,
2279 RegNtPreSaveKey,
2280 RegNtPostSaveKey,
2281 RegNtPreReplaceKey,
2282 RegNtPostReplaceKey,
2283 MaxRegNtNotifyClass
2284 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
2285
2286 typedef NTSTATUS
2287 (NTAPI *PEX_CALLBACK_FUNCTION)(
2288 IN PVOID CallbackContext,
2289 IN PVOID Argument1,
2290 IN PVOID Argument2
2291 );
2292
2293 typedef struct _REG_DELETE_KEY_INFORMATION {
2294 PVOID Object;
2295 PVOID CallContext;
2296 PVOID ObjectContext;
2297 PVOID Reserved;
2298 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
2299 #if (NTDDI_VERSION >= NTDDI_VISTA)
2300 , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
2301 #endif
2302 ;
2303
2304 typedef struct _REG_SET_VALUE_KEY_INFORMATION {
2305 PVOID Object;
2306 PUNICODE_STRING ValueName;
2307 ULONG TitleIndex;
2308 ULONG Type;
2309 PVOID Data;
2310 ULONG DataSize;
2311 PVOID CallContext;
2312 PVOID ObjectContext;
2313 PVOID Reserved;
2314 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
2315
2316 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
2317 PVOID Object;
2318 PUNICODE_STRING ValueName;
2319 PVOID CallContext;
2320 PVOID ObjectContext;
2321 PVOID Reserved;
2322 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
2323
2324 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
2325 PVOID Object;
2326 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
2327 PVOID KeySetInformation;
2328 ULONG KeySetInformationLength;
2329 PVOID CallContext;
2330 PVOID ObjectContext;
2331 PVOID Reserved;
2332 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
2333
2334 typedef struct _REG_ENUMERATE_KEY_INFORMATION {
2335 PVOID Object;
2336 ULONG Index;
2337 KEY_INFORMATION_CLASS KeyInformationClass;
2338 PVOID KeyInformation;
2339 ULONG Length;
2340 PULONG ResultLength;
2341 PVOID CallContext;
2342 PVOID ObjectContext;
2343 PVOID Reserved;
2344 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
2345
2346 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
2347 PVOID Object;
2348 ULONG Index;
2349 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
2350 PVOID KeyValueInformation;
2351 ULONG Length;
2352 PULONG ResultLength;
2353 PVOID CallContext;
2354 PVOID ObjectContext;
2355 PVOID Reserved;
2356 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
2357
2358 typedef struct _REG_QUERY_KEY_INFORMATION {
2359 PVOID Object;
2360 KEY_INFORMATION_CLASS KeyInformationClass;
2361 PVOID KeyInformation;
2362 ULONG Length;
2363 PULONG ResultLength;
2364 PVOID CallContext;
2365 PVOID ObjectContext;
2366 PVOID Reserved;
2367 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
2368
2369 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
2370 PVOID Object;
2371 PUNICODE_STRING ValueName;
2372 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
2373 PVOID KeyValueInformation;
2374 ULONG Length;
2375 PULONG ResultLength;
2376 PVOID CallContext;
2377 PVOID ObjectContext;
2378 PVOID Reserved;
2379 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
2380
2381 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
2382 PVOID Object;
2383 PKEY_VALUE_ENTRY ValueEntries;
2384 ULONG EntryCount;
2385 PVOID ValueBuffer;
2386 PULONG BufferLength;
2387 PULONG RequiredBufferLength;
2388 PVOID CallContext;
2389 PVOID ObjectContext;
2390 PVOID Reserved;
2391 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
2392
2393 typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
2394 PUNICODE_STRING CompleteName;
2395 } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
2396
2397 typedef struct _REG_POST_CREATE_KEY_INFORMATION {
2398 PUNICODE_STRING CompleteName;
2399 PVOID Object;
2400 NTSTATUS Status;
2401 } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
2402
2403 typedef struct _REG_POST_OPERATION_INFORMATION {
2404 PVOID Object;
2405 NTSTATUS Status;
2406 PVOID PreInformation;
2407 NTSTATUS ReturnStatus;
2408 PVOID CallContext;
2409 PVOID ObjectContext;
2410 PVOID Reserved;
2411 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
2412
2413 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
2414 PVOID Object;
2415 PVOID CallContext;
2416 PVOID ObjectContext;
2417 PVOID Reserved;
2418 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
2419
2420 /******************************************************************************
2421 * I/O Manager Functions *
2422 ******************************************************************************/
2423
2424 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2425 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2426
2427 #define DMA_MACROS_DEFINED
2428
2429 FORCEINLINE
2430 NTSTATUS
2431 IoAllocateAdapterChannel(
2432 IN PADAPTER_OBJECT AdapterObject,
2433 IN PDEVICE_OBJECT DeviceObject,
2434 IN ULONG NumberOfMapRegisters,
2435 IN PDRIVER_CONTROL ExecutionRoutine,
2436 IN PVOID Context)
2437 {
2438 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
2439 AllocateAdapterChannel =
2440 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
2441 ASSERT(AllocateAdapterChannel);
2442 return AllocateAdapterChannel(DmaAdapter,
2443 DeviceObject,
2444 NumberOfMapRegisters,
2445 ExecutionRoutine,
2446 Context );
2447 }
2448
2449 FORCEINLINE
2450 BOOLEAN
2451 IoFlushAdapterBuffers(
2452 IN PADAPTER_OBJECT AdapterObject,
2453 IN PMDL Mdl,
2454 IN PVOID MapRegisterBase,
2455 IN PVOID CurrentVa,
2456 IN ULONG Length,
2457 IN BOOLEAN WriteToDevice)
2458 {
2459 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
2460 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
2461 ASSERT(FlushAdapterBuffers);
2462 return FlushAdapterBuffers(DmaAdapter,
2463 Mdl,
2464 MapRegisterBase,
2465 CurrentVa,
2466 Length,
2467 WriteToDevice );
2468 }
2469
2470 FORCEINLINE
2471 VOID
2472 IoFreeAdapterChannel(
2473 IN PADAPTER_OBJECT AdapterObject)
2474 {
2475 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
2476 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
2477 ASSERT(FreeAdapterChannel);
2478 FreeAdapterChannel(DmaAdapter);
2479 }
2480
2481 FORCEINLINE
2482 VOID
2483 IoFreeMapRegisters(
2484 IN PADAPTER_OBJECT AdapterObject,
2485 IN PVOID MapRegisterBase,
2486 IN ULONG NumberOfMapRegisters)
2487 {
2488 PFREE_MAP_REGISTERS FreeMapRegisters;
2489 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
2490 ASSERT(FreeMapRegisters);
2491 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
2492 }
2493
2494 FORCEINLINE
2495 PHYSICAL_ADDRESS
2496 IoMapTransfer(
2497 IN PDMA_ADAPTER DmaAdapter,
2498 IN PMDL Mdl,
2499 IN PVOID MapRegisterBase,
2500 IN PVOID CurrentVa,
2501 IN OUT PULONG Length,
2502 IN BOOLEAN WriteToDevice)
2503 {
2504 PMAP_TRANSFER MapTransfer;
2505
2506 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
2507 ASSERT(MapTransfer);
2508 return MapTransfer(DmaAdapter,
2509 Mdl,
2510 MapRegisterBase,
2511 CurrentVa,
2512 Length,
2513 WriteToDevice);
2514 }
2515 #endif
2516
2517 /* PCI_COMMON_CONFIG.Command */
2518
2519 #define PCI_ENABLE_IO_SPACE 0x0001
2520 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2521 #define PCI_ENABLE_BUS_MASTER 0x0004
2522 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2523 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2524 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2525 #define PCI_ENABLE_PARITY 0x0040
2526 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2527 #define PCI_ENABLE_SERR 0x0100
2528 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2529 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
2530
2531 /* PCI_COMMON_CONFIG.Status */
2532
2533 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
2534 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2535 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2536 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2537 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2538 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2539 #define PCI_STATUS_DEVSEL 0x0600
2540 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2541 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2542 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2543 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2544 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2545
2546 /* PCI_COMMON_CONFIG.HeaderType */
2547
2548 #define PCI_MULTIFUNCTION 0x80
2549 #define PCI_DEVICE_TYPE 0x00
2550 #define PCI_BRIDGE_TYPE 0x01
2551 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2552
2553 #define PCI_CONFIGURATION_TYPE(PciData) \
2554 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2555
2556 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2557 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2558
2559 /* PCI device classes */
2560
2561 #define PCI_CLASS_PRE_20 0x00
2562 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
2563 #define PCI_CLASS_NETWORK_CTLR 0x02
2564 #define PCI_CLASS_DISPLAY_CTLR 0x03
2565 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
2566 #define PCI_CLASS_MEMORY_CTLR 0x05
2567 #define PCI_CLASS_BRIDGE_DEV 0x06
2568 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
2569 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
2570 #define PCI_CLASS_INPUT_DEV 0x09
2571 #define PCI_CLASS_DOCKING_STATION 0x0a
2572 #define PCI_CLASS_PROCESSOR 0x0b
2573 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
2574 #define PCI_CLASS_WIRELESS_CTLR 0x0d
2575 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
2576 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
2577 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
2578 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
2579
2580 /* PCI device subclasses for class 0 */
2581
2582 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
2583 #define PCI_SUBCLASS_PRE_20_VGA 0x01
2584
2585 /* PCI device subclasses for class 1 (mass storage controllers)*/
2586
2587 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
2588 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
2589 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
2590 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
2591 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
2592 #define PCI_SUBCLASS_MSC_OTHER 0x80
2593
2594 /* PCI device subclasses for class 2 (network controllers)*/
2595
2596 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
2597 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
2598 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
2599 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
2600 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
2601 #define PCI_SUBCLASS_NET_OTHER 0x80
2602
2603 /* PCI device subclasses for class 3 (display controllers)*/
2604
2605 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
2606 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
2607 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
2608 #define PCI_SUBCLASS_VID_OTHER 0x80
2609
2610 /* PCI device subclasses for class 4 (multimedia device)*/
2611
2612 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
2613 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
2614 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
2615 #define PCI_SUBCLASS_MM_OTHER 0x80
2616
2617 /* PCI device subclasses for class 5 (memory controller)*/
2618
2619 #define PCI_SUBCLASS_MEM_RAM 0x00
2620 #define PCI_SUBCLASS_MEM_FLASH 0x01
2621 #define PCI_SUBCLASS_MEM_OTHER 0x80
2622
2623 /* PCI device subclasses for class 6 (bridge device)*/
2624
2625 #define PCI_SUBCLASS_BR_HOST 0x00
2626 #define PCI_SUBCLASS_BR_ISA 0x01
2627 #define PCI_SUBCLASS_BR_EISA 0x02
2628 #define PCI_SUBCLASS_BR_MCA 0x03
2629 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
2630 #define PCI_SUBCLASS_BR_PCMCIA 0x05
2631 #define PCI_SUBCLASS_BR_NUBUS 0x06
2632 #define PCI_SUBCLASS_BR_CARDBUS 0x07
2633 #define PCI_SUBCLASS_BR_RACEWAY 0x08
2634 #define PCI_SUBCLASS_BR_OTHER 0x80
2635
2636 /* PCI device subclasses for class C (serial bus controller)*/
2637
2638 #define PCI_SUBCLASS_SB_IEEE1394 0x00
2639 #define PCI_SUBCLASS_SB_ACCESS 0x01
2640 #define PCI_SUBCLASS_SB_SSA 0x02
2641 #define PCI_SUBCLASS_SB_USB 0x03
2642 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
2643 #define PCI_SUBCLASS_SB_SMBUS 0x05
2644
2645 #define PCI_MAX_DEVICES 32
2646 #define PCI_MAX_FUNCTION 8
2647 #define PCI_MAX_BRIDGE_NUMBER 0xFF
2648 #define PCI_INVALID_VENDORID 0xFFFF
2649 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
2650
2651 #define PCI_ADDRESS_IO_SPACE 0x00000001
2652 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
2653 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
2654 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
2655 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
2656 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
2657
2658 #define PCI_TYPE_32BIT 0
2659 #define PCI_TYPE_20BIT 2
2660 #define PCI_TYPE_64BIT 4
2661
2662 #define POOL_COLD_ALLOCATION 256
2663 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
2664 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
2665
2666 #define PCI_TYPE0_ADDRESSES 6
2667 #define PCI_TYPE1_ADDRESSES 2
2668 #define PCI_TYPE2_ADDRESSES 5
2669
2670 #define IO_TYPE_ADAPTER 1
2671 #define IO_TYPE_CONTROLLER 2
2672 #define IO_TYPE_DEVICE 3
2673 #define IO_TYPE_DRIVER 4
2674 #define IO_TYPE_FILE 5
2675 #define IO_TYPE_IRP 6
2676 #define IO_TYPE_MASTER_ADAPTER 7
2677 #define IO_TYPE_OPEN_PACKET 8
2678 #define IO_TYPE_TIMER 9
2679 #define IO_TYPE_VPB 10
2680 #define IO_TYPE_ERROR_LOG 11
2681 #define IO_TYPE_ERROR_MESSAGE 12
2682 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
2683
2684 #define IO_TYPE_CSQ_IRP_CONTEXT 1
2685 #define IO_TYPE_CSQ 2
2686 #define IO_TYPE_CSQ_EX 3
2687
2688 /* IO_RESOURCE_DESCRIPTOR.Option */
2689
2690 #define IO_RESOURCE_PREFERRED 0x01
2691 #define IO_RESOURCE_DEFAULT 0x02
2692 #define IO_RESOURCE_ALTERNATIVE 0x08
2693
2694 /* DEVICE_OBJECT.Flags */
2695
2696 #define DO_VERIFY_VOLUME 0x00000002
2697 #define DO_BUFFERED_IO 0x00000004
2698 #define DO_EXCLUSIVE 0x00000008
2699 #define DO_DIRECT_IO 0x00000010
2700 #define DO_MAP_IO_BUFFER 0x00000020
2701 #define DO_DEVICE_INITIALIZING 0x00000080
2702 #define DO_SHUTDOWN_REGISTERED 0x00000800
2703 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
2704 #define DO_POWER_PAGABLE 0x00002000
2705 #define DO_POWER_INRUSH 0x00004000
2706
2707 /* DEVICE_OBJECT.Characteristics */
2708
2709 #define FILE_REMOVABLE_MEDIA 0x00000001
2710 #define FILE_READ_ONLY_DEVICE 0x00000002
2711 #define FILE_FLOPPY_DISKETTE 0x00000004
2712 #define FILE_WRITE_ONCE_MEDIA 0x00000008
2713 #define FILE_REMOTE_DEVICE 0x00000010
2714 #define FILE_DEVICE_IS_MOUNTED 0x00000020
2715 #define FILE_VIRTUAL_VOLUME 0x00000040
2716 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
2717 #define FILE_DEVICE_SECURE_OPEN 0x00000100
2718 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
2719 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
2720 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
2721
2722 /* DEVICE_OBJECT.AlignmentRequirement */
2723
2724 #define FILE_BYTE_ALIGNMENT 0x00000000
2725 #define FILE_WORD_ALIGNMENT 0x00000001
2726 #define FILE_LONG_ALIGNMENT 0x00000003
2727 #define FILE_QUAD_ALIGNMENT 0x00000007
2728 #define FILE_OCTA_ALIGNMENT 0x0000000f
2729 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
2730 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
2731 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
2732 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
2733 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
2734
2735 /* DEVICE_OBJECT.DeviceType */
2736
2737 #define DEVICE_TYPE ULONG
2738
2739 #define FILE_DEVICE_BEEP 0x00000001
2740 #define FILE_DEVICE_CD_ROM 0x00000002
2741 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
2742 #define FILE_DEVICE_CONTROLLER 0x00000004
2743 #define FILE_DEVICE_DATALINK 0x00000005
2744 #define FILE_DEVICE_DFS 0x00000006
2745 #define FILE_DEVICE_DISK 0x00000007
2746 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
2747 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
2748 #define FILE_DEVICE_INPORT_PORT 0x0000000a
2749 #define FILE_DEVICE_KEYBOARD 0x0000000b
2750 #define FILE_DEVICE_MAILSLOT 0x0000000c
2751 #define FILE_DEVICE_MIDI_IN 0x0000000d
2752 #define FILE_DEVICE_MIDI_OUT 0x0000000e
2753 #define FILE_DEVICE_MOUSE 0x0000000f
2754 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
2755 #define FILE_DEVICE_NAMED_PIPE 0x00000011
2756 #define FILE_DEVICE_NETWORK 0x00000012
2757 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
2758 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
2759 #define FILE_DEVICE_NULL 0x00000015
2760 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
2761 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
2762 #define FILE_DEVICE_PRINTER 0x00000018
2763 #define FILE_DEVICE_SCANNER 0x00000019
2764 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
2765 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
2766 #define FILE_DEVICE_SCREEN 0x0000001c
2767 #define FILE_DEVICE_SOUND 0x0000001d
2768 #define FILE_DEVICE_STREAMS 0x0000001e
2769 #define FILE_DEVICE_TAPE 0x0000001f
2770 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
2771 #define FILE_DEVICE_TRANSPORT 0x00000021
2772 #define FILE_DEVICE_UNKNOWN 0x00000022
2773 #define FILE_DEVICE_VIDEO 0x00000023
2774 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
2775 #define FILE_DEVICE_WAVE_IN 0x00000025
2776 #define FILE_DEVICE_WAVE_OUT 0x00000026
2777 #define FILE_DEVICE_8042_PORT 0x00000027
2778 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
2779 #define FILE_DEVICE_BATTERY 0x00000029
2780 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
2781 #define FILE_DEVICE_MODEM 0x0000002b
2782 #define FILE_DEVICE_VDM 0x0000002c
2783 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
2784 #define FILE_DEVICE_SMB 0x0000002e
2785 #define FILE_DEVICE_KS 0x0000002f
2786 #define FILE_DEVICE_CHANGER 0x00000030
2787 #define FILE_DEVICE_SMARTCARD 0x00000031
2788 #define FILE_DEVICE_ACPI 0x00000032
2789 #define FILE_DEVICE_DVD 0x00000033
2790 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
2791 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
2792 #define FILE_DEVICE_DFS_VOLUME 0x00000036
2793 #define FILE_DEVICE_SERENUM 0x00000037
2794 #define FILE_DEVICE_TERMSRV 0x00000038
2795 #define FILE_DEVICE_KSEC 0x00000039
2796 #define FILE_DEVICE_FIPS 0x0000003a
2797 #define FILE_DEVICE_INFINIBAND 0x0000003b
2798 #define FILE_DEVICE_VMBUS 0x0000003e
2799 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003f
2800 #define FILE_DEVICE_WPD 0x00000040
2801 #define FILE_DEVICE_BLUETOOTH 0x00000041
2802 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
2803 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
2804 #define FILE_DEVICE_BIOMETRIC 0x00000044
2805 #define FILE_DEVICE_PMI 0x00000045
2806
2807 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
2808
2809 typedef struct _OBJECT_HANDLE_INFORMATION {
2810 ULONG HandleAttributes;
2811 ACCESS_MASK GrantedAccess;
2812 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
2813
2814 typedef struct _CLIENT_ID {
2815 HANDLE UniqueProcess;
2816 HANDLE UniqueThread;
2817 } CLIENT_ID, *PCLIENT_ID;
2818
2819 typedef VOID
2820 (DDKAPI *PKSTART_ROUTINE)(
2821 IN PVOID StartContext);
2822
2823 typedef struct _VPB {
2824 CSHORT Type;
2825 CSHORT Size;
2826 USHORT Flags;
2827 USHORT VolumeLabelLength;
2828 struct _DEVICE_OBJECT *DeviceObject;
2829 struct _DEVICE_OBJECT *RealDevice;
2830 ULONG SerialNumber;
2831 ULONG ReferenceCount;
2832 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
2833 } VPB, *PVPB;
2834
2835 typedef struct _DEVICE_OBJECT {
2836 CSHORT Type;
2837 USHORT Size;
2838 LONG ReferenceCount;
2839 struct _DRIVER_OBJECT *DriverObject;
2840 struct _DEVICE_OBJECT *NextDevice;
2841 struct _DEVICE_OBJECT *AttachedDevice;
2842 struct _IRP *CurrentIrp;
2843 PIO_TIMER Timer;
2844 ULONG Flags;
2845 ULONG Characteristics;
2846 volatile PVPB Vpb;
2847 PVOID DeviceExtension;
2848 DEVICE_TYPE DeviceType;
2849 CCHAR StackSize;
2850 union {
2851 LIST_ENTRY ListEntry;
2852 WAIT_CONTEXT_BLOCK Wcb;
2853 } Queue;
2854 ULONG AlignmentRequirement;
2855 KDEVICE_QUEUE DeviceQueue;
2856 KDPC Dpc;
2857 ULONG ActiveThreadCount;
2858 PSECURITY_DESCRIPTOR SecurityDescriptor;
2859 KEVENT DeviceLock;
2860 USHORT SectorSize;
2861 USHORT Spare1;
2862 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
2863 PVOID Reserved;
2864 } DEVICE_OBJECT, *PDEVICE_OBJECT;
2865
2866 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
2867
2868 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
2869 BOOLEAN Removed;
2870 BOOLEAN Reserved[3];
2871 volatile LONG IoCount;
2872 KEVENT RemoveEvent;
2873 } IO_REMOVE_LOCK_COMMON_BLOCK;
2874
2875 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
2876 LONG Signature;
2877 LONG HighWatermark;
2878 LONGLONG MaxLockedTicks;
2879 LONG AllocateTag;
2880 LIST_ENTRY LockList;
2881 KSPIN_LOCK Spin;
2882 volatile LONG LowMemoryCount;
2883 ULONG Reserved1[4];
2884 PVOID Reserved2;
2885 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
2886 } IO_REMOVE_LOCK_DBG_BLOCK;
2887
2888 typedef struct _IO_REMOVE_LOCK {
2889 IO_REMOVE_LOCK_COMMON_BLOCK Common;
2890 #if DBG
2891 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
2892 #endif
2893 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
2894
2895 typedef struct _IO_WORKITEM *PIO_WORKITEM;
2896
2897 typedef VOID
2898 (DDKAPI IO_WORKITEM_ROUTINE)(
2899 IN PDEVICE_OBJECT DeviceObject,
2900 IN PVOID Context);
2901 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
2902
2903 typedef struct _SHARE_ACCESS {
2904 ULONG OpenCount;
2905 ULONG Readers;
2906 ULONG Writers;
2907 ULONG Deleters;
2908 ULONG SharedRead;
2909 ULONG SharedWrite;
2910 ULONG SharedDelete;
2911 } SHARE_ACCESS, *PSHARE_ACCESS;
2912
2913 typedef struct _PCI_COMMON_HEADER {
2914 USHORT VendorID;
2915 USHORT DeviceID;
2916 USHORT Command;
2917 USHORT Status;
2918 UCHAR RevisionID;
2919 UCHAR ProgIf;
2920 UCHAR SubClass;
2921 UCHAR BaseClass;
2922 UCHAR CacheLineSize;
2923 UCHAR LatencyTimer;
2924 UCHAR HeaderType;
2925 UCHAR BIST;
2926 union {
2927 struct _PCI_HEADER_TYPE_0 {
2928 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
2929 ULONG CIS;
2930 USHORT SubVendorID;
2931 USHORT SubSystemID;
2932 ULONG ROMBaseAddress;
2933 UCHAR CapabilitiesPtr;
2934 UCHAR Reserved1[3];
2935 ULONG Reserved2;
2936 UCHAR InterruptLine;
2937 UCHAR InterruptPin;
2938 UCHAR MinimumGrant;
2939 UCHAR MaximumLatency;
2940 } type0;
2941 struct _PCI_HEADER_TYPE_1 {
2942 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
2943 UCHAR PrimaryBus;
2944 UCHAR SecondaryBus;
2945 UCHAR SubordinateBus;
2946 UCHAR SecondaryLatency;
2947 UCHAR IOBase;
2948 UCHAR IOLimit;
2949 USHORT SecondaryStatus;
2950 USHORT MemoryBase;
2951 USHORT MemoryLimit;
2952 USHORT PrefetchBase;
2953 USHORT PrefetchLimit;
2954 ULONG PrefetchBaseUpper32;
2955 ULONG PrefetchLimitUpper32;
2956 USHORT IOBaseUpper16;
2957 USHORT IOLimitUpper16;
2958 UCHAR CapabilitiesPtr;
2959 UCHAR Reserved1[3];
2960 ULONG ROMBaseAddress;
2961 UCHAR InterruptLine;
2962 UCHAR InterruptPin;
2963 USHORT BridgeControl;
2964 } type1;
2965 struct _PCI_HEADER_TYPE_2 {
2966 ULONG SocketRegistersBaseAddress;
2967 UCHAR CapabilitiesPtr;
2968 UCHAR Reserved;
2969 USHORT SecondaryStatus;
2970 UCHAR PrimaryBus;
2971 UCHAR SecondaryBus;
2972 UCHAR SubordinateBus;
2973 UCHAR SecondaryLatency;
2974 struct {
2975 ULONG Base;
2976 ULONG Limit;
2977 } Range[PCI_TYPE2_ADDRESSES-1];
2978 UCHAR InterruptLine;
2979 UCHAR InterruptPin;
2980 USHORT BridgeControl;
2981 } type2;
2982 } u;
2983 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
2984
2985 #ifdef __cplusplus
2986
2987 typedef struct _PCI_COMMON_CONFIG : PCI_COMMON_HEADER {
2988 UCHAR DeviceSpecific[192];
2989 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2990
2991 #else
2992
2993 typedef struct _PCI_COMMON_CONFIG {
2994 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
2995 UCHAR DeviceSpecific[192];
2996 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2997
2998 #endif
2999
3000 typedef enum _CREATE_FILE_TYPE {
3001 CreateFileTypeNone,
3002 CreateFileTypeNamedPipe,
3003 CreateFileTypeMailslot
3004 } CREATE_FILE_TYPE;
3005
3006 #define IO_FORCE_ACCESS_CHECK 0x001
3007 #define IO_NO_PARAMETER_CHECKING 0x100
3008
3009 #define IO_REPARSE 0x0
3010 #define IO_REMOUNT 0x1
3011
3012 typedef union _POWER_STATE {
3013 SYSTEM_POWER_STATE SystemState;
3014 DEVICE_POWER_STATE DeviceState;
3015 } POWER_STATE, *PPOWER_STATE;
3016
3017 typedef enum _POWER_STATE_TYPE {
3018 SystemPowerState = 0,
3019 DevicePowerState
3020 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
3021
3022 typedef struct _IO_STATUS_BLOCK {
3023 _ANONYMOUS_UNION union {
3024 NTSTATUS Status;
3025 PVOID Pointer;
3026 } DUMMYUNIONNAME;
3027 ULONG_PTR Information;
3028 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
3029
3030 typedef VOID
3031 (DDKAPI *PREQUEST_POWER_COMPLETE)(
3032 IN PDEVICE_OBJECT DeviceObject,
3033 IN UCHAR MinorFunction,
3034 IN POWER_STATE PowerState,
3035 IN PVOID Context,
3036 IN PIO_STATUS_BLOCK IoStatus);
3037
3038 typedef struct _PCI_SLOT_NUMBER {
3039 union {
3040 struct {
3041 ULONG DeviceNumber : 5;
3042 ULONG FunctionNumber : 3;
3043 ULONG Reserved : 24;
3044 } bits;
3045 ULONG AsULONG;
3046 } u;
3047 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
3048
3049 typedef VOID
3050 (DDKAPI *PIO_APC_ROUTINE)(
3051 IN PVOID ApcContext,
3052 IN PIO_STATUS_BLOCK IoStatusBlock,
3053 IN ULONG Reserved);
3054
3055 #define EVENT_INCREMENT 1
3056 #define IO_NO_INCREMENT 0
3057 #define IO_CD_ROM_INCREMENT 1
3058 #define IO_DISK_INCREMENT 1
3059 #define IO_KEYBOARD_INCREMENT 6
3060 #define IO_MAILSLOT_INCREMENT 2
3061 #define IO_MOUSE_INCREMENT 6
3062 #define IO_NAMED_PIPE_INCREMENT 2
3063 #define IO_NETWORK_INCREMENT 2
3064 #define IO_PARALLEL_INCREMENT 1
3065 #define IO_SERIAL_INCREMENT 2
3066 #define IO_SOUND_INCREMENT 8
3067 #define IO_VIDEO_INCREMENT 1
3068 #define SEMAPHORE_INCREMENT 1
3069
3070 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
3071
3072 typedef struct _BOOTDISK_INFORMATION {
3073 LONGLONG BootPartitionOffset;
3074 LONGLONG SystemPartitionOffset;
3075 ULONG BootDeviceSignature;
3076 ULONG SystemDeviceSignature;
3077 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
3078
3079 typedef struct _BOOTDISK_INFORMATION_EX {
3080 LONGLONG BootPartitionOffset;
3081 LONGLONG SystemPartitionOffset;
3082 ULONG BootDeviceSignature;
3083 ULONG SystemDeviceSignature;
3084 GUID BootDeviceGuid;
3085 GUID SystemDeviceGuid;
3086 BOOLEAN BootDeviceIsGpt;
3087 BOOLEAN SystemDeviceIsGpt;
3088 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
3089
3090 typedef struct _EISA_MEMORY_TYPE {
3091 UCHAR ReadWrite : 1;
3092 UCHAR Cached : 1;
3093 UCHAR Reserved0 : 1;
3094 UCHAR Type : 2;
3095 UCHAR Shared : 1;
3096 UCHAR Reserved1 : 1;
3097 UCHAR MoreEntries : 1;
3098 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
3099
3100 #include <pshpack1.h>
3101 typedef struct _EISA_MEMORY_CONFIGURATION {
3102 EISA_MEMORY_TYPE ConfigurationByte;
3103 UCHAR DataSize;
3104 USHORT AddressLowWord;
3105 UCHAR AddressHighByte;
3106 USHORT MemorySize;
3107 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
3108 #include <poppack.h>
3109
3110 typedef struct _EISA_IRQ_DESCRIPTOR {
3111 UCHAR Interrupt : 4;
3112 UCHAR Reserved : 1;
3113 UCHAR LevelTriggered : 1;
3114 UCHAR Shared : 1;
3115 UCHAR MoreEntries : 1;
3116 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
3117
3118 typedef struct _EISA_IRQ_CONFIGURATION {
3119 EISA_IRQ_DESCRIPTOR ConfigurationByte;
3120 UCHAR Reserved;
3121 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
3122
3123 typedef struct _DMA_CONFIGURATION_BYTE0 {
3124 UCHAR Channel : 3;
3125 UCHAR Reserved : 3;
3126 UCHAR Shared : 1;
3127 UCHAR MoreEntries : 1;
3128 } DMA_CONFIGURATION_BYTE0;
3129
3130 typedef struct _DMA_CONFIGURATION_BYTE1 {
3131 UCHAR Reserved0 : 2;
3132 UCHAR TransferSize : 2;
3133 UCHAR Timing : 2;
3134 UCHAR Reserved1 : 2;
3135 } DMA_CONFIGURATION_BYTE1;
3136
3137 typedef struct _EISA_DMA_CONFIGURATION {
3138 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
3139 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
3140 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
3141
3142 #include <pshpack1.h>
3143 typedef struct _EISA_PORT_DESCRIPTOR {
3144 UCHAR NumberPorts : 5;
3145 UCHAR Reserved : 1;
3146 UCHAR Shared : 1;
3147 UCHAR MoreEntries : 1;
3148 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
3149
3150 typedef struct _EISA_PORT_CONFIGURATION {
3151 EISA_PORT_DESCRIPTOR Configuration;
3152 USHORT PortAddress;
3153 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
3154 #include <poppack.h>
3155
3156 typedef struct _CM_EISA_FUNCTION_INFORMATION {
3157 ULONG CompressedId;
3158 UCHAR IdSlotFlags1;
3159 UCHAR IdSlotFlags2;
3160 UCHAR MinorRevision;
3161 UCHAR MajorRevision;
3162 UCHAR Selections[26];
3163 UCHAR FunctionFlags;
3164 UCHAR TypeString[80];
3165 EISA_MEMORY_CONFIGURATION EisaMemory[9];
3166 EISA_IRQ_CONFIGURATION EisaIrq[7];
3167 EISA_DMA_CONFIGURATION EisaDma[4];
3168 EISA_PORT_CONFIGURATION EisaPort[20];
3169 UCHAR InitializationData[60];
3170 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
3171
3172 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
3173
3174 #define EISA_FUNCTION_ENABLED 0x80
3175 #define EISA_FREE_FORM_DATA 0x40
3176 #define EISA_HAS_PORT_INIT_ENTRY 0x20
3177 #define EISA_HAS_PORT_RANGE 0x10
3178 #define EISA_HAS_DMA_ENTRY 0x08
3179 #define EISA_HAS_IRQ_ENTRY 0x04
3180 #define EISA_HAS_MEMORY_ENTRY 0x02
3181 #define EISA_HAS_TYPE_ENTRY 0x01
3182 #define EISA_HAS_INFORMATION \
3183 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
3184 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
3185
3186 typedef struct _CM_EISA_SLOT_INFORMATION {
3187 UCHAR ReturnCode;
3188 UCHAR ReturnFlags;
3189 UCHAR MajorRevision;
3190 UCHAR MinorRevision;
3191 USHORT Checksum;
3192 UCHAR NumberFunctions;
3193 UCHAR FunctionInformation;
3194 ULONG CompressedId;
3195 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
3196
3197 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
3198
3199 #define EISA_INVALID_SLOT 0x80
3200 #define EISA_INVALID_FUNCTION 0x81
3201 #define EISA_INVALID_CONFIGURATION 0x82
3202 #define EISA_EMPTY_SLOT 0x83
3203 #define EISA_INVALID_BIOS_CALL 0x86
3204
3205 /*
3206 ** Plug and Play structures
3207 */
3208
3209 typedef VOID
3210 (DDKAPI *PINTERFACE_REFERENCE)(
3211 PVOID Context);
3212
3213 typedef VOID
3214 (DDKAPI *PINTERFACE_DEREFERENCE)(
3215 PVOID Context);
3216
3217 typedef BOOLEAN
3218 (DDKAPI *PTRANSLATE_BUS_ADDRESS)(
3219 IN PVOID Context,
3220 IN PHYSICAL_ADDRESS BusAddress,
3221 IN ULONG Length,
3222 IN OUT PULONG AddressSpace,
3223 OUT PPHYSICAL_ADDRESS TranslatedAddress);
3224
3225 typedef struct _DMA_ADAPTER*
3226 (DDKAPI *PGET_DMA_ADAPTER)(
3227 IN PVOID Context,
3228 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
3229 OUT PULONG NumberOfMapRegisters);
3230
3231 typedef ULONG
3232 (DDKAPI *PGET_SET_DEVICE_DATA)(
3233 IN PVOID Context,
3234 IN ULONG DataType,
3235 IN PVOID Buffer,
3236 IN ULONG Offset,
3237 IN ULONG Length);
3238
3239 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
3240 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
3241 #define PCI_USE_REVISION 0x00000002
3242 #define PCI_USE_VENDEV_IDS 0x00000004
3243 #define PCI_USE_CLASS_SUBCLASS 0x00000008
3244 #define PCI_USE_PROGIF 0x00000010
3245 #define PCI_USE_LOCAL_BUS 0x00000020
3246 #define PCI_USE_LOCAL_DEVICE 0x00000040
3247
3248 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
3249 ULONG Size;
3250 ULONG Flags;
3251 USHORT VendorID;
3252 USHORT DeviceID;
3253 UCHAR RevisionID;
3254 USHORT SubVendorID;
3255 USHORT SubSystemID;
3256 UCHAR BaseClass;
3257 UCHAR SubClass;
3258 UCHAR ProgIf;
3259 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
3260
3261 typedef BOOLEAN
3262 (DDKAPI *PPCI_IS_DEVICE_PRESENT)(
3263 IN USHORT VendorID,
3264 IN USHORT DeviceID,
3265 IN UCHAR RevisionID,
3266 IN USHORT SubVendorID,
3267 IN USHORT SubSystemID,
3268 IN ULONG Flags);
3269
3270 typedef BOOLEAN
3271 (DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
3272 IN PVOID Context,
3273 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
3274
3275 typedef struct _BUS_INTERFACE_STANDARD {
3276 USHORT Size;
3277 USHORT Version;
3278 PVOID Context;
3279 PINTERFACE_REFERENCE InterfaceReference;
3280 PINTERFACE_DEREFERENCE InterfaceDereference;
3281 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
3282 PGET_DMA_ADAPTER GetDmaAdapter;
3283 PGET_SET_DEVICE_DATA SetBusData;
3284 PGET_SET_DEVICE_DATA GetBusData;
3285 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
3286
3287 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
3288 USHORT Size;
3289 USHORT Version;
3290 PVOID Context;
3291 PINTERFACE_REFERENCE InterfaceReference;
3292 PINTERFACE_DEREFERENCE InterfaceDereference;
3293 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
3294 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
3295 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
3296
3297 typedef struct _DEVICE_CAPABILITIES {
3298 USHORT Size;
3299 USHORT Version;
3300 ULONG DeviceD1 : 1;
3301 ULONG DeviceD2 : 1;
3302 ULONG LockSupported : 1;
3303 ULONG EjectSupported : 1;
3304 ULONG Removable : 1;
3305 ULONG DockDevice : 1;
3306 ULONG UniqueID : 1;
3307 ULONG SilentInstall : 1;
3308 ULONG RawDeviceOK : 1;
3309 ULONG SurpriseRemovalOK : 1;
3310 ULONG WakeFromD0 : 1;
3311 ULONG WakeFromD1 : 1;
3312 ULONG WakeFromD2 : 1;
3313 ULONG WakeFromD3 : 1;
3314 ULONG HardwareDisabled : 1;
3315 ULONG NonDynamic : 1;
3316 ULONG WarmEjectSupported : 1;
3317 ULONG NoDisplayInUI : 1;
3318 ULONG Reserved : 14;
3319 ULONG Address;
3320 ULONG UINumber;
3321 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
3322 SYSTEM_POWER_STATE SystemWake;
3323 DEVICE_POWER_STATE DeviceWake;
3324 ULONG D1Latency;
3325 ULONG D2Latency;
3326 ULONG D3Latency;
3327 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
3328
3329 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
3330 USHORT Version;
3331 USHORT Size;
3332 GUID Event;
3333 GUID InterfaceClassGuid;
3334 PUNICODE_STRING SymbolicLinkName;
3335 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
3336
3337 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
3338 USHORT Version;
3339 USHORT Size;
3340 GUID Event;
3341 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
3342
3343 #undef INTERFACE
3344
3345 typedef struct _INTERFACE {
3346 USHORT Size;
3347 USHORT Version;
3348 PVOID Context;
3349 PINTERFACE_REFERENCE InterfaceReference;
3350 PINTERFACE_DEREFERENCE InterfaceDereference;
3351 } INTERFACE, *PINTERFACE;
3352
3353 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
3354 USHORT Version;
3355 USHORT Size;
3356 GUID Event;
3357 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
3358
3359 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
3360
3361 /* PNP_DEVICE_STATE */
3362
3363 #define PNP_DEVICE_DISABLED 0x00000001
3364 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
3365 #define PNP_DEVICE_FAILED 0x00000004
3366 #define PNP_DEVICE_REMOVED 0x00000008
3367 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
3368 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
3369
3370 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
3371 USHORT Version;
3372 USHORT Size;
3373 GUID Event;
3374 struct _FILE_OBJECT *FileObject;
3375 LONG NameBufferOffset;
3376 UCHAR CustomDataBuffer[1];
3377 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
3378
3379 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
3380 USHORT Version;
3381 USHORT Size;
3382 GUID Event;
3383 struct _FILE_OBJECT *FileObject;
3384 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
3385
3386 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
3387 DeviceUsageTypeUndefined,
3388 DeviceUsageTypePaging,
3389 DeviceUsageTypeHibernation,
3390 DeviceUsageTypeDumpFile
3391 } DEVICE_USAGE_NOTIFICATION_TYPE;
3392
3393 typedef struct _POWER_SEQUENCE {
3394 ULONG SequenceD1;
3395 ULONG SequenceD2;
3396 ULONG SequenceD3;
3397 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
3398
3399 typedef enum {
3400 DevicePropertyDeviceDescription = 0x0,
3401 DevicePropertyHardwareID = 0x1,
3402 DevicePropertyCompatibleIDs = 0x2,
3403 DevicePropertyBootConfiguration = 0x3,
3404 DevicePropertyBootConfigurationTranslated = 0x4,
3405 DevicePropertyClassName = 0x5,
3406 DevicePropertyClassGuid = 0x6,
3407 DevicePropertyDriverKeyName = 0x7,
3408 DevicePropertyManufacturer = 0x8,
3409 DevicePropertyFriendlyName = 0x9,
3410 DevicePropertyLocationInformation = 0xa,
3411 DevicePropertyPhysicalDeviceObjectName = 0xb,
3412 DevicePropertyBusTypeGuid = 0xc,
3413 DevicePropertyLegacyBusType = 0xd,
3414 DevicePropertyBusNumber = 0xe,
3415 DevicePropertyEnumeratorName = 0xf,
3416 DevicePropertyAddress = 0x10,
3417 DevicePropertyUINumber = 0x11,
3418 DevicePropertyInstallState = 0x12,
3419 DevicePropertyRemovalPolicy = 0x13,
3420 DevicePropertyResourceRequirements = 0x14,
3421 DevicePropertyAllocatedResources = 0x15,
3422 DevicePropertyContainerID = 0x16
3423 } DEVICE_REGISTRY_PROPERTY;
3424
3425 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
3426 EventCategoryReserved,
3427 EventCategoryHardwareProfileChange,
3428 EventCategoryDeviceInterfaceChange,
3429 EventCategoryTargetDeviceChange
3430 } IO_NOTIFICATION_EVENT_CATEGORY;
3431
3432 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
3433
3434 typedef NTSTATUS
3435 (DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
3436 IN PVOID NotificationStructure,
3437 IN PVOID Context);
3438
3439 typedef VOID
3440 (DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
3441 IN PVOID Context);
3442
3443 typedef enum _FILE_INFORMATION_CLASS {
3444 FileDirectoryInformation = 1,
3445 FileFullDirectoryInformation,
3446 FileBothDirectoryInformation,
3447 FileBasicInformation,
3448 FileStandardInformation,
3449 FileInternalInformation,
3450 FileEaInformation,
3451 FileAccessInformation,
3452 FileNameInformation,
3453 FileRenameInformation,
3454 FileLinkInformation,
3455 FileNamesInformation,
3456 FileDispositionInformation,
3457 FilePositionInformation,
3458 FileFullEaInformation,
3459 FileModeInformation,
3460 FileAlignmentInformation,
3461 FileAllInformation,
3462 FileAllocationInformation,
3463 FileEndOfFileInformation,
3464 FileAlternateNameInformation,
3465 FileStreamInformation,
3466 FilePipeInformation,
3467 FilePipeLocalInformation,
3468 FilePipeRemoteInformation,
3469 FileMailslotQueryInformation,
3470 FileMailslotSetInformation,
3471 FileCompressionInformation,
3472 FileObjectIdInformation,
3473 FileCompletionInformation,
3474 FileMoveClusterInformation,
3475 FileQuotaInformation,
3476 FileReparsePointInformation,
3477 FileNetworkOpenInformation,
3478 FileAttributeTagInformation,
3479 FileTrackingInformation,
3480 FileIdBothDirectoryInformation,
3481 FileIdFullDirectoryInformation,
3482 FileValidDataLengthInformation,
3483 FileShortNameInformation,
3484 FileIoCompletionNotificationInformation,
3485 FileIoStatusBlockRangeInformation,
3486 FileIoPriorityHintInformation,
3487 FileSfioReserveInformation,
3488 FileSfioVolumeInformation,
3489 FileHardLinkInformation,
3490 FileProcessIdsUsingFileInformation,
3491 FileNormalizedNameInformation,
3492 FileNetworkPhysicalNameInformation,
3493 FileIdGlobalTxDirectoryInformation,
3494 FileIsRemoteDeviceInformation,
3495 FileAttributeCacheInformation,
3496 FileNumaNodeInformation,
3497 FileStandardLinkInformation,
3498 FileRemoteProtocolInformation,
3499 FileMaximumInformation
3500 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
3501
3502 typedef struct _FILE_POSITION_INFORMATION {
3503 LARGE_INTEGER CurrentByteOffset;
3504 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
3505
3506 #include <pshpack8.h>
3507 typedef struct _FILE_BASIC_INFORMATION {
3508 LARGE_INTEGER CreationTime;
3509 LARGE_INTEGER LastAccessTime;
3510 LARGE_INTEGER LastWriteTime;
3511 LARGE_INTEGER ChangeTime;
3512 ULONG FileAttributes;
3513 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
3514 #include <poppack.h>
3515
3516 typedef struct _FILE_STANDARD_INFORMATION {
3517 LARGE_INTEGER AllocationSize;
3518 LARGE_INTEGER EndOfFile;
3519 ULONG NumberOfLinks;
3520 BOOLEAN DeletePending;
3521 BOOLEAN Directory;
3522 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
3523
3524 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
3525 LARGE_INTEGER CreationTime;
3526 LARGE_INTEGER LastAccessTime;
3527 LARGE_INTEGER LastWriteTime;
3528 LARGE_INTEGER ChangeTime;
3529 LARGE_INTEGER AllocationSize;
3530 LARGE_INTEGER EndOfFile;
3531 ULONG FileAttributes;
3532 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
3533
3534 typedef enum _FSINFOCLASS {
3535 FileFsVolumeInformation = 1,
3536 FileFsLabelInformation,
3537 FileFsSizeInformation,
3538 FileFsDeviceInformation,
3539 FileFsAttributeInformation,
3540 FileFsControlInformation,
3541 FileFsFullSizeInformation,
3542 FileFsObjectIdInformation,
3543 FileFsDriverPathInformation,
3544 FileFsVolumeFlagsInformation,
3545 FileFsMaximumInformation
3546 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
3547
3548 typedef struct _FILE_FS_DEVICE_INFORMATION {
3549 DEVICE_TYPE DeviceType;
3550 ULONG Characteristics;
3551 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
3552
3553 typedef struct _FILE_FULL_EA_INFORMATION {
3554 ULONG NextEntryOffset;
3555 UCHAR Flags;
3556 UCHAR EaNameLength;
3557 USHORT EaValueLength;
3558 CHAR EaName[1];
3559 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
3560
3561 typedef struct _FAST_MUTEX
3562 {
3563 LONG Count;
3564 PKTHREAD Owner;
3565 ULONG Contention;
3566 KEVENT Gate;
3567 ULONG OldIrql;
3568 } FAST_MUTEX, *PFAST_MUTEX;
3569
3570 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
3571
3572 typedef struct _OWNER_ENTRY {
3573 ERESOURCE_THREAD OwnerThread;
3574 _ANONYMOUS_UNION union {
3575 LONG OwnerCount;
3576 ULONG TableSize;
3577 } DUMMYUNIONNAME;
3578 } OWNER_ENTRY, *POWNER_ENTRY;
3579
3580 typedef struct _ERESOURCE
3581 {
3582 LIST_ENTRY SystemResourcesList;
3583 POWNER_ENTRY OwnerTable;
3584 SHORT ActiveCount;
3585 USHORT Flag;
3586 volatile PKSEMAPHORE SharedWaiters;
3587 volatile PKEVENT ExclusiveWaiters;
3588 OWNER_ENTRY OwnerEntry;
3589 ULONG ActiveEntries;
3590 ULONG ContentionCount;
3591 ULONG NumberOfSharedWaiters;
3592 ULONG NumberOfExclusiveWaiters;
3593 __GNU_EXTENSION union
3594 {
3595 PVOID Address;
3596 ULONG_PTR CreatorBackTraceIndex;
3597 };
3598 KSPIN_LOCK SpinLock;
3599 } ERESOURCE, *PERESOURCE;
3600
3601 /* ERESOURCE.Flag */
3602
3603 #define ResourceNeverExclusive 0x0010
3604 #define ResourceReleaseByOtherThread 0x0020
3605 #define ResourceOwnedExclusive 0x0080
3606
3607 #define RESOURCE_HASH_TABLE_SIZE 64
3608
3609 typedef BOOLEAN
3610 (DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
3611 IN struct _FILE_OBJECT *FileObject,
3612 IN PLARGE_INTEGER FileOffset,
3613 IN ULONG Length,
3614 IN BOOLEAN Wait,
3615 IN ULONG LockKey,
3616 IN BOOLEAN CheckForReadOperation,
3617 OUT PIO_STATUS_BLOCK IoStatus,
3618 IN struct _DEVICE_OBJECT *DeviceObject);
3619
3620 typedef BOOLEAN
3621 (DDKAPI *PFAST_IO_READ)(
3622 IN struct _FILE_OBJECT *FileObject,
3623 IN PLARGE_INTEGER FileOffset,
3624 IN ULONG Length,
3625 IN BOOLEAN Wait,
3626 IN ULONG LockKey,
3627 OUT PVOID Buffer,
3628 OUT PIO_STATUS_BLOCK IoStatus,
3629 IN struct _DEVICE_OBJECT *DeviceObject);
3630
3631 typedef BOOLEAN
3632 (DDKAPI *PFAST_IO_WRITE)(
3633 IN struct _FILE_OBJECT *FileObject,
3634 IN PLARGE_INTEGER FileOffset,
3635 IN ULONG Length,
3636 IN BOOLEAN Wait,
3637 IN ULONG LockKey,
3638 IN PVOID Buffer,
3639 OUT PIO_STATUS_BLOCK IoStatus,
3640 IN struct _DEVICE_OBJECT *DeviceObject);
3641
3642 typedef BOOLEAN
3643 (DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
3644 IN struct _FILE_OBJECT *FileObject,
3645 IN BOOLEAN Wait,
3646 OUT PFILE_BASIC_INFORMATION Buffer,
3647 OUT PIO_STATUS_BLOCK IoStatus,
3648 IN struct _DEVICE_OBJECT *DeviceObject);
3649
3650 typedef BOOLEAN
3651 (DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
3652 IN struct _FILE_OBJECT *FileObject,
3653 IN BOOLEAN Wait,
3654 OUT PFILE_STANDARD_INFORMATION Buffer,
3655 OUT PIO_STATUS_BLOCK IoStatus,
3656 IN struct _DEVICE_OBJECT *DeviceObject);
3657
3658 typedef BOOLEAN
3659 (DDKAPI *PFAST_IO_LOCK)(
3660 IN struct _FILE_OBJECT *FileObject,
3661 IN PLARGE_INTEGER FileOffset,
3662 IN PLARGE_INTEGER Length,
3663 PEPROCESS ProcessId,
3664 ULONG Key,
3665 BOOLEAN FailImmediately,
3666 BOOLEAN ExclusiveLock,
3667 OUT PIO_STATUS_BLOCK IoStatus,
3668 IN struct _DEVICE_OBJECT *DeviceObject);
3669
3670 typedef BOOLEAN
3671 (DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
3672 IN struct _FILE_OBJECT *FileObject,
3673 IN PLARGE_INTEGER FileOffset,
3674 IN PLARGE_INTEGER Length,
3675 PEPROCESS ProcessId,
3676 ULONG Key,
3677 OUT PIO_STATUS_BLOCK IoStatus,
3678 IN struct _DEVICE_OBJECT *DeviceObject);
3679
3680 typedef BOOLEAN
3681 (DDKAPI *PFAST_IO_UNLOCK_ALL)(
3682 IN struct _FILE_OBJECT *FileObject,
3683 PEPROCESS ProcessId,
3684 OUT PIO_STATUS_BLOCK IoStatus,
3685 IN struct _DEVICE_OBJECT *DeviceObject);
3686
3687 typedef BOOLEAN
3688 (DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
3689 IN struct _FILE_OBJECT *FileObject,
3690 PVOID ProcessId,
3691 ULONG Key,
3692 OUT PIO_STATUS_BLOCK IoStatus,
3693 IN struct _DEVICE_OBJECT *DeviceObject);
3694
3695 typedef BOOLEAN
3696 (DDKAPI *PFAST_IO_DEVICE_CONTROL)(
3697 IN struct _FILE_OBJECT *FileObject,
3698 IN BOOLEAN Wait,
3699 IN PVOID InputBuffer OPTIONAL,
3700 IN ULONG InputBufferLength,
3701 OUT PVOID OutputBuffer OPTIONAL,
3702 IN ULONG OutputBufferLength,
3703 IN ULONG IoControlCode,
3704 OUT PIO_STATUS_BLOCK IoStatus,
3705 IN struct _DEVICE_OBJECT *DeviceObject);
3706
3707 typedef VOID
3708 (DDKAPI *PFAST_IO_ACQUIRE_FILE)(
3709 IN struct _FILE_OBJECT *FileObject);
3710
3711 typedef VOID
3712 (DDKAPI *PFAST_IO_RELEASE_FILE)(
3713 IN struct _FILE_OBJECT *FileObject);
3714
3715 typedef VOID
3716 (DDKAPI *PFAST_IO_DETACH_DEVICE)(
3717 IN struct _DEVICE_OBJECT *SourceDevice,
3718 IN struct _DEVICE_OBJECT *TargetDevice);
3719
3720 typedef BOOLEAN
3721 (DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
3722 IN struct _FILE_OBJECT *FileObject,
3723 IN BOOLEAN Wait,
3724 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
3725 OUT struct _IO_STATUS_BLOCK *IoStatus,
3726 IN struct _DEVICE_OBJECT *DeviceObject);
3727
3728 typedef NTSTATUS
3729 (DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
3730 IN struct _FILE_OBJECT *FileObject,
3731 IN PLARGE_INTEGER EndingOffset,
3732 OUT struct _ERESOURCE **ResourceToRelease,
3733 IN struct _DEVICE_OBJECT *DeviceObject);
3734
3735 typedef BOOLEAN
3736 (DDKAPI *PFAST_IO_MDL_READ)(
3737 IN struct _FILE_OBJECT *FileObject,
3738 IN PLARGE_INTEGER FileOffset,
3739 IN ULONG Length,
3740 IN ULONG LockKey,
3741 OUT PMDL *MdlChain,
3742 OUT PIO_STATUS_BLOCK IoStatus,
3743 IN struct _DEVICE_OBJECT *DeviceObject);
3744
3745 typedef BOOLEAN
3746 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
3747 IN struct _FILE_OBJECT *FileObject,
3748 IN PMDL MdlChain,
3749 IN struct _DEVICE_OBJECT *DeviceObject);
3750
3751 typedef BOOLEAN
3752 (DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
3753 IN struct _FILE_OBJECT *FileObject,
3754 IN PLARGE_INTEGER FileOffset,
3755 IN ULONG Length,
3756 IN ULONG LockKey,
3757 OUT PMDL *MdlChain,
3758 OUT PIO_STATUS_BLOCK IoStatus,
3759 IN struct _DEVICE_OBJECT *DeviceObject);
3760
3761 typedef BOOLEAN
3762 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
3763 IN struct _FILE_OBJECT *FileObject,
3764 IN PLARGE_INTEGER FileOffset,
3765 IN PMDL MdlChain,
3766 IN struct _DEVICE_OBJECT *DeviceObject);
3767
3768 typedef BOOLEAN
3769 (DDKAPI *PFAST_IO_READ_COMPRESSED)(
3770 IN struct _FILE_OBJECT *FileObject,
3771 IN PLARGE_INTEGER FileOffset,
3772 IN ULONG Length,
3773 IN ULONG LockKey,
3774 OUT PVOID Buffer,
3775 OUT PMDL *MdlChain,
3776 OUT PIO_STATUS_BLOCK IoStatus,
3777 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
3778 IN ULONG CompressedDataInfoLength,
3779 IN struct _DEVICE_OBJECT *DeviceObject);
3780
3781 typedef BOOLEAN
3782 (DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
3783 IN struct _FILE_OBJECT *FileObject,
3784 IN PLARGE_INTEGER FileOffset,
3785 IN ULONG Length,
3786 IN ULONG LockKey,
3787 IN PVOID Buffer,
3788 OUT PMDL *MdlChain,
3789 OUT PIO_STATUS_BLOCK IoStatus,
3790 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
3791 IN ULONG CompressedDataInfoLength,
3792 IN struct _DEVICE_OBJECT *DeviceObject);
3793
3794 typedef BOOLEAN
3795 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
3796 IN struct _FILE_OBJECT *FileObject,
3797 IN PMDL MdlChain,
3798 IN struct _DEVICE_OBJECT *DeviceObject);
3799
3800 typedef BOOLEAN
3801 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
3802 IN struct _FILE_OBJECT *FileObject,
3803 IN PLARGE_INTEGER FileOffset,
3804 IN PMDL MdlChain,
3805 IN struct _DEVICE_OBJECT *DeviceObject);
3806
3807 typedef BOOLEAN
3808 (DDKAPI *PFAST_IO_QUERY_OPEN)(
3809 IN struct _IRP *Irp,
3810 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
3811 IN struct _DEVICE_OBJECT *DeviceObject);
3812
3813 typedef NTSTATUS
3814 (DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
3815 IN struct _FILE_OBJECT *FileObject,
3816 IN struct _ERESOURCE *ResourceToRelease,
3817 IN struct _DEVICE_OBJECT *DeviceObject);
3818
3819 typedef NTSTATUS
3820 (DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
3821 IN struct _FILE_OBJECT *FileObject,
3822 IN struct _DEVICE_OBJECT *DeviceObject);
3823
3824 typedef NTSTATUS
3825 (DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
3826 IN struct _FILE_OBJECT *FileObject,
3827 IN struct _DEVICE_OBJECT *DeviceObject);
3828
3829 typedef struct _FAST_IO_DISPATCH {
3830 ULONG SizeOfFastIoDispatch;
3831 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
3832 PFAST_IO_READ FastIoRead;
3833 PFAST_IO_WRITE FastIoWrite;
3834 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
3835 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
3836 PFAST_IO_LOCK FastIoLock;
3837 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
3838 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
3839 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
3840 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
3841 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
3842 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
3843 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
3844 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
3845 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
3846 PFAST_IO_MDL_READ MdlRead;
3847 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
3848 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
3849 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
3850 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
3851 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
3852 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
3853 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
3854 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
3855 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
3856 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
3857 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
3858 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
3859
3860 typedef struct _SECTION_OBJECT_POINTERS {
3861 PVOID DataSectionObject;
3862 PVOID SharedCacheMap;
3863 PVOID ImageSectionObject;
3864 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
3865
3866 typedef struct _IO_COMPLETION_CONTEXT {
3867 PVOID Port;
3868 PVOID Key;
3869 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
3870
3871 /* FILE_OBJECT.Flags */
3872
3873 #define FO_FILE_OPEN 0x00000001
3874 #define FO_SYNCHRONOUS_IO 0x00000002
3875 #define FO_ALERTABLE_IO 0x00000004
3876 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
3877 #define FO_WRITE_THROUGH 0x00000010
3878 #define FO_SEQUENTIAL_ONLY 0x00000020
3879 #define FO_CACHE_SUPPORTED 0x00000040
3880 #define FO_NAMED_PIPE 0x00000080
3881 #define FO_STREAM_FILE 0x00000100
3882 #define FO_MAILSLOT 0x00000200
3883 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
3884 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
3885 #define FO_DIRECT_DEVICE_OPEN 0x00000800
3886 #define FO_FILE_MODIFIED 0x00001000
3887 #define FO_FILE_SIZE_CHANGED 0x00002000
3888 #define FO_CLEANUP_COMPLETE 0x00004000
3889 #define FO_TEMPORARY_FILE 0x00008000
3890 #define FO_DELETE_ON_CLOSE 0x00010000
3891 #define FO_OPENED_CASE_SENSITIVE 0x00020000
3892 #define FO_HANDLE_CREATED 0x00040000
3893 #define FO_FILE_FAST_IO_READ 0x00080000
3894 #define FO_RANDOM_ACCESS 0x00100000
3895 #define FO_FILE_OPEN_CANCELLED 0x00200000
3896 #define FO_VOLUME_OPEN 0x00400000
3897 #define FO_REMOTE_ORIGIN 0x01000000
3898 #define FO_DISALLOW_EXCLUSIVE 0x02000000
3899 #define FO_SKIP_COMPLETION_PORT 0x02000000
3900 #define FO_SKIP_SET_EVENT 0x04000000
3901 #define FO_SKIP_SET_FAST_IO 0x08000000
3902
3903 /* VPB.Flags */
3904 #define VPB_MOUNTED 0x0001
3905 #define VPB_LOCKED 0x0002
3906 #define VPB_PERSISTENT 0x0004
3907 #define VPB_REMOVE_PENDING 0x0008
3908 #define VPB_RAW_MOUNT 0x0010
3909 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
3910
3911 /* IRP.Flags */
3912
3913 #define SL_FORCE_ACCESS_CHECK 0x01
3914 #define SL_OPEN_PAGING_FILE 0x02
3915 #define SL_OPEN_TARGET_DIRECTORY 0x04
3916 #define SL_CASE_SENSITIVE 0x80
3917
3918 #define SL_KEY_SPECIFIED 0x01
3919 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
3920 #define SL_WRITE_THROUGH 0x04
3921 #define SL_FT_SEQUENTIAL_WRITE 0x08
3922
3923 #define SL_FAIL_IMMEDIATELY 0x01
3924 #define SL_EXCLUSIVE_LOCK 0x02
3925
3926 #define SL_RESTART_SCAN 0x01
3927 #define SL_RETURN_SINGLE_ENTRY 0x02
3928 #define SL_INDEX_SPECIFIED 0x04
3929
3930 #define SL_WATCH_TREE 0x01
3931
3932 #define SL_ALLOW_RAW_MOUNT 0x01
3933
3934 #define CTL_CODE(DeviceType, Function, Method, Access)( \
3935 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
3936
3937 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
3938
3939 #define IRP_NOCACHE 0x00000001
3940 #define IRP_PAGING_IO 0x00000002
3941 #define IRP_MOUNT_COMPLETION 0x00000002
3942 #define IRP_SYNCHRONOUS_API 0x00000004
3943 #define IRP_ASSOCIATED_IRP 0x00000008
3944 #define IRP_BUFFERED_IO 0x00000010
3945 #define IRP_DEALLOCATE_BUFFER 0x00000020
3946 #define IRP_INPUT_OPERATION 0x00000040
3947 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
3948 #define IRP_CREATE_OPERATION 0x00000080
3949 #define IRP_READ_OPERATION 0x00000100
3950 #define IRP_WRITE_OPERATION 0x00000200
3951 #define IRP_CLOSE_OPERATION 0x00000400
3952 #define IRP_DEFER_IO_COMPLETION 0x00000800
3953 #define IRP_OB_QUERY_NAME 0x00001000
3954 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
3955
3956 #define IRP_QUOTA_CHARGED 0x01
3957 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
3958 #define IRP_ALLOCATED_FIXED_SIZE 0x04
3959 #define IRP_LOOKASIDE_ALLOCATION 0x08
3960
3961 /*
3962 ** IRP function codes
3963 */
3964
3965 #define IRP_MJ_CREATE 0x00
3966 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
3967 #define IRP_MJ_CLOSE 0x02
3968 #define IRP_MJ_READ 0x03
3969 #define IRP_MJ_WRITE 0x04
3970 #define IRP_MJ_QUERY_INFORMATION 0x05
3971 #define IRP_MJ_SET_INFORMATION 0x06
3972 #define IRP_MJ_QUERY_EA 0x07
3973 #define IRP_MJ_SET_EA 0x08
3974 #define IRP_MJ_FLUSH_BUFFERS 0x09
3975 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
3976 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
3977 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
3978 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
3979 #define IRP_MJ_DEVICE_CONTROL 0x0e
3980 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
3981 #define IRP_MJ_SCSI 0x0f
3982 #define IRP_MJ_SHUTDOWN 0x10
3983 #define IRP_MJ_LOCK_CONTROL 0x11
3984 #define IRP_MJ_CLEANUP 0x12
3985 #define IRP_MJ_CREATE_MAILSLOT 0x13
3986 #define IRP_MJ_QUERY_SECURITY 0x14
3987 #define IRP_MJ_SET_SECURITY 0x15
3988 #define IRP_MJ_POWER 0x16
3989 #define IRP_MJ_SYSTEM_CONTROL 0x17
3990 #define IRP_MJ_DEVICE_CHANGE 0x18
3991 #define IRP_MJ_QUERY_QUOTA 0x19
3992 #define IRP_MJ_SET_QUOTA 0x1a
3993 #define IRP_MJ_PNP 0x1b
3994 #define IRP_MJ_PNP_POWER 0x1b
3995 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
3996
3997 #define IRP_MN_SCSI_CLASS 0x01
3998
3999 #define IRP_MN_START_DEVICE 0x00
4000 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
4001 #define IRP_MN_REMOVE_DEVICE 0x02
4002 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
4003 #define IRP_MN_STOP_DEVICE 0x04
4004 #define IRP_MN_QUERY_STOP_DEVICE 0x05
4005 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
4006
4007 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
4008 #define IRP_MN_QUERY_INTERFACE 0x08
4009 #define IRP_MN_QUERY_CAPABILITIES 0x09
4010 #define IRP_MN_QUERY_RESOURCES 0x0A
4011 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
4012 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
4013 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
4014
4015 #define IRP_MN_READ_CONFIG 0x0F
4016 #define IRP_MN_WRITE_CONFIG 0x10
4017 #define IRP_MN_EJECT 0x11
4018 #define IRP_MN_SET_LOCK 0x12
4019 #define IRP_MN_QUERY_ID 0x13
4020 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
4021 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
4022 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
4023 #define IRP_MN_SURPRISE_REMOVAL 0x17
4024
4025 #define IRP_MN_WAIT_WAKE 0x00
4026 #define IRP_MN_POWER_SEQUENCE 0x01
4027 #define IRP_MN_SET_POWER 0x02
4028 #define IRP_MN_QUERY_POWER 0x03
4029
4030 #define IRP_MN_QUERY_ALL_DATA 0x00
4031 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
4032 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
4033 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
4034 #define IRP_MN_ENABLE_EVENTS 0x04
4035 #define IRP_MN_DISABLE_EVENTS 0x05
4036 #define IRP_MN_ENABLE_COLLECTION 0x06
4037 #define IRP_MN_DISABLE_COLLECTION 0x07
4038 #define IRP_MN_REGINFO 0x08
4039 #define IRP_MN_EXECUTE_METHOD 0x09
4040
4041 #define IRP_MN_REGINFO_EX 0x0b
4042
4043 typedef struct _FILE_OBJECT
4044 {
4045 CSHORT Type;
4046 CSHORT Size;
4047 PDEVICE_OBJECT DeviceObject;
4048 PVPB Vpb;
4049 PVOID FsContext;
4050 PVOID FsContext2;
4051 PSECTION_OBJECT_POINTERS SectionObjectPointer;
4052 PVOID PrivateCacheMap;
4053 NTSTATUS FinalStatus;
4054 struct _FILE_OBJECT *RelatedFileObject;
4055 BOOLEAN LockOperation;
4056 BOOLEAN DeletePending;
4057 BOOLEAN ReadAccess;
4058 BOOLEAN WriteAccess;
4059 BOOLEAN DeleteAccess;
4060 BOOLEAN SharedRead;
4061 BOOLEAN SharedWrite;
4062 BOOLEAN SharedDelete;
4063 ULONG Flags;
4064 UNICODE_STRING FileName;
4065 LARGE_INTEGER CurrentByteOffset;
4066 volatile ULONG Waiters;
4067 volatile ULONG Busy;
4068 PVOID LastLock;
4069 KEVENT Lock;
4070 KEVENT Event;
4071 volatile PIO_COMPLETION_CONTEXT CompletionContext;
4072 KSPIN_LOCK IrpListLock;
4073 LIST_ENTRY IrpList;
4074 volatile PVOID FileObjectExtension;
4075 } FILE_OBJECT;
4076 typedef struct _FILE_OBJECT *PFILE_OBJECT;
4077
4078 typedef struct _IO_ERROR_LOG_PACKET {
4079 UCHAR MajorFunctionCode;
4080 UCHAR RetryCount;
4081 USHORT DumpDataSize;
4082 USHORT NumberOfStrings;
4083 USHORT StringOffset;
4084 USHORT EventCategory;
4085 NTSTATUS ErrorCode;
4086 ULONG UniqueErrorValue;
4087 NTSTATUS FinalStatus;
4088 ULONG SequenceNumber;
4089 ULONG IoControlCode;
4090 LARGE_INTEGER DeviceOffset;
4091 ULONG DumpData[1];
4092 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
4093
4094 typedef struct _IO_ERROR_LOG_MESSAGE {
4095 USHORT Type;
4096 USHORT Size;
4097 USHORT DriverNameLength;
4098 LARGE_INTEGER TimeStamp;
4099 ULONG DriverNameOffset;
4100 IO_ERROR_LOG_PACKET EntryData;
4101 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
4102
4103 #define ERROR_LOG_LIMIT_SIZE 240
4104 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
4105 sizeof(IO_ERROR_LOG_PACKET) + \
4106 (sizeof(WCHAR) * 40))
4107 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
4108 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
4109 #define IO_ERROR_LOG_MESSAGE_LENGTH \
4110 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
4111 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
4112 PORT_MAXIMUM_MESSAGE_LENGTH)
4113 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
4114 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
4115
4116 typedef enum _DMA_WIDTH {
4117 Width8Bits,
4118 Width16Bits,
4119 Width32Bits,
4120 MaximumDmaWidth
4121 } DMA_WIDTH, *PDMA_WIDTH;
4122
4123 typedef enum _DMA_SPEED {
4124 Compatible,
4125 TypeA,
4126 TypeB,
4127 TypeC,
4128 TypeF,
4129 MaximumDmaSpeed
4130 } DMA_SPEED, *PDMA_SPEED;
4131
4132 /* DEVICE_DESCRIPTION.Version */
4133
4134 #define DEVICE_DESCRIPTION_VERSION 0x0000
4135 #define DEVICE_DESCRIPTION_VERSION1 0x0001
4136 #define DEVICE_DESCRIPTION_VERSION2 0x0002
4137
4138 typedef struct _DEVICE_DESCRIPTION {
4139 ULONG Version;
4140 BOOLEAN Master;
4141 BOOLEAN ScatterGather;
4142 BOOLEAN DemandMode;
4143 BOOLEAN AutoInitialize;
4144 BOOLEAN Dma32BitAddresses;
4145 BOOLEAN IgnoreCount;
4146 BOOLEAN Reserved1;
4147 BOOLEAN Dma64BitAddresses;
4148 ULONG BusNumber;
4149 ULONG DmaChannel;
4150 INTERFACE_TYPE InterfaceType;
4151 DMA_WIDTH DmaWidth;
4152 DMA_SPEED DmaSpeed;
4153 ULONG MaximumLength;
4154 ULONG DmaPort;
4155 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
4156
4157 typedef enum _DEVICE_RELATION_TYPE {
4158 BusRelations,
4159 EjectionRelations,
4160 PowerRelations,
4161 RemovalRelations,
4162 TargetDeviceRelation,
4163 SingleBusRelations,
4164 TransportRelations
4165 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
4166
4167 typedef struct _DEVICE_RELATIONS {
4168 ULONG Count;
4169 PDEVICE_OBJECT Objects[1];
4170 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
4171
4172 typedef struct _DEVOBJ_EXTENSION
4173 {
4174 CSHORT Type;
4175 USHORT Size;
4176 PDEVICE_OBJECT DeviceObject;
4177 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
4178
4179 typedef struct _SCATTER_GATHER_ELEMENT {
4180 PHYSICAL_ADDRESS Address;
4181 ULONG Length;
4182 ULONG_PTR Reserved;
4183 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
4184
4185 #if defined(_MSC_EXTENSIONS)
4186
4187 #if _MSC_VER >= 1200
4188 #pragma warning(push)
4189 #endif
4190 #pragma warning(disable:4200)
4191 typedef struct _SCATTER_GATHER_LIST {
4192 ULONG NumberOfElements;
4193 ULONG_PTR Reserved;
4194 SCATTER_GATHER_ELEMENT Elements[1];
4195 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
4196
4197 #if _MSC_VER >= 1200
4198 #pragma warning(pop)
4199 #else
4200 #pragma warning(default:4200)
4201 #endif
4202
4203 #else
4204
4205 struct _SCATTER_GATHER_LIST;
4206 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
4207
4208 #endif
4209
4210 typedef NTSTATUS
4211 (DDKAPI DRIVER_ADD_DEVICE)(
4212 IN struct _DRIVER_OBJECT *DriverObject,
4213 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
4214 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
4215
4216 typedef struct _DRIVER_EXTENSION {
4217 struct _DRIVER_OBJECT *DriverObject;
4218 PDRIVER_ADD_DEVICE AddDevice;
4219 ULONG Count;
4220 UNICODE_STRING ServiceKeyName;
4221 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
4222
4223 #define DRVO_UNLOAD_INVOKED 0x00000001
4224 #define DRVO_LEGACY_DRIVER 0x00000002
4225 #define DRVO_BUILTIN_DRIVER 0x00000004
4226
4227 typedef NTSTATUS
4228 (DDKAPI DRIVER_INITIALIZE)(
4229 IN struct _DRIVER_OBJECT *DriverObject,
4230 IN PUNICODE_STRING RegistryPath);
4231 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
4232
4233 typedef VOID
4234 (DDKAPI DRIVER_STARTIO)(
4235 IN struct _DEVICE_OBJECT *DeviceObject,
4236 IN struct _IRP *Irp);
4237 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
4238
4239 typedef VOID
4240 (DDKAPI DRIVER_UNLOAD)(
4241 IN struct _DRIVER_OBJECT *DriverObject);
4242 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
4243
4244 typedef NTSTATUS
4245 (DDKAPI DRIVER_DISPATCH)(
4246 IN struct _DEVICE_OBJECT *DeviceObject,
4247 IN struct _IRP *Irp);
4248 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
4249
4250 typedef struct _DRIVER_OBJECT {
4251 CSHORT Type;
4252 CSHORT Size;
4253 PDEVICE_OBJECT DeviceObject;
4254 ULONG Flags;
4255 PVOID DriverStart;
4256 ULONG DriverSize;
4257 PVOID DriverSection;
4258 PDRIVER_EXTENSION DriverExtension;
4259 UNICODE_STRING DriverName;
4260 PUNICODE_STRING HardwareDatabase;
4261 struct _FAST_IO_DISPATCH *FastIoDispatch;
4262 PDRIVER_INITIALIZE DriverInit;
4263 PDRIVER_STARTIO DriverStartIo;
4264 PDRIVER_UNLOAD DriverUnload;
4265 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
4266 } DRIVER_OBJECT;
4267 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
4268
4269 typedef struct _DMA_ADAPTER {
4270 USHORT Version;
4271 USHORT Size;
4272 struct _DMA_OPERATIONS* DmaOperations;
4273 } DMA_ADAPTER, *PDMA_ADAPTER;
4274
4275 typedef VOID
4276 (DDKAPI *PPUT_DMA_ADAPTER)(
4277 IN PDMA_ADAPTER DmaAdapter);
4278
4279 typedef PVOID
4280 (DDKAPI *PALLOCATE_COMMON_BUFFER)(
4281 IN PDMA_ADAPTER DmaAdapter,
4282 IN ULONG Length,
4283 OUT PPHYSICAL_ADDRESS LogicalAddress,
4284 IN BOOLEAN CacheEnabled);
4285
4286 typedef VOID
4287 (DDKAPI *PFREE_COMMON_BUFFER)(
4288 IN PDMA_ADAPTER DmaAdapter,
4289 IN ULONG Length,
4290 IN PHYSICAL_ADDRESS LogicalAddress,
4291 IN PVOID VirtualAddress,
4292 IN BOOLEAN CacheEnabled);
4293
4294 typedef NTSTATUS
4295 (DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
4296 IN PDMA_ADAPTER DmaAdapter,
4297 IN PDEVICE_OBJECT DeviceObject,
4298 IN ULONG NumberOfMapRegisters,
4299 IN PDRIVER_CONTROL ExecutionRoutine,
4300 IN PVOID Context);
4301
4302 typedef BOOLEAN
4303 (DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
4304 IN PDMA_ADAPTER DmaAdapter,
4305 IN PMDL Mdl,
4306 IN PVOID MapRegisterBase,
4307 IN PVOID CurrentVa,
4308 IN ULONG Length,
4309 IN BOOLEAN WriteToDevice);
4310
4311 typedef VOID
4312 (DDKAPI *PFREE_ADAPTER_CHANNEL)(
4313 IN PDMA_ADAPTER DmaAdapter);
4314
4315 typedef VOID
4316 (DDKAPI *PFREE_MAP_REGISTERS)(
4317 IN PDMA_ADAPTER DmaAdapter,
4318 PVOID MapRegisterBase,
4319 ULONG NumberOfMapRegisters);
4320
4321 typedef PHYSICAL_ADDRESS
4322 (DDKAPI *PMAP_TRANSFER)(
4323 IN PDMA_ADAPTER DmaAdapter,
4324 IN PMDL Mdl,
4325 IN PVOID MapRegisterBase,
4326 IN PVOID CurrentVa,
4327 IN OUT PULONG Length,
4328 IN BOOLEAN WriteToDevice);
4329
4330 typedef ULONG
4331 (DDKAPI *PGET_DMA_ALIGNMENT)(
4332 IN PDMA_ADAPTER DmaAdapter);
4333
4334 typedef ULONG
4335 (DDKAPI *PREAD_DMA_COUNTER)(
4336 IN PDMA_ADAPTER DmaAdapter);
4337
4338 typedef VOID
4339 (DDKAPI *PDRIVER_LIST_CONTROL)(
4340 IN struct _DEVICE_OBJECT *DeviceObject,
4341 IN struct _IRP *Irp,
4342 IN struct _SCATTER_GATHER_LIST *ScatterGather,
4343 IN PVOID Context);
4344
4345 typedef NTSTATUS
4346 (DDKAPI *PGET_SCATTER_GATHER_LIST)(
4347 IN PDMA_ADAPTER DmaAdapter,
4348 IN PDEVICE_OBJECT DeviceObject,
4349 IN PMDL Mdl,
4350 IN PVOID CurrentVa,
4351 IN ULONG Length,
4352 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
4353 IN PVOID Context,
4354 IN BOOLEAN WriteToDevice);
4355
4356 typedef VOID
4357 (DDKAPI *PPUT_SCATTER_GATHER_LIST)(
4358 IN PDMA_ADAPTER DmaAdapter,
4359 IN PSCATTER_GATHER_LIST ScatterGather,
4360 IN BOOLEAN WriteToDevice);
4361
4362 typedef NTSTATUS
4363 (DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
4364 IN PDMA_ADAPTER DmaAdapter,
4365 IN PMDL Mdl OPTIONAL,
4366 IN PVOID CurrentVa,
4367 IN ULONG Length,
4368 OUT PULONG ScatterGatherListSize,
4369 OUT PULONG pNumberOfMapRegisters OPTIONAL);
4370
4371 typedef NTSTATUS
4372 (DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
4373 IN PDMA_ADAPTER DmaAdapter,
4374 IN PDEVICE_OBJECT DeviceObject,
4375 IN PMDL Mdl,
4376 IN PVOID CurrentVa,
4377 IN ULONG Length,
4378 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
4379 IN PVOID Context,
4380 IN BOOLEAN WriteToDevice,
4381 IN PVOID ScatterGatherBuffer,
4382 IN ULONG ScatterGatherLength);
4383
4384 typedef NTSTATUS
4385 (DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
4386 IN PDMA_ADAPTER DmaAdapter,
4387 IN PSCATTER_GATHER_LIST ScatterGather,
4388 IN PMDL OriginalMdl,
4389 OUT PMDL *TargetMdl);
4390
4391 typedef struct _DMA_OPERATIONS {
4392 ULONG Size;
4393 PPUT_DMA_ADAPTER PutDmaAdapter;
4394 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
4395 PFREE_COMMON_BUFFER FreeCommonBuffer;
4396 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
4397 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
4398 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
4399 PFREE_MAP_REGISTERS FreeMapRegisters;
4400 PMAP_TRANSFER MapTransfer;
4401 PGET_DMA_ALIGNMENT GetDmaAlignment;
4402 PREAD_DMA_COUNTER ReadDmaCounter;
4403 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
4404 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
4405 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
4406 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
4407 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
4408 } DMA_OPERATIONS, *PDMA_OPERATIONS;
4409
4410 typedef struct _IO_RESOURCE_DESCRIPTOR {
4411 UCHAR Option;
4412 UCHAR Type;
4413 UCHAR ShareDisposition;
4414 UCHAR Spare1;
4415 USHORT Flags;
4416 USHORT Spare2;
4417 union {
4418 struct {
4419 ULONG Length;
4420 ULONG Alignment;
4421 PHYSICAL_ADDRESS MinimumAddress;
4422 PHYSICAL_ADDRESS MaximumAddress;
4423 } Port;
4424 struct {
4425 ULONG Length;
4426 ULONG Alignment;
4427 PHYSICAL_ADDRESS MinimumAddress;
4428 PHYSICAL_ADDRESS MaximumAddress;
4429 } Memory;
4430 struct {
4431 ULONG MinimumVector;
4432 ULONG MaximumVector;
4433 } Interrupt;
4434 struct {
4435 ULONG MinimumChannel;
4436 ULONG MaximumChannel;
4437 } Dma;
4438 struct {
4439 ULONG Length;
4440 ULONG Alignment;
4441 PHYSICAL_ADDRESS MinimumAddress;
4442 PHYSICAL_ADDRESS MaximumAddress;
4443 } Generic;
4444 struct {
4445 ULONG Data[3];
4446 } DevicePrivate;
4447 struct {
4448 ULONG Length;
4449 ULONG MinBusNumber;
4450 ULONG MaxBusNumber;
4451 ULONG Reserved;
4452 } BusNumber;
4453 struct {
4454 ULONG Priority;
4455 ULONG Reserved1;
4456 ULONG Reserved2;
4457 } ConfigData;
4458 } u;
4459 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
4460
4461 typedef struct _IO_RESOURCE_LIST {
4462 USHORT Version;
4463 USHORT Revision;
4464 ULONG Count;
4465 IO_RESOURCE_DESCRIPTOR Descriptors[1];
4466 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
4467
4468 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
4469 ULONG ListSize;
4470 INTERFACE_TYPE InterfaceType;
4471 ULONG BusNumber;
4472 ULONG SlotNumber;
4473 ULONG Reserved[3];
4474 ULONG AlternativeLists;
4475 IO_RESOURCE_LIST List[1];
4476 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
4477
4478 typedef VOID
4479 (DDKAPI DRIVER_CANCEL)(
4480 IN struct _DEVICE_OBJECT *DeviceObject,
4481 IN struct _IRP *Irp);
4482 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
4483
4484 typedef struct _IRP {
4485 CSHORT Type;
4486 USHORT Size;
4487 struct _MDL *MdlAddress;
4488 ULONG Flags;
4489 union {
4490 struct _IRP *MasterIrp;
4491 volatile LONG IrpCount;
4492 PVOID SystemBuffer;
4493 } AssociatedIrp;
4494 LIST_ENTRY ThreadListEntry;
4495 IO_STATUS_BLOCK IoStatus;
4496 KPROCESSOR_MODE RequestorMode;
4497 BOOLEAN PendingReturned;
4498 CHAR StackCount;
4499 CHAR CurrentLocation;
4500 BOOLEAN Cancel;
4501 KIRQL CancelIrql;
4502 CCHAR ApcEnvironment;
4503 UCHAR AllocationFlags;
4504 PIO_STATUS_BLOCK UserIosb;
4505 PKEVENT UserEvent;
4506 union {
4507 struct {
4508 _ANONYMOUS_UNION union {
4509 PIO_APC_ROUTINE UserApcRoutine;
4510 PVOID IssuingProcess;
4511 } DUMMYUNIONNAME;
4512 PVOID UserApcContext;
4513 } AsynchronousParameters;
4514 LARGE_INTEGER AllocationSize;
4515 } Overlay;
4516 volatile PDRIVER_CANCEL CancelRoutine;
4517 PVOID UserBuffer;
4518 union {
4519 struct {
4520 _ANONYMOUS_UNION union {
4521 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
4522 _ANONYMOUS_STRUCT struct {
4523 PVOID DriverContext[4];
4524 } DUMMYSTRUCTNAME;
4525 } DUMMYUNIONNAME;
4526 PETHREAD Thread;
4527 PCHAR AuxiliaryBuffer;
4528 _ANONYMOUS_STRUCT struct {
4529 LIST_ENTRY ListEntry;
4530 _ANONYMOUS_UNION union {
4531 struct _IO_STACK_LOCATION *CurrentStackLocation;
4532 ULONG PacketType;
4533 } DUMMYUNIONNAME;
4534 } DUMMYSTRUCTNAME;
4535 struct _FILE_OBJECT *OriginalFileObject;
4536 } Overlay;
4537 KAPC Apc;
4538 PVOID CompletionKey;
4539 } Tail;
4540 } IRP;
4541 typedef struct _IRP *PIRP;
4542
4543 typedef enum _IO_PAGING_PRIORITY {
4544 IoPagingPriorityInvalid,
4545 IoPagingPriorityNormal,
4546 IoPagingPriorityHigh,
4547 IoPagingPriorityReserved1,
4548 IoPagingPriorityReserved2
4549 } IO_PAGING_PRIORITY;
4550
4551 typedef NTSTATUS
4552 (DDKAPI IO_COMPLETION_ROUTINE)(
4553 IN struct _DEVICE_OBJECT *DeviceObject,
4554 IN struct _IRP *Irp,
4555 IN PVOID Context);
4556 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
4557
4558 typedef VOID
4559 (DDKAPI *PIO_DPC_ROUTINE)(
4560 IN struct _KDPC *Dpc,
4561 IN struct _DEVICE_OBJECT *DeviceObject,
4562 IN struct _IRP *Irp,
4563 IN PVOID Context);
4564
4565 typedef NTSTATUS
4566 (DDKAPI *PMM_DLL_INITIALIZE)(
4567 IN PUNICODE_STRING RegistryPath);
4568
4569 typedef NTSTATUS
4570 (DDKAPI *PMM_DLL_UNLOAD)(
4571 VOID);
4572
4573 typedef BOOLEAN
4574 (DDKAPI KSERVICE_ROUTINE)(
4575 IN struct _KINTERRUPT *Interrupt,
4576 IN PVOID ServiceContext);
4577 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
4578
4579 typedef VOID
4580 (DDKAPI *PIO_TIMER_ROUTINE)(
4581 IN struct _DEVICE_OBJECT *DeviceObject,
4582 IN PVOID Context);
4583
4584 typedef BOOLEAN
4585 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
4586 IN PVOID SynchronizeContext);
4587
4588 typedef struct _IO_SECURITY_CONTEXT {
4589 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
4590 PACCESS_STATE AccessState;
4591 ACCESS_MASK DesiredAccess;
4592 ULONG FullCreateOptions;
4593 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
4594
4595 struct _IO_CSQ;
4596
4597 typedef struct _IO_CSQ_IRP_CONTEXT {
4598 ULONG Type;
4599 struct _IRP *Irp;
4600 struct _IO_CSQ *Csq;
4601 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
4602
4603 typedef VOID
4604 (DDKAPI *PIO_CSQ_INSERT_IRP)(
4605 IN struct _IO_CSQ *Csq,
4606 IN PIRP Irp);
4607
4608 typedef VOID
4609 (DDKAPI *PIO_CSQ_REMOVE_IRP)(
4610 IN struct _IO_CSQ *Csq,
4611 IN PIRP Irp);
4612
4613 typedef PIRP
4614 (DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
4615 IN struct _IO_CSQ *Csq,
4616 IN PIRP Irp,
4617 IN PVOID PeekContext);
4618
4619 typedef VOID
4620 (DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
4621 IN struct _IO_CSQ *Csq,
4622 OUT PKIRQL Irql);
4623
4624 typedef VOID
4625 (DDKAPI *PIO_CSQ_RELEASE_LOCK)(
4626 IN struct _IO_CSQ *Csq,
4627 IN KIRQL Irql);
4628
4629 typedef VOID
4630 (DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
4631 IN struct _IO_CSQ *Csq,
4632 IN PIRP Irp);
4633
4634 typedef struct _IO_CSQ {
4635 ULONG Type;
4636 PIO_CSQ_INSERT_IRP CsqInsertIrp;
4637 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
4638 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
4639 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
4640 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
4641 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
4642 PVOID ReservePointer;
4643 } IO_CSQ, *PIO_CSQ;
4644
4645 typedef enum _BUS_QUERY_ID_TYPE {
4646 BusQueryDeviceID,
4647 BusQueryHardwareIDs,
4648 BusQueryCompatibleIDs,
4649 BusQueryInstanceID,
4650 BusQueryDeviceSerialNumber
4651 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
4652
4653 typedef enum _DEVICE_TEXT_TYPE {
4654 DeviceTextDescription,
4655 DeviceTextLocationInformation
4656 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
4657
4658 #if !defined(_ALPHA_)
4659 #include <pshpack4.h>
4660 #endif
4661 typedef struct _IO_STACK_LOCATION {
4662 UCHAR MajorFunction;
4663 UCHAR MinorFunction;
4664 UCHAR Flags;
4665 UCHAR Control;
4666 union {
4667 struct {
4668 PIO_SECURITY_CONTEXT SecurityContext;
4669 ULONG Options;
4670 USHORT POINTER_ALIGNMENT FileAttributes;
4671 USHORT ShareAccess;
4672 ULONG POINTER_ALIGNMENT EaLength;
4673 } Create;
4674 struct {
4675 ULONG Length;
4676 ULONG POINTER_ALIGNMENT Key;
4677 LARGE_INTEGER ByteOffset;
4678 } Read;
4679 struct {
4680 ULONG Length;
4681 ULONG POINTER_ALIGNMENT Key;
4682 LARGE_INTEGER ByteOffset;
4683 } Write;
4684 struct {
4685 ULONG Length;
4686 PUNICODE_STRING FileName;
4687 FILE_INFORMATION_CLASS FileInformationClass;
4688 ULONG FileIndex;
4689 } QueryDirectory;
4690 struct {
4691 ULONG Length;
4692 ULONG CompletionFilter;
4693 } NotifyDirectory;
4694 struct {
4695 ULONG Length;
4696 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
4697 } QueryFile;
4698 struct {
4699 ULONG Length;
4700 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
4701 PFILE_OBJECT FileObject;
4702 _ANONYMOUS_UNION union {
4703 _ANONYMOUS_STRUCT struct {
4704 BOOLEAN ReplaceIfExists;
4705 BOOLEAN AdvanceOnly;
4706 } DUMMYSTRUCTNAME;
4707 ULONG ClusterCount;
4708 HANDLE DeleteHandle;
4709 } DUMMYUNIONNAME;
4710 } SetFile;
4711 struct {
4712 ULONG Length;
4713 PVOID EaList;
4714 ULONG EaListLength;
4715 ULONG EaIndex;
4716 } QueryEa;
4717 struct {
4718 ULONG Length;
4719 } SetEa;
4720 struct {
4721 ULONG Length;
4722 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
4723 } QueryVolume;
4724 struct {
4725 ULONG Length;
4726 FS_INFORMATION_CLASS FsInformationClass;
4727 } SetVolume;
4728 struct {
4729 ULONG OutputBufferLength;
4730 ULONG InputBufferLength;
4731 ULONG FsControlCode;
4732 PVOID Type3InputBuffer;
4733 } FileSystemControl;
4734 struct {
4735 PLARGE_INTEGER Length;
4736 ULONG Key;
4737 LARGE_INTEGER ByteOffset;
4738 } LockControl;
4739 struct {
4740 ULONG OutputBufferLength;
4741 ULONG POINTER_ALIGNMENT InputBufferLength;
4742 ULONG POINTER_ALIGNMENT IoControlCode;
4743 PVOID Type3InputBuffer;
4744 } DeviceIoControl;
4745 struct {
4746 SECURITY_INFORMATION SecurityInformation;
4747 ULONG POINTER_ALIGNMENT Length;
4748 } QuerySecurity;
4749 struct {
4750 SECURITY_INFORMATION SecurityInformation;
4751 PSECURITY_DESCRIPTOR SecurityDescriptor;
4752 } SetSecurity;
4753 struct {
4754 PVPB Vpb;
4755 PDEVICE_OBJECT DeviceObject;
4756 } MountVolume;
4757 struct {
4758 PVPB Vpb;
4759 PDEVICE_OBJECT DeviceObject;
4760 } VerifyVolume;
4761 struct {
4762 struct _SCSI_REQUEST_BLOCK *Srb;
4763 } Scsi;
4764 struct {
4765 ULONG Length;
4766 PSID StartSid;
4767 struct _FILE_GET_QUOTA_INFORMATION *SidList;
4768 ULONG SidListLength;
4769 } QueryQuota;
4770 struct {
4771 ULONG Length;
4772 } SetQuota;
4773 struct {
4774 DEVICE_RELATION_TYPE Type;
4775 } QueryDeviceRelations;
4776 struct {
4777 CONST GUID *InterfaceType;
4778 USHORT Size;
4779 USHORT Version;
4780 PINTERFACE Interface;
4781 PVOID InterfaceSpecificData;
4782 } QueryInterface;
4783 struct {
4784 PDEVICE_CAPABILITIES Capabilities;
4785 } DeviceCapabilities;
4786 struct {
4787 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
4788 } FilterResourceRequirements;
4789 struct {
4790 ULONG WhichSpace;
4791 PVOID Buffer;
4792 ULONG Offset;
4793 ULONG POINTER_ALIGNMENT Length;
4794 } ReadWriteConfig;
4795 struct {
4796 BOOLEAN Lock;
4797 } SetLock;
4798 struct {
4799 BUS_QUERY_ID_TYPE IdType;
4800 } QueryId;
4801 struct {
4802 DEVICE_TEXT_TYPE DeviceTextType;
4803 LCID POINTER_ALIGNMENT LocaleId;
4804 } QueryDeviceText;
4805 struct {
4806 BOOLEAN InPath;
4807 BOOLEAN Reserved[3];
4808 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
4809 } UsageNotification;
4810 struct {
4811 SYSTEM_POWER_STATE PowerState;
4812 } WaitWake;
4813 struct {
4814 PPOWER_SEQUENCE PowerSequence;
4815 } PowerSequence;
4816 struct {
4817 ULONG SystemContext;
4818 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
4819 POWER_STATE POINTER_ALIGNMENT State;
4820 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
4821 } Power;
4822 struct {
4823 PCM_RESOURCE_LIST AllocatedResources;
4824 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
4825 } StartDevice;
4826 struct {
4827 ULONG_PTR ProviderId;
4828 PVOID DataPath;
4829 ULONG BufferSize;
4830 PVOID Buffer;
4831 } WMI;
4832 struct {
4833 PVOID Argument1;
4834 PVOID Argument2;
4835 PVOID Argument3;
4836 PVOID Argument4;
4837 } Others;
4838 } Parameters;
4839 PDEVICE_OBJECT DeviceObject;
4840 PFILE_OBJECT FileObject;
4841 PIO_COMPLETION_ROUTINE CompletionRoutine;
4842 PVOID Context;
4843 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
4844 #if !defined(_ALPHA_)
4845 #include <poppack.h>
4846 #endif
4847
4848 /* IO_STACK_LOCATION.Control */
4849
4850 #define SL_PENDING_RETURNED 0x01
4851 #define SL_ERROR_RETURNED 0x02
4852 #define SL_INVOKE_ON_CANCEL 0x20
4853 #define SL_INVOKE_ON_SUCCESS 0x40
4854 #define SL_INVOKE_ON_ERROR 0x80
4855
4856 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
4857
4858 #define PCI_WHICHSPACE_CONFIG 0x0
4859 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
4860
4861 /******************************************************************************
4862 * RTL Types *
4863 ******************************************************************************/
4864
4865 #define RTL_REGISTRY_ABSOLUTE 0
4866 #define RTL_REGISTRY_SERVICES 1
4867 #define RTL_REGISTRY_CONTROL 2
4868 #define RTL_REGISTRY_WINDOWS_NT 3
4869 #define RTL_REGISTRY_DEVICEMAP 4
4870 #define RTL_REGISTRY_USER 5
4871 #define RTL_REGISTRY_MAXIMUM 6
4872 #define RTL_REGISTRY_HANDLE 0x40000000
4873 #define RTL_REGISTRY_OPTIONAL 0x80000000
4874
4875 /* RTL_QUERY_REGISTRY_TABLE.Flags */
4876 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
4877 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
4878 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
4879 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
4880 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
4881 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
4882 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
4883
4884 #define HASH_STRING_ALGORITHM_DEFAULT 0
4885 #define HASH_STRING_ALGORITHM_X65599 1
4886 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
4887
4888 typedef struct _RTL_BITMAP {
4889 ULONG SizeOfBitMap;
4890 PULONG Buffer;
4891 } RTL_BITMAP, *PRTL_BITMAP;
4892
4893 typedef struct _RTL_BITMAP_RUN {
4894 ULONG StartingIndex;
4895 ULONG NumberOfBits;
4896 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
4897
4898 typedef NTSTATUS
4899 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
4900 IN PWSTR ValueName,
4901 IN ULONG ValueType,
4902 IN PVOID ValueData,
4903 IN ULONG ValueLength,
4904 IN PVOID Context,
4905 IN PVOID EntryContext);
4906
4907 typedef struct _RTL_QUERY_REGISTRY_TABLE {
4908 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
4909 ULONG Flags;
4910 PCWSTR Name;
4911 PVOID EntryContext;
4912 ULONG DefaultType;
4913 PVOID DefaultData;
4914 ULONG DefaultLength;
4915 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
4916
4917 typedef struct _TIME_FIELDS {
4918 CSHORT Year;
4919 CSHORT Month;
4920 CSHORT Day;
4921 CSHORT Hour;
4922 CSHORT Minute;
4923 CSHORT Second;
4924 CSHORT Milliseconds;
4925 CSHORT Weekday;
4926 } TIME_FIELDS, *PTIME_FIELDS;
4927
4928
4929 /******************************************************************************
4930 * RTL Functions *
4931 ******************************************************************************/
4932
4933 NTSYSAPI
4934 VOID
4935 NTAPI
4936 RtlAssert(
4937 IN PVOID FailedAssertion,
4938 IN PVOID FileName,
4939 IN ULONG LineNumber,
4940 IN PCHAR Message);
4941
4942 /* VOID
4943 * RtlCopyMemory(
4944 * IN VOID UNALIGNED *Destination,
4945 * IN CONST VOID UNALIGNED *Source,
4946 * IN SIZE_T Length)
4947 */
4948 #define RtlCopyMemory(Destination, Source, Length) \
4949 memcpy(Destination, Source, Length)
4950
4951 #define RtlCopyBytes RtlCopyMemory
4952
4953 #if defined(_M_AMD64)
4954 NTSYSAPI
4955 VOID
4956 NTAPI
4957 RtlCopyMemoryNonTemporal(
4958 VOID UNALIGNED *Destination,
4959 CONST VOID UNALIGNED *Source,
4960 SIZE_T Length);
4961 #else
4962 #define RtlCopyMemoryNonTemporal RtlCopyMemory
4963 #endif
4964
4965 /* BOOLEAN
4966 * RtlEqualLuid(
4967 * IN PLUID Luid1,
4968 * IN PLUID Luid2)
4969 */
4970 #define RtlEqualLuid(Luid1, Luid2) \
4971 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
4972
4973 /* ULONG
4974 * RtlEqualMemory(
4975 * IN VOID UNALIGNED *Destination,
4976 * IN CONST VOID UNALIGNED *Source,
4977 * IN SIZE_T Length)
4978 */
4979 #define RtlEqualMemory(Destination, Source, Length) \
4980 (!memcmp(Destination, Source, Length))
4981
4982 /* VOID
4983 * RtlFillMemory(
4984 * IN VOID UNALIGNED *Destination,
4985 * IN SIZE_T Length,
4986 * IN UCHAR Fill)
4987 */
4988 #define RtlFillMemory(Destination, Length, Fill) \
4989 memset(Destination, Fill, Length)
4990
4991 #define RtlFillBytes RtlFillMemory
4992
4993 NTSYSAPI
4994 VOID
4995 NTAPI
4996 RtlFreeUnicodeString(
4997 IN PUNICODE_STRING UnicodeString);
4998
4999 NTSYSAPI
5000 NTSTATUS
5001 NTAPI
5002 RtlGUIDFromString(
5003 IN PUNICODE_STRING GuidString,
5004 OUT GUID *Guid);
5005
5006 NTSYSAPI
5007 VOID
5008 NTAPI
5009 RtlInitUnicodeString(
5010 IN OUT PUNICODE_STRING DestinationString,
5011 IN PCWSTR SourceString);
5012
5013 /* VOID
5014 * RtlMoveMemory(
5015 * IN VOID UNALIGNED *Destination,
5016 * IN CONST VOID UNALIGNED *Source,
5017 * IN SIZE_T Length)
5018 */
5019 #define RtlMoveMemory(Destination, Source, Length) \
5020 memmove(Destination, Source, Length)
5021
5022 NTSYSAPI
5023 NTSTATUS
5024 NTAPI
5025 RtlStringFromGUID(
5026 IN REFGUID Guid,
5027 OUT PUNICODE_STRING GuidString);
5028
5029 /* VOID
5030 * RtlZeroMemory(
5031 * IN VOID UNALIGNED *Destination,
5032 * IN SIZE_T Length)
5033 */
5034 #define RtlZeroMemory(Destination, Length) \
5035 memset(Destination, 0, Length)
5036
5037 #define RtlZeroBytes RtlZeroMemory
5038
5039
5040 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5041 NTSYSAPI
5042 BOOLEAN
5043 NTAPI
5044 RtlAreBitsClear(
5045 IN PRTL_BITMAP BitMapHeader,
5046 IN ULONG StartingIndex,
5047 IN ULONG Length);
5048
5049 NTSYSAPI
5050 BOOLEAN
5051 NTAPI
5052 RtlAreBitsSet(
5053 IN PRTL_BITMAP BitMapHeader,
5054 IN ULONG StartingIndex,
5055 IN ULONG Length);
5056
5057 NTSYSAPI
5058 NTSTATUS
5059 NTAPI
5060 RtlAnsiStringToUnicodeString(
5061 IN OUT PUNICODE_STRING DestinationString,
5062 IN PANSI_STRING SourceString,
5063 IN BOOLEAN AllocateDestinationString);
5064
5065 NTSYSAPI
5066 ULONG
5067 NTAPI
5068 RtlxAnsiStringToUnicodeSize(
5069 IN PCANSI_STRING AnsiString);
5070
5071 #define RtlAnsiStringToUnicodeSize(String) ( \
5072 NLS_MB_CODE_PAGE_TAG ? \
5073 RtlxAnsiStringToUnicodeSize(String) : \
5074 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
5075 )
5076
5077 NTSYSAPI
5078 NTSTATUS
5079 NTAPI
5080 RtlAppendUnicodeStringToString(
5081 IN OUT PUNICODE_STRING Destination,
5082 IN PCUNICODE_STRING Source);
5083
5084 NTSYSAPI
5085 NTSTATUS
5086 NTAPI
5087 RtlAppendUnicodeToString(
5088 IN OUT PUNICODE_STRING Destination,
5089 IN PCWSTR Source);
5090
5091 NTSYSAPI
5092 NTSTATUS
5093 NTAPI
5094 RtlCheckRegistryKey(
5095 IN ULONG RelativeTo,
5096 IN PWSTR Path);
5097
5098 NTSYSAPI
5099 VOID
5100 NTAPI
5101 RtlClearAllBits(
5102 IN PRTL_BITMAP BitMapHeader);
5103
5104 NTSYSAPI
5105 VOID
5106 NTAPI
5107 RtlClearBits(
5108 IN PRTL_BITMAP BitMapHeader,
5109 IN ULONG StartingIndex,
5110 IN ULONG NumberToClear);
5111
5112 NTSYSAPI
5113 SIZE_T
5114 NTAPI
5115 RtlCompareMemory(
5116 IN CONST VOID *Source1,
5117 IN CONST VOID *Source2,
5118 IN SIZE_T Length);
5119
5120 NTSYSAPI
5121 LONG
5122 NTAPI
5123 RtlCompareUnicodeString(
5124 IN PCUNICODE_STRING String1,
5125 IN PCUNICODE_STRING String2,
5126 IN BOOLEAN CaseInSensitive);
5127
5128 NTSYSAPI
5129 LONG
5130 NTAPI
5131 RtlCompareUnicodeStrings(
5132 IN PCWCH String1,
5133 IN SIZE_T String1Length,
5134 IN PCWCH String2,
5135 IN SIZE_T String2Length,
5136 IN BOOLEAN CaseInSensitive);
5137
5138 NTSYSAPI
5139 VOID
5140 NTAPI
5141 RtlCopyUnicodeString(
5142 IN OUT PUNICODE_STRING DestinationString,
5143 IN PCUNICODE_STRING SourceString);
5144
5145 NTSYSAPI
5146 NTSTATUS
5147 NTAPI
5148 RtlCreateRegistryKey(
5149 IN ULONG RelativeTo,
5150 IN PWSTR Path);
5151
5152 NTSYSAPI
5153 NTSTATUS
5154 NTAPI
5155 RtlCreateSecurityDescriptor(
5156 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5157 IN ULONG Revision);
5158
5159 NTSYSAPI
5160 NTSTATUS
5161 NTAPI
5162 RtlDeleteRegistryValue(
5163 IN ULONG RelativeTo,
5164 IN PCWSTR Path,
5165 IN PCWSTR ValueName);
5166
5167 NTSYSAPI
5168 BOOLEAN
5169 NTAPI
5170 RtlEqualUnicodeString(
5171 IN CONST UNICODE_STRING *String1,
5172 IN CONST UNICODE_STRING *String2,
5173 IN BOOLEAN CaseInSensitive);
5174
5175 #if !defined(_AMD64_) && !defined(_IA64_)
5176 NTSYSAPI
5177 LARGE_INTEGER
5178 NTAPI
5179 RtlExtendedIntegerMultiply(
5180 IN LARGE_INTEGER Multiplicand,
5181 IN LONG Multiplier);
5182
5183 NTSYSAPI
5184 LARGE_INTEGER
5185 NTAPI
5186 RtlExtendedLargeIntegerDivide(
5187 IN LARGE_INTEGER Dividend,
5188 IN ULONG Divisor,
5189 IN OUT PULONG Remainder);
5190 #endif
5191
5192 #if defined(_X86_) || defined(_IA64_)
5193 NTSYSAPI
5194 LARGE_INTEGER
5195 NTAPI
5196 RtlExtendedMagicDivide(
5197 IN LARGE_INTEGER Dividend,
5198 IN LARGE_INTEGER MagicDivisor,
5199 IN CCHAR ShiftCount);
5200 #endif
5201
5202 NTSYSAPI
5203 VOID
5204 NTAPI
5205 RtlFreeAnsiString(
5206 IN PANSI_STRING AnsiString);
5207
5208 NTSYSAPI
5209 ULONG
5210 NTAPI
5211 RtlFindClearBits(
5212 IN PRTL_BITMAP BitMapHeader,
5213 IN ULONG NumberToFind,
5214 IN ULONG HintIndex);
5215
5216 NTSYSAPI
5217 ULONG
5218 NTAPI
5219 RtlFindClearBitsAndSet(
5220 IN PRTL_BITMAP BitMapHeader,
5221 IN ULONG NumberToFind,
5222 IN ULONG HintIndex);
5223
5224 NTSYSAPI
5225 ULONG
5226 NTAPI
5227 RtlFindFirstRunClear(
5228 IN PRTL_BITMAP BitMapHeader,
5229 OUT PULONG StartingIndex);
5230
5231 NTSYSAPI
5232 ULONG
5233 NTAPI
5234 RtlFindClearRuns(
5235 IN PRTL_BITMAP BitMapHeader,
5236 OUT PRTL_BITMAP_RUN RunArray,
5237 IN ULONG SizeOfRunArray,
5238 IN BOOLEAN LocateLongestRuns);
5239
5240 NTSYSAPI
5241 ULONG
5242 NTAPI
5243 RtlFindLastBackwardRunClear(
5244 IN PRTL_BITMAP BitMapHeader,
5245 IN ULONG FromIndex,
5246 OUT PULONG StartingRunIndex);
5247
5248 NTSYSAPI
5249 CCHAR
5250 NTAPI
5251 RtlFindLeastSignificantBit(
5252 IN ULONGLONG Set);
5253
5254 NTSYSAPI
5255 ULONG
5256 NTAPI
5257 RtlFindLongestRunClear(
5258 IN PRTL_BITMAP BitMapHeader,
5259 OUT PULONG StartingIndex);
5260
5261 NTSYSAPI
5262 CCHAR
5263 NTAPI
5264 RtlFindMostSignificantBit(
5265 IN ULONGLONG Set);
5266
5267 NTSYSAPI
5268 ULONG
5269 NTAPI
5270 RtlFindNextForwardRunClear(
5271 IN PRTL_BITMAP BitMapHeader,
5272 IN ULONG FromIndex,
5273 OUT PULONG StartingRunIndex);
5274
5275 NTSYSAPI
5276 ULONG
5277 NTAPI
5278 RtlFindSetBits(
5279 IN PRTL_BITMAP BitMapHeader,
5280 IN ULONG NumberToFind,
5281 IN ULONG HintIndex);
5282
5283 NTSYSAPI
5284 ULONG
5285 NTAPI
5286 RtlFindSetBitsAndClear(
5287 IN PRTL_BITMAP BitMapHeader,
5288 IN ULONG NumberToFind,
5289 IN ULONG HintIndex);
5290
5291 NTSYSAPI
5292 NTSTATUS
5293 NTAPI
5294 RtlHashUnicodeString(
5295 IN CONST UNICODE_STRING *String,
5296 IN BOOLEAN CaseInSensitive,
5297 IN ULONG HashAlgorithm,
5298 OUT PULONG HashValue);
5299
5300 NTSYSAPI
5301 VOID
5302 NTAPI
5303 RtlInitAnsiString(
5304 IN OUT PANSI_STRING DestinationString,
5305 IN PCSZ SourceString);
5306
5307 NTSYSAPI
5308 VOID
5309 NTAPI
5310 RtlInitializeBitMap(
5311 IN PRTL_BITMAP BitMapHeader,
5312 IN PULONG BitMapBuffer,
5313 IN ULONG SizeOfBitMap);
5314
5315 NTSYSAPI
5316 VOID
5317 NTAPI
5318 RtlInitString(
5319 IN OUT PSTRING DestinationString,
5320 IN PCSZ SourceString);
5321
5322 NTSYSAPI
5323 NTSTATUS
5324 NTAPI
5325 RtlIntegerToUnicodeString(
5326 IN ULONG Value,
5327 IN ULONG Base OPTIONAL,
5328 IN OUT PUNICODE_STRING String);
5329
5330 NTSYSAPI
5331 NTSTATUS
5332 NTAPI
5333 RtlInt64ToUnicodeString(
5334 IN ULONGLONG Value,
5335 IN ULONG Base OPTIONAL,
5336 IN OUT PUNICODE_STRING String);
5337
5338 #ifdef _WIN64
5339 #define RtlIntPtrToUnicodeString(Value, Base, String) \
5340 RtlInt64ToUnicodeString(Value, Base, String)
5341 #else
5342 #define RtlIntPtrToUnicodeString(Value, Base, String) \
5343 RtlIntegerToUnicodeString(Value, Base, String)
5344 #endif
5345
5346 /* BOOLEAN
5347 * RtlIsZeroLuid(
5348 * IN PLUID L1);
5349 */
5350 #define RtlIsZeroLuid(_L1) \
5351 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
5352
5353 NTSYSAPI
5354 ULONG
5355 NTAPI
5356 RtlLengthSecurityDescriptor(
5357 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5358
5359 NTSYSAPI
5360 ULONG
5361 NTAPI
5362 RtlNumberOfClearBits(
5363 IN PRTL_BITMAP BitMapHeader);
5364
5365 NTSYSAPI
5366 ULONG
5367 NTAPI
5368 RtlNumberOfSetBits(
5369 IN PRTL_BITMAP BitMapHeader);
5370
5371 NTSYSAPI
5372 NTSTATUS
5373 NTAPI
5374 RtlQueryRegistryValues(
5375 IN ULONG RelativeTo,
5376 IN PCWSTR Path,
5377 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
5378 IN PVOID Context,
5379 IN PVOID Environment OPTIONAL);
5380
5381 #define LONG_SIZE (sizeof(LONG))
5382 #define LONG_MASK (LONG_SIZE - 1)
5383
5384 /* VOID
5385 * RtlRetrieveUlong(
5386 * PULONG DestinationAddress,
5387 * PULONG SourceAddress);
5388 */
5389 #if defined(_AMD64_)
5390 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
5391 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
5392 #else
5393 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
5394 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
5395 { \
5396 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
5397 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
5398 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
5399 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
5400 } \
5401 else \
5402 { \
5403 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
5404 }
5405 #endif
5406
5407 /* VOID
5408 * RtlRetrieveUshort(
5409 * PUSHORT DestinationAddress,
5410 * PUSHORT SourceAddress);
5411 */
5412 #if defined(_AMD64_)
5413 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
5414 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
5415 #else
5416 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
5417 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
5418 { \
5419 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
5420 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
5421 } \
5422 else \
5423 { \
5424 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
5425 }
5426 #endif
5427
5428 NTSYSAPI
5429 VOID
5430 NTAPI
5431 RtlSetAllBits(
5432 IN PRTL_BITMAP BitMapHeader);
5433
5434 NTSYSAPI
5435 VOID
5436 NTAPI
5437 RtlSetBits(
5438 IN PRTL_BITMAP BitMapHeader,
5439 IN ULONG StartingIndex,
5440 IN ULONG NumberToSet);
5441
5442 NTSYSAPI
5443 NTSTATUS
5444 NTAPI
5445 RtlSetDaclSecurityDescriptor(
5446 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5447 IN BOOLEAN DaclPresent,
5448 IN PACL Dacl OPTIONAL,
5449 IN BOOLEAN DaclDefaulted OPTIONAL);
5450
5451 /* VOID
5452 * RtlStoreUlong(
5453 * IN PULONG Address,
5454 * IN ULONG Value);
5455 */
5456 #if defined(_AMD64_)
5457 #define RtlStoreUlong(Address,Value) \
5458 *(ULONG UNALIGNED *)(Address) = (Value)
5459 #else
5460 #define RtlStoreUlong(Address,Value) \
5461 if ((ULONG_PTR)(Address) & LONG_MASK) { \
5462 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
5463 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
5464 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
5465 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
5466 } \
5467 else { \
5468 *((PULONG)(Address)) = (ULONG) (Value); \
5469 }
5470 #endif
5471
5472 /* VOID
5473 * RtlStoreUlonglong(
5474 * IN OUT PULONGLONG Address,
5475 * ULONGLONG Value);
5476 */
5477 #if defined(_AMD64_)
5478 #define RtlStoreUlonglong(Address,Value) \
5479 *(ULONGLONG UNALIGNED *)(Address) = (Value)
5480 #else
5481 #define RtlStoreUlonglong(Address,Value) \
5482 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
5483 RtlStoreUlong((ULONG_PTR)(Address), \
5484 (ULONGLONG)(Value) & 0xFFFFFFFF); \
5485 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
5486 (ULONGLONG)(Value) >> 32); \
5487 } else { \
5488 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
5489 }
5490 #endif
5491
5492 /* VOID
5493 * RtlStoreUlongPtr(
5494 * IN OUT PULONG_PTR Address,
5495 * IN ULONG_PTR Value);
5496 */
5497 #ifdef _WIN64
5498 #define RtlStoreUlongPtr(Address,Value) \
5499 RtlStoreUlonglong(Address,Value)
5500 #else
5501 #define RtlStoreUlongPtr(Address,Value) \
5502 RtlStoreUlong(Address,Value)
5503 #endif
5504
5505 /* VOID
5506 * RtlStoreUshort(
5507 * IN PUSHORT Address,
5508 * IN USHORT Value);
5509 */
5510 #if defined(_AMD64_)
5511 #define RtlStoreUshort(Address,Value) \
5512 *(USHORT UNALIGNED *)(Address) = (Value)
5513 #else
5514 #define RtlStoreUshort(Address,Value) \
5515 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
5516 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
5517 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
5518 } \
5519 else { \
5520 *((PUSHORT) (Address)) = (USHORT)Value; \
5521 }
5522 #endif
5523
5524 NTSYSAPI
5525 BOOLEAN
5526 NTAPI
5527 RtlTimeFieldsToTime(
5528 IN PTIME_FIELDS TimeFields,
5529 IN PLARGE_INTEGER Time);
5530
5531 NTSYSAPI
5532 VOID
5533 NTAPI
5534 RtlTimeToTimeFields(
5535 IN PLARGE_INTEGER Time,
5536 IN PTIME_FIELDS TimeFields);
5537
5538 NTSYSAPI
5539 ULONG
5540 FASTCALL
5541 RtlUlongByteSwap(
5542 IN ULONG Source);
5543
5544 NTSYSAPI
5545 ULONGLONG
5546 FASTCALL
5547 RtlUlonglongByteSwap(
5548 IN ULONGLONG Source);
5549
5550 NTSYSAPI
5551 NTSTATUS
5552 NTAPI
5553 RtlUnicodeStringToAnsiString(
5554 IN OUT PANSI_STRING DestinationString,
5555 IN PCUNICODE_STRING SourceString,
5556 IN BOOLEAN AllocateDestinationString);
5557
5558 NTSYSAPI
5559 ULONG
5560 NTAPI
5561 RtlxUnicodeStringToAnsiSize(
5562 IN PCUNICODE_STRING UnicodeString);
5563
5564 #define RtlUnicodeStringToAnsiSize(String) ( \
5565 NLS_MB_CODE_PAGE_TAG ? \
5566 RtlxUnicodeStringToAnsiSize(String) : \
5567 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
5568 )
5569
5570 NTSYSAPI
5571 NTSTATUS
5572 NTAPI
5573 RtlUnicodeStringToInteger(
5574 IN PCUNICODE_STRING String,
5575 IN ULONG Base OPTIONAL,
5576 OUT PULONG Value);
5577
5578 NTSYSAPI
5579 WCHAR
5580 NTAPI
5581 RtlUpcaseUnicodeChar(
5582 IN WCHAR SourceCharacter);
5583
5584 NTSYSAPI
5585 USHORT
5586 FASTCALL
5587 RtlUshortByteSwap(
5588 IN USHORT Source);
5589
5590 NTSYSAPI
5591 BOOLEAN
5592 NTAPI
5593 RtlValidRelativeSecurityDescriptor(
5594 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
5595 IN ULONG SecurityDescriptorLength,
5596 IN SECURITY_INFORMATION RequiredInformation);
5597
5598 NTSYSAPI
5599 BOOLEAN
5600 NTAPI
5601 RtlValidSecurityDescriptor(
5602 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5603
5604 NTSYSAPI
5605 NTSTATUS
5606 NTAPI
5607 RtlWriteRegistryValue(
5608 IN ULONG RelativeTo,
5609 IN PCWSTR Path,
5610 IN PCWSTR ValueName,
5611 IN ULONG ValueType,
5612 IN PVOID ValueData,
5613 IN ULONG ValueLength);
5614
5615 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
5616
5617 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
5618 NTSYSAPI
5619 VOID
5620 FASTCALL
5621 RtlPrefetchMemoryNonTemporal(
5622 IN PVOID Source,
5623 IN SIZE_T Length);
5624 #endif
5625
5626 #if (NTDDI_VERSION >= NTDDI_WINXP)
5627 NTSYSAPI
5628 VOID
5629 NTAPI
5630 RtlClearBit(
5631 PRTL_BITMAP BitMapHeader,
5632 ULONG BitNumber);
5633
5634 NTSYSAPI
5635 WCHAR
5636 NTAPI
5637 RtlDowncaseUnicodeChar(
5638 IN WCHAR SourceCharacter);
5639
5640 NTSYSAPI
5641 VOID
5642 NTAPI
5643 RtlSetBit(
5644 PRTL_BITMAP BitMapHeader,
5645 ULONG BitNumber);
5646
5647 NTSYSAPI
5648 BOOLEAN
5649 NTAPI
5650 RtlTestBit(
5651 IN PRTL_BITMAP BitMapHeader,
5652 IN ULONG BitNumber);
5653
5654 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
5655
5656 #if (NTDDI_VERSION >= NTDDI_VISTA)
5657 NTSYSAPI
5658 ULONG
5659 NTAPI
5660 RtlNumberOfSetBitsUlongPtr(
5661 IN ULONG_PTR Target);
5662
5663 NTSYSAPI
5664 ULONGLONG
5665 NTAPI
5666 RtlIoDecodeMemIoResource (
5667 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
5668 OUT PULONGLONG Alignment OPTIONAL,
5669 OUT PULONGLONG MinimumAddress OPTIONAL,
5670 OUT PULONGLONG MaximumAddress OPTIONAL);
5671
5672 NTSYSAPI
5673 NTSTATUS
5674 NTAPI
5675 RtlIoEncodeMemIoResource(
5676 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
5677 IN UCHAR Type,
5678 IN ULONGLONG Length,
5679 IN ULONGLONG Alignment,
5680 IN ULONGLONG MinimumAddress,
5681 IN ULONGLONG MaximumAddress);
5682
5683 NTSYSAPI
5684 ULONGLONG
5685 NTAPI
5686 RtlCmDecodeMemIoResource(
5687 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
5688 OUT PULONGLONG Start OPTIONAL);
5689
5690 NTSYSAPI
5691 NTSTATUS
5692 NTAPI
5693 RtlFindClosestEncodableLength(
5694 IN ULONGLONG SourceLength,
5695 OUT PULONGLONG TargetLength);
5696
5697 #endif
5698
5699 #if !defined(MIDL_PASS)
5700 /* inline funftions */
5701 //DECLSPEC_DEPRECATED_DDK_WINXP
5702 static __inline
5703 LARGE_INTEGER
5704 NTAPI_INLINE
5705 RtlConvertLongToLargeInteger(LONG SignedInteger)
5706 {
5707 LARGE_INTEGER ret;
5708 ret.QuadPart = SignedInteger;
5709 return ret;
5710 }
5711
5712 //DECLSPEC_DEPRECATED_DDK_WINXP
5713 static __inline
5714 LARGE_INTEGER
5715 NTAPI_INLINE
5716 RtlConvertUlongToLargeInteger(
5717 ULONG UnsignedInteger)
5718 {
5719 LARGE_INTEGER ret;
5720 ret.QuadPart = UnsignedInteger;
5721 return ret;
5722 }
5723
5724 //DECLSPEC_DEPRECATED_DDK
5725 static __inline
5726 ULONG
5727 NTAPI_INLINE
5728 RtlEnlargedUnsignedDivide(
5729 IN ULARGE_INTEGER Dividend,
5730 IN ULONG Divisor,
5731 IN OUT PULONG Remainder)
5732 {
5733 if (Remainder)
5734 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
5735 return (ULONG)(Dividend.QuadPart / Divisor);
5736 }
5737
5738 //DECLSPEC_DEPRECATED_DDK
5739 static __inline
5740 LARGE_INTEGER
5741 NTAPI_INLINE
5742 RtlEnlargedUnsignedMultiply(
5743 IN ULONG Multiplicand,
5744 IN ULONG Multiplier)
5745 {
5746 LARGE_INTEGER ret;
5747 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
5748 return ret;
5749 }
5750
5751 //DECLSPEC_DEPRECATED_DDK
5752 static __inline
5753 LARGE_INTEGER
5754 NTAPI_INLINE
5755 RtlEnlargedIntegerMultiply(
5756 IN LONG Multiplicand,
5757 IN LONG Multiplier)
5758 {
5759 LARGE_INTEGER ret;
5760 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
5761 return ret;
5762 }
5763
5764 FORCEINLINE
5765 VOID
5766 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
5767 IN PCHAR Buffer,
5768 IN USHORT BufferSize)
5769 {
5770 AnsiString->Length = 0;
5771 AnsiString->MaximumLength = BufferSize;
5772 AnsiString->Buffer = Buffer;
5773 }
5774
5775 FORCEINLINE
5776 VOID
5777 RtlInitEmptyUnicodeString(
5778 OUT PUNICODE_STRING UnicodeString,
5779 IN PWSTR Buffer,
5780 IN USHORT BufferSize)
5781 {
5782 UnicodeString->Length = 0;
5783 UnicodeString->MaximumLength = BufferSize;
5784 UnicodeString->Buffer = Buffer;
5785 }
5786
5787 #if defined(_AMD64_) || defined(_IA64_)
5788 static __inline
5789 LARGE_INTEGER
5790 NTAPI_INLINE
5791 RtlExtendedIntegerMultiply(
5792 LARGE_INTEGER Multiplicand,
5793 LONG Multiplier)
5794 {
5795 LARGE_INTEGER ret;
5796 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
5797 return ret;
5798 }
5799
5800 static __inline
5801 LARGE_INTEGER
5802 NTAPI_INLINE
5803 RtlExtendedLargeIntegerDivide(
5804 LARGE_INTEGER Dividend,
5805 ULONG Divisor,
5806 PULONG Remainder)
5807 {
5808 LARGE_INTEGER ret;
5809 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
5810 if (Remainder)
5811 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
5812 return ret;
5813 }
5814 #endif
5815
5816 #if defined(_AMD64_)
5817
5818 #define MultiplyHigh __mulh
5819 #define UnsignedMultiplyHigh __umulh
5820
5821 //DECLSPEC_DEPRECATED_DDK
5822 static __inline
5823 LARGE_INTEGER
5824 NTAPI_INLINE
5825 RtlExtendedMagicDivide(
5826 IN LARGE_INTEGER Dividend,
5827 IN LARGE_INTEGER MagicDivisor,
5828 IN CCHAR ShiftCount)
5829 {
5830 LARGE_INTEGER ret;
5831 ULONG64 ret64;
5832 BOOLEAN Pos;
5833 Pos = (Dividend.QuadPart >= 0);
5834 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
5835 MagicDivisor.QuadPart);
5836 ret64 >>= ShiftCount;
5837 ret.QuadPart = Pos ? ret64 : -ret64;
5838 return ret;
5839 }
5840 #endif
5841
5842 //DECLSPEC_DEPRECATED_DDK
5843 static __inline
5844 LARGE_INTEGER
5845 NTAPI_INLINE
5846 RtlLargeIntegerAdd(
5847 IN LARGE_INTEGER Addend1,
5848 IN LARGE_INTEGER Addend2)
5849 {
5850 LARGE_INTEGER ret;
5851 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
5852 return ret;
5853 }
5854
5855 /* VOID
5856 * RtlLargeIntegerAnd(
5857 * IN OUT LARGE_INTEGER Result,
5858 * IN LARGE_INTEGER Source,
5859 * IN LARGE_INTEGER Mask);
5860 */
5861 #define RtlLargeIntegerAnd(Result, Source, Mask) \
5862 Result.QuadPart = Source.QuadPart & Mask.QuadPart
5863
5864 //DECLSPEC_DEPRECATED_DDK
5865 static __inline
5866 LARGE_INTEGER
5867 NTAPI_INLINE
5868 RtlLargeIntegerArithmeticShift(
5869 IN LARGE_INTEGER LargeInteger,
5870 IN CCHAR ShiftCount)
5871 {
5872 LARGE_INTEGER ret;
5873 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
5874 return ret;
5875 }
5876
5877 /* BOOLEAN
5878 * RtlLargeIntegerEqualTo(
5879 * IN LARGE_INTEGER Operand1,
5880 * IN LARGE_INTEGER Operand2);
5881 */
5882 #define RtlLargeIntegerEqualTo(X,Y) \
5883 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
5884
5885 FORCEINLINE
5886 PVOID
5887 RtlSecureZeroMemory(
5888 OUT PVOID Pointer,
5889 IN SIZE_T Size)
5890 {
5891 volatile char* vptr = (volatile char*)Pointer;
5892 #if defined(_M_AMD64)
5893 __stosb((PUCHAR)vptr, 0, Size);
5894 #else
5895 char * endptr = (char *)vptr + Size;
5896 while (vptr < endptr)
5897 {
5898 *vptr = 0; vptr++;
5899 }
5900 #endif
5901 return Pointer;
5902 }
5903
5904 #if defined(_M_AMD64)
5905 FORCEINLINE
5906 ULONG
5907 RtlCheckBit(
5908 IN PRTL_BITMAP BitMapHeader,
5909 IN ULONG BitPosition)
5910 {
5911 return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
5912 }
5913 #else
5914 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
5915 #endif // defined(_M_AMD64)
5916
5917 #endif // !defined(MIDL_PASS)
5918
5919 //
5920 // Byte Swap Functions
5921 //
5922 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
5923 ((defined(_M_AMD64) || defined(_M_IA64)) \
5924 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
5925
5926 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
5927 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
5928 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
5929
5930 #endif
5931
5932 /******************************************************************************
5933 * Executive Types *
5934 ******************************************************************************/
5935
5936 #define MAXIMUM_SUPPORTED_EXTENSION 512
5937
5938 typedef ULONG PFN_COUNT;
5939 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
5940 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
5941
5942 #if defined(_X86_)
5943
5944 #define PASSIVE_LEVEL 0
5945 #define LOW_LEVEL 0
5946 #define APC_LEVEL 1
5947 #define DISPATCH_LEVEL 2
5948 #define CMCI_LEVEL 5
5949 #define PROFILE_LEVEL 27
5950 #define CLOCK1_LEVEL 28
5951 #define CLOCK2_LEVEL 28
5952 #define IPI_LEVEL 29
5953 #define POWER_LEVEL 30
5954 #define HIGH_LEVEL 31
5955 #define CLOCK_LEVEL (CLOCK2_LEVEL)
5956
5957 #endif
5958 #if defined(_AMD64_)
5959
5960 #define PASSIVE_LEVEL 0
5961 #define LOW_LEVEL 0
5962 #define APC_LEVEL 1
5963 #define DISPATCH_LEVEL 2
5964 #define CMCI_LEVEL 5
5965 #define CLOCK_LEVEL 13
5966 #define IPI_LEVEL 14
5967 #define DRS_LEVEL 14
5968 #define POWER_LEVEL 14
5969 #define PROFILE_LEVEL 15
5970 #define HIGH_LEVEL 15
5971
5972 #endif
5973 #if defined(_IA64_)
5974
5975 #define PASSIVE_LEVEL 0
5976 #define LOW_LEVEL 0
5977 #define APC_LEVEL 1
5978 #define DISPATCH_LEVEL 2
5979 #define CMC_LEVEL 3
5980 #define DEVICE_LEVEL_BASE 4
5981 #define PC_LEVEL 12
5982 #define IPI_LEVEL 14
5983 #define DRS_LEVEL 14
5984 #define CLOCK_LEVEL 13
5985 #define POWER_LEVEL 15
5986 #define PROFILE_LEVEL 15
5987 #define HIGH_LEVEL 15
5988
5989 #endif
5990
5991 typedef struct _KFLOATING_SAVE {
5992 ULONG ControlWord;
5993 ULONG StatusWord;
5994 ULONG ErrorOffset;
5995 ULONG ErrorSelector;
5996 ULONG DataOffset;
5997 ULONG DataSelector;
5998 ULONG Cr0NpxState;
5999 ULONG Spare1;
6000 } KFLOATING_SAVE, *PKFLOATING_SAVE;
6001
6002 typedef enum _KBUGCHECK_CALLBACK_REASON {
6003 KbCallbackInvalid,
6004 KbCallbackReserved1,
6005 KbCallbackSecondaryDumpData,
6006 KbCallbackDumpIo,
6007 KbCallbackAddPages
6008 } KBUGCHECK_CALLBACK_REASON;
6009
6010 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
6011
6012 typedef VOID
6013 (DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
6014 IN KBUGCHECK_CALLBACK_REASON Reason,
6015 IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
6016 IN OUT PVOID ReasonSpecificData,
6017 IN ULONG ReasonSpecificDataLength);
6018
6019 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
6020 LIST_ENTRY Entry;
6021 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
6022 PUCHAR Component;
6023 ULONG_PTR Checksum;
6024 KBUGCHECK_CALLBACK_REASON Reason;
6025 UCHAR State;
6026 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
6027
6028 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
6029 BufferEmpty,
6030 BufferInserted,
6031 BufferStarted,
6032 BufferFinished,
6033 BufferIncomplete
6034 } KBUGCHECK_BUFFER_DUMP_STATE;
6035
6036 typedef VOID
6037 (DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
6038 IN PVOID Buffer,
6039 IN ULONG Length);
6040
6041 typedef struct _KBUGCHECK_CALLBACK_RECORD {
6042 LIST_ENTRY Entry;
6043 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
6044 PVOID Buffer;
6045 ULONG Length;
6046 PUCHAR Component;
6047 ULONG_PTR Checksum;
6048 UCHAR State;
6049 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
6050
6051 typedef BOOLEAN
6052 (DDKAPI *PNMI_CALLBACK)(
6053 IN PVOID Context,
6054 IN BOOLEAN Handled);
6055
6056 /*
6057 * VOID
6058 * KeInitializeCallbackRecord(
6059 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
6060 */
6061 #define KeInitializeCallbackRecord(CallbackRecord) \
6062 CallbackRecord->State = BufferEmpty;
6063
6064 typedef enum _KDPC_IMPORTANCE {
6065 LowImportance,
6066 MediumImportance,
6067 HighImportance,
6068 MediumHighImportance
6069 } KDPC_IMPORTANCE;
6070
6071 typedef enum _POOL_TYPE {
6072 NonPagedPool,
6073 PagedPool,
6074 NonPagedPoolMustSucceed,
6075 DontUseThisType,
6076 NonPagedPoolCacheAligned,
6077 PagedPoolCacheAligned,
6078 NonPagedPoolCacheAlignedMustS,
6079 MaxPoolType,
6080 NonPagedPoolSession = 32,
6081 PagedPoolSession,
6082 NonPagedPoolMustSucceedSession,
6083 DontUseThisTypeSession,
6084 NonPagedPoolCacheAlignedSession,
6085 PagedPoolCacheAlignedSession,
6086 NonPagedPoolCacheAlignedMustSSession
6087 } POOL_TYPE;
6088
6089 typedef enum _SUITE_TYPE {
6090 SmallBusiness,
6091 Enterprise,
6092 BackOffice,
6093 CommunicationServer,
6094 TerminalServer,
6095 SmallBusinessRestricted,
6096 EmbeddedNT,
6097 DataCenter,
6098 SingleUserTS,
6099 Personal,
6100 Blade,
6101 MaxSuiteType
6102 } SUITE_TYPE;
6103
6104 typedef enum _EX_POOL_PRIORITY {
6105 LowPoolPriority,
6106 LowPoolPrioritySpecialPoolOverrun = 8,
6107 LowPoolPrioritySpecialPoolUnderrun = 9,
6108 NormalPoolPriority = 16,
6109 NormalPoolPrioritySpecialPoolOverrun = 24,
6110 NormalPoolPrioritySpecialPoolUnderrun = 25,
6111 HighPoolPriority = 32,
6112 HighPoolPrioritySpecialPoolOverrun = 40,
6113 HighPoolPrioritySpecialPoolUnderrun = 41
6114 } EX_POOL_PRIORITY;
6115
6116 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
6117 #define LOOKASIDE_ALIGN
6118 #else
6119 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
6120 #endif
6121
6122 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
6123
6124 typedef PVOID
6125 (DDKAPI *PALLOCATE_FUNCTION)(
6126 IN POOL_TYPE PoolType,
6127 IN SIZE_T NumberOfBytes,
6128 IN ULONG Tag);
6129
6130 typedef PVOID
6131 (DDKAPI *PALLOCATE_FUNCTION_EX)(
6132 IN POOL_TYPE PoolType,
6133 IN SIZE_T NumberOfBytes,
6134 IN ULONG Tag,
6135 IN OUT PLOOKASIDE_LIST_EX Lookaside);
6136
6137 typedef VOID
6138 (DDKAPI *PFREE_FUNCTION)(
6139 IN PVOID Buffer);
6140
6141 typedef VOID
6142 (DDKAPI *PFREE_FUNCTION_EX)(
6143 IN PVOID Buffer,
6144 IN OUT PLOOKASIDE_LIST_EX Lookaside);
6145
6146 typedef VOID
6147 (DDKAPI *PCALLBACK_FUNCTION)(
6148 IN PVOID CallbackContext,
6149 IN PVOID Argument1,
6150 IN PVOID Argument2);
6151
6152 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
6153 union {
6154 SLIST_HEADER ListHead;
6155 SINGLE_LIST_ENTRY SingleListHead;
6156 } DUMMYUNIONNAME;
6157 USHORT Depth;
6158 USHORT MaximumDepth;
6159 ULONG TotalAllocates;
6160 union {
6161 ULONG AllocateMisses;
6162 ULONG AllocateHits;
6163 } DUMMYUNIONNAME2;
6164 ULONG TotalFrees;
6165 union {
6166 ULONG FreeMisses;
6167 ULONG FreeHits;
6168 } DUMMYUNIONNAME3;
6169 POOL_TYPE Type;
6170 ULONG Tag;
6171 ULONG Size;
6172 union {
6173 PALLOCATE_FUNCTION_EX AllocateEx;
6174 PALLOCATE_FUNCTION Allocate;
6175 } DUMMYUNIONNAME4;
6176 union {
6177 PFREE_FUNCTION_EX FreeEx;
6178 PFREE_FUNCTION Free;
6179 } DUMMYUNIONNAME5;
6180 LIST_ENTRY ListEntry;
6181 ULONG LastTotalAllocates;
6182 union {
6183 ULONG LastAllocateMisses;
6184 ULONG LastAllocateHits;
6185 } DUMMYUNIONNAME6;
6186 ULONG Future[2];
6187 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
6188
6189 typedef struct _PAGED_LOOKASIDE_LIST {
6190 GENERAL_LOOKASIDE L;
6191 #if !defined(_AMD64_) && !defined(_IA64_)
6192 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
6193 #endif
6194 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
6195
6196 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
6197 GENERAL_LOOKASIDE L;
6198 #if !defined(_AMD64_) && !defined(_IA64_)
6199 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
6200 #endif
6201 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
6202
6203 //typedef struct _LOOKASIDE_LIST_EX {
6204 // GENERAL_LOOKASIDE_POOL L;
6205 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
6206
6207 typedef struct _EX_RUNDOWN_REF {
6208 __GNU_EXTENSION union {
6209 volatile ULONG_PTR Count;
6210 volatile PVOID Ptr;
6211 };
6212 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
6213
6214 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
6215
6216 typedef enum _WORK_QUEUE_TYPE {
6217 CriticalWorkQueue,
6218 DelayedWorkQueue,
6219 HyperCriticalWorkQueue,
6220 MaximumWorkQueue
6221 } WORK_QUEUE_TYPE;
6222
6223 typedef VOID
6224 (DDKAPI *PWORKER_THREAD_ROUTINE)(
6225 IN PVOID Parameter);
6226
6227 typedef struct _WORK_QUEUE_ITEM {
6228 LIST_ENTRY List;
6229 PWORKER_THREAD_ROUTINE WorkerRoutine;
6230 volatile PVOID Parameter;
6231 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
6232
6233
6234 /******************************************************************************
6235 * Executive Functions *
6236 ******************************************************************************/
6237
6238 #if defined(_X86_)
6239 #if defined(_NTHAL_)
6240 #define ExAcquireFastMutex ExiAcquireFastMutex
6241 #define ExReleaseFastMutex ExiReleaseFastMutex
6242 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
6243 #endif
6244 #define ExInterlockedAddUlong ExfInterlockedAddUlong
6245 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
6246 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
6247 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
6248 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
6249 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
6250 #endif
6251
6252 #if defined(_WIN64)
6253
6254 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
6255 defined(_NTHAL_) || defined(_NTOSP_)
6256 NTKERNELAPI
6257 USHORT
6258 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
6259 #else
6260 FORCEINLINE
6261 USHORT
6262 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
6263 {
6264 return (USHORT)(ListHead->Alignment & 0xffff);
6265 }
6266 #endif
6267
6268 NTKERNELAPI
6269 PSLIST_ENTRY
6270 ExpInterlockedFlushSList(
6271 PSLIST_HEADER ListHead);
6272
6273 NTKERNELAPI
6274 PSLIST_ENTRY
6275 ExpInterlockedPopEntrySList(
6276 PSLIST_HEADER ListHead);
6277
6278 NTKERNELAPI
6279 PSLIST_ENTRY
6280 ExpInterlockedPushEntrySList(
6281 PSLIST_HEADER ListHead,
6282 PSLIST_ENTRY ListEntry);
6283
6284 #define ExInterlockedFlushSList(Head) \
6285 ExpInterlockedFlushSList(Head)
6286 #define ExInterlockedPopEntrySList(Head, Lock) \
6287 ExpInterlockedPopEntrySList(Head)
6288 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
6289 ExpInterlockedPushEntrySList(Head, Entry)
6290
6291 #else // !defined(_WIN64)
6292
6293 #define ExQueryDepthSList(listhead) (listhead)->Depth
6294
6295 NTKERNELAPI
6296 PSINGLE_LIST_ENTRY
6297 FASTCALL
6298 ExInterlockedFlushSList(
6299 IN PSLIST_HEADER ListHead);
6300
6301 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
6302 NTKERNELAPI
6303 PSINGLE_LIST_ENTRY
6304 FASTCALL
6305 ExInterlockedPopEntrySList(
6306 IN PSLIST_HEADER ListHead,
6307 IN PKSPIN_LOCK Lock);
6308
6309 NTKERNELAPI
6310 PSINGLE_LIST_ENTRY
6311 FASTCALL
6312 ExInterlockedPushEntrySList(
6313 IN PSLIST_HEADER ListHead,
6314 IN PSINGLE_LIST_ENTRY ListEntry,
6315 IN PKSPIN_LOCK Lock);
6316 #else
6317 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
6318 InterlockedPopEntrySList(_ListHead)
6319 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
6320 InterlockedPushEntrySList(_ListHead, _ListEntry)
6321 #endif // _WIN2K_COMPAT_SLIST_USAGE
6322
6323 #endif // !defined(_WIN64)
6324
6325 /* ERESOURCE_THREAD
6326 * ExGetCurrentResourceThread(
6327 * VOID);
6328 */
6329 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
6330
6331 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
6332
6333 /* VOID
6334 * ExInitializeWorkItem(
6335 * IN PWORK_QUEUE_ITEM Item,
6336 * IN PWORKER_THREAD_ROUTINE Routine,
6337 * IN PVOID Context)
6338 */
6339 #define ExInitializeWorkItem(Item, Routine, Context) \
6340 { \
6341 (Item)->WorkerRoutine = Routine; \
6342 (Item)->Parameter = Context; \
6343 (Item)->List.Flink = NULL; \
6344 }
6345
6346 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6347
6348 NTKERNELAPI
6349 VOID
6350 FASTCALL
6351 ExAcquireFastMutex(
6352 IN OUT PFAST_MUTEX FastMutex);
6353
6354 NTKERNELAPI
6355 VOID
6356 FASTCALL
6357 ExReleaseFastMutex(
6358 IN OUT PFAST_MUTEX FastMutex);
6359
6360 NTKERNELAPI
6361 BOOLEAN
6362 FASTCALL
6363 ExTryToAcquireFastMutex(
6364 IN OUT PFAST_MUTEX FastMutex);
6365
6366 NTKERNELAPI
6367 VOID
6368 FASTCALL
6369 ExAcquireFastMutexUnsafe(
6370 IN OUT PFAST_MUTEX FastMutex);
6371
6372 NTKERNELAPI
6373 VOID
6374 FASTCALL
6375 ExReleaseFastMutexUnsafe(
6376 IN OUT PFAST_MUTEX FastMutex);
6377
6378 NTKERNELAPI
6379 BOOLEAN
6380 NTAPI
6381 ExAcquireResourceExclusiveLite(
6382 IN PERESOURCE Resource,
6383 IN BOOLEAN Wait);
6384
6385 NTKERNELAPI
6386 BOOLEAN
6387 NTAPI
6388 ExAcquireResourceSharedLite(
6389 IN PERESOURCE Resource,
6390 IN BOOLEAN Wait);
6391
6392 NTKERNELAPI
6393 BOOLEAN
6394 NTAPI
6395 ExAcquireSharedStarveExclusive(
6396 IN PERESOURCE Resource,
6397 IN BOOLEAN Wait);
6398
6399 NTKERNELAPI
6400 BOOLEAN
6401 NTAPI
6402 ExAcquireSharedWaitForExclusive(
6403 IN PERESOURCE Resource,
6404 IN BOOLEAN Wait);
6405
6406 NTKERNELAPI
6407 PVOID
6408 NTAPI
6409 ExAllocatePool(
6410 IN POOL_TYPE PoolType,
6411 IN SIZE_T NumberOfBytes);
6412
6413 #ifdef POOL_TAGGING
6414 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
6415 #endif /* POOL_TAGGING */
6416
6417 NTKERNELAPI
6418 PVOID
6419 NTAPI
6420 ExAllocatePoolWithQuota(
6421 IN POOL_TYPE PoolType,
6422 IN SIZE_T NumberOfBytes);
6423
6424 #ifdef POOL_TAGGING
6425 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
6426 #endif /* POOL_TAGGING */
6427
6428 NTKERNELAPI
6429 PVOID
6430 NTAPI
6431 ExAllocatePoolWithQuotaTag(
6432 IN POOL_TYPE PoolType,
6433 IN SIZE_T NumberOfBytes,
6434 IN ULONG Tag);
6435
6436 #ifndef POOL_TAGGING
6437 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
6438 #endif /* POOL_TAGGING */
6439
6440 NTKERNELAPI
6441 PVOID
6442 NTAPI
6443 ExAllocatePoolWithTag(
6444 IN POOL_TYPE PoolType,
6445 IN SIZE_T NumberOfBytes,
6446 IN ULONG Tag);
6447
6448 NTKERNELAPI
6449 PVOID
6450 NTAPI
6451 ExAllocatePoolWithTagPriority(
6452 IN POOL_TYPE PoolType,
6453 IN SIZE_T NumberOfBytes,
6454 IN ULONG Tag,
6455 IN EX_POOL_PRIORITY Priority);
6456
6457 NTKERNELAPI
6458 VOID
6459 NTAPI
6460 ExConvertExclusiveToSharedLite(
6461 IN PERESOURCE Resource);
6462
6463 NTKERNELAPI
6464 NTSTATUS
6465 NTAPI
6466 ExCreateCallback(
6467 OUT PCALLBACK_OBJECT *CallbackObject,
6468 IN POBJECT_ATTRIBUTES ObjectAttributes,
6469 IN BOOLEAN Create,
6470 IN BOOLEAN AllowMultipleCallbacks);
6471
6472 NTKERNELAPI
6473 VOID
6474 NTAPI
6475 ExDeleteNPagedLookasideList(
6476 IN PNPAGED_LOOKASIDE_LIST Lookaside);
6477
6478 NTKERNELAPI
6479 VOID
6480 NTAPI
6481 ExDeletePagedLookasideList(
6482 IN PPAGED_LOOKASIDE_LIST Lookaside);
6483
6484 NTKERNELAPI
6485 NTSTATUS
6486 NTAPI
6487 ExDeleteResourceLite(
6488 IN PERESOURCE Resource);
6489
6490 NTKERNELAPI
6491 VOID
6492 NTAPI
6493 ExFreePool(
6494 IN PVOID P);
6495
6496 #ifdef POOL_TAGGING
6497 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
6498 #endif
6499
6500 NTKERNELAPI
6501 VOID
6502 NTAPI
6503 ExFreePoolWithTag(
6504 IN PVOID P,
6505 IN ULONG Tag);
6506
6507 NTKERNELAPI
6508 ULONG
6509 NTAPI
6510 ExGetExclusiveWaiterCount(
6511 IN PERESOURCE Resource);
6512
6513 NTKERNELAPI
6514 KPROCESSOR_MODE
6515 NTAPI
6516 ExGetPreviousMode(
6517 VOID);
6518
6519 NTKERNELAPI
6520 ULONG
6521 NTAPI
6522 ExGetSharedWaiterCount(
6523 IN PERESOURCE Resource);
6524
6525 NTKERNELAPI
6526 VOID
6527 NTAPI
6528 ExInitializeNPagedLookasideList(
6529 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6530 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6531 IN PFREE_FUNCTION Free OPTIONAL,
6532 IN ULONG Flags,
6533 IN SIZE_T Size,
6534 IN ULONG Tag,
6535 IN USHORT Depth);
6536
6537 NTKERNELAPI
6538 VOID
6539 NTAPI
6540 ExInitializePagedLookasideList(
6541 IN PPAGED_LOOKASIDE_LIST Lookaside,
6542 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6543 IN PFREE_FUNCTION Free OPTIONAL,
6544 IN ULONG Flags,
6545 IN SIZE_T Size,
6546 IN ULONG Tag,
6547 IN USHORT Depth);
6548
6549 NTKERNELAPI
6550 NTSTATUS
6551 NTAPI
6552 ExInitializeResourceLite(
6553 IN PERESOURCE Resource);
6554
6555 NTKERNELAPI
6556 LARGE_INTEGER
6557 NTAPI
6558 ExInterlockedAddLargeInteger(
6559 IN PLARGE_INTEGER Addend,
6560 IN LARGE_INTEGER Increment,
6561 IN PKSPIN_LOCK Lock);
6562
6563 #if defined(_WIN64)
6564 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
6565 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
6566 #else
6567 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
6568 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
6569 #endif
6570
6571 NTKERNELAPI
6572 ULONG
6573 FASTCALL
6574 ExInterlockedAddUlong(
6575 IN PULONG Addend,
6576 IN ULONG Increment,
6577 PKSPIN_LOCK Lock);
6578
6579 #if defined(_AMD64_) || defined(_IA64_)
6580 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
6581 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
6582 #elif defined(_X86_)
6583 NTKERNELAPI
6584 LONGLONG
6585 FASTCALL
6586 ExfInterlockedCompareExchange64(
6587 IN OUT LONGLONG volatile *Destination,
6588 IN PLONGLONG Exchange,
6589 IN PLONGLONG Comperand);
6590 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
6591 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
6592 #else
6593 NTKERNELAPI
6594 LONGLONG
6595 FASTCALL
6596 ExInterlockedCompareExchange64(
6597 IN OUT LONGLONG volatile *Destination,
6598 IN PLONGLONG Exchange,
6599 IN PLONGLONG Comparand,
6600 IN PKSPIN_LOCK Lock);
6601 #endif
6602
6603 NTKERNELAPI
6604 PLIST_ENTRY
6605 FASTCALL
6606 ExInterlockedInsertHeadList(
6607 IN PLIST_ENTRY ListHead,
6608 IN PLIST_ENTRY ListEntry,
6609 IN PKSPIN_LOCK Lock);
6610
6611 NTKERNELAPI
6612 PLIST_ENTRY
6613 FASTCALL
6614 ExInterlockedInsertTailList(
6615 IN PLIST_ENTRY ListHead,
6616 IN PLIST_ENTRY ListEntry,
6617 IN PKSPIN_LOCK Lock);
6618
6619 NTKERNELAPI
6620 PSINGLE_LIST_ENTRY
6621 FASTCALL
6622 ExInterlockedPopEntryList(
6623 IN PSINGLE_LIST_ENTRY ListHead,
6624 IN PKSPIN_LOCK Lock);
6625
6626 NTKERNELAPI
6627 PSINGLE_LIST_ENTRY
6628 FASTCALL
6629 ExInterlockedPushEntryList(
6630 IN PSINGLE_LIST_ENTRY ListHead,
6631 IN PSINGLE_LIST_ENTRY ListEntry,
6632 IN PKSPIN_LOCK Lock);
6633
6634 NTKERNELAPI
6635 PLIST_ENTRY
6636 FASTCALL
6637 ExInterlockedRemoveHeadList(
6638 IN PLIST_ENTRY ListHead,
6639 IN PKSPIN_LOCK Lock);
6640
6641 NTKERNELAPI
6642 BOOLEAN
6643 NTAPI
6644 ExIsProcessorFeaturePresent(
6645 IN ULONG ProcessorFeature);
6646
6647 NTKERNELAPI
6648 BOOLEAN
6649 NTAPI
6650 ExIsResourceAcquiredExclusiveLite(
6651 IN PERESOURCE Resource);
6652
6653 NTKERNELAPI
6654 ULONG
6655 NTAPI
6656 ExIsResourceAcquiredSharedLite(
6657 IN PERESOURCE Resource);
6658
6659 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
6660
6661 NTKERNELAPI
6662 VOID
6663 NTAPI
6664 ExLocalTimeToSystemTime(
6665 IN PLARGE_INTEGER LocalTime,
6666 OUT PLARGE_INTEGER SystemTime);
6667
6668 NTKERNELAPI
6669 VOID
6670 NTAPI
6671 ExNotifyCallback(
6672 IN PCALLBACK_OBJECT CallbackObject,
6673 IN PVOID Argument1,
6674 IN PVOID Argument2);
6675
6676 NTKERNELAPI
6677 VOID
6678 NTAPI
6679 ExQueueWorkItem(
6680 IN PWORK_QUEUE_ITEM WorkItem,
6681 IN WORK_QUEUE_TYPE QueueType);
6682
6683 NTKERNELAPI
6684 DECLSPEC_NORETURN
6685 VOID
6686 NTAPI
6687 ExRaiseStatus(
6688 IN NTSTATUS Status);
6689
6690 NTKERNELAPI
6691 PVOID
6692 NTAPI
6693 ExRegisterCallback(
6694 IN PCALLBACK_OBJECT CallbackObject,
6695 IN PCALLBACK_FUNCTION CallbackFunction,
6696 IN PVOID CallbackContext);
6697
6698 NTKERNELAPI
6699 NTSTATUS
6700 NTAPI
6701 ExReinitializeResourceLite(
6702 IN PERESOURCE Resource);
6703
6704 NTKERNELAPI
6705 VOID
6706 NTAPI
6707 ExReleaseResourceForThreadLite(
6708 IN PERESOURCE Resource,
6709 IN ERESOURCE_THREAD ResourceThreadId);
6710
6711 NTKERNELAPI
6712 VOID
6713 FASTCALL
6714 ExReleaseResourceLite(
6715 IN PERESOURCE Resource);
6716
6717 NTKERNELAPI
6718 VOID
6719 NTAPI
6720 ExSetResourceOwnerPointer(
6721 IN PERESOURCE Resource,
6722 IN PVOID OwnerPointer);
6723
6724 NTKERNELAPI
6725 ULONG
6726 NTAPI
6727 ExSetTimerResolution(
6728 IN ULONG DesiredTime,
6729 IN BOOLEAN SetResolution);
6730
6731 NTKERNELAPI
6732 VOID
6733 NTAPI
6734 ExSystemTimeToLocalTime(
6735 IN PLARGE_INTEGER SystemTime,
6736 OUT PLARGE_INTEGER LocalTime);
6737
6738 NTKERNELAPI
6739 VOID
6740 NTAPI
6741 ExUnregisterCallback(
6742 IN PVOID CbRegistration);
6743
6744
6745 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
6746
6747 #if (NTDDI_VERSION >= NTDDI_WINXP)
6748 NTKERNELAPI
6749 BOOLEAN
6750 FASTCALL
6751 ExAcquireRundownProtection(
6752 IN OUT PEX_RUNDOWN_REF RunRef);
6753
6754 NTKERNELAPI
6755 VOID
6756 FASTCALL
6757 ExInitializeRundownProtection(
6758 OUT PEX_RUNDOWN_REF RunRef);
6759
6760 NTKERNELAPI
6761 VOID
6762 FASTCALL
6763 ExReInitializeRundownProtection(
6764 OUT PEX_RUNDOWN_REF RunRef);
6765
6766 NTKERNELAPI
6767 VOID
6768 FASTCALL
6769 ExReleaseRundownProtection(
6770 IN OUT PEX_RUNDOWN_REF RunRef);
6771
6772 NTKERNELAPI
6773 VOID
6774 FASTCALL
6775 ExRundownCompleted(
6776 OUT PEX_RUNDOWN_REF RunRef);
6777
6778 NTKERNELAPI
6779 BOOLEAN
6780 NTAPI
6781 ExVerifySuite(
6782 IN SUITE_TYPE SuiteType);
6783
6784 NTKERNELAPI
6785 VOID
6786 FASTCALL
6787 ExWaitForRundownProtectionRelease(
6788 IN OUT PEX_RUNDOWN_REF RunRef);
6789
6790 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
6791
6792 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
6793 NTKERNELAPI
6794 BOOLEAN
6795 FASTCALL
6796 ExAcquireRundownProtectionEx(
6797 IN OUT PEX_RUNDOWN_REF RunRef,
6798 IN ULONG Count);
6799
6800 NTKERNELAPI
6801 VOID
6802 FASTCALL
6803 ExReleaseRundownProtectionEx(
6804 IN OUT PEX_RUNDOWN_REF RunRef,
6805 IN ULONG Count);
6806 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
6807
6808 #if (NTDDI_VERSION >= NTDDI_WS03)
6809
6810 #endif // (NTDDI_VERSION >= NTDDI_WS03)
6811
6812 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
6813 NTKERNELAPI
6814 PEX_RUNDOWN_REF_CACHE_AWARE
6815 ExAllocateCacheAwareRundownProtection(
6816 IN POOL_TYPE PoolType,
6817 IN ULONG PoolTag);
6818
6819 NTKERNELAPI
6820 SIZE_T
6821 ExSizeOfRundownProtectionCacheAware(VOID);
6822
6823 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
6824
6825 #if (NTDDI_VERSION >= NTDDI_VISTA)
6826 NTKERNELAPI
6827 NTSTATUS
6828 ExInitializeLookasideListEx(
6829 OUT PLOOKASIDE_LIST_EX Lookaside,
6830 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
6831 IN PFREE_FUNCTION_EX Free OPTIONAL,
6832 IN POOL_TYPE PoolType,
6833 IN ULONG Flags,
6834 IN SIZE_T Size,
6835 IN ULONG Tag,
6836 IN USHORT Depth);
6837 #endif
6838
6839
6840 #if !defined(MIDL_PASS)
6841
6842 static __inline PVOID
6843 ExAllocateFromNPagedLookasideList(
6844 IN PNPAGED_LOOKASIDE_LIST Lookaside)
6845 {
6846 PVOID Entry;
6847
6848 Lookaside->L.TotalAllocates++;
6849 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6850 if (Entry == NULL) {
6851 Lookaside->L.AllocateMisses++;
6852 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
6853 Lookaside->L.Size,
6854 Lookaside->L.Tag);
6855 }
6856 return Entry;
6857 }
6858
6859 static __inline PVOID
6860 ExAllocateFromPagedLookasideList(
6861 IN PPAGED_LOOKASIDE_LIST Lookaside)
6862 {
6863 PVOID Entry;
6864
6865 Lookaside->L.TotalAllocates++;
6866 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6867 if (Entry == NULL) {
6868 Lookaside->L.AllocateMisses++;
6869 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
6870 Lookaside->L.Size,
6871 Lookaside->L.Tag);
6872 }
6873 return Entry;
6874 }
6875
6876 static __inline VOID
6877 ExFreeToNPagedLookasideList(
6878 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6879 IN PVOID Entry)
6880 {
6881 Lookaside->L.TotalFrees++;
6882 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6883 Lookaside->L.FreeMisses++;
6884 (Lookaside->L.Free)(Entry);
6885 } else {
6886 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6887 }
6888 }
6889
6890 static __inline VOID
6891 ExFreeToPagedLookasideList(
6892 IN PPAGED_LOOKASIDE_LIST Lookaside,
6893 IN PVOID Entry)
6894 {
6895 Lookaside->L.TotalFrees++;
6896 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6897 Lookaside->L.FreeMisses++;
6898 (Lookaside->L.Free)(Entry);
6899 } else {
6900 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6901 }
6902 }
6903
6904
6905 #endif // !defined(MIDL_PASS)
6906
6907 NTHALAPI
6908 KIRQL
6909 NTAPI
6910 KeGetCurrentIrql(
6911 VOID);
6912
6913 #if defined(_M_AMD64)
6914
6915 ULONG64
6916 __readgsqword (
6917 IN ULONG Offset);
6918
6919 #pragma intrinsic(__readgsqword)
6920
6921 FORCEINLINE
6922 PKTHREAD
6923 KeGetCurrentThread (
6924 VOID)
6925 {
6926 return (struct _KTHREAD *)__readgsqword(0x188);
6927 }
6928
6929 #endif
6930
6931 #if defined(_M_IX86) || defined(_M_IA64)
6932
6933 NTSYSAPI
6934 PKTHREAD
6935 NTAPI
6936 KeGetCurrentThread(
6937 VOID);
6938
6939 #endif
6940
6941 /*
6942 ** WMI structures
6943 */
6944
6945 typedef VOID
6946 (DDKAPI *WMI_NOTIFICATION_CALLBACK)(
6947 PVOID Wnode,
6948 PVOID Context);
6949
6950
6951 #ifdef __cplusplus
6952 }
6953 #endif
6954
6955 #endif // _WDMDDK_