[XDK/DDK]
[reactos.git] / reactos / include / ddk / wdm.h
1 /*
2 * wdm.h
3 *
4 * Windows NT WDM Driver Developer Kit
5 *
6 * This file is part of the ReactOS DDK package.
7 *
8 * Contributors:
9 * Amine Khaldi (amine.khaldi@reactos.org)
10 * Timo Kreuzer (timo.kreuzer@reactos.org)
11 *
12 * THIS SOFTWARE IS NOT COPYRIGHTED
13 *
14 * This source code is offered for use in the public domain. You may
15 * use, modify or distribute it freely.
16 *
17 * This code is distributed in the hope that it will be useful but
18 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
19 * DISCLAIMED. This includes but is not limited to warranties of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 *
22 */
23 #pragma once
24
25 #ifndef _WDMDDK_
26 #define _WDMDDK_
27
28 #define WDM_MAJORVERSION 0x06
29 #define WDM_MINORVERSION 0x00
30
31 /* Included via ntddk.h? */
32 #ifndef _NTDDK_
33 #define _NTDDK_
34 #define _WDM_INCLUDED_
35 #define _DDK_DRIVER_
36 #define NO_INTERLOCKED_INTRINSICS
37 #endif /* _NTDDK_ */
38
39 /* Dependencies */
40 #define NT_INCLUDED
41 #include <excpt.h>
42 #include <ntdef.h>
43 #include <ntstatus.h>
44 #include <ntiologc.h>
45
46 #ifndef GUID_DEFINED
47 #include <guiddef.h>
48 #endif
49
50 #ifdef _MAC
51 #ifndef _INC_STRING
52 #include <string.h>
53 #endif /* _INC_STRING */
54 #else
55 #include <string.h>
56 #endif /* _MAC */
57
58 #ifndef _KTMTYPES_
59 typedef GUID UOW, *PUOW;
60 #endif
61
62 typedef GUID *PGUID;
63
64 #if (NTDDI_VERSION >= NTDDI_WINXP)
65 #include <dpfilter.h>
66 #endif
67
68 #include "intrin.h"
69
70 __internal_kernel_driver
71 __drv_Mode_impl(WDM_INCLUDED)
72
73 #ifdef __cplusplus
74 extern "C" {
75 #endif
76
77 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
78 #define NTHALAPI DECLSPEC_IMPORT
79 #else
80 #define NTHALAPI
81 #endif
82
83 /* For ReactOS */
84 #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
85 #define NTKERNELAPI DECLSPEC_IMPORT
86 #else
87 #define NTKERNELAPI
88 #endif
89
90 #if defined(_X86_) && !defined(_NTHAL_)
91 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT
92 #elif defined(_X86_)
93 #define _DECL_HAL_KE_IMPORT
94 #else
95 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
96 #endif
97
98 #if defined(_WIN64)
99 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
100 #else
101 #define POINTER_ALIGNMENT
102 #endif
103
104 /* Helper macro to enable gcc's extension. */
105 #ifndef __GNU_EXTENSION
106 #ifdef __GNUC__
107 #define __GNU_EXTENSION __extension__
108 #else
109 #define __GNU_EXTENSION
110 #endif
111 #endif
112
113 #if defined(_MSC_VER)
114
115 /* Disable some warnings */
116 #pragma warning(disable:4115) /* Named type definition in parentheses */
117 #pragma warning(disable:4201) /* Nameless unions and structs */
118 #pragma warning(disable:4214) /* Bit fields of other types than int */
119 #pragma warning(disable:4820) /* Padding added, due to alignemnet requirement */
120
121 /* Indicate if #pragma alloc_text() is supported */
122 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
123 #define ALLOC_PRAGMA 1
124 #endif
125
126 /* Indicate if #pragma data_seg() is supported */
127 #if defined(_M_IX86) || defined(_M_AMD64)
128 #define ALLOC_DATA_PRAGMA 1
129 #endif
130
131 #endif
132
133 #if defined(_WIN64)
134 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
135 #define USE_DMA_MACROS
136 #endif
137 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__)
138 #define NO_LEGACY_DRIVERS
139 #endif
140 #endif /* defined(_WIN64) */
141
142 /* Forward declarations */
143 struct _IRP;
144 struct _MDL;
145 struct _KAPC;
146 struct _KDPC;
147 struct _FILE_OBJECT;
148 struct _DMA_ADAPTER;
149 struct _DEVICE_OBJECT;
150 struct _DRIVER_OBJECT;
151 struct _IO_STATUS_BLOCK;
152 struct _DEVICE_DESCRIPTION;
153 struct _SCATTER_GATHER_LIST;
154 struct _DRIVE_LAYOUT_INFORMATION;
155 struct _COMPRESSED_DATA_INFO;
156 struct _IO_RESOURCE_DESCRIPTOR;
157
158 /* Structures not exposed to drivers */
159 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
160 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
161 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
162 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
163 typedef struct _EPROCESS *PEPROCESS;
164 typedef struct _ETHREAD *PETHREAD;
165 typedef struct _IO_TIMER *PIO_TIMER;
166 typedef struct _KINTERRUPT *PKINTERRUPT;
167 typedef struct _KPROCESS *PKPROCESS;
168 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
169 typedef struct _CONTEXT *PCONTEXT;
170
171 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
172 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
173 #elif defined(_WDM_INCLUDED_)
174 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
175 #else
176 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
177 #endif
178
179 #ifndef DEFINE_GUIDEX
180 #ifdef _MSC_VER
181 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
182 #else
183 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
184 #endif
185 #endif /* DEFINE_GUIDEX */
186
187 #ifndef STATICGUIDOF
188 #define STATICGUIDOF(guid) STATIC_##guid
189 #endif
190
191 /* GUID Comparison */
192 #ifndef __IID_ALIGNED__
193 #define __IID_ALIGNED__
194 #ifdef __cplusplus
195 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
196 {
197 return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
198 (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
199 }
200 #else
201 #define IsEqualGUIDAligned(guid1, guid2) \
202 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
203 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
204 #endif /* __cplusplus */
205 #endif /* !__IID_ALIGNED__ */
206
207
208 /******************************************************************************
209 * INTERLOCKED Functions *
210 ******************************************************************************/
211 //
212 // Intrinsics (note: taken from our winnt.h)
213 // FIXME: 64-bit
214 //
215 #if defined(__GNUC__)
216
217 static __inline__ BOOLEAN
218 InterlockedBitTestAndSet(
219 _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base,
220 _In_ LONG Bit)
221 {
222 #if defined(_M_IX86)
223 LONG OldBit;
224 __asm__ __volatile__("lock "
225 "btsl %2,%1\n\t"
226 "sbbl %0,%0\n\t"
227 :"=r" (OldBit),"+m" (*Base)
228 :"Ir" (Bit)
229 : "memory");
230 return OldBit;
231 #else
232 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
233 #endif
234 }
235
236 static __inline__ BOOLEAN
237 InterlockedBitTestAndReset(
238 _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base,
239 _In_ LONG Bit)
240 {
241 #if defined(_M_IX86)
242 LONG OldBit;
243 __asm__ __volatile__("lock "
244 "btrl %2,%1\n\t"
245 "sbbl %0,%0\n\t"
246 :"=r" (OldBit),"+m" (*Base)
247 :"Ir" (Bit)
248 : "memory");
249 return OldBit;
250 #else
251 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
252 #endif
253 }
254
255 #endif /* defined(__GNUC__) */
256
257 #define BitScanForward _BitScanForward
258 #define BitScanReverse _BitScanReverse
259 #define BitTest _bittest
260 #define BitTestAndComplement _bittestandcomplement
261 #define BitTestAndSet _bittestandset
262 #define BitTestAndReset _bittestandreset
263 #define InterlockedBitTestAndSet _interlockedbittestandset
264 #define InterlockedBitTestAndReset _interlockedbittestandreset
265
266 #ifdef _M_AMD64
267 #define BitTest64 _bittest64
268 #define BitTestAndComplement64 _bittestandcomplement64
269 #define BitTestAndSet64 _bittestandset64
270 #define BitTestAndReset64 _bittestandreset64
271 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
272 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
273 #endif
274
275 #if !defined(__INTERLOCKED_DECLARED)
276 #define __INTERLOCKED_DECLARED
277
278 #if defined (_X86_)
279 #if defined(NO_INTERLOCKED_INTRINSICS)
280 NTKERNELAPI
281 LONG
282 FASTCALL
283 InterlockedIncrement(
284 _Inout_ _Interlocked_operand_ LONG volatile *Addend);
285
286 NTKERNELAPI
287 LONG
288 FASTCALL
289 InterlockedDecrement(
290 _Inout_ _Interlocked_operand_ LONG volatile *Addend);
291
292 NTKERNELAPI
293 LONG
294 FASTCALL
295 InterlockedCompareExchange(
296 _Inout_ _Interlocked_operand_ LONG volatile *Destination,
297 _In_ LONG Exchange,
298 _In_ LONG Comparand);
299
300 NTKERNELAPI
301 LONG
302 FASTCALL
303 InterlockedExchange(
304 _Inout_ _Interlocked_operand_ LONG volatile *Destination,
305 _In_ LONG Value);
306
307 NTKERNELAPI
308 LONG
309 FASTCALL
310 InterlockedExchangeAdd(
311 _Inout_ _Interlocked_operand_ LONG volatile *Addend,
312 _In_ LONG Value);
313
314 #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
315
316 #define InterlockedExchange _InterlockedExchange
317 #define InterlockedIncrement _InterlockedIncrement
318 #define InterlockedDecrement _InterlockedDecrement
319 #define InterlockedExchangeAdd _InterlockedExchangeAdd
320 #define InterlockedCompareExchange _InterlockedCompareExchange
321 #define InterlockedOr _InterlockedOr
322 #define InterlockedAnd _InterlockedAnd
323 #define InterlockedXor _InterlockedXor
324
325 #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
326
327 #endif /* defined (_X86_) */
328
329 #if !defined (_WIN64)
330 /*
331 * PVOID
332 * InterlockedExchangePointer(
333 * IN OUT PVOID volatile *Target,
334 * IN PVOID Value)
335 */
336 #define InterlockedExchangePointer(Target, Value) \
337 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
338
339 /*
340 * PVOID
341 * InterlockedCompareExchangePointer(
342 * IN OUT PVOID *Destination,
343 * IN PVOID Exchange,
344 * IN PVOID Comparand)
345 */
346 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
347 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
348
349 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
350 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
351 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
352
353 #endif // !defined (_WIN64)
354
355 #if defined (_M_AMD64)
356
357 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
358 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
359 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
360 #define InterlockedAnd _InterlockedAnd
361 #define InterlockedOr _InterlockedOr
362 #define InterlockedXor _InterlockedXor
363 #define InterlockedIncrement _InterlockedIncrement
364 #define InterlockedDecrement _InterlockedDecrement
365 #define InterlockedAdd _InterlockedAdd
366 #define InterlockedExchange _InterlockedExchange
367 #define InterlockedExchangeAdd _InterlockedExchangeAdd
368 #define InterlockedCompareExchange _InterlockedCompareExchange
369 #define InterlockedAnd64 _InterlockedAnd64
370 #define InterlockedOr64 _InterlockedOr64
371 #define InterlockedXor64 _InterlockedXor64
372 #define InterlockedIncrement64 _InterlockedIncrement64
373 #define InterlockedDecrement64 _InterlockedDecrement64
374 #define InterlockedAdd64 _InterlockedAdd64
375 #define InterlockedExchange64 _InterlockedExchange64
376 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
377 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
378 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
379 #define InterlockedExchangePointer _InterlockedExchangePointer
380 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
381 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
382
383 #endif // _M_AMD64
384
385 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
386 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
387 FORCEINLINE
388 LONG64
389 InterlockedAdd64(
390 _Inout_ _Interlocked_operand_ LONG64 volatile *Addend,
391 _In_ LONG64 Value)
392 {
393 return InterlockedExchangeAdd64(Addend, Value) + Value;
394 }
395 //#endif
396 #endif
397
398 #endif /* !__INTERLOCKED_DECLARED */
399
400
401 /******************************************************************************
402 * Runtime Library Types *
403 ******************************************************************************/
404
405 #define RTL_REGISTRY_ABSOLUTE 0
406 #define RTL_REGISTRY_SERVICES 1
407 #define RTL_REGISTRY_CONTROL 2
408 #define RTL_REGISTRY_WINDOWS_NT 3
409 #define RTL_REGISTRY_DEVICEMAP 4
410 #define RTL_REGISTRY_USER 5
411 #define RTL_REGISTRY_MAXIMUM 6
412 #define RTL_REGISTRY_HANDLE 0x40000000
413 #define RTL_REGISTRY_OPTIONAL 0x80000000
414
415 /* RTL_QUERY_REGISTRY_TABLE.Flags */
416 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
417 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
418 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
419 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
420 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
421 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
422 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
423
424 #define HASH_STRING_ALGORITHM_DEFAULT 0
425 #define HASH_STRING_ALGORITHM_X65599 1
426 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
427
428 typedef struct _RTL_BITMAP {
429 ULONG SizeOfBitMap;
430 PULONG Buffer;
431 } RTL_BITMAP, *PRTL_BITMAP;
432
433 typedef struct _RTL_BITMAP_RUN {
434 ULONG StartingIndex;
435 ULONG NumberOfBits;
436 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
437
438 _Function_class_(RTL_QUERY_REGISTRY_ROUTINE)
439 _IRQL_requires_max_(PASSIVE_LEVEL)
440 _IRQL_requires_same_
441 typedef NTSTATUS
442 (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
443 _In_z_ PWSTR ValueName,
444 _In_ ULONG ValueType,
445 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
446 _In_ ULONG ValueLength,
447 _In_opt_ PVOID Context,
448 _In_opt_ PVOID EntryContext);
449
450 typedef struct _RTL_QUERY_REGISTRY_TABLE {
451 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
452 ULONG Flags;
453 PCWSTR Name;
454 PVOID EntryContext;
455 ULONG DefaultType;
456 PVOID DefaultData;
457 ULONG DefaultLength;
458 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
459
460 typedef struct _TIME_FIELDS {
461 CSHORT Year;
462 CSHORT Month;
463 CSHORT Day;
464 CSHORT Hour;
465 CSHORT Minute;
466 CSHORT Second;
467 CSHORT Milliseconds;
468 CSHORT Weekday;
469 } TIME_FIELDS, *PTIME_FIELDS;
470
471 /* Slist Header */
472 #ifndef _SLIST_HEADER_
473 #define _SLIST_HEADER_
474
475 #if defined(_WIN64)
476
477 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
478 struct _SLIST_ENTRY *Next;
479 } SLIST_ENTRY, *PSLIST_ENTRY;
480
481 typedef struct _SLIST_ENTRY32 {
482 ULONG Next;
483 } SLIST_ENTRY32, *PSLIST_ENTRY32;
484
485 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
486 _ANONYMOUS_STRUCT struct {
487 ULONGLONG Alignment;
488 ULONGLONG Region;
489 } DUMMYSTRUCTNAME;
490 struct {
491 ULONGLONG Depth:16;
492 ULONGLONG Sequence:9;
493 ULONGLONG NextEntry:39;
494 ULONGLONG HeaderType:1;
495 ULONGLONG Init:1;
496 ULONGLONG Reserved:59;
497 ULONGLONG Region:3;
498 } Header8;
499 struct {
500 ULONGLONG Depth:16;
501 ULONGLONG Sequence:48;
502 ULONGLONG HeaderType:1;
503 ULONGLONG Init:1;
504 ULONGLONG Reserved:2;
505 ULONGLONG NextEntry:60;
506 } Header16;
507 struct {
508 ULONGLONG Depth:16;
509 ULONGLONG Sequence:48;
510 ULONGLONG HeaderType:1;
511 ULONGLONG Reserved:3;
512 ULONGLONG NextEntry:60;
513 } HeaderX64;
514 } SLIST_HEADER, *PSLIST_HEADER;
515
516 typedef union _SLIST_HEADER32 {
517 ULONGLONG Alignment;
518 _ANONYMOUS_STRUCT struct {
519 SLIST_ENTRY32 Next;
520 USHORT Depth;
521 USHORT Sequence;
522 } DUMMYSTRUCTNAME;
523 } SLIST_HEADER32, *PSLIST_HEADER32;
524
525 #else
526
527 #define SLIST_ENTRY SINGLE_LIST_ENTRY
528 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
529 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
530
531 typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
532
533 typedef union _SLIST_HEADER {
534 ULONGLONG Alignment;
535 _ANONYMOUS_STRUCT struct {
536 SLIST_ENTRY Next;
537 USHORT Depth;
538 USHORT Sequence;
539 } DUMMYSTRUCTNAME;
540 } SLIST_HEADER, *PSLIST_HEADER;
541
542 typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
543
544 #endif /* defined(_WIN64) */
545
546 #endif /* _SLIST_HEADER_ */
547
548 /* MS definition is broken! */
549 extern BOOLEAN NTSYSAPI NlsMbCodePageTag;
550 extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag;
551 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
552 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
553
554 #define SHORT_LEAST_SIGNIFICANT_BIT 0
555 #define SHORT_MOST_SIGNIFICANT_BIT 1
556
557 #define LONG_LEAST_SIGNIFICANT_BIT 0
558 #define LONG_3RD_MOST_SIGNIFICANT_BIT 1
559 #define LONG_2ND_MOST_SIGNIFICANT_BIT 2
560 #define LONG_MOST_SIGNIFICANT_BIT 3
561
562 #define RTLVERLIB_DDI(x) Wdmlib##x
563
564 typedef BOOLEAN
565 (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)(
566 _In_ ULONG Version);
567
568 typedef BOOLEAN
569 (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)(
570 _In_ ULONG Version);
571
572 /******************************************************************************
573 * Kernel Types *
574 ******************************************************************************/
575
576 typedef UCHAR KIRQL, *PKIRQL;
577 typedef CCHAR KPROCESSOR_MODE;
578 typedef LONG KPRIORITY;
579
580 typedef enum _MODE {
581 KernelMode,
582 UserMode,
583 MaximumMode
584 } MODE;
585
586 #define CACHE_FULLY_ASSOCIATIVE 0xFF
587 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
588
589 #define EVENT_QUERY_STATE (0x0001)
590 #define EVENT_MODIFY_STATE (0x0002)
591 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
592
593 #define LTP_PC_SMT 0x1
594
595 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
596 #define SINGLE_GROUP_LEGACY_API 1
597 #endif
598
599 #define SEMAPHORE_QUERY_STATE (0x0001)
600 #define SEMAPHORE_MODIFY_STATE (0x0002)
601 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
602
603 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
604 RelationProcessorCore,
605 RelationNumaNode,
606 RelationCache,
607 RelationProcessorPackage,
608 RelationGroup,
609 RelationAll = 0xffff
610 } LOGICAL_PROCESSOR_RELATIONSHIP;
611
612 typedef enum _PROCESSOR_CACHE_TYPE {
613 CacheUnified,
614 CacheInstruction,
615 CacheData,
616 CacheTrace
617 } PROCESSOR_CACHE_TYPE;
618
619 typedef struct _CACHE_DESCRIPTOR {
620 UCHAR Level;
621 UCHAR Associativity;
622 USHORT LineSize;
623 ULONG Size;
624 PROCESSOR_CACHE_TYPE Type;
625 } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
626
627 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
628 ULONG_PTR ProcessorMask;
629 LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
630 _ANONYMOUS_UNION union {
631 struct {
632 UCHAR Flags;
633 } ProcessorCore;
634 struct {
635 ULONG NodeNumber;
636 } NumaNode;
637 CACHE_DESCRIPTOR Cache;
638 ULONGLONG Reserved[2];
639 } DUMMYUNIONNAME;
640 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
641
642 typedef struct _PROCESSOR_RELATIONSHIP {
643 UCHAR Flags;
644 UCHAR Reserved[21];
645 USHORT GroupCount;
646 _Field_size_(GroupCount) GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
647 } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
648
649 typedef struct _NUMA_NODE_RELATIONSHIP {
650 ULONG NodeNumber;
651 UCHAR Reserved[20];
652 GROUP_AFFINITY GroupMask;
653 } NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
654
655 typedef struct _CACHE_RELATIONSHIP {
656 UCHAR Level;
657 UCHAR Associativity;
658 USHORT LineSize;
659 ULONG CacheSize;
660 PROCESSOR_CACHE_TYPE Type;
661 UCHAR Reserved[20];
662 GROUP_AFFINITY GroupMask;
663 } CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
664
665 typedef struct _PROCESSOR_GROUP_INFO {
666 UCHAR MaximumProcessorCount;
667 UCHAR ActiveProcessorCount;
668 UCHAR Reserved[38];
669 KAFFINITY ActiveProcessorMask;
670 } PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
671
672 typedef struct _GROUP_RELATIONSHIP {
673 USHORT MaximumGroupCount;
674 USHORT ActiveGroupCount;
675 UCHAR Reserved[20];
676 PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY];
677 } GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP;
678
679 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
680 LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
681 ULONG Size;
682 _ANONYMOUS_UNION union {
683 PROCESSOR_RELATIONSHIP Processor;
684 NUMA_NODE_RELATIONSHIP NumaNode;
685 CACHE_RELATIONSHIP Cache;
686 GROUP_RELATIONSHIP Group;
687 } DUMMYUNIONNAME;
688 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;;
689
690 /* Processor features */
691 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
692 #define PF_FLOATING_POINT_EMULATED 1
693 #define PF_COMPARE_EXCHANGE_DOUBLE 2
694 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
695 #define PF_PPC_MOVEMEM_64BIT_OK 4
696 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
697 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
698 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
699 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
700 #define PF_PAE_ENABLED 9
701 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
702 #define PF_SSE_DAZ_MODE_AVAILABLE 11
703 #define PF_NX_ENABLED 12
704 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
705 #define PF_COMPARE_EXCHANGE128 14
706 #define PF_COMPARE64_EXCHANGE128 15
707 #define PF_CHANNELS_ENABLED 16
708 #define PF_XSAVE_ENABLED 17
709
710 #define MAXIMUM_WAIT_OBJECTS 64
711
712 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
713
714 #define ASSERT_DPC(Object) \
715 ASSERT(((Object)->Type == 0) || \
716 ((Object)->Type == DpcObject) || \
717 ((Object)->Type == ThreadedDpcObject))
718
719 #define ASSERT_GATE(object) \
720 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
721 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
722
723 #define ASSERT_DEVICE_QUEUE(Object) \
724 NT_ASSERT((Object)->Type == DeviceQueueObject)
725
726 #define ASSERT_TIMER(E) \
727 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
728 ((E)->Header.Type == TimerSynchronizationObject))
729
730 #define ASSERT_MUTANT(E) \
731 NT_ASSERT((E)->Header.Type == MutantObject)
732
733 #define ASSERT_SEMAPHORE(E) \
734 NT_ASSERT((E)->Header.Type == SemaphoreObject)
735
736 #define ASSERT_EVENT(E) \
737 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
738 ((E)->Header.Type == SynchronizationEvent))
739
740 #define DPC_NORMAL 0
741 #define DPC_THREADED 1
742
743 #define GM_LOCK_BIT 0x1
744 #define GM_LOCK_BIT_V 0x0
745 #define GM_LOCK_WAITER_WOKEN 0x2
746 #define GM_LOCK_WAITER_INC 0x4
747
748 #define LOCK_QUEUE_WAIT_BIT 0
749 #define LOCK_QUEUE_OWNER_BIT 1
750
751 #define LOCK_QUEUE_WAIT 1
752 #define LOCK_QUEUE_OWNER 2
753 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
754 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
755
756 #define PROCESSOR_FEATURE_MAX 64
757
758 #define DBG_STATUS_CONTROL_C 1
759 #define DBG_STATUS_SYSRQ 2
760 #define DBG_STATUS_BUGCHECK_FIRST 3
761 #define DBG_STATUS_BUGCHECK_SECOND 4
762 #define DBG_STATUS_FATAL 5
763 #define DBG_STATUS_DEBUG_CONTROL 6
764 #define DBG_STATUS_WORKER 7
765
766 #if defined(_WIN64)
767 #define MAXIMUM_PROC_PER_GROUP 64
768 #else
769 #define MAXIMUM_PROC_PER_GROUP 32
770 #endif
771 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
772
773 /* Exception Records */
774 #define EXCEPTION_NONCONTINUABLE 1
775 #define EXCEPTION_MAXIMUM_PARAMETERS 15
776
777 #define EXCEPTION_DIVIDED_BY_ZERO 0
778 #define EXCEPTION_DEBUG 1
779 #define EXCEPTION_NMI 2
780 #define EXCEPTION_INT3 3
781 #define EXCEPTION_BOUND_CHECK 5
782 #define EXCEPTION_INVALID_OPCODE 6
783 #define EXCEPTION_NPX_NOT_AVAILABLE 7
784 #define EXCEPTION_DOUBLE_FAULT 8
785 #define EXCEPTION_NPX_OVERRUN 9
786 #define EXCEPTION_INVALID_TSS 0x0A
787 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
788 #define EXCEPTION_STACK_FAULT 0x0C
789 #define EXCEPTION_GP_FAULT 0x0D
790 #define EXCEPTION_RESERVED_TRAP 0x0F
791 #define EXCEPTION_NPX_ERROR 0x010
792 #define EXCEPTION_ALIGNMENT_CHECK 0x011
793
794 typedef struct _EXCEPTION_RECORD {
795 NTSTATUS ExceptionCode;
796 ULONG ExceptionFlags;
797 struct _EXCEPTION_RECORD *ExceptionRecord;
798 PVOID ExceptionAddress;
799 ULONG NumberParameters;
800 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
801 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
802
803 typedef struct _EXCEPTION_RECORD32 {
804 NTSTATUS ExceptionCode;
805 ULONG ExceptionFlags;
806 ULONG ExceptionRecord;
807 ULONG ExceptionAddress;
808 ULONG NumberParameters;
809 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
810 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
811
812 typedef struct _EXCEPTION_RECORD64 {
813 NTSTATUS ExceptionCode;
814 ULONG ExceptionFlags;
815 ULONG64 ExceptionRecord;
816 ULONG64 ExceptionAddress;
817 ULONG NumberParameters;
818 ULONG __unusedAlignment;
819 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
820 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
821
822 typedef struct _EXCEPTION_POINTERS {
823 PEXCEPTION_RECORD ExceptionRecord;
824 PCONTEXT ContextRecord;
825 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
826
827 typedef enum _KBUGCHECK_CALLBACK_REASON {
828 KbCallbackInvalid,
829 KbCallbackReserved1,
830 KbCallbackSecondaryDumpData,
831 KbCallbackDumpIo,
832 KbCallbackAddPages
833 } KBUGCHECK_CALLBACK_REASON;
834
835 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
836
837 _Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE)
838 _IRQL_requires_same_
839 typedef VOID
840 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)(
841 _In_ KBUGCHECK_CALLBACK_REASON Reason,
842 _In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
843 _Inout_ PVOID ReasonSpecificData,
844 _In_ ULONG ReasonSpecificDataLength);
845 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE;
846
847 typedef struct _KBUGCHECK_ADD_PAGES {
848 _Inout_ PVOID Context;
849 _Inout_ ULONG Flags;
850 _In_ ULONG BugCheckCode;
851 _Out_ ULONG_PTR Address;
852 _Out_ ULONG_PTR Count;
853 } KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES;
854
855 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA {
856 _In_ PVOID InBuffer;
857 _In_ ULONG InBufferLength;
858 _In_ ULONG MaximumAllowed;
859 _Out_ GUID Guid;
860 _Out_ PVOID OutBuffer;
861 _Out_ ULONG OutBufferLength;
862 } KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA;
863
864 typedef enum _KBUGCHECK_DUMP_IO_TYPE {
865 KbDumpIoInvalid,
866 KbDumpIoHeader,
867 KbDumpIoBody,
868 KbDumpIoSecondaryData,
869 KbDumpIoComplete
870 } KBUGCHECK_DUMP_IO_TYPE;
871
872 typedef struct _KBUGCHECK_DUMP_IO {
873 _In_ ULONG64 Offset;
874 _In_ PVOID Buffer;
875 _In_ ULONG BufferLength;
876 _In_ KBUGCHECK_DUMP_IO_TYPE Type;
877 } KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO;
878
879 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
880 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
881 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
882
883 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
884 LIST_ENTRY Entry;
885 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
886 PUCHAR Component;
887 ULONG_PTR Checksum;
888 KBUGCHECK_CALLBACK_REASON Reason;
889 UCHAR State;
890 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
891
892 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
893 BufferEmpty,
894 BufferInserted,
895 BufferStarted,
896 BufferFinished,
897 BufferIncomplete
898 } KBUGCHECK_BUFFER_DUMP_STATE;
899
900 _Function_class_(KBUGCHECK_CALLBACK_ROUTINE)
901 _IRQL_requires_same_
902 typedef VOID
903 (NTAPI KBUGCHECK_CALLBACK_ROUTINE)(
904 IN PVOID Buffer,
905 IN ULONG Length);
906 typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE;
907
908 typedef struct _KBUGCHECK_CALLBACK_RECORD {
909 LIST_ENTRY Entry;
910 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
911 _Field_size_bytes_opt_(Length) PVOID Buffer;
912 ULONG Length;
913 PUCHAR Component;
914 ULONG_PTR Checksum;
915 UCHAR State;
916 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
917
918 _Function_class_(NMI_CALLBACK)
919 _IRQL_requires_same_
920 typedef BOOLEAN
921 (NTAPI NMI_CALLBACK)(
922 _In_opt_ PVOID Context,
923 _In_ BOOLEAN Handled);
924 typedef NMI_CALLBACK *PNMI_CALLBACK;
925
926 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE {
927 KeProcessorAddStartNotify = 0,
928 KeProcessorAddCompleteNotify,
929 KeProcessorAddFailureNotify
930 } KE_PROCESSOR_CHANGE_NOTIFY_STATE;
931
932 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT {
933 KE_PROCESSOR_CHANGE_NOTIFY_STATE State;
934 ULONG NtNumber;
935 NTSTATUS Status;
936 #if (NTDDI_VERSION >= NTDDI_WIN7)
937 PROCESSOR_NUMBER ProcNumber;
938 #endif
939 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT;
940
941 _IRQL_requires_same_
942 _Function_class_(PROCESSOR_CALLBACK_FUNCTION)
943 typedef VOID
944 (NTAPI PROCESSOR_CALLBACK_FUNCTION)(
945 _In_ PVOID CallbackContext,
946 _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
947 _Inout_ PNTSTATUS OperationStatus);
948 typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION;
949
950 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
951
952 #define INVALID_PROCESSOR_INDEX 0xffffffff
953
954 typedef enum _KINTERRUPT_POLARITY {
955 InterruptPolarityUnknown,
956 InterruptActiveHigh,
957 InterruptActiveLow
958 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
959
960 typedef enum _KPROFILE_SOURCE {
961 ProfileTime,
962 ProfileAlignmentFixup,
963 ProfileTotalIssues,
964 ProfilePipelineDry,
965 ProfileLoadInstructions,
966 ProfilePipelineFrozen,
967 ProfileBranchInstructions,
968 ProfileTotalNonissues,
969 ProfileDcacheMisses,
970 ProfileIcacheMisses,
971 ProfileCacheMisses,
972 ProfileBranchMispredictions,
973 ProfileStoreInstructions,
974 ProfileFpInstructions,
975 ProfileIntegerInstructions,
976 Profile2Issue,
977 Profile3Issue,
978 Profile4Issue,
979 ProfileSpecialInstructions,
980 ProfileTotalCycles,
981 ProfileIcacheIssues,
982 ProfileDcacheAccesses,
983 ProfileMemoryBarrierCycles,
984 ProfileLoadLinkedIssues,
985 ProfileMaximum
986 } KPROFILE_SOURCE;
987
988 typedef enum _KWAIT_REASON {
989 Executive,
990 FreePage,
991 PageIn,
992 PoolAllocation,
993 DelayExecution,
994 Suspended,
995 UserRequest,
996 WrExecutive,
997 WrFreePage,
998 WrPageIn,
999 WrPoolAllocation,
1000 WrDelayExecution,
1001 WrSuspended,
1002 WrUserRequest,
1003 WrEventPair,
1004 WrQueue,
1005 WrLpcReceive,
1006 WrLpcReply,
1007 WrVirtualMemory,
1008 WrPageOut,
1009 WrRendezvous,
1010 WrKeyedEvent,
1011 WrTerminated,
1012 WrProcessInSwap,
1013 WrCpuRateControl,
1014 WrCalloutStack,
1015 WrKernel,
1016 WrResource,
1017 WrPushLock,
1018 WrMutex,
1019 WrQuantumEnd,
1020 WrDispatchInt,
1021 WrPreempted,
1022 WrYieldExecution,
1023 WrFastMutex,
1024 WrGuardedMutex,
1025 WrRundown,
1026 MaximumWaitReason
1027 } KWAIT_REASON;
1028
1029 typedef struct _KWAIT_BLOCK {
1030 LIST_ENTRY WaitListEntry;
1031 struct _KTHREAD *Thread;
1032 PVOID Object;
1033 struct _KWAIT_BLOCK *NextWaitBlock;
1034 USHORT WaitKey;
1035 UCHAR WaitType;
1036 #if (NTDDI_VERSION >= NTDDI_WIN7)
1037 volatile UCHAR BlockState;
1038 #else
1039 UCHAR SpareByte;
1040 #endif
1041 #if defined(_WIN64)
1042 LONG SpareLong;
1043 #endif
1044 } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
1045
1046 typedef enum _KINTERRUPT_MODE {
1047 LevelSensitive,
1048 Latched
1049 } KINTERRUPT_MODE;
1050
1051 #define THREAD_WAIT_OBJECTS 3
1052
1053 _IRQL_requires_same_
1054 _Function_class_(KSTART_ROUTINE)
1055 typedef VOID
1056 (NTAPI KSTART_ROUTINE)(
1057 _In_ PVOID StartContext);
1058 typedef KSTART_ROUTINE *PKSTART_ROUTINE;
1059
1060 typedef VOID
1061 (NTAPI *PKINTERRUPT_ROUTINE)(
1062 VOID);
1063
1064 _Function_class_(KSERVICE_ROUTINE)
1065 _IRQL_requires_(HIGH_LEVEL)
1066 _IRQL_requires_same_
1067 typedef BOOLEAN
1068 (NTAPI KSERVICE_ROUTINE)(
1069 _In_ struct _KINTERRUPT *Interrupt,
1070 _In_ PVOID ServiceContext);
1071 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
1072
1073 _Function_class_(KMESSAGE_SERVICE_ROUTINE)
1074 _IRQL_requires_same_
1075 typedef BOOLEAN
1076 (NTAPI KMESSAGE_SERVICE_ROUTINE)(
1077 _In_ struct _KINTERRUPT *Interrupt,
1078 _In_ PVOID ServiceContext,
1079 _In_ ULONG MessageID);
1080 typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE;
1081
1082 typedef enum _KD_OPTION {
1083 KD_OPTION_SET_BLOCK_ENABLE,
1084 } KD_OPTION;
1085
1086 typedef VOID
1087 (NTAPI *PKNORMAL_ROUTINE)(
1088 IN PVOID NormalContext OPTIONAL,
1089 IN PVOID SystemArgument1 OPTIONAL,
1090 IN PVOID SystemArgument2 OPTIONAL);
1091
1092 typedef VOID
1093 (NTAPI *PKRUNDOWN_ROUTINE)(
1094 IN struct _KAPC *Apc);
1095
1096 typedef VOID
1097 (NTAPI *PKKERNEL_ROUTINE)(
1098 IN struct _KAPC *Apc,
1099 IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
1100 IN OUT PVOID *NormalContext OPTIONAL,
1101 IN OUT PVOID *SystemArgument1 OPTIONAL,
1102 IN OUT PVOID *SystemArgument2 OPTIONAL);
1103
1104 typedef struct _KAPC {
1105 UCHAR Type;
1106 UCHAR SpareByte0;
1107 UCHAR Size;
1108 UCHAR SpareByte1;
1109 ULONG SpareLong0;
1110 struct _KTHREAD *Thread;
1111 LIST_ENTRY ApcListEntry;
1112 PKKERNEL_ROUTINE KernelRoutine;
1113 PKRUNDOWN_ROUTINE RundownRoutine;
1114 PKNORMAL_ROUTINE NormalRoutine;
1115 PVOID NormalContext;
1116 PVOID SystemArgument1;
1117 PVOID SystemArgument2;
1118 CCHAR ApcStateIndex;
1119 KPROCESSOR_MODE ApcMode;
1120 BOOLEAN Inserted;
1121 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
1122
1123 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
1124 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
1125 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
1126 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
1127 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
1128 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
1129 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
1130
1131 typedef struct _KDEVICE_QUEUE_ENTRY {
1132 LIST_ENTRY DeviceListEntry;
1133 ULONG SortKey;
1134 BOOLEAN Inserted;
1135 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
1136 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
1137
1138 typedef PVOID PKIPI_CONTEXT;
1139
1140 typedef VOID
1141 (NTAPI *PKIPI_WORKER)(
1142 IN OUT PKIPI_CONTEXT PacketContext,
1143 IN PVOID Parameter1 OPTIONAL,
1144 IN PVOID Parameter2 OPTIONAL,
1145 IN PVOID Parameter3 OPTIONAL);
1146
1147 typedef struct _KIPI_COUNTS {
1148 ULONG Freeze;
1149 ULONG Packet;
1150 ULONG DPC;
1151 ULONG APC;
1152 ULONG FlushSingleTb;
1153 ULONG FlushMultipleTb;
1154 ULONG FlushEntireTb;
1155 ULONG GenericCall;
1156 ULONG ChangeColor;
1157 ULONG SweepDcache;
1158 ULONG SweepIcache;
1159 ULONG SweepIcacheRange;
1160 ULONG FlushIoBuffers;
1161 ULONG GratuitousDPC;
1162 } KIPI_COUNTS, *PKIPI_COUNTS;
1163
1164 _IRQL_requires_same_
1165 _Function_class_(KIPI_BROADCAST_WORKER)
1166 _IRQL_requires_(IPI_LEVEL)
1167 typedef ULONG_PTR
1168 (NTAPI KIPI_BROADCAST_WORKER)(
1169 _In_ ULONG_PTR Argument);
1170 typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER;
1171
1172 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
1173
1174 typedef struct _KSPIN_LOCK_QUEUE {
1175 struct _KSPIN_LOCK_QUEUE *volatile Next;
1176 PKSPIN_LOCK volatile Lock;
1177 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
1178
1179 typedef struct _KLOCK_QUEUE_HANDLE {
1180 KSPIN_LOCK_QUEUE LockQueue;
1181 KIRQL OldIrql;
1182 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
1183
1184 #if defined(_AMD64_)
1185
1186 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
1187
1188 #define LockQueueDispatcherLock 0
1189 #define LockQueueExpansionLock 1
1190 #define LockQueuePfnLock 2
1191 #define LockQueueSystemSpaceLock 3
1192 #define LockQueueVacbLock 4
1193 #define LockQueueMasterLock 5
1194 #define LockQueueNonPagedPoolLock 6
1195 #define LockQueueIoCancelLock 7
1196 #define LockQueueWorkQueueLock 8
1197 #define LockQueueIoVpbLock 9
1198 #define LockQueueIoDatabaseLock 10
1199 #define LockQueueIoCompletionLock 11
1200 #define LockQueueNtfsStructLock 12
1201 #define LockQueueAfdWorkQueueLock 13
1202 #define LockQueueBcbLock 14
1203 #define LockQueueMmNonPagedPoolLock 15
1204 #define LockQueueUnusedSpare16 16
1205 #define LockQueueTimerTableLock 17
1206 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1207
1208 #else
1209
1210 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
1211 LockQueueDispatcherLock,
1212 LockQueueExpansionLock,
1213 LockQueuePfnLock,
1214 LockQueueSystemSpaceLock,
1215 LockQueueVacbLock,
1216 LockQueueMasterLock,
1217 LockQueueNonPagedPoolLock,
1218 LockQueueIoCancelLock,
1219 LockQueueWorkQueueLock,
1220 LockQueueIoVpbLock,
1221 LockQueueIoDatabaseLock,
1222 LockQueueIoCompletionLock,
1223 LockQueueNtfsStructLock,
1224 LockQueueAfdWorkQueueLock,
1225 LockQueueBcbLock,
1226 LockQueueMmNonPagedPoolLock,
1227 LockQueueUnusedSpare16,
1228 LockQueueTimerTableLock,
1229 LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
1230 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
1231
1232 #endif /* defined(_AMD64_) */
1233
1234 _Function_class_(KDEFERRED_ROUTINE)
1235 _IRQL_requires_(DISPATCH_LEVEL)
1236 _IRQL_requires_same_
1237 typedef VOID
1238 (NTAPI KDEFERRED_ROUTINE)(
1239 _In_ struct _KDPC *Dpc,
1240 _In_opt_ PVOID DeferredContext,
1241 _In_opt_ PVOID SystemArgument1,
1242 _In_opt_ PVOID SystemArgument2);
1243 typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE;
1244
1245 typedef enum _KDPC_IMPORTANCE {
1246 LowImportance,
1247 MediumImportance,
1248 HighImportance,
1249 MediumHighImportance
1250 } KDPC_IMPORTANCE;
1251
1252 typedef struct _KDPC {
1253 UCHAR Type;
1254 UCHAR Importance;
1255 volatile USHORT Number;
1256 LIST_ENTRY DpcListEntry;
1257 PKDEFERRED_ROUTINE DeferredRoutine;
1258 PVOID DeferredContext;
1259 PVOID SystemArgument1;
1260 PVOID SystemArgument2;
1261 volatile PVOID DpcData;
1262 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
1263
1264 typedef struct _KDPC_WATCHDOG_INFORMATION {
1265 ULONG DpcTimeLimit;
1266 ULONG DpcTimeCount;
1267 ULONG DpcWatchdogLimit;
1268 ULONG DpcWatchdogCount;
1269 ULONG Reserved;
1270 } KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
1271
1272 typedef struct _KDEVICE_QUEUE {
1273 CSHORT Type;
1274 CSHORT Size;
1275 LIST_ENTRY DeviceListHead;
1276 KSPIN_LOCK Lock;
1277 # if defined(_AMD64_)
1278 _ANONYMOUS_UNION union {
1279 BOOLEAN Busy;
1280 _ANONYMOUS_STRUCT struct {
1281 LONG64 Reserved:8;
1282 LONG64 Hint:56;
1283 } DUMMYSTRUCTNAME;
1284 } DUMMYUNIONNAME;
1285 # else
1286 BOOLEAN Busy;
1287 # endif
1288 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
1289
1290 #define TIMER_EXPIRED_INDEX_BITS 6
1291 #define TIMER_PROCESSOR_INDEX_BITS 5
1292
1293 typedef struct _DISPATCHER_HEADER {
1294 _ANONYMOUS_UNION union {
1295 _ANONYMOUS_STRUCT struct {
1296 UCHAR Type;
1297 _ANONYMOUS_UNION union {
1298 _ANONYMOUS_UNION union {
1299 UCHAR TimerControlFlags;
1300 _ANONYMOUS_STRUCT struct {
1301 UCHAR Absolute:1;
1302 UCHAR Coalescable:1;
1303 UCHAR KeepShifting:1;
1304 UCHAR EncodedTolerableDelay:5;
1305 } DUMMYSTRUCTNAME;
1306 } DUMMYUNIONNAME;
1307 UCHAR Abandoned;
1308 #if (NTDDI_VERSION < NTDDI_WIN7)
1309 UCHAR NpxIrql;
1310 #endif
1311 BOOLEAN Signalling;
1312 } DUMMYUNIONNAME;
1313 _ANONYMOUS_UNION union {
1314 _ANONYMOUS_UNION union {
1315 UCHAR ThreadControlFlags;
1316 _ANONYMOUS_STRUCT struct {
1317 UCHAR CpuThrottled:1;
1318 UCHAR CycleProfiling:1;
1319 UCHAR CounterProfiling:1;
1320 UCHAR Reserved:5;
1321 } DUMMYSTRUCTNAME;
1322 } DUMMYUNIONNAME;
1323 UCHAR Size;
1324 UCHAR Hand;
1325 } DUMMYUNIONNAME2;
1326 _ANONYMOUS_UNION union {
1327 #if (NTDDI_VERSION >= NTDDI_WIN7)
1328 _ANONYMOUS_UNION union {
1329 UCHAR TimerMiscFlags;
1330 _ANONYMOUS_STRUCT struct {
1331 #if !defined(_X86_)
1332 UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
1333 #else
1334 UCHAR Index:1;
1335 UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
1336 #endif
1337 UCHAR Inserted:1;
1338 volatile UCHAR Expired:1;
1339 } DUMMYSTRUCTNAME;
1340 } DUMMYUNIONNAME;
1341 #else
1342 /* Pre Win7 compatibility fix to latest WDK */
1343 UCHAR Inserted;
1344 #endif
1345 _ANONYMOUS_UNION union {
1346 BOOLEAN DebugActive;
1347 _ANONYMOUS_STRUCT struct {
1348 BOOLEAN ActiveDR7:1;
1349 BOOLEAN Instrumented:1;
1350 BOOLEAN Reserved2:4;
1351 BOOLEAN UmsScheduled:1;
1352 BOOLEAN UmsPrimary:1;
1353 } DUMMYSTRUCTNAME;
1354 } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
1355 BOOLEAN DpcActive;
1356 } DUMMYUNIONNAME3;
1357 } DUMMYSTRUCTNAME;
1358 volatile LONG Lock;
1359 } DUMMYUNIONNAME;
1360 LONG SignalState;
1361 LIST_ENTRY WaitListHead;
1362 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
1363
1364 typedef struct _KEVENT {
1365 DISPATCHER_HEADER Header;
1366 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1367
1368 typedef struct _KSEMAPHORE {
1369 DISPATCHER_HEADER Header;
1370 LONG Limit;
1371 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1372
1373 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
1374
1375 typedef struct _KGATE {
1376 DISPATCHER_HEADER Header;
1377 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
1378
1379 typedef struct _KGUARDED_MUTEX {
1380 volatile LONG Count;
1381 PKTHREAD Owner;
1382 ULONG Contention;
1383 KGATE Gate;
1384 _ANONYMOUS_UNION union {
1385 _ANONYMOUS_STRUCT struct {
1386 SHORT KernelApcDisable;
1387 SHORT SpecialApcDisable;
1388 } DUMMYSTRUCTNAME;
1389 ULONG CombinedApcDisable;
1390 } DUMMYUNIONNAME;
1391 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
1392
1393 typedef struct _KMUTANT {
1394 DISPATCHER_HEADER Header;
1395 LIST_ENTRY MutantListEntry;
1396 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
1397 BOOLEAN Abandoned;
1398 UCHAR ApcDisable;
1399 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
1400
1401 #define TIMER_TABLE_SIZE 512
1402 #define TIMER_TABLE_SHIFT 9
1403
1404 typedef struct _KTIMER {
1405 DISPATCHER_HEADER Header;
1406 ULARGE_INTEGER DueTime;
1407 LIST_ENTRY TimerListEntry;
1408 struct _KDPC *Dpc;
1409 #if (NTDDI_VERSION >= NTDDI_WIN7) && !defined(_X86_)
1410 ULONG Processor;
1411 #endif
1412 ULONG Period;
1413 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
1414
1415 typedef enum _LOCK_OPERATION {
1416 IoReadAccess,
1417 IoWriteAccess,
1418 IoModifyAccess
1419 } LOCK_OPERATION;
1420
1421 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
1422
1423 _Function_class_(KSYNCHRONIZE_ROUTINE)
1424 _IRQL_requires_same_
1425 typedef BOOLEAN
1426 (NTAPI KSYNCHRONIZE_ROUTINE)(
1427 _In_ PVOID SynchronizeContext);
1428 typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE;
1429
1430 typedef enum _POOL_TYPE {
1431 NonPagedPool,
1432 PagedPool,
1433 NonPagedPoolMustSucceed,
1434 DontUseThisType,
1435 NonPagedPoolCacheAligned,
1436 PagedPoolCacheAligned,
1437 NonPagedPoolCacheAlignedMustS,
1438 MaxPoolType,
1439 NonPagedPoolSession = 32,
1440 PagedPoolSession,
1441 NonPagedPoolMustSucceedSession,
1442 DontUseThisTypeSession,
1443 NonPagedPoolCacheAlignedSession,
1444 PagedPoolCacheAlignedSession,
1445 NonPagedPoolCacheAlignedMustSSession
1446 } POOL_TYPE;
1447
1448 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
1449 StandardDesign,
1450 NEC98x86,
1451 EndAlternatives
1452 } ALTERNATIVE_ARCHITECTURE_TYPE;
1453
1454 #ifndef _X86_
1455
1456 #ifndef IsNEC_98
1457 #define IsNEC_98 (FALSE)
1458 #endif
1459
1460 #ifndef IsNotNEC_98
1461 #define IsNotNEC_98 (TRUE)
1462 #endif
1463
1464 #ifndef SetNEC_98
1465 #define SetNEC_98
1466 #endif
1467
1468 #ifndef SetNotNEC_98
1469 #define SetNotNEC_98
1470 #endif
1471
1472 #endif
1473
1474 typedef struct _KSYSTEM_TIME {
1475 ULONG LowPart;
1476 LONG High1Time;
1477 LONG High2Time;
1478 } KSYSTEM_TIME, *PKSYSTEM_TIME;
1479
1480 typedef struct DECLSPEC_ALIGN(16) _M128A {
1481 ULONGLONG Low;
1482 LONGLONG High;
1483 } M128A, *PM128A;
1484
1485 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
1486 USHORT ControlWord;
1487 USHORT StatusWord;
1488 UCHAR TagWord;
1489 UCHAR Reserved1;
1490 USHORT ErrorOpcode;
1491 ULONG ErrorOffset;
1492 USHORT ErrorSelector;
1493 USHORT Reserved2;
1494 ULONG DataOffset;
1495 USHORT DataSelector;
1496 USHORT Reserved3;
1497 ULONG MxCsr;
1498 ULONG MxCsr_Mask;
1499 M128A FloatRegisters[8];
1500 #if defined(_WIN64)
1501 M128A XmmRegisters[16];
1502 UCHAR Reserved4[96];
1503 #else
1504 M128A XmmRegisters[8];
1505 UCHAR Reserved4[192];
1506 ULONG StackControl[7];
1507 ULONG Cr0NpxState;
1508 #endif
1509 } XSAVE_FORMAT, *PXSAVE_FORMAT;
1510
1511 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER {
1512 ULONG64 Mask;
1513 ULONG64 Reserved[7];
1514 } XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER;
1515
1516 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA {
1517 XSAVE_FORMAT LegacyState;
1518 XSAVE_AREA_HEADER Header;
1519 } XSAVE_AREA, *PXSAVE_AREA;
1520
1521 typedef struct _XSTATE_CONTEXT {
1522 ULONG64 Mask;
1523 ULONG Length;
1524 ULONG Reserved1;
1525 _Field_size_bytes_opt_(Length) PXSAVE_AREA Area;
1526 #if defined(_X86_)
1527 ULONG Reserved2;
1528 #endif
1529 PVOID Buffer;
1530 #if defined(_X86_)
1531 ULONG Reserved3;
1532 #endif
1533 } XSTATE_CONTEXT, *PXSTATE_CONTEXT;
1534
1535 typedef struct _XSTATE_SAVE {
1536 #if defined(_AMD64_)
1537 struct _XSTATE_SAVE* Prev;
1538 struct _KTHREAD* Thread;
1539 UCHAR Level;
1540 XSTATE_CONTEXT XStateContext;
1541 #elif defined(_IA64_)
1542 ULONG Dummy;
1543 #elif defined(_X86_)
1544 _ANONYMOUS_UNION union {
1545 _ANONYMOUS_STRUCT struct {
1546 LONG64 Reserved1;
1547 ULONG Reserved2;
1548 struct _XSTATE_SAVE* Prev;
1549 PXSAVE_AREA Reserved3;
1550 struct _KTHREAD* Thread;
1551 PVOID Reserved4;
1552 UCHAR Level;
1553 } DUMMYSTRUCTNAME;
1554 XSTATE_CONTEXT XStateContext;
1555 } DUMMYUNIONNAME;
1556 #endif
1557 } XSTATE_SAVE, *PXSTATE_SAVE;
1558
1559 #ifdef _X86_
1560
1561 #define MAXIMUM_SUPPORTED_EXTENSION 512
1562
1563 #if !defined(__midl) && !defined(MIDL_PASS)
1564 C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION);
1565 #endif
1566
1567 #endif /* _X86_ */
1568
1569 #define XSAVE_ALIGN 64
1570 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
1571
1572 #if !defined(__midl) && !defined(MIDL_PASS)
1573 C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0);
1574 C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0);
1575 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64);
1576 #endif
1577
1578 typedef struct _CONTEXT_CHUNK {
1579 LONG Offset;
1580 ULONG Length;
1581 } CONTEXT_CHUNK, *PCONTEXT_CHUNK;
1582
1583 typedef struct _CONTEXT_EX {
1584 CONTEXT_CHUNK All;
1585 CONTEXT_CHUNK Legacy;
1586 CONTEXT_CHUNK XState;
1587 } CONTEXT_EX, *PCONTEXT_EX;
1588
1589 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1590
1591 #if (NTDDI_VERSION >= NTDDI_VISTA)
1592 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
1593 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1594 extern NTSYSAPI CCHAR KeNumberProcessors;
1595 #else
1596 extern PCCHAR KeNumberProcessors;
1597 #endif
1598
1599
1600 /******************************************************************************
1601 * Memory manager Types *
1602 ******************************************************************************/
1603
1604 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1605 typedef ULONG NODE_REQUIREMENT;
1606 #define MM_ANY_NODE_OK 0x80000000
1607 #endif
1608
1609 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1610 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1611 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1612 #define MM_ALLOCATE_NO_WAIT 0x00000008
1613 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1614 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
1615
1616 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1617 #define MDL_PAGES_LOCKED 0x0002
1618 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1619 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1620 #define MDL_PARTIAL 0x0010
1621 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1622 #define MDL_IO_PAGE_READ 0x0040
1623 #define MDL_WRITE_OPERATION 0x0080
1624 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1625 #define MDL_FREE_EXTRA_PTES 0x0200
1626 #define MDL_DESCRIBES_AWE 0x0400
1627 #define MDL_IO_SPACE 0x0800
1628 #define MDL_NETWORK_HEADER 0x1000
1629 #define MDL_MAPPING_CAN_FAIL 0x2000
1630 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1631 #define MDL_INTERNAL 0x8000
1632
1633 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \
1634 MDL_PAGES_LOCKED | \
1635 MDL_SOURCE_IS_NONPAGED_POOL | \
1636 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1637 MDL_PARENT_MAPPED_SYSTEM_VA | \
1638 MDL_SYSTEM_VA | \
1639 MDL_IO_SPACE)
1640
1641 #define FLUSH_MULTIPLE_MAXIMUM 32
1642
1643 /* Section access rights */
1644 #define SECTION_QUERY 0x0001
1645 #define SECTION_MAP_WRITE 0x0002
1646 #define SECTION_MAP_READ 0x0004
1647 #define SECTION_MAP_EXECUTE 0x0008
1648 #define SECTION_EXTEND_SIZE 0x0010
1649 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1650
1651 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
1652 SECTION_MAP_WRITE | \
1653 SECTION_MAP_READ | \
1654 SECTION_MAP_EXECUTE | \
1655 SECTION_EXTEND_SIZE)
1656
1657 #define SESSION_QUERY_ACCESS 0x0001
1658 #define SESSION_MODIFY_ACCESS 0x0002
1659
1660 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
1661 SESSION_QUERY_ACCESS | \
1662 SESSION_MODIFY_ACCESS)
1663
1664 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1665
1666 #define PAGE_NOACCESS 0x01
1667 #define PAGE_READONLY 0x02
1668 #define PAGE_READWRITE 0x04
1669 #define PAGE_WRITECOPY 0x08
1670 #define PAGE_EXECUTE 0x10
1671 #define PAGE_EXECUTE_READ 0x20
1672 #define PAGE_EXECUTE_READWRITE 0x40
1673 #define PAGE_EXECUTE_WRITECOPY 0x80
1674 #define PAGE_GUARD 0x100
1675 #define PAGE_NOCACHE 0x200
1676 #define PAGE_WRITECOMBINE 0x400
1677
1678 #define MEM_COMMIT 0x1000
1679 #define MEM_RESERVE 0x2000
1680 #define MEM_DECOMMIT 0x4000
1681 #define MEM_RELEASE 0x8000
1682 #define MEM_FREE 0x10000
1683 #define MEM_PRIVATE 0x20000
1684 #define MEM_MAPPED 0x40000
1685 #define MEM_RESET 0x80000
1686 #define MEM_TOP_DOWN 0x100000
1687 #define MEM_LARGE_PAGES 0x20000000
1688 #define MEM_4MB_PAGES 0x80000000
1689
1690 #define SEC_RESERVE 0x4000000
1691 #define SEC_COMMIT 0x8000000
1692 #define SEC_LARGE_PAGES 0x80000000
1693
1694 /* Section map options */
1695 typedef enum _SECTION_INHERIT {
1696 ViewShare = 1,
1697 ViewUnmap = 2
1698 } SECTION_INHERIT;
1699
1700 typedef ULONG PFN_COUNT;
1701 typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
1702 typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
1703
1704 _Struct_size_bytes_(_Inexpressible_(sizeof(struct _MDL) +
1705 (ByteOffset + ByteCount + PAGE_SIZE-1) / PAGE_SIZE * sizeof(PFN_NUMBER)))
1706 typedef struct _MDL {
1707 struct _MDL *Next;
1708 CSHORT Size;
1709 CSHORT MdlFlags;
1710 struct _EPROCESS *Process;
1711 PVOID MappedSystemVa;
1712 PVOID StartVa;
1713 ULONG ByteCount;
1714 ULONG ByteOffset;
1715 } MDL, *PMDL;
1716 #if (_MSC_VER >= 1600)
1717 typedef _Readable_bytes_(_Inexpressible_(polymorphism)) MDL *PMDLX;
1718 #else
1719 typedef MDL *PMDLX;
1720 #endif
1721
1722 typedef enum _MEMORY_CACHING_TYPE_ORIG {
1723 MmFrameBufferCached = 2
1724 } MEMORY_CACHING_TYPE_ORIG;
1725
1726 typedef enum _MEMORY_CACHING_TYPE {
1727 MmNonCached = FALSE,
1728 MmCached = TRUE,
1729 MmWriteCombined = MmFrameBufferCached,
1730 MmHardwareCoherentCached,
1731 MmNonCachedUnordered,
1732 MmUSWCCached,
1733 MmMaximumCacheType
1734 } MEMORY_CACHING_TYPE;
1735
1736 typedef enum _MM_PAGE_PRIORITY {
1737 LowPagePriority,
1738 NormalPagePriority = 16,
1739 HighPagePriority = 32
1740 } MM_PAGE_PRIORITY;
1741
1742 typedef enum _MM_SYSTEM_SIZE {
1743 MmSmallSystem,
1744 MmMediumSystem,
1745 MmLargeSystem
1746 } MM_SYSTEMSIZE;
1747
1748 extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress;
1749 extern PVOID MmBadPointer;
1750
1751
1752 /******************************************************************************
1753 * Executive Types *
1754 ******************************************************************************/
1755 #define EX_RUNDOWN_ACTIVE 0x1
1756 #define EX_RUNDOWN_COUNT_SHIFT 0x1
1757 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
1758
1759 typedef struct _FAST_MUTEX {
1760 volatile LONG Count;
1761 PKTHREAD Owner;
1762 ULONG Contention;
1763 KEVENT Event;
1764 ULONG OldIrql;
1765 } FAST_MUTEX, *PFAST_MUTEX;
1766
1767 typedef enum _SUITE_TYPE {
1768 SmallBusiness,
1769 Enterprise,
1770 BackOffice,
1771 CommunicationServer,
1772 TerminalServer,
1773 SmallBusinessRestricted,
1774 EmbeddedNT,
1775 DataCenter,
1776 SingleUserTS,
1777 Personal,
1778 Blade,
1779 EmbeddedRestricted,
1780 SecurityAppliance,
1781 StorageServer,
1782 ComputeServer,
1783 WHServer,
1784 MaxSuiteType
1785 } SUITE_TYPE;
1786
1787 typedef enum _EX_POOL_PRIORITY {
1788 LowPoolPriority,
1789 LowPoolPrioritySpecialPoolOverrun = 8,
1790 LowPoolPrioritySpecialPoolUnderrun = 9,
1791 NormalPoolPriority = 16,
1792 NormalPoolPrioritySpecialPoolOverrun = 24,
1793 NormalPoolPrioritySpecialPoolUnderrun = 25,
1794 HighPoolPriority = 32,
1795 HighPoolPrioritySpecialPoolOverrun = 40,
1796 HighPoolPrioritySpecialPoolUnderrun = 41
1797 } EX_POOL_PRIORITY;
1798
1799 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
1800 #define LOOKASIDE_ALIGN
1801 #else
1802 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
1803 #endif
1804
1805 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
1806
1807 _IRQL_requires_same_
1808 _Function_class_(ALLOCATE_FUNCTION)
1809 typedef PVOID
1810 (NTAPI *PALLOCATE_FUNCTION)(
1811 _In_ POOL_TYPE PoolType,
1812 _In_ SIZE_T NumberOfBytes,
1813 _In_ ULONG Tag);
1814
1815 _IRQL_requires_same_
1816 _Function_class_(ALLOCATE_FUNCTION_EX)
1817 typedef PVOID
1818 (NTAPI *PALLOCATE_FUNCTION_EX)(
1819 _In_ POOL_TYPE PoolType,
1820 _In_ SIZE_T NumberOfBytes,
1821 _In_ ULONG Tag,
1822 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
1823
1824 _IRQL_requires_same_
1825 _Function_class_(FREE_FUNCTION)
1826 typedef VOID
1827 (NTAPI *PFREE_FUNCTION)(
1828 _In_ PVOID Buffer);
1829
1830 _IRQL_requires_same_
1831 _Function_class_(FREE_FUNCTION_EX)
1832 typedef VOID
1833 (NTAPI *PFREE_FUNCTION_EX)(
1834 _In_ PVOID Buffer,
1835 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
1836
1837 _IRQL_requires_same_
1838 _Function_class_(CALLBACK_FUNCTION)
1839 typedef VOID
1840 (NTAPI CALLBACK_FUNCTION)(
1841 _In_opt_ PVOID CallbackContext,
1842 _In_opt_ PVOID Argument1,
1843 _In_opt_ PVOID Argument2);
1844 typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
1845
1846 #define GENERAL_LOOKASIDE_LAYOUT \
1847 _ANONYMOUS_UNION union { \
1848 SLIST_HEADER ListHead; \
1849 SINGLE_LIST_ENTRY SingleListHead; \
1850 } DUMMYUNIONNAME; \
1851 USHORT Depth; \
1852 USHORT MaximumDepth; \
1853 ULONG TotalAllocates; \
1854 _ANONYMOUS_UNION union { \
1855 ULONG AllocateMisses; \
1856 ULONG AllocateHits; \
1857 } DUMMYUNIONNAME2; \
1858 ULONG TotalFrees; \
1859 _ANONYMOUS_UNION union { \
1860 ULONG FreeMisses; \
1861 ULONG FreeHits; \
1862 } DUMMYUNIONNAME3; \
1863 POOL_TYPE Type; \
1864 ULONG Tag; \
1865 ULONG Size; \
1866 _ANONYMOUS_UNION union { \
1867 PALLOCATE_FUNCTION_EX AllocateEx; \
1868 PALLOCATE_FUNCTION Allocate; \
1869 } DUMMYUNIONNAME4; \
1870 _ANONYMOUS_UNION union { \
1871 PFREE_FUNCTION_EX FreeEx; \
1872 PFREE_FUNCTION Free; \
1873 } DUMMYUNIONNAME5; \
1874 LIST_ENTRY ListEntry; \
1875 ULONG LastTotalAllocates; \
1876 _ANONYMOUS_UNION union { \
1877 ULONG LastAllocateMisses; \
1878 ULONG LastAllocateHits; \
1879 } DUMMYUNIONNAME6; \
1880 ULONG Future[2];
1881
1882 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
1883 GENERAL_LOOKASIDE_LAYOUT
1884 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
1885
1886 typedef struct _GENERAL_LOOKASIDE_POOL {
1887 GENERAL_LOOKASIDE_LAYOUT
1888 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
1889
1890 #define LOOKASIDE_CHECK(f) \
1891 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
1892
1893 LOOKASIDE_CHECK(TotalFrees);
1894 LOOKASIDE_CHECK(Tag);
1895 LOOKASIDE_CHECK(Future);
1896
1897 typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST {
1898 GENERAL_LOOKASIDE L;
1899 #if !defined(_AMD64_) && !defined(_IA64_)
1900 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
1901 #endif
1902 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
1903
1904 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
1905 GENERAL_LOOKASIDE L;
1906 #if !defined(_AMD64_) && !defined(_IA64_)
1907 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
1908 #endif
1909 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
1910
1911 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
1912
1913 typedef struct _LOOKASIDE_LIST_EX {
1914 GENERAL_LOOKASIDE_POOL L;
1915 } LOOKASIDE_LIST_EX;
1916
1917 #if (NTDDI_VERSION >= NTDDI_VISTA)
1918
1919 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
1920 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
1921
1922 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
1923 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
1924
1925 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1926
1927 typedef struct _EX_RUNDOWN_REF {
1928 _ANONYMOUS_UNION union {
1929 volatile ULONG_PTR Count;
1930 volatile PVOID Ptr;
1931 } DUMMYUNIONNAME;
1932 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
1933
1934 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
1935
1936 typedef enum _WORK_QUEUE_TYPE {
1937 CriticalWorkQueue,
1938 DelayedWorkQueue,
1939 HyperCriticalWorkQueue,
1940 MaximumWorkQueue
1941 } WORK_QUEUE_TYPE;
1942
1943 _IRQL_requires_same_
1944 _Function_class_(WORKER_THREAD_ROUTINE)
1945 typedef VOID
1946 (NTAPI WORKER_THREAD_ROUTINE)(
1947 _In_ PVOID Parameter);
1948 typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
1949
1950 typedef struct _WORK_QUEUE_ITEM {
1951 LIST_ENTRY List;
1952 PWORKER_THREAD_ROUTINE WorkerRoutine;
1953 volatile PVOID Parameter;
1954 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
1955
1956 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
1957
1958 typedef struct _OWNER_ENTRY {
1959 ERESOURCE_THREAD OwnerThread;
1960 _ANONYMOUS_UNION union {
1961 _ANONYMOUS_STRUCT struct {
1962 ULONG IoPriorityBoosted:1;
1963 ULONG OwnerReferenced:1;
1964 ULONG OwnerCount:30;
1965 } DUMMYSTRUCTNAME;
1966 ULONG TableSize;
1967 } DUMMYUNIONNAME;
1968 } OWNER_ENTRY, *POWNER_ENTRY;
1969
1970 typedef struct _ERESOURCE {
1971 LIST_ENTRY SystemResourcesList;
1972 POWNER_ENTRY OwnerTable;
1973 SHORT ActiveCount;
1974 USHORT Flag;
1975 volatile PKSEMAPHORE SharedWaiters;
1976 volatile PKEVENT ExclusiveWaiters;
1977 OWNER_ENTRY OwnerEntry;
1978 ULONG ActiveEntries;
1979 ULONG ContentionCount;
1980 ULONG NumberOfSharedWaiters;
1981 ULONG NumberOfExclusiveWaiters;
1982 #if defined(_WIN64)
1983 PVOID Reserved2;
1984 #endif
1985 _ANONYMOUS_UNION union {
1986 PVOID Address;
1987 ULONG_PTR CreatorBackTraceIndex;
1988 } DUMMYUNIONNAME;
1989 KSPIN_LOCK SpinLock;
1990 } ERESOURCE, *PERESOURCE;
1991
1992 /* ERESOURCE.Flag */
1993 #define ResourceNeverExclusive 0x0010
1994 #define ResourceReleaseByOtherThread 0x0020
1995 #define ResourceOwnedExclusive 0x0080
1996
1997 #define RESOURCE_HASH_TABLE_SIZE 64
1998
1999 typedef struct _RESOURCE_HASH_ENTRY {
2000 LIST_ENTRY ListEntry;
2001 PVOID Address;
2002 ULONG ContentionCount;
2003 ULONG Number;
2004 } RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY;
2005
2006 typedef struct _RESOURCE_PERFORMANCE_DATA {
2007 ULONG ActiveResourceCount;
2008 ULONG TotalResourceCount;
2009 ULONG ExclusiveAcquire;
2010 ULONG SharedFirstLevel;
2011 ULONG SharedSecondLevel;
2012 ULONG StarveFirstLevel;
2013 ULONG StarveSecondLevel;
2014 ULONG WaitForExclusive;
2015 ULONG OwnerTableExpands;
2016 ULONG MaximumTableExpand;
2017 LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE];
2018 } RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA;
2019
2020 /* Global debug flag */
2021 #if DEVL
2022 extern ULONG NtGlobalFlag;
2023 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
2024 #else
2025 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
2026 #endif
2027
2028 /******************************************************************************
2029 * Security Manager Types *
2030 ******************************************************************************/
2031
2032 /* Simple types */
2033 typedef PVOID PSECURITY_DESCRIPTOR;
2034 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
2035 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
2036 typedef PVOID PACCESS_TOKEN;
2037 typedef PVOID PSID;
2038
2039 #define DELETE 0x00010000L
2040 #define READ_CONTROL 0x00020000L
2041 #define WRITE_DAC 0x00040000L
2042 #define WRITE_OWNER 0x00080000L
2043 #define SYNCHRONIZE 0x00100000L
2044 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
2045 #define STANDARD_RIGHTS_READ READ_CONTROL
2046 #define STANDARD_RIGHTS_WRITE READ_CONTROL
2047 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
2048 #define STANDARD_RIGHTS_ALL 0x001F0000L
2049 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
2050 #define ACCESS_SYSTEM_SECURITY 0x01000000L
2051 #define MAXIMUM_ALLOWED 0x02000000L
2052 #define GENERIC_READ 0x80000000L
2053 #define GENERIC_WRITE 0x40000000L
2054 #define GENERIC_EXECUTE 0x20000000L
2055 #define GENERIC_ALL 0x10000000L
2056
2057 typedef struct _GENERIC_MAPPING {
2058 ACCESS_MASK GenericRead;
2059 ACCESS_MASK GenericWrite;
2060 ACCESS_MASK GenericExecute;
2061 ACCESS_MASK GenericAll;
2062 } GENERIC_MAPPING, *PGENERIC_MAPPING;
2063
2064 #define ACL_REVISION 2
2065 #define ACL_REVISION_DS 4
2066
2067 #define ACL_REVISION1 1
2068 #define ACL_REVISION2 2
2069 #define ACL_REVISION3 3
2070 #define ACL_REVISION4 4
2071 #define MIN_ACL_REVISION ACL_REVISION2
2072 #define MAX_ACL_REVISION ACL_REVISION4
2073
2074 typedef struct _ACL {
2075 UCHAR AclRevision;
2076 UCHAR Sbz1;
2077 USHORT AclSize;
2078 USHORT AceCount;
2079 USHORT Sbz2;
2080 } ACL, *PACL;
2081
2082 /* Current security descriptor revision value */
2083 #define SECURITY_DESCRIPTOR_REVISION (1)
2084 #define SECURITY_DESCRIPTOR_REVISION1 (1)
2085
2086 /* Privilege attributes */
2087 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2088 #define SE_PRIVILEGE_ENABLED (0x00000002L)
2089 #define SE_PRIVILEGE_REMOVED (0X00000004L)
2090 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
2091
2092 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2093 SE_PRIVILEGE_ENABLED | \
2094 SE_PRIVILEGE_REMOVED | \
2095 SE_PRIVILEGE_USED_FOR_ACCESS)
2096
2097 #include <pshpack4.h>
2098 typedef struct _LUID_AND_ATTRIBUTES {
2099 LUID Luid;
2100 ULONG Attributes;
2101 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
2102 #include <poppack.h>
2103
2104 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
2105 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
2106
2107 /* Privilege sets */
2108 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2109
2110 typedef struct _PRIVILEGE_SET {
2111 ULONG PrivilegeCount;
2112 ULONG Control;
2113 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
2114 } PRIVILEGE_SET,*PPRIVILEGE_SET;
2115
2116 typedef enum _SECURITY_IMPERSONATION_LEVEL {
2117 SecurityAnonymous,
2118 SecurityIdentification,
2119 SecurityImpersonation,
2120 SecurityDelegation
2121 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
2122
2123 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2124 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2125 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2126 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2127
2128 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2129 #define SECURITY_STATIC_TRACKING (FALSE)
2130
2131 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
2132
2133 typedef struct _SECURITY_QUALITY_OF_SERVICE {
2134 ULONG Length;
2135 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2136 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
2137 BOOLEAN EffectiveOnly;
2138 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
2139
2140 typedef struct _SE_IMPERSONATION_STATE {
2141 PACCESS_TOKEN Token;
2142 BOOLEAN CopyOnOpen;
2143 BOOLEAN EffectiveOnly;
2144 SECURITY_IMPERSONATION_LEVEL Level;
2145 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
2146
2147 #define OWNER_SECURITY_INFORMATION (0x00000001L)
2148 #define GROUP_SECURITY_INFORMATION (0x00000002L)
2149 #define DACL_SECURITY_INFORMATION (0x00000004L)
2150 #define SACL_SECURITY_INFORMATION (0x00000008L)
2151 #define LABEL_SECURITY_INFORMATION (0x00000010L)
2152
2153 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
2154 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
2155 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
2156 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
2157
2158 typedef enum _SECURITY_OPERATION_CODE {
2159 SetSecurityDescriptor,
2160 QuerySecurityDescriptor,
2161 DeleteSecurityDescriptor,
2162 AssignSecurityDescriptor
2163 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2164
2165 #define INITIAL_PRIVILEGE_COUNT 3
2166
2167 typedef struct _INITIAL_PRIVILEGE_SET {
2168 ULONG PrivilegeCount;
2169 ULONG Control;
2170 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2171 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2172
2173 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2174 #define SE_CREATE_TOKEN_PRIVILEGE 2
2175 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2176 #define SE_LOCK_MEMORY_PRIVILEGE 4
2177 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2178 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2179 #define SE_TCB_PRIVILEGE 7
2180 #define SE_SECURITY_PRIVILEGE 8
2181 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2182 #define SE_LOAD_DRIVER_PRIVILEGE 10
2183 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2184 #define SE_SYSTEMTIME_PRIVILEGE 12
2185 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2186 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2187 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2188 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2189 #define SE_BACKUP_PRIVILEGE 17
2190 #define SE_RESTORE_PRIVILEGE 18
2191 #define SE_SHUTDOWN_PRIVILEGE 19
2192 #define SE_DEBUG_PRIVILEGE 20
2193 #define SE_AUDIT_PRIVILEGE 21
2194 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2195 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2196 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2197 #define SE_UNDOCK_PRIVILEGE 25
2198 #define SE_SYNC_AGENT_PRIVILEGE 26
2199 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2200 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2201 #define SE_IMPERSONATE_PRIVILEGE 29
2202 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2203 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2204 #define SE_RELABEL_PRIVILEGE 32
2205 #define SE_INC_WORKING_SET_PRIVILEGE 33
2206 #define SE_TIME_ZONE_PRIVILEGE 34
2207 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
2208 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2209
2210 typedef struct _SECURITY_SUBJECT_CONTEXT {
2211 PACCESS_TOKEN ClientToken;
2212 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2213 PACCESS_TOKEN PrimaryToken;
2214 PVOID ProcessAuditId;
2215 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2216
2217 typedef struct _ACCESS_STATE {
2218 LUID OperationID;
2219 BOOLEAN SecurityEvaluated;
2220 BOOLEAN GenerateAudit;
2221 BOOLEAN GenerateOnClose;
2222 BOOLEAN PrivilegesAllocated;
2223 ULONG Flags;
2224 ACCESS_MASK RemainingDesiredAccess;
2225 ACCESS_MASK PreviouslyGrantedAccess;
2226 ACCESS_MASK OriginalDesiredAccess;
2227 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2228 PSECURITY_DESCRIPTOR SecurityDescriptor;
2229 PVOID AuxData;
2230 union {
2231 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2232 PRIVILEGE_SET PrivilegeSet;
2233 } Privileges;
2234 BOOLEAN AuditPrivileges;
2235 UNICODE_STRING ObjectName;
2236 UNICODE_STRING ObjectTypeName;
2237 } ACCESS_STATE, *PACCESS_STATE;
2238
2239 typedef VOID
2240 (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)(
2241 _In_ PVOID Vcb,
2242 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
2243
2244 #ifndef _NTLSA_IFS_
2245
2246 #ifndef _NTLSA_AUDIT_
2247 #define _NTLSA_AUDIT_
2248
2249 #define SE_MAX_AUDIT_PARAMETERS 32
2250 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
2251
2252 #define SE_ADT_OBJECT_ONLY 0x1
2253
2254 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
2255 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
2256 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
2257 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
2258 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
2259
2260 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
2261 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
2262 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
2263
2264 typedef enum _SE_ADT_PARAMETER_TYPE {
2265 SeAdtParmTypeNone = 0,
2266 SeAdtParmTypeString,
2267 SeAdtParmTypeFileSpec,
2268 SeAdtParmTypeUlong,
2269 SeAdtParmTypeSid,
2270 SeAdtParmTypeLogonId,
2271 SeAdtParmTypeNoLogonId,
2272 SeAdtParmTypeAccessMask,
2273 SeAdtParmTypePrivs,
2274 SeAdtParmTypeObjectTypes,
2275 SeAdtParmTypeHexUlong,
2276 SeAdtParmTypePtr,
2277 SeAdtParmTypeTime,
2278 SeAdtParmTypeGuid,
2279 SeAdtParmTypeLuid,
2280 SeAdtParmTypeHexInt64,
2281 SeAdtParmTypeStringList,
2282 SeAdtParmTypeSidList,
2283 SeAdtParmTypeDuration,
2284 SeAdtParmTypeUserAccountControl,
2285 SeAdtParmTypeNoUac,
2286 SeAdtParmTypeMessage,
2287 SeAdtParmTypeDateTime,
2288 SeAdtParmTypeSockAddr,
2289 SeAdtParmTypeSD,
2290 SeAdtParmTypeLogonHours,
2291 SeAdtParmTypeLogonIdNoSid,
2292 SeAdtParmTypeUlongNoConv,
2293 SeAdtParmTypeSockAddrNoPort,
2294 SeAdtParmTypeAccessReason
2295 } SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
2296
2297 typedef struct _SE_ADT_OBJECT_TYPE {
2298 GUID ObjectType;
2299 USHORT Flags;
2300 USHORT Level;
2301 ACCESS_MASK AccessMask;
2302 } SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
2303
2304 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
2305 SE_ADT_PARAMETER_TYPE Type;
2306 ULONG Length;
2307 ULONG_PTR Data[2];
2308 PVOID Address;
2309 } SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
2310
2311 typedef struct _SE_ADT_ACCESS_REASON {
2312 ACCESS_MASK AccessMask;
2313 ULONG AccessReasons[32];
2314 ULONG ObjectTypeIndex;
2315 ULONG AccessGranted;
2316 PSECURITY_DESCRIPTOR SecurityDescriptor;
2317 } SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
2318
2319 typedef struct _SE_ADT_PARAMETER_ARRAY {
2320 ULONG CategoryId;
2321 ULONG AuditId;
2322 ULONG ParameterCount;
2323 ULONG Length;
2324 USHORT FlatSubCategoryId;
2325 USHORT Type;
2326 ULONG Flags;
2327 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
2328 } SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
2329
2330 #endif /* !_NTLSA_AUDIT_ */
2331 #endif /* !_NTLSA_IFS_ */
2332 /******************************************************************************
2333 * Power Management Support Types *
2334 ******************************************************************************/
2335
2336 #ifndef _PO_DDK_
2337 #define _PO_DDK_
2338
2339 #define PO_CB_SYSTEM_POWER_POLICY 0
2340 #define PO_CB_AC_STATUS 1
2341 #define PO_CB_BUTTON_COLLISION 2
2342 #define PO_CB_SYSTEM_STATE_LOCK 3
2343 #define PO_CB_LID_SWITCH_STATE 4
2344 #define PO_CB_PROCESSOR_POWER_POLICY 5
2345
2346 /* Power States/Levels */
2347 typedef enum _SYSTEM_POWER_STATE {
2348 PowerSystemUnspecified = 0,
2349 PowerSystemWorking,
2350 PowerSystemSleeping1,
2351 PowerSystemSleeping2,
2352 PowerSystemSleeping3,
2353 PowerSystemHibernate,
2354 PowerSystemShutdown,
2355 PowerSystemMaximum
2356 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
2357
2358 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
2359
2360 typedef enum _POWER_INFORMATION_LEVEL {
2361 SystemPowerPolicyAc,
2362 SystemPowerPolicyDc,
2363 VerifySystemPolicyAc,
2364 VerifySystemPolicyDc,
2365 SystemPowerCapabilities,
2366 SystemBatteryState,
2367 SystemPowerStateHandler,
2368 ProcessorStateHandler,
2369 SystemPowerPolicyCurrent,
2370 AdministratorPowerPolicy,
2371 SystemReserveHiberFile,
2372 ProcessorInformation,
2373 SystemPowerInformation,
2374 ProcessorStateHandler2,
2375 LastWakeTime,
2376 LastSleepTime,
2377 SystemExecutionState,
2378 SystemPowerStateNotifyHandler,
2379 ProcessorPowerPolicyAc,
2380 ProcessorPowerPolicyDc,
2381 VerifyProcessorPowerPolicyAc,
2382 VerifyProcessorPowerPolicyDc,
2383 ProcessorPowerPolicyCurrent,
2384 SystemPowerStateLogging,
2385 SystemPowerLoggingEntry,
2386 SetPowerSettingValue,
2387 NotifyUserPowerSetting,
2388 PowerInformationLevelUnused0,
2389 PowerInformationLevelUnused1,
2390 SystemVideoState,
2391 TraceApplicationPowerMessage,
2392 TraceApplicationPowerMessageEnd,
2393 ProcessorPerfStates,
2394 ProcessorIdleStates,
2395 ProcessorCap,
2396 SystemWakeSource,
2397 SystemHiberFileInformation,
2398 TraceServicePowerMessage,
2399 ProcessorLoad,
2400 PowerShutdownNotification,
2401 MonitorCapabilities,
2402 SessionPowerInit,
2403 SessionDisplayState,
2404 PowerRequestCreate,
2405 PowerRequestAction,
2406 GetPowerRequestList,
2407 ProcessorInformationEx,
2408 NotifyUserModeLegacyPowerEvent,
2409 GroupPark,
2410 ProcessorIdleDomains,
2411 WakeTimerList,
2412 SystemHiberFileSize,
2413 PowerInformationLevelMaximum
2414 } POWER_INFORMATION_LEVEL;
2415
2416 typedef enum {
2417 PowerActionNone = 0,
2418 PowerActionReserved,
2419 PowerActionSleep,
2420 PowerActionHibernate,
2421 PowerActionShutdown,
2422 PowerActionShutdownReset,
2423 PowerActionShutdownOff,
2424 PowerActionWarmEject
2425 } POWER_ACTION, *PPOWER_ACTION;
2426
2427 typedef enum _DEVICE_POWER_STATE {
2428 PowerDeviceUnspecified = 0,
2429 PowerDeviceD0,
2430 PowerDeviceD1,
2431 PowerDeviceD2,
2432 PowerDeviceD3,
2433 PowerDeviceMaximum
2434 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
2435
2436 typedef enum _MONITOR_DISPLAY_STATE {
2437 PowerMonitorOff = 0,
2438 PowerMonitorOn,
2439 PowerMonitorDim
2440 } MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
2441
2442 typedef union _POWER_STATE {
2443 SYSTEM_POWER_STATE SystemState;
2444 DEVICE_POWER_STATE DeviceState;
2445 } POWER_STATE, *PPOWER_STATE;
2446
2447 typedef enum _POWER_STATE_TYPE {
2448 SystemPowerState = 0,
2449 DevicePowerState
2450 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
2451
2452 #if (NTDDI_VERSION >= NTDDI_VISTA)
2453 typedef struct _SYSTEM_POWER_STATE_CONTEXT {
2454 _ANONYMOUS_UNION union {
2455 _ANONYMOUS_STRUCT struct {
2456 ULONG Reserved1:8;
2457 ULONG TargetSystemState:4;
2458 ULONG EffectiveSystemState:4;
2459 ULONG CurrentSystemState:4;
2460 ULONG IgnoreHibernationPath:1;
2461 ULONG PseudoTransition:1;
2462 ULONG Reserved2:10;
2463 } DUMMYSTRUCTNAME;
2464 ULONG ContextAsUlong;
2465 } DUMMYUNIONNAME;
2466 } SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;
2467 #endif
2468
2469 #if (NTDDI_VERSION >= NTDDI_WIN7)
2470 typedef struct _COUNTED_REASON_CONTEXT {
2471 ULONG Version;
2472 ULONG Flags;
2473 _ANONYMOUS_UNION union {
2474 _ANONYMOUS_STRUCT struct {
2475 UNICODE_STRING ResourceFileName;
2476 USHORT ResourceReasonId;
2477 ULONG StringCount;
2478 PUNICODE_STRING ReasonStrings;
2479 } DUMMYSTRUCTNAME;
2480 UNICODE_STRING SimpleString;
2481 } DUMMYUNIONNAME;
2482 } COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT;
2483 #endif
2484
2485 #define IOCTL_QUERY_DEVICE_POWER_STATE \
2486 CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS)
2487
2488 #define IOCTL_SET_DEVICE_WAKE \
2489 CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2490
2491 #define IOCTL_CANCEL_DEVICE_WAKE \
2492 CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2493
2494 #define ES_SYSTEM_REQUIRED 0x00000001
2495 #define ES_DISPLAY_REQUIRED 0x00000002
2496 #define ES_USER_PRESENT 0x00000004
2497 #define ES_CONTINUOUS 0x80000000
2498
2499 typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE;
2500
2501 typedef enum {
2502 LT_DONT_CARE,
2503 LT_LOWEST_LATENCY
2504 } LATENCY_TIME;
2505
2506 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
2507 #define DIAGNOSTIC_REASON_VERSION 0
2508 #define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001
2509 #define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002
2510 #define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000
2511 #define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003)
2512 #endif
2513
2514 #define POWER_REQUEST_CONTEXT_VERSION 0
2515 #define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001
2516 #define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002
2517
2518 #define PowerRequestMaximum 3
2519
2520 typedef enum _POWER_REQUEST_TYPE {
2521 PowerRequestDisplayRequired,
2522 PowerRequestSystemRequired,
2523 PowerRequestAwayModeRequired
2524 } POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE;
2525
2526 #if (NTDDI_VERSION >= NTDDI_WINXP)
2527
2528 #define PDCAP_D0_SUPPORTED 0x00000001
2529 #define PDCAP_D1_SUPPORTED 0x00000002
2530 #define PDCAP_D2_SUPPORTED 0x00000004
2531 #define PDCAP_D3_SUPPORTED 0x00000008
2532 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2533 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2534 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2535 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2536 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2537
2538 typedef struct CM_Power_Data_s {
2539 ULONG PD_Size;
2540 DEVICE_POWER_STATE PD_MostRecentPowerState;
2541 ULONG PD_Capabilities;
2542 ULONG PD_D1Latency;
2543 ULONG PD_D2Latency;
2544 ULONG PD_D3Latency;
2545 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
2546 SYSTEM_POWER_STATE PD_DeepestSystemWake;
2547 } CM_POWER_DATA, *PCM_POWER_DATA;
2548
2549 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2550
2551 typedef enum _SYSTEM_POWER_CONDITION {
2552 PoAc,
2553 PoDc,
2554 PoHot,
2555 PoConditionMaximum
2556 } SYSTEM_POWER_CONDITION;
2557
2558 typedef struct _SET_POWER_SETTING_VALUE {
2559 ULONG Version;
2560 GUID Guid;
2561 SYSTEM_POWER_CONDITION PowerCondition;
2562 ULONG DataLength;
2563 UCHAR Data[ANYSIZE_ARRAY];
2564 } SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;
2565
2566 #define POWER_SETTING_VALUE_VERSION (0x1)
2567
2568 typedef struct _NOTIFY_USER_POWER_SETTING {
2569 GUID Guid;
2570 } NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;
2571
2572 typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {
2573 LARGE_INTEGER ActivationTime;
2574 ULONG Flags;
2575 ULONG ButtonInstanceID;
2576 } APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;
2577
2578 typedef enum _POWER_PLATFORM_ROLE {
2579 PlatformRoleUnspecified = 0,
2580 PlatformRoleDesktop,
2581 PlatformRoleMobile,
2582 PlatformRoleWorkstation,
2583 PlatformRoleEnterpriseServer,
2584 PlatformRoleSOHOServer,
2585 PlatformRoleAppliancePC,
2586 PlatformRolePerformanceServer,
2587 PlatformRoleMaximum
2588 } POWER_PLATFORM_ROLE;
2589
2590 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
2591 typedef struct {
2592 ULONG Granularity;
2593 ULONG Capacity;
2594 } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
2595 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
2596
2597 #endif /* !_PO_DDK_ */
2598
2599 #define CORE_PARKING_POLICY_CHANGE_IDEAL 0
2600 #define CORE_PARKING_POLICY_CHANGE_SINGLE 1
2601 #define CORE_PARKING_POLICY_CHANGE_ROCKET 2
2602 #define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
2603
2604 DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
2605 DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
2606 DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
2607 DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
2608 DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
2609 DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
2610 DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
2611 DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
2612 DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
2613 DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
2614 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
2615 DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
2616 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
2617 DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
2618 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
2619 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
2620 DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
2621 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
2622 DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
2623 DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
2624 DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
2625 DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
2626 DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
2627 DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
2628 DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
2629 DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
2630 DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
2631 DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
2632 DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
2633 DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
2634 DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
2635 DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
2636 DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
2637 DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
2638 DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
2639 DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
2640 DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
2641 DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
2642 DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
2643 DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
2644 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
2645 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
2646 DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
2647 DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
2648 DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
2649 DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
2650 DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
2651 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
2652 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
2653 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
2654 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
2655 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
2656 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
2657 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
2658 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
2659 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
2660 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
2661 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
2662 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
2663 DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
2664 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
2665 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
2666 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
2667 DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
2668 DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
2669 DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
2670 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
2671 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
2672 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
2673 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
2674 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
2675 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
2676 DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
2677 DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
2678 DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
2679 DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
2680 DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
2681 DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
2682 DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
2683 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
2684 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
2685 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
2686 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
2687 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
2688 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
2689 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
2690 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
2691 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
2692 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
2693 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
2694 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
2695 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
2696 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
2697 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
2698 DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
2699 DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
2700 DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
2701 DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
2702 DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
2703 DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
2704 DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
2705 DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
2706 DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
2707 DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
2708 DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
2709 DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
2710 DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
2711 DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
2712 DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
2713
2714 #define PERFSTATE_POLICY_CHANGE_IDEAL 0
2715 #define PERFSTATE_POLICY_CHANGE_SINGLE 1
2716 #define PERFSTATE_POLICY_CHANGE_ROCKET 2
2717 #define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
2718
2719 #define PROCESSOR_PERF_BOOST_POLICY_DISABLED 0
2720 #define PROCESSOR_PERF_BOOST_POLICY_MAX 100
2721
2722 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0
2723 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1
2724
2725 _Function_class_(REQUEST_POWER_COMPLETE)
2726 _IRQL_requires_same_
2727 typedef VOID
2728 (NTAPI REQUEST_POWER_COMPLETE)(
2729 _In_ struct _DEVICE_OBJECT *DeviceObject,
2730 _In_ UCHAR MinorFunction,
2731 _In_ POWER_STATE PowerState,
2732 _In_opt_ PVOID Context,
2733 _In_ struct _IO_STATUS_BLOCK *IoStatus);
2734 typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE;
2735
2736 _Function_class_(POWER_SETTING_CALLBACK)
2737 _IRQL_requires_same_
2738 typedef NTSTATUS
2739 (NTAPI POWER_SETTING_CALLBACK)(
2740 _In_ LPCGUID SettingGuid,
2741 _In_reads_bytes_(ValueLength) PVOID Value,
2742 _In_ ULONG ValueLength,
2743 _Inout_opt_ PVOID Context);
2744 typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
2745
2746 /******************************************************************************
2747 * Configuration Manager Types *
2748 ******************************************************************************/
2749
2750 /* Resource list definitions */
2751 typedef int CM_RESOURCE_TYPE;
2752
2753 #define CmResourceTypeNull 0
2754 #define CmResourceTypePort 1
2755 #define CmResourceTypeInterrupt 2
2756 #define CmResourceTypeMemory 3
2757 #define CmResourceTypeDma 4
2758 #define CmResourceTypeDeviceSpecific 5
2759 #define CmResourceTypeBusNumber 6
2760 #define CmResourceTypeNonArbitrated 128
2761 #define CmResourceTypeConfigData 128
2762 #define CmResourceTypeDevicePrivate 129
2763 #define CmResourceTypePcCardConfig 130
2764 #define CmResourceTypeMfCardConfig 131
2765
2766 /* KEY_VALUE_Xxx.Type */
2767 #define REG_NONE 0
2768 #define REG_SZ 1
2769 #define REG_EXPAND_SZ 2
2770 #define REG_BINARY 3
2771 #define REG_DWORD 4
2772 #define REG_DWORD_LITTLE_ENDIAN 4
2773 #define REG_DWORD_BIG_ENDIAN 5
2774 #define REG_LINK 6
2775 #define REG_MULTI_SZ 7
2776 #define REG_RESOURCE_LIST 8
2777 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2778 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2779 #define REG_QWORD 11
2780 #define REG_QWORD_LITTLE_ENDIAN 11
2781
2782 /* Registry Access Rights */
2783 #define KEY_QUERY_VALUE (0x0001)
2784 #define KEY_SET_VALUE (0x0002)
2785 #define KEY_CREATE_SUB_KEY (0x0004)
2786 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
2787 #define KEY_NOTIFY (0x0010)
2788 #define KEY_CREATE_LINK (0x0020)
2789 #define KEY_WOW64_32KEY (0x0200)
2790 #define KEY_WOW64_64KEY (0x0100)
2791 #define KEY_WOW64_RES (0x0300)
2792
2793 #define KEY_READ ((STANDARD_RIGHTS_READ |\
2794 KEY_QUERY_VALUE |\
2795 KEY_ENUMERATE_SUB_KEYS |\
2796 KEY_NOTIFY) \
2797 & \
2798 (~SYNCHRONIZE))
2799
2800 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
2801 KEY_SET_VALUE |\
2802 KEY_CREATE_SUB_KEY) \
2803 & \
2804 (~SYNCHRONIZE))
2805
2806 #define KEY_EXECUTE ((KEY_READ) \
2807 & \
2808 (~SYNCHRONIZE))
2809
2810 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
2811 KEY_QUERY_VALUE |\
2812 KEY_SET_VALUE |\
2813 KEY_CREATE_SUB_KEY |\
2814 KEY_ENUMERATE_SUB_KEYS |\
2815 KEY_NOTIFY |\
2816 KEY_CREATE_LINK) \
2817 & \
2818 (~SYNCHRONIZE))
2819
2820 /* Registry Open/Create Options */
2821 #define REG_OPTION_RESERVED (0x00000000L)
2822 #define REG_OPTION_NON_VOLATILE (0x00000000L)
2823 #define REG_OPTION_VOLATILE (0x00000001L)
2824 #define REG_OPTION_CREATE_LINK (0x00000002L)
2825 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
2826 #define REG_OPTION_OPEN_LINK (0x00000008L)
2827
2828 #define REG_LEGAL_OPTION \
2829 (REG_OPTION_RESERVED |\
2830 REG_OPTION_NON_VOLATILE |\
2831 REG_OPTION_VOLATILE |\
2832 REG_OPTION_CREATE_LINK |\
2833 REG_OPTION_BACKUP_RESTORE |\
2834 REG_OPTION_OPEN_LINK)
2835
2836 #define REG_OPEN_LEGAL_OPTION \
2837 (REG_OPTION_RESERVED |\
2838 REG_OPTION_BACKUP_RESTORE |\
2839 REG_OPTION_OPEN_LINK)
2840
2841 #define REG_STANDARD_FORMAT 1
2842 #define REG_LATEST_FORMAT 2
2843 #define REG_NO_COMPRESSION 4
2844
2845 /* Key creation/open disposition */
2846 #define REG_CREATED_NEW_KEY (0x00000001L)
2847 #define REG_OPENED_EXISTING_KEY (0x00000002L)
2848
2849 /* Key restore & hive load flags */
2850 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
2851 #define REG_REFRESH_HIVE (0x00000002L)
2852 #define REG_NO_LAZY_FLUSH (0x00000004L)
2853 #define REG_FORCE_RESTORE (0x00000008L)
2854 #define REG_APP_HIVE (0x00000010L)
2855 #define REG_PROCESS_PRIVATE (0x00000020L)
2856 #define REG_START_JOURNAL (0x00000040L)
2857 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
2858 #define REG_HIVE_NO_RM (0x00000100L)
2859 #define REG_HIVE_SINGLE_LOG (0x00000200L)
2860 #define REG_BOOT_HIVE (0x00000400L)
2861
2862 /* Unload Flags */
2863 #define REG_FORCE_UNLOAD 1
2864
2865 /* Notify Filter Values */
2866 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
2867 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
2868 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
2869 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
2870
2871 #define REG_LEGAL_CHANGE_FILTER \
2872 (REG_NOTIFY_CHANGE_NAME |\
2873 REG_NOTIFY_CHANGE_ATTRIBUTES |\
2874 REG_NOTIFY_CHANGE_LAST_SET |\
2875 REG_NOTIFY_CHANGE_SECURITY)
2876
2877 #include <pshpack4.h>
2878 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
2879 UCHAR Type;
2880 UCHAR ShareDisposition;
2881 USHORT Flags;
2882 union {
2883 struct {
2884 PHYSICAL_ADDRESS Start;
2885 ULONG Length;
2886 } Generic;
2887 struct {
2888 PHYSICAL_ADDRESS Start;
2889 ULONG Length;
2890 } Port;
2891 struct {
2892 #if defined(NT_PROCESSOR_GROUPS)
2893 USHORT Level;
2894 USHORT Group;
2895 #else
2896 ULONG Level;
2897 #endif
2898 ULONG Vector;
2899 KAFFINITY Affinity;
2900 } Interrupt;
2901 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2902 struct {
2903 _ANONYMOUS_UNION union {
2904 struct {
2905 #if defined(NT_PROCESSOR_GROUPS)
2906 USHORT Group;
2907 #else
2908 USHORT Reserved;
2909 #endif
2910 USHORT MessageCount;
2911 ULONG Vector;
2912 KAFFINITY Affinity;
2913 } Raw;
2914 struct {
2915 #if defined(NT_PROCESSOR_GROUPS)
2916 USHORT Level;
2917 USHORT Group;
2918 #else
2919 ULONG Level;
2920 #endif
2921 ULONG Vector;
2922 KAFFINITY Affinity;
2923 } Translated;
2924 } DUMMYUNIONNAME;
2925 } MessageInterrupt;
2926 #endif
2927 struct {
2928 PHYSICAL_ADDRESS Start;
2929 ULONG Length;
2930 } Memory;
2931 struct {
2932 ULONG Channel;
2933 ULONG Port;
2934 ULONG Reserved1;
2935 } Dma;
2936 struct {
2937 ULONG Data[3];
2938 } DevicePrivate;
2939 struct {
2940 ULONG Start;
2941 ULONG Length;
2942 ULONG Reserved;
2943 } BusNumber;
2944 struct {
2945 ULONG DataSize;
2946 ULONG Reserved1;
2947 ULONG Reserved2;
2948 } DeviceSpecificData;
2949 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2950 struct {
2951 PHYSICAL_ADDRESS Start;
2952 ULONG Length40;
2953 } Memory40;
2954 struct {
2955 PHYSICAL_ADDRESS Start;
2956 ULONG Length48;
2957 } Memory48;
2958 struct {
2959 PHYSICAL_ADDRESS Start;
2960 ULONG Length64;
2961 } Memory64;
2962 #endif
2963 } u;
2964 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
2965 #include <poppack.h>
2966
2967 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
2968 #define CmResourceTypeNull 0
2969 #define CmResourceTypePort 1
2970 #define CmResourceTypeInterrupt 2
2971 #define CmResourceTypeMemory 3
2972 #define CmResourceTypeDma 4
2973 #define CmResourceTypeDeviceSpecific 5
2974 #define CmResourceTypeBusNumber 6
2975 #define CmResourceTypeMemoryLarge 7
2976 #define CmResourceTypeNonArbitrated 128
2977 #define CmResourceTypeConfigData 128
2978 #define CmResourceTypeDevicePrivate 129
2979 #define CmResourceTypePcCardConfig 130
2980 #define CmResourceTypeMfCardConfig 131
2981
2982 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
2983 typedef enum _CM_SHARE_DISPOSITION {
2984 CmResourceShareUndetermined = 0,
2985 CmResourceShareDeviceExclusive,
2986 CmResourceShareDriverExclusive,
2987 CmResourceShareShared
2988 } CM_SHARE_DISPOSITION;
2989
2990 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
2991 #define CM_RESOURCE_PORT_MEMORY 0x0000
2992 #define CM_RESOURCE_PORT_IO 0x0001
2993 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
2994 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
2995 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
2996 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
2997 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
2998 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
2999 #define CM_RESOURCE_PORT_BAR 0x0100
3000
3001 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
3002 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
3003 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
3004 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
3005 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
3006
3007 #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
3008
3009 #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN ((ULONG)-2)
3010
3011 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
3012 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
3013 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
3014 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
3015 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
3016 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
3017 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
3018 #define CM_RESOURCE_MEMORY_24 0x0010
3019 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
3020 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
3021 #define CM_RESOURCE_MEMORY_BAR 0x0080
3022 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
3023
3024 #define CM_RESOURCE_MEMORY_LARGE 0x0E00
3025 #define CM_RESOURCE_MEMORY_LARGE_40 0x0200
3026 #define CM_RESOURCE_MEMORY_LARGE_48 0x0400
3027 #define CM_RESOURCE_MEMORY_LARGE_64 0x0800
3028
3029 #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN 0x000000FFFFFFFF00
3030 #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN 0x0000FFFFFFFF0000
3031 #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN 0xFFFFFFFF00000000
3032
3033 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
3034 #define CM_RESOURCE_DMA_8 0x0000
3035 #define CM_RESOURCE_DMA_16 0x0001
3036 #define CM_RESOURCE_DMA_32 0x0002
3037 #define CM_RESOURCE_DMA_8_AND_16 0x0004
3038 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
3039 #define CM_RESOURCE_DMA_TYPE_A 0x0010
3040 #define CM_RESOURCE_DMA_TYPE_B 0x0020
3041 #define CM_RESOURCE_DMA_TYPE_F 0x0040
3042
3043 typedef struct _DEVICE_FLAGS {
3044 ULONG Failed:1;
3045 ULONG ReadOnly:1;
3046 ULONG Removable:1;
3047 ULONG ConsoleIn:1;
3048 ULONG ConsoleOut:1;
3049 ULONG Input:1;
3050 ULONG Output:1;
3051 } DEVICE_FLAGS, *PDEVICE_FLAGS;
3052
3053 typedef enum _INTERFACE_TYPE {
3054 InterfaceTypeUndefined = -1,
3055 Internal,
3056 Isa,
3057 Eisa,
3058 MicroChannel,
3059 TurboChannel,
3060 PCIBus,
3061 VMEBus,
3062 NuBus,
3063 PCMCIABus,
3064 CBus,
3065 MPIBus,
3066 MPSABus,
3067 ProcessorInternal,
3068 InternalPowerBus,
3069 PNPISABus,
3070 PNPBus,
3071 Vmcs,
3072 MaximumInterfaceType
3073 } INTERFACE_TYPE, *PINTERFACE_TYPE;
3074
3075 typedef struct _CM_COMPONENT_INFORMATION {
3076 DEVICE_FLAGS Flags;
3077 ULONG Version;
3078 ULONG Key;
3079 KAFFINITY AffinityMask;
3080 } CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION;
3081
3082 typedef struct _CM_ROM_BLOCK {
3083 ULONG Address;
3084 ULONG Size;
3085 } CM_ROM_BLOCK, *PCM_ROM_BLOCK;
3086
3087 typedef struct _CM_PARTIAL_RESOURCE_LIST {
3088 USHORT Version;
3089 USHORT Revision;
3090 ULONG Count;
3091 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
3092 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
3093
3094 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
3095 INTERFACE_TYPE InterfaceType;
3096 ULONG BusNumber;
3097 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
3098 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
3099
3100 typedef struct _CM_RESOURCE_LIST {
3101 ULONG Count;
3102 CM_FULL_RESOURCE_DESCRIPTOR List[1];
3103 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
3104
3105 typedef struct _PNP_BUS_INFORMATION {
3106 GUID BusTypeGuid;
3107 INTERFACE_TYPE LegacyBusType;
3108 ULONG BusNumber;
3109 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
3110
3111 #include <pshpack1.h>
3112
3113 typedef struct _CM_INT13_DRIVE_PARAMETER {
3114 USHORT DriveSelect;
3115 ULONG MaxCylinders;
3116 USHORT SectorsPerTrack;
3117 USHORT MaxHeads;
3118 USHORT NumberDrives;
3119 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
3120
3121 typedef struct _CM_MCA_POS_DATA {
3122 USHORT AdapterId;
3123 UCHAR PosData1;
3124 UCHAR PosData2;
3125 UCHAR PosData3;
3126 UCHAR PosData4;
3127 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
3128
3129 typedef struct _CM_PNP_BIOS_DEVICE_NODE {
3130 USHORT Size;
3131 UCHAR Node;
3132 ULONG ProductId;
3133 UCHAR DeviceType[3];
3134 USHORT DeviceAttributes;
3135 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
3136
3137 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
3138 UCHAR Signature[4];
3139 UCHAR Revision;
3140 UCHAR Length;
3141 USHORT ControlField;
3142 UCHAR Checksum;
3143 ULONG EventFlagAddress;
3144 USHORT RealModeEntryOffset;
3145 USHORT RealModeEntrySegment;
3146 USHORT ProtectedModeEntryOffset;
3147 ULONG ProtectedModeCodeBaseAddress;
3148 ULONG OemDeviceId;
3149 USHORT RealModeDataBaseAddress;
3150 ULONG ProtectedModeDataBaseAddress;
3151 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
3152
3153 #include <poppack.h>
3154
3155 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
3156 ULONG BytesPerSector;
3157 ULONG NumberOfCylinders;
3158 ULONG SectorsPerTrack;
3159 ULONG NumberOfHeads;
3160 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
3161
3162 typedef struct _CM_KEYBOARD_DEVICE_DATA {
3163 USHORT Version;
3164 USHORT Revision;
3165 UCHAR Type;
3166 UCHAR Subtype;
3167 USHORT KeyboardFlags;
3168 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
3169
3170 typedef struct _CM_SCSI_DEVICE_DATA {
3171 USHORT Version;
3172 USHORT Revision;
3173 UCHAR HostIdentifier;
3174 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
3175
3176 typedef struct _CM_VIDEO_DEVICE_DATA {
3177 USHORT Version;
3178 USHORT Revision;
3179 ULONG VideoClock;
3180 } CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA;
3181
3182 typedef struct _CM_SONIC_DEVICE_DATA {
3183 USHORT Version;
3184 USHORT Revision;
3185 USHORT DataConfigurationRegister;
3186 UCHAR EthernetAddress[8];
3187 } CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
3188
3189 typedef struct _CM_SERIAL_DEVICE_DATA {
3190 USHORT Version;
3191 USHORT Revision;
3192 ULONG BaudClock;
3193 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
3194
3195 typedef struct _CM_MONITOR_DEVICE_DATA {
3196 USHORT Version;
3197 USHORT Revision;
3198 USHORT HorizontalScreenSize;
3199 USHORT VerticalScreenSize;
3200 USHORT HorizontalResolution;
3201 USHORT VerticalResolution;
3202 USHORT HorizontalDisplayTimeLow;
3203 USHORT HorizontalDisplayTime;
3204 USHORT HorizontalDisplayTimeHigh;
3205 USHORT HorizontalBackPorchLow;
3206 USHORT HorizontalBackPorch;
3207 USHORT HorizontalBackPorchHigh;
3208 USHORT HorizontalFrontPorchLow;
3209 USHORT HorizontalFrontPorch;
3210 USHORT HorizontalFrontPorchHigh;
3211 USHORT HorizontalSyncLow;
3212 USHORT HorizontalSync;
3213 USHORT HorizontalSyncHigh;
3214 USHORT VerticalBackPorchLow;
3215 USHORT VerticalBackPorch;
3216 USHORT VerticalBackPorchHigh;
3217 USHORT VerticalFrontPorchLow;
3218 USHORT VerticalFrontPorch;
3219 USHORT VerticalFrontPorchHigh;
3220 USHORT VerticalSyncLow;
3221 USHORT VerticalSync;
3222 USHORT VerticalSyncHigh;
3223 } CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA;
3224
3225 typedef struct _CM_FLOPPY_DEVICE_DATA {
3226 USHORT Version;
3227 USHORT Revision;
3228 CHAR Size[8];
3229 ULONG MaxDensity;
3230 ULONG MountDensity;
3231 UCHAR StepRateHeadUnloadTime;
3232 UCHAR HeadLoadTime;
3233 UCHAR MotorOffTime;
3234 UCHAR SectorLengthCode;
3235 UCHAR SectorPerTrack;
3236 UCHAR ReadWriteGapLength;
3237 UCHAR DataTransferLength;
3238 UCHAR FormatGapLength;
3239 UCHAR FormatFillCharacter;
3240 UCHAR HeadSettleTime;
3241 UCHAR MotorSettleTime;
3242 UCHAR MaximumTrackValue;
3243 UCHAR DataTransferRate;
3244 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
3245
3246 typedef enum _KEY_INFORMATION_CLASS {
3247 KeyBasicInformation,
3248 KeyNodeInformation,
3249 KeyFullInformation,
3250 KeyNameInformation,
3251 KeyCachedInformation,
3252 KeyFlagsInformation,
3253 KeyVirtualizationInformation,
3254 KeyHandleTagsInformation,
3255 MaxKeyInfoClass
3256 } KEY_INFORMATION_CLASS;
3257
3258 typedef struct _KEY_BASIC_INFORMATION {
3259 LARGE_INTEGER LastWriteTime;
3260 ULONG TitleIndex;
3261 ULONG NameLength;
3262 WCHAR Name[1];
3263 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
3264
3265 typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
3266 ULONG ControlFlags;
3267 } KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;
3268
3269 typedef struct _KEY_FULL_INFORMATION {
3270 LARGE_INTEGER LastWriteTime;
3271 ULONG TitleIndex;
3272 ULONG ClassOffset;
3273 ULONG ClassLength;
3274 ULONG SubKeys;
3275 ULONG MaxNameLen;
3276 ULONG MaxClassLen;
3277 ULONG Values;
3278 ULONG MaxValueNameLen;
3279 ULONG MaxValueDataLen;
3280 WCHAR Class[1];
3281 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
3282
3283 typedef struct _KEY_HANDLE_TAGS_INFORMATION {
3284 ULONG HandleTags;
3285 } KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION;
3286
3287 typedef struct _KEY_NODE_INFORMATION {
3288 LARGE_INTEGER LastWriteTime;
3289 ULONG TitleIndex;
3290 ULONG ClassOffset;
3291 ULONG ClassLength;
3292 ULONG NameLength;
3293 WCHAR Name[1];
3294 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
3295
3296 typedef enum _KEY_SET_INFORMATION_CLASS {
3297 KeyWriteTimeInformation,
3298 KeyWow64FlagsInformation,
3299 KeyControlFlagsInformation,
3300 KeySetVirtualizationInformation,
3301 KeySetDebugInformation,
3302 KeySetHandleTagsInformation,
3303 MaxKeySetInfoClass
3304 } KEY_SET_INFORMATION_CLASS;
3305
3306 typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION {
3307 ULONG VirtualTarget:1;
3308 ULONG VirtualStore:1;
3309 ULONG VirtualSource:1;
3310 ULONG Reserved:29;
3311 } KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION;
3312
3313 typedef struct _KEY_VALUE_BASIC_INFORMATION {
3314 ULONG TitleIndex;
3315 ULONG Type;
3316 ULONG NameLength;
3317 WCHAR Name[1];
3318 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
3319
3320 typedef struct _KEY_VALUE_FULL_INFORMATION {
3321 ULONG TitleIndex;
3322 ULONG Type;
3323 ULONG DataOffset;
3324 ULONG DataLength;
3325 ULONG NameLength;
3326 WCHAR Name[1];
3327 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
3328
3329 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
3330 ULONG TitleIndex;
3331 ULONG Type;
3332 ULONG DataLength;
3333 _Field_size_bytes_(DataLength) UCHAR Data[1];
3334 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
3335
3336 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
3337 ULONG Type;
3338 ULONG DataLength;
3339 _Field_size_bytes_(DataLength) UCHAR Data[1];
3340 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
3341
3342 typedef struct _KEY_VALUE_ENTRY {
3343 PUNICODE_STRING ValueName;
3344 ULONG DataLength;
3345 ULONG DataOffset;
3346 ULONG Type;
3347 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
3348
3349 typedef enum _KEY_VALUE_INFORMATION_CLASS {
3350 KeyValueBasicInformation,
3351 KeyValueFullInformation,
3352 KeyValuePartialInformation,
3353 KeyValueFullInformationAlign64,
3354 KeyValuePartialInformationAlign64
3355 } KEY_VALUE_INFORMATION_CLASS;
3356
3357 typedef struct _KEY_WOW64_FLAGS_INFORMATION {
3358 ULONG UserFlags;
3359 } KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION;
3360
3361 typedef struct _KEY_WRITE_TIME_INFORMATION {
3362 LARGE_INTEGER LastWriteTime;
3363 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
3364
3365 typedef enum _REG_NOTIFY_CLASS {
3366 RegNtDeleteKey,
3367 RegNtPreDeleteKey = RegNtDeleteKey,
3368 RegNtSetValueKey,
3369 RegNtPreSetValueKey = RegNtSetValueKey,
3370 RegNtDeleteValueKey,
3371 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
3372 RegNtSetInformationKey,
3373 RegNtPreSetInformationKey = RegNtSetInformationKey,
3374 RegNtRenameKey,
3375 RegNtPreRenameKey = RegNtRenameKey,
3376 RegNtEnumerateKey,
3377 RegNtPreEnumerateKey = RegNtEnumerateKey,
3378 RegNtEnumerateValueKey,
3379 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
3380 RegNtQueryKey,
3381 RegNtPreQueryKey = RegNtQueryKey,
3382 RegNtQueryValueKey,
3383 RegNtPreQueryValueKey = RegNtQueryValueKey,
3384 RegNtQueryMultipleValueKey,
3385 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
3386 RegNtPreCreateKey,
3387 RegNtPostCreateKey,
3388 RegNtPreOpenKey,
3389 RegNtPostOpenKey,
3390 RegNtKeyHandleClose,
3391 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
3392 RegNtPostDeleteKey,
3393 RegNtPostSetValueKey,
3394 RegNtPostDeleteValueKey,
3395 RegNtPostSetInformationKey,
3396 RegNtPostRenameKey,
3397 RegNtPostEnumerateKey,
3398 RegNtPostEnumerateValueKey,
3399 RegNtPostQueryKey,
3400 RegNtPostQueryValueKey,
3401 RegNtPostQueryMultipleValueKey,
3402 RegNtPostKeyHandleClose,
3403 RegNtPreCreateKeyEx,
3404 RegNtPostCreateKeyEx,
3405 RegNtPreOpenKeyEx,
3406 RegNtPostOpenKeyEx,
3407 RegNtPreFlushKey,
3408 RegNtPostFlushKey,
3409 RegNtPreLoadKey,
3410 RegNtPostLoadKey,
3411 RegNtPreUnLoadKey,
3412 RegNtPostUnLoadKey,
3413 RegNtPreQueryKeySecurity,
3414 RegNtPostQueryKeySecurity,
3415 RegNtPreSetKeySecurity,
3416 RegNtPostSetKeySecurity,
3417 RegNtCallbackObjectContextCleanup,
3418 RegNtPreRestoreKey,
3419 RegNtPostRestoreKey,
3420 RegNtPreSaveKey,
3421 RegNtPostSaveKey,
3422 RegNtPreReplaceKey,
3423 RegNtPostReplaceKey,
3424 MaxRegNtNotifyClass
3425 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
3426
3427 _IRQL_requires_same_
3428 _Function_class_(EX_CALLBACK_FUNCTION)
3429 typedef NTSTATUS
3430 (NTAPI EX_CALLBACK_FUNCTION)(
3431 _In_ PVOID CallbackContext,
3432 _In_opt_ PVOID Argument1,
3433 _In_opt_ PVOID Argument2);
3434 typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION;
3435
3436 typedef struct _REG_DELETE_KEY_INFORMATION {
3437 PVOID Object;
3438 PVOID CallContext;
3439 PVOID ObjectContext;
3440 PVOID Reserved;
3441 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
3442 #if (NTDDI_VERSION >= NTDDI_VISTA)
3443 , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
3444 #endif
3445 ;
3446
3447 typedef struct _REG_SET_VALUE_KEY_INFORMATION {
3448 PVOID Object;
3449 PUNICODE_STRING ValueName;
3450 ULONG TitleIndex;
3451 ULONG Type;
3452 PVOID Data;
3453 ULONG DataSize;
3454 PVOID CallContext;
3455 PVOID ObjectContext;
3456 PVOID Reserved;
3457 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
3458
3459 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
3460 PVOID Object;
3461 PUNICODE_STRING ValueName;
3462 PVOID CallContext;
3463 PVOID ObjectContext;
3464 PVOID Reserved;
3465 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
3466
3467 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
3468 PVOID Object;
3469 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
3470 PVOID KeySetInformation;
3471 ULONG KeySetInformationLength;
3472 PVOID CallContext;
3473 PVOID ObjectContext;
3474 PVOID Reserved;
3475 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
3476
3477 typedef struct _REG_ENUMERATE_KEY_INFORMATION {
3478 PVOID Object;
3479 ULONG Index;
3480 KEY_INFORMATION_CLASS KeyInformationClass;
3481 PVOID KeyInformation;
3482 ULONG Length;
3483 PULONG ResultLength;
3484 PVOID CallContext;
3485 PVOID ObjectContext;
3486 PVOID Reserved;
3487 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
3488
3489 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
3490 PVOID Object;
3491 ULONG Index;
3492 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3493 PVOID KeyValueInformation;
3494 ULONG Length;
3495 PULONG ResultLength;
3496 PVOID CallContext;
3497 PVOID ObjectContext;
3498 PVOID Reserved;
3499 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
3500
3501 typedef struct _REG_QUERY_KEY_INFORMATION {
3502 PVOID Object;
3503 KEY_INFORMATION_CLASS KeyInformationClass;
3504 PVOID KeyInformation;
3505 ULONG Length;
3506 PULONG ResultLength;
3507 PVOID CallContext;
3508 PVOID ObjectContext;
3509 PVOID Reserved;
3510 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
3511
3512 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
3513 PVOID Object;
3514 PUNICODE_STRING ValueName;
3515 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3516 PVOID KeyValueInformation;
3517 ULONG Length;
3518 PULONG ResultLength;
3519 PVOID CallContext;
3520 PVOID ObjectContext;
3521 PVOID Reserved;
3522 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
3523
3524 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
3525 PVOID Object;
3526 PKEY_VALUE_ENTRY ValueEntries;
3527 ULONG EntryCount;
3528 PVOID ValueBuffer;
3529 PULONG BufferLength;
3530 PULONG RequiredBufferLength;
3531 PVOID CallContext;
3532 PVOID ObjectContext;
3533 PVOID Reserved;
3534 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
3535
3536 typedef struct _REG_RENAME_KEY_INFORMATION {
3537 PVOID Object;
3538 PUNICODE_STRING NewName;
3539 PVOID CallContext;
3540 PVOID ObjectContext;
3541 PVOID Reserved;
3542 } REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION;
3543
3544 typedef struct _REG_CREATE_KEY_INFORMATION {
3545 PUNICODE_STRING CompleteName;
3546 PVOID RootObject;
3547 PVOID ObjectType;
3548 ULONG CreateOptions;
3549 PUNICODE_STRING Class;
3550 PVOID SecurityDescriptor;
3551 PVOID SecurityQualityOfService;
3552 ACCESS_MASK DesiredAccess;
3553 ACCESS_MASK GrantedAccess;
3554 PULONG Disposition;
3555 PVOID *ResultObject;
3556 PVOID CallContext;
3557 PVOID RootObjectContext;
3558 PVOID Transaction;
3559 PVOID Reserved;
3560 } REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION;
3561
3562 typedef struct _REG_CREATE_KEY_INFORMATION_V1 {
3563 PUNICODE_STRING CompleteName;
3564 PVOID RootObject;
3565 PVOID ObjectType;
3566 ULONG Options;
3567 PUNICODE_STRING Class;
3568 PVOID SecurityDescriptor;
3569 PVOID SecurityQualityOfService;
3570 ACCESS_MASK DesiredAccess;
3571 ACCESS_MASK GrantedAccess;
3572 PULONG Disposition;
3573 PVOID *ResultObject;
3574 PVOID CallContext;
3575 PVOID RootObjectContext;
3576 PVOID Transaction;
3577 ULONG_PTR Version;
3578 PUNICODE_STRING RemainingName;
3579 ULONG Wow64Flags;
3580 ULONG Attributes;
3581 KPROCESSOR_MODE CheckAccessMode;
3582 } REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1;
3583
3584 typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
3585 PUNICODE_STRING CompleteName;
3586 } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
3587
3588 typedef struct _REG_POST_CREATE_KEY_INFORMATION {
3589 PUNICODE_STRING CompleteName;
3590 PVOID Object;
3591 NTSTATUS Status;
3592 } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
3593
3594 typedef struct _REG_POST_OPERATION_INFORMATION {
3595 PVOID Object;
3596 NTSTATUS Status;
3597 PVOID PreInformation;
3598 NTSTATUS ReturnStatus;
3599 PVOID CallContext;
3600 PVOID ObjectContext;
3601 PVOID Reserved;
3602 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
3603
3604 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
3605 PVOID Object;
3606 PVOID CallContext;
3607 PVOID ObjectContext;
3608 PVOID Reserved;
3609 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
3610
3611 #if (NTDDI_VERSION >= NTDDI_VISTA)
3612
3613 typedef struct _REG_LOAD_KEY_INFORMATION {
3614 PVOID Object;
3615 PUNICODE_STRING KeyName;
3616 PUNICODE_STRING SourceFile;
3617 ULONG Flags;
3618 PVOID TrustClassObject;
3619 PVOID UserEvent;
3620 ACCESS_MASK DesiredAccess;
3621 PHANDLE RootHandle;
3622 PVOID CallContext;
3623 PVOID ObjectContext;
3624 PVOID Reserved;
3625 } REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION;
3626
3627 typedef struct _REG_UNLOAD_KEY_INFORMATION {
3628 PVOID Object;
3629 PVOID UserEvent;
3630 PVOID CallContext;
3631 PVOID ObjectContext;
3632 PVOID Reserved;
3633 } REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION;
3634
3635 typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION {
3636 PVOID Object;
3637 PVOID ObjectContext;
3638 PVOID Reserved;
3639 } REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION;
3640
3641 typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION {
3642 PVOID Object;
3643 PSECURITY_INFORMATION SecurityInformation;
3644 PSECURITY_DESCRIPTOR SecurityDescriptor;
3645 PULONG Length;
3646 PVOID CallContext;
3647 PVOID ObjectContext;
3648 PVOID Reserved;
3649 } REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION;
3650
3651 typedef struct _REG_SET_KEY_SECURITY_INFORMATION {
3652 PVOID Object;
3653 PSECURITY_INFORMATION SecurityInformation;
3654 PSECURITY_DESCRIPTOR SecurityDescriptor;
3655 PVOID CallContext;
3656 PVOID ObjectContext;
3657 PVOID Reserved;
3658 } REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION;
3659
3660 typedef struct _REG_RESTORE_KEY_INFORMATION {
3661 PVOID Object;
3662 HANDLE FileHandle;
3663 ULONG Flags;
3664 PVOID CallContext;
3665 PVOID ObjectContext;
3666 PVOID Reserved;
3667 } REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION;
3668
3669 typedef struct _REG_SAVE_KEY_INFORMATION {
3670 PVOID Object;
3671 HANDLE FileHandle;
3672 ULONG Format;
3673 PVOID CallContext;
3674 PVOID ObjectContext;
3675 PVOID Reserved;
3676 } REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION;
3677
3678 typedef struct _REG_REPLACE_KEY_INFORMATION {
3679 PVOID Object;
3680 PUNICODE_STRING OldFileName;
3681 PUNICODE_STRING NewFileName;
3682 PVOID CallContext;
3683 PVOID ObjectContext;
3684 PVOID Reserved;
3685 } REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION;
3686
3687 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
3688
3689 #define SERVICE_KERNEL_DRIVER 0x00000001
3690 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
3691 #define SERVICE_ADAPTER 0x00000004
3692 #define SERVICE_RECOGNIZER_DRIVER 0x00000008
3693
3694 #define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
3695 SERVICE_FILE_SYSTEM_DRIVER | \
3696 SERVICE_RECOGNIZER_DRIVER)
3697
3698 #define SERVICE_WIN32_OWN_PROCESS 0x00000010
3699 #define SERVICE_WIN32_SHARE_PROCESS 0x00000020
3700 #define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
3701 SERVICE_WIN32_SHARE_PROCESS)
3702
3703 #define SERVICE_INTERACTIVE_PROCESS 0x00000100
3704
3705 #define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
3706 SERVICE_ADAPTER | \
3707 SERVICE_DRIVER | \
3708 SERVICE_INTERACTIVE_PROCESS)
3709
3710 /* Service Start Types */
3711 #define SERVICE_BOOT_START 0x00000000
3712 #define SERVICE_SYSTEM_START 0x00000001
3713 #define SERVICE_AUTO_START 0x00000002
3714 #define SERVICE_DEMAND_START 0x00000003
3715 #define SERVICE_DISABLED 0x00000004
3716
3717 #define SERVICE_ERROR_IGNORE 0x00000000
3718 #define SERVICE_ERROR_NORMAL 0x00000001
3719 #define SERVICE_ERROR_SEVERE 0x00000002
3720 #define SERVICE_ERROR_CRITICAL 0x00000003
3721
3722 typedef enum _CM_SERVICE_NODE_TYPE {
3723 DriverType = SERVICE_KERNEL_DRIVER,
3724 FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
3725 Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
3726 Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
3727 AdapterType = SERVICE_ADAPTER,
3728 RecognizerType = SERVICE_RECOGNIZER_DRIVER
3729 } SERVICE_NODE_TYPE;
3730
3731 typedef enum _CM_SERVICE_LOAD_TYPE {
3732 BootLoad = SERVICE_BOOT_START,
3733 SystemLoad = SERVICE_SYSTEM_START,
3734 AutoLoad = SERVICE_AUTO_START,
3735 DemandLoad = SERVICE_DEMAND_START,
3736 DisableLoad = SERVICE_DISABLED
3737 } SERVICE_LOAD_TYPE;
3738
3739 typedef enum _CM_ERROR_CONTROL_TYPE {
3740 IgnoreError = SERVICE_ERROR_IGNORE,
3741 NormalError = SERVICE_ERROR_NORMAL,
3742 SevereError = SERVICE_ERROR_SEVERE,
3743 CriticalError = SERVICE_ERROR_CRITICAL
3744 } SERVICE_ERROR_TYPE;
3745
3746 #define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001
3747 #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
3748 #define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004
3749
3750 #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \
3751 CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
3752 CM_SERVICE_USB_DISK_BOOT_LOAD)
3753
3754 /******************************************************************************
3755 * I/O Manager Types *
3756 ******************************************************************************/
3757
3758
3759 #define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
3760
3761 #define CONNECT_FULLY_SPECIFIED 0x1
3762 #define CONNECT_LINE_BASED 0x2
3763 #define CONNECT_MESSAGE_BASED 0x3
3764 #define CONNECT_FULLY_SPECIFIED_GROUP 0x4
3765 #define CONNECT_CURRENT_VERSION 0x4
3766
3767 #define POOL_COLD_ALLOCATION 256
3768 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
3769 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
3770
3771 #define IO_TYPE_ADAPTER 1
3772 #define IO_TYPE_CONTROLLER 2
3773 #define IO_TYPE_DEVICE 3
3774 #define IO_TYPE_DRIVER 4
3775 #define IO_TYPE_FILE 5
3776 #define IO_TYPE_IRP 6
3777 #define IO_TYPE_MASTER_ADAPTER 7
3778 #define IO_TYPE_OPEN_PACKET 8
3779 #define IO_TYPE_TIMER 9
3780 #define IO_TYPE_VPB 10
3781 #define IO_TYPE_ERROR_LOG 11
3782 #define IO_TYPE_ERROR_MESSAGE 12
3783 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
3784
3785 #define IO_TYPE_CSQ_IRP_CONTEXT 1
3786 #define IO_TYPE_CSQ 2
3787 #define IO_TYPE_CSQ_EX 3
3788
3789 /* IO_RESOURCE_DESCRIPTOR.Option */
3790 #define IO_RESOURCE_PREFERRED 0x01
3791 #define IO_RESOURCE_DEFAULT 0x02
3792 #define IO_RESOURCE_ALTERNATIVE 0x08
3793
3794 #define FILE_DEVICE_BEEP 0x00000001
3795 #define FILE_DEVICE_CD_ROM 0x00000002
3796 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
3797 #define FILE_DEVICE_CONTROLLER 0x00000004
3798 #define FILE_DEVICE_DATALINK 0x00000005
3799 #define FILE_DEVICE_DFS 0x00000006
3800 #define FILE_DEVICE_DISK 0x00000007
3801 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
3802 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
3803 #define FILE_DEVICE_INPORT_PORT 0x0000000a
3804 #define FILE_DEVICE_KEYBOARD 0x0000000b
3805 #define FILE_DEVICE_MAILSLOT 0x0000000c
3806 #define FILE_DEVICE_MIDI_IN 0x0000000d
3807 #define FILE_DEVICE_MIDI_OUT 0x0000000e
3808 #define FILE_DEVICE_MOUSE 0x0000000f
3809 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
3810 #define FILE_DEVICE_NAMED_PIPE 0x00000011
3811 #define FILE_DEVICE_NETWORK 0x00000012
3812 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
3813 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
3814 #define FILE_DEVICE_NULL 0x00000015
3815 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
3816 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
3817 #define FILE_DEVICE_PRINTER 0x00000018
3818 #define FILE_DEVICE_SCANNER 0x00000019
3819 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
3820 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
3821 #define FILE_DEVICE_SCREEN 0x0000001c
3822 #define FILE_DEVICE_SOUND 0x0000001d
3823 #define FILE_DEVICE_STREAMS 0x0000001e
3824 #define FILE_DEVICE_TAPE 0x0000001f
3825 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
3826 #define FILE_DEVICE_TRANSPORT 0x00000021
3827 #define FILE_DEVICE_UNKNOWN 0x00000022
3828 #define FILE_DEVICE_VIDEO 0x00000023
3829 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
3830 #define FILE_DEVICE_WAVE_IN 0x00000025
3831 #define FILE_DEVICE_WAVE_OUT 0x00000026
3832 #define FILE_DEVICE_8042_PORT 0x00000027
3833 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
3834 #define FILE_DEVICE_BATTERY 0x00000029
3835 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
3836 #define FILE_DEVICE_MODEM 0x0000002b
3837 #define FILE_DEVICE_VDM 0x0000002c
3838 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
3839 #define FILE_DEVICE_SMB 0x0000002e
3840 #define FILE_DEVICE_KS 0x0000002f
3841 #define FILE_DEVICE_CHANGER 0x00000030
3842 #define FILE_DEVICE_SMARTCARD 0x00000031
3843 #define FILE_DEVICE_ACPI 0x00000032
3844 #define FILE_DEVICE_DVD 0x00000033
3845 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
3846 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
3847 #define FILE_DEVICE_DFS_VOLUME 0x00000036
3848 #define FILE_DEVICE_SERENUM 0x00000037
3849 #define FILE_DEVICE_TERMSRV 0x00000038
3850 #define FILE_DEVICE_KSEC 0x00000039
3851 #define FILE_DEVICE_FIPS 0x0000003A
3852 #define FILE_DEVICE_INFINIBAND 0x0000003B
3853 #define FILE_DEVICE_VMBUS 0x0000003E
3854 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
3855 #define FILE_DEVICE_WPD 0x00000040
3856 #define FILE_DEVICE_BLUETOOTH 0x00000041
3857 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
3858 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
3859 #define FILE_DEVICE_BIOMETRIC 0x00000044
3860 #define FILE_DEVICE_PMI 0x00000045
3861
3862 #if defined(NT_PROCESSOR_GROUPS)
3863
3864 typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
3865
3866 typedef enum _IRQ_DEVICE_POLICY_USHORT {
3867 IrqPolicyMachineDefault = 0,
3868 IrqPolicyAllCloseProcessors = 1,
3869 IrqPolicyOneCloseProcessor = 2,
3870 IrqPolicyAllProcessorsInMachine = 3,
3871 IrqPolicyAllProcessorsInGroup = 3,
3872 IrqPolicySpecifiedProcessors = 4,
3873 IrqPolicySpreadMessagesAcrossAllProcessors = 5};
3874
3875 #else /* defined(NT_PROCESSOR_GROUPS) */
3876
3877 typedef enum _IRQ_DEVICE_POLICY {
3878 IrqPolicyMachineDefault = 0,
3879 IrqPolicyAllCloseProcessors,
3880 IrqPolicyOneCloseProcessor,
3881 IrqPolicyAllProcessorsInMachine,
3882 IrqPolicySpecifiedProcessors,
3883 IrqPolicySpreadMessagesAcrossAllProcessors
3884 } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
3885
3886 #endif
3887
3888 typedef enum _IRQ_PRIORITY {
3889 IrqPriorityUndefined = 0,
3890 IrqPriorityLow,
3891 IrqPriorityNormal,
3892 IrqPriorityHigh
3893 } IRQ_PRIORITY, *PIRQ_PRIORITY;
3894
3895 typedef enum _IRQ_GROUP_POLICY {
3896 GroupAffinityAllGroupZero = 0,
3897 GroupAffinityDontCare
3898 } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
3899
3900 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
3901
3902 typedef struct _OBJECT_HANDLE_INFORMATION {
3903 ULONG HandleAttributes;
3904 ACCESS_MASK GrantedAccess;
3905 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3906
3907 typedef struct _CLIENT_ID {
3908 HANDLE UniqueProcess;
3909 HANDLE UniqueThread;
3910 } CLIENT_ID, *PCLIENT_ID;
3911
3912 typedef struct _VPB {
3913 CSHORT Type;
3914 CSHORT Size;
3915 USHORT Flags;
3916 USHORT VolumeLabelLength;
3917 struct _DEVICE_OBJECT *DeviceObject;
3918 struct _DEVICE_OBJECT *RealDevice;
3919 ULONG SerialNumber;
3920 ULONG ReferenceCount;
3921 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
3922 } VPB, *PVPB;
3923
3924 typedef enum _IO_ALLOCATION_ACTION {
3925 KeepObject = 1,
3926 DeallocateObject,
3927 DeallocateObjectKeepRegisters
3928 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
3929
3930 _Function_class_(DRIVER_CONTROL)
3931 _IRQL_requires_same_
3932 typedef IO_ALLOCATION_ACTION
3933 (NTAPI DRIVER_CONTROL)(
3934 _In_ struct _DEVICE_OBJECT *DeviceObject,
3935 _Inout_ struct _IRP *Irp,
3936 _In_ PVOID MapRegisterBase,
3937 _In_ PVOID Context);
3938 typedef DRIVER_CONTROL *PDRIVER_CONTROL;
3939
3940 typedef struct _WAIT_CONTEXT_BLOCK {
3941 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
3942 PDRIVER_CONTROL DeviceRoutine;
3943 PVOID DeviceContext;
3944 ULONG NumberOfMapRegisters;
3945 PVOID DeviceObject;
3946 PVOID CurrentIrp;
3947 PKDPC BufferChainingDpc;
3948 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
3949
3950 /* DEVICE_OBJECT.Flags */
3951 #define DO_VERIFY_VOLUME 0x00000002
3952 #define DO_BUFFERED_IO 0x00000004
3953 #define DO_EXCLUSIVE 0x00000008
3954 #define DO_DIRECT_IO 0x00000010
3955 #define DO_MAP_IO_BUFFER 0x00000020
3956 #define DO_DEVICE_INITIALIZING 0x00000080
3957 #define DO_SHUTDOWN_REGISTERED 0x00000800
3958 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
3959 #define DO_POWER_PAGABLE 0x00002000
3960 #define DO_POWER_INRUSH 0x00004000
3961
3962 /* DEVICE_OBJECT.Characteristics */
3963 #define FILE_REMOVABLE_MEDIA 0x00000001
3964 #define FILE_READ_ONLY_DEVICE 0x00000002
3965 #define FILE_FLOPPY_DISKETTE 0x00000004
3966 #define FILE_WRITE_ONCE_MEDIA 0x00000008
3967 #define FILE_REMOTE_DEVICE 0x00000010
3968 #define FILE_DEVICE_IS_MOUNTED 0x00000020
3969 #define FILE_VIRTUAL_VOLUME 0x00000040
3970 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
3971 #define FILE_DEVICE_SECURE_OPEN 0x00000100
3972 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
3973 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
3974 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
3975
3976 /* DEVICE_OBJECT.AlignmentRequirement */
3977 #define FILE_BYTE_ALIGNMENT 0x00000000
3978 #define FILE_WORD_ALIGNMENT 0x00000001
3979 #define FILE_LONG_ALIGNMENT 0x00000003
3980 #define FILE_QUAD_ALIGNMENT 0x00000007
3981 #define FILE_OCTA_ALIGNMENT 0x0000000f
3982 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
3983 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
3984 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
3985 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
3986 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
3987
3988 /* DEVICE_OBJECT.DeviceType */
3989 #define DEVICE_TYPE ULONG
3990
3991 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
3992 CSHORT Type;
3993 USHORT Size;
3994 LONG ReferenceCount;
3995 struct _DRIVER_OBJECT *DriverObject;
3996 struct _DEVICE_OBJECT *NextDevice;
3997 struct _DEVICE_OBJECT *AttachedDevice;
3998 struct _IRP *CurrentIrp;
3999 PIO_TIMER Timer;
4000 ULONG Flags;
4001 ULONG Characteristics;
4002 volatile PVPB Vpb;
4003 PVOID DeviceExtension;
4004 DEVICE_TYPE DeviceType;
4005 CCHAR StackSize;
4006 union {
4007 LIST_ENTRY ListEntry;
4008 WAIT_CONTEXT_BLOCK Wcb;
4009 } Queue;
4010 ULONG AlignmentRequirement;
4011 KDEVICE_QUEUE DeviceQueue;
4012 KDPC Dpc;
4013 ULONG ActiveThreadCount;
4014 PSECURITY_DESCRIPTOR SecurityDescriptor;
4015 KEVENT DeviceLock;
4016 USHORT SectorSize;
4017 USHORT Spare1;
4018 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
4019 PVOID Reserved;
4020 } DEVICE_OBJECT, *PDEVICE_OBJECT;
4021
4022 typedef enum _IO_SESSION_STATE {
4023 IoSessionStateCreated = 1,
4024 IoSessionStateInitialized,
4025 IoSessionStateConnected,
4026 IoSessionStateDisconnected,
4027 IoSessionStateDisconnectedLoggedOn,
4028 IoSessionStateLoggedOn,
4029 IoSessionStateLoggedOff,
4030 IoSessionStateTerminated,
4031 IoSessionStateMax
4032 } IO_SESSION_STATE, *PIO_SESSION_STATE;
4033
4034 typedef enum _IO_COMPLETION_ROUTINE_RESULT {
4035 ContinueCompletion = STATUS_CONTINUE_COMPLETION,
4036 StopCompletion = STATUS_MORE_PROCESSING_REQUIRED
4037 } IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT;
4038
4039 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY {
4040 PHYSICAL_ADDRESS MessageAddress;
4041 KAFFINITY TargetProcessorSet;
4042 PKINTERRUPT InterruptObject;
4043 ULONG MessageData;
4044 ULONG Vector;
4045 KIRQL Irql;
4046 KINTERRUPT_MODE Mode;
4047 KINTERRUPT_POLARITY Polarity;
4048 } IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY;
4049
4050 typedef struct _IO_INTERRUPT_MESSAGE_INFO {
4051 KIRQL UnifiedIrql;
4052 ULONG MessageCount;
4053 IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1];
4054 } IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO;
4055
4056 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS {
4057 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
4058 _Out_ PKINTERRUPT *InterruptObject;
4059 _In_ PKSERVICE_ROUTINE ServiceRoutine;
4060 _In_ PVOID ServiceContext;
4061 _In_opt_ PKSPIN_LOCK SpinLock;
4062 _In_ KIRQL SynchronizeIrql;
4063 _In_ BOOLEAN FloatingSave;
4064 _In_ BOOLEAN ShareVector;
4065 _In_ ULONG Vector;
4066 _In_ KIRQL Irql;
4067 _In_ KINTERRUPT_MODE InterruptMode;
4068 _In_ KAFFINITY ProcessorEnableMask;
4069 _In_ USHORT Group;
4070 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS;
4071
4072 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS {
4073 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
4074 _Out_ PKINTERRUPT *InterruptObject;
4075 _In_ PKSERVICE_ROUTINE ServiceRoutine;
4076 _In_ PVOID ServiceContext;
4077 _In_opt_ PKSPIN_LOCK SpinLock;
4078 _In_opt_ KIRQL SynchronizeIrql;
4079 _In_ BOOLEAN FloatingSave;
4080 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS;
4081
4082 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
4083 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
4084 union {
4085 _Out_ PVOID *Generic;
4086 _Out_ PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable;
4087 _Out_ PKINTERRUPT *InterruptObject;
4088 } ConnectionContext;
4089 _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine;
4090 _In_ PVOID ServiceContext;
4091 _In_opt_ PKSPIN_LOCK SpinLock;
4092 _In_opt_ KIRQL SynchronizeIrql;
4093 _In_ BOOLEAN FloatingSave;
4094 _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine;
4095 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS;
4096
4097 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
4098 _Inout_ ULONG Version;
4099 _ANONYMOUS_UNION union {
4100 IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
4101 IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
4102 IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
4103 } DUMMYUNIONNAME;
4104 } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
4105
4106 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
4107 _In_ ULONG Version;
4108 union {
4109 _In_ PVOID Generic;
4110 _In_ PKINTERRUPT InterruptObject;
4111 _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
4112 } ConnectionContext;
4113 } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS;
4114
4115 typedef enum _IO_ACCESS_TYPE {
4116 ReadAccess,
4117 WriteAccess,
4118 ModifyAccess
4119 } IO_ACCESS_TYPE;
4120
4121 typedef enum _IO_ACCESS_MODE {
4122 SequentialAccess,
4123 RandomAccess
4124 } IO_ACCESS_MODE;
4125
4126 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS {
4127 IoSessionStateNotification,
4128 IoMaxContainerNotificationClass
4129 } IO_CONTAINER_NOTIFICATION_CLASS;
4130
4131 typedef struct _IO_SESSION_STATE_NOTIFICATION {
4132 ULONG Size;
4133 ULONG Flags;
4134 PVOID IoObject;
4135 ULONG EventMask;
4136 PVOID Context;
4137 } IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION;
4138
4139 typedef enum _IO_CONTAINER_INFORMATION_CLASS {
4140 IoSessionStateInformation,
4141 IoMaxContainerInformationClass
4142 } IO_CONTAINER_INFORMATION_CLASS;
4143
4144 typedef struct _IO_SESSION_STATE_INFORMATION {
4145 ULONG SessionId;
4146 IO_SESSION_STATE SessionState;
4147 BOOLEAN LocalSession;
4148 } IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION;
4149
4150 #if (NTDDI_VERSION >= NTDDI_WIN7)
4151
4152 typedef NTSTATUS
4153 (NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)(
4154 VOID);
4155
4156 typedef NTSTATUS
4157 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION)(
4158 _In_ PVOID SessionObject,
4159 _In_ PVOID IoObject,
4160 _In_ ULONG Event,
4161 _In_ PVOID Context,
4162 _In_reads_bytes_opt_(PayloadLength) PVOID NotificationPayload,
4163 _In_ ULONG PayloadLength);
4164
4165 typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
4166
4167 #endif
4168
4169 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
4170
4171 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
4172 BOOLEAN Removed;
4173 BOOLEAN Reserved[3];
4174 volatile LONG IoCount;
4175 KEVENT RemoveEvent;
4176 } IO_REMOVE_LOCK_COMMON_BLOCK;
4177
4178 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
4179 LONG Signature;
4180 LONG HighWatermark;
4181 LONGLONG MaxLockedTicks;
4182 LONG AllocateTag;
4183 LIST_ENTRY LockList;
4184 KSPIN_LOCK Spin;
4185 volatile LONG LowMemoryCount;
4186 ULONG Reserved1[4];
4187 PVOID Reserved2;
4188 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
4189 } IO_REMOVE_LOCK_DBG_BLOCK;
4190
4191 typedef struct _IO_REMOVE_LOCK {
4192 IO_REMOVE_LOCK_COMMON_BLOCK Common;
4193 #if DBG
4194 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
4195 #endif
4196 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
4197
4198 typedef struct _IO_WORKITEM *PIO_WORKITEM;
4199
4200 _Function_class_(IO_WORKITEM_ROUTINE)
4201 _IRQL_requires_(PASSIVE_LEVEL)
4202 _IRQL_requires_same_
4203 typedef VOID
4204 (NTAPI IO_WORKITEM_ROUTINE)(
4205 _In_ PDEVICE_OBJECT DeviceObject,
4206 _In_opt_ PVOID Context);
4207 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
4208
4209 typedef VOID
4210 (NTAPI IO_WORKITEM_ROUTINE_EX)(
4211 _In_ PVOID IoObject,
4212 _In_opt_ PVOID Context,
4213 _In_ PIO_WORKITEM IoWorkItem);
4214 typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
4215
4216 typedef struct _SHARE_ACCESS {
4217 ULONG OpenCount;
4218 ULONG Readers;
4219 ULONG Writers;
4220 ULONG Deleters;
4221 ULONG SharedRead;
4222 ULONG SharedWrite;
4223 ULONG SharedDelete;
4224 } SHARE_ACCESS, *PSHARE_ACCESS;
4225
4226 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
4227 inheritance, even from a struct renders the type non-POD. So we use
4228 this hack */
4229 #define PCI_COMMON_HEADER_LAYOUT \
4230 USHORT VendorID; \
4231 USHORT DeviceID; \
4232 USHORT Command; \
4233 USHORT Status; \
4234 UCHAR RevisionID; \
4235 UCHAR ProgIf; \
4236 UCHAR SubClass; \
4237 UCHAR BaseClass; \
4238 UCHAR CacheLineSize; \
4239 UCHAR LatencyTimer; \
4240 UCHAR HeaderType; \
4241 UCHAR BIST; \
4242 union { \
4243 struct _PCI_HEADER_TYPE_0 { \
4244 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
4245 ULONG CIS; \
4246 USHORT SubVendorID; \
4247 USHORT SubSystemID; \
4248 ULONG ROMBaseAddress; \
4249 UCHAR CapabilitiesPtr; \
4250 UCHAR Reserved1[3]; \
4251 ULONG Reserved2; \
4252 UCHAR InterruptLine; \
4253 UCHAR InterruptPin; \
4254 UCHAR MinimumGrant; \
4255 UCHAR MaximumLatency; \
4256 } type0; \
4257 struct _PCI_HEADER_TYPE_1 { \
4258 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
4259 UCHAR PrimaryBus; \
4260 UCHAR SecondaryBus; \
4261 UCHAR SubordinateBus; \
4262 UCHAR SecondaryLatency; \
4263 UCHAR IOBase; \
4264 UCHAR IOLimit; \
4265 USHORT SecondaryStatus; \
4266 USHORT MemoryBase; \
4267 USHORT MemoryLimit; \
4268 USHORT PrefetchBase; \
4269 USHORT PrefetchLimit; \
4270 ULONG PrefetchBaseUpper32; \
4271 ULONG PrefetchLimitUpper32; \
4272 USHORT IOBaseUpper16; \
4273 USHORT IOLimitUpper16; \
4274 UCHAR CapabilitiesPtr; \
4275 UCHAR Reserved1[3]; \
4276 ULONG ROMBaseAddress; \
4277 UCHAR InterruptLine; \
4278 UCHAR InterruptPin; \
4279 USHORT BridgeControl; \
4280 } type1; \
4281 struct _PCI_HEADER_TYPE_2 { \
4282 ULONG SocketRegistersBaseAddress; \
4283 UCHAR CapabilitiesPtr; \
4284 UCHAR Reserved; \
4285 USHORT SecondaryStatus; \
4286 UCHAR PrimaryBus; \
4287 UCHAR SecondaryBus; \
4288 UCHAR SubordinateBus; \
4289 UCHAR SecondaryLatency; \
4290 struct { \
4291 ULONG Base; \
4292 ULONG Limit; \
4293 } Range[PCI_TYPE2_ADDRESSES-1]; \
4294 UCHAR InterruptLine; \
4295 UCHAR InterruptPin; \
4296 USHORT BridgeControl; \
4297 } type2; \
4298 } u;
4299
4300 typedef enum _CREATE_FILE_TYPE {
4301 CreateFileTypeNone,
4302 CreateFileTypeNamedPipe,
4303 CreateFileTypeMailslot
4304 } CREATE_FILE_TYPE;
4305
4306 #define IO_FORCE_ACCESS_CHECK 0x001
4307 #define IO_NO_PARAMETER_CHECKING 0x100
4308
4309 #define IO_REPARSE 0x0
4310 #define IO_REMOUNT 0x1
4311
4312 typedef struct _IO_STATUS_BLOCK {
4313 _ANONYMOUS_UNION union {
4314 NTSTATUS Status;
4315 PVOID Pointer;
4316 } DUMMYUNIONNAME;
4317 ULONG_PTR Information;
4318 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
4319
4320 #if defined(_WIN64)
4321 typedef struct _IO_STATUS_BLOCK32 {
4322 NTSTATUS Status;
4323 ULONG Information;
4324 } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
4325 #endif
4326
4327 typedef VOID
4328 (NTAPI *PIO_APC_ROUTINE)(
4329 _In_ PVOID ApcContext,
4330 _In_ PIO_STATUS_BLOCK IoStatusBlock,
4331 _In_ ULONG Reserved);
4332
4333 #define PIO_APC_ROUTINE_DEFINED
4334
4335 typedef enum _IO_SESSION_EVENT {
4336 IoSessionEventIgnore = 0,
4337 IoSessionEventCreated,
4338 IoSessionEventTerminated,
4339 IoSessionEventConnected,
4340 IoSessionEventDisconnected,
4341 IoSessionEventLogon,
4342 IoSessionEventLogoff,
4343 IoSessionEventMax
4344 } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
4345
4346 #define IO_SESSION_STATE_ALL_EVENTS 0xffffffff
4347 #define IO_SESSION_STATE_CREATION_EVENT 0x00000001
4348 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
4349 #define IO_SESSION_STATE_CONNECT_EVENT 0x00000004
4350 #define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008
4351 #define IO_SESSION_STATE_LOGON_EVENT 0x00000010
4352 #define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020
4353
4354 #define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f
4355
4356 #define IO_SESSION_MAX_PAYLOAD_SIZE 256L
4357
4358 typedef struct _IO_SESSION_CONNECT_INFO {
4359 ULONG SessionId;
4360 BOOLEAN LocalSession;
4361 } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
4362
4363 #define EVENT_INCREMENT 1
4364 #define IO_NO_INCREMENT 0
4365 #define IO_CD_ROM_INCREMENT 1
4366 #define IO_DISK_INCREMENT 1
4367 #define IO_KEYBOARD_INCREMENT 6
4368 #define IO_MAILSLOT_INCREMENT 2
4369 #define IO_MOUSE_INCREMENT 6
4370 #define IO_NAMED_PIPE_INCREMENT 2
4371 #define IO_NETWORK_INCREMENT 2
4372 #define IO_PARALLEL_INCREMENT 1
4373 #define IO_SERIAL_INCREMENT 2
4374 #define IO_SOUND_INCREMENT 8
4375 #define IO_VIDEO_INCREMENT 1
4376 #define SEMAPHORE_INCREMENT 1
4377
4378 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
4379
4380 typedef struct _BOOTDISK_INFORMATION {
4381 LONGLONG BootPartitionOffset;
4382 LONGLONG SystemPartitionOffset;
4383 ULONG BootDeviceSignature;
4384 ULONG SystemDeviceSignature;
4385 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
4386
4387 typedef struct _BOOTDISK_INFORMATION_EX {
4388 LONGLONG BootPartitionOffset;
4389 LONGLONG SystemPartitionOffset;
4390 ULONG BootDeviceSignature;
4391 ULONG SystemDeviceSignature;
4392 GUID BootDeviceGuid;
4393 GUID SystemDeviceGuid;
4394 BOOLEAN BootDeviceIsGpt;
4395 BOOLEAN SystemDeviceIsGpt;
4396 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
4397
4398 #if (NTDDI_VERSION >= NTDDI_WIN7)
4399
4400 typedef struct _LOADER_PARTITION_INFORMATION_EX {
4401 ULONG PartitionStyle;
4402 ULONG PartitionNumber;
4403 _ANONYMOUS_UNION union {
4404 ULONG Signature;
4405 GUID DeviceId;
4406 } DUMMYUNIONNAME;
4407 ULONG Flags;
4408 } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
4409
4410 typedef struct _BOOTDISK_INFORMATION_LITE {
4411 ULONG NumberEntries;
4412 LOADER_PARTITION_INFORMATION_EX Entries[1];
4413 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
4414
4415 #else
4416
4417 #if (NTDDI_VERSION >= NTDDI_VISTA)
4418 typedef struct _BOOTDISK_INFORMATION_LITE {
4419 ULONG BootDeviceSignature;
4420 ULONG SystemDeviceSignature;
4421 GUID BootDeviceGuid;
4422 GUID SystemDeviceGuid;
4423 BOOLEAN BootDeviceIsGpt;
4424 BOOLEAN SystemDeviceIsGpt;
4425 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
4426 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4427
4428 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4429
4430 #include <pshpack1.h>
4431
4432 typedef struct _EISA_MEMORY_TYPE {
4433 UCHAR ReadWrite:1;
4434 UCHAR Cached:1;
4435 UCHAR Reserved0:1;
4436 UCHAR Type:2;
4437 UCHAR Shared:1;
4438 UCHAR Reserved1:1;
4439 UCHAR MoreEntries:1;
4440 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
4441
4442 typedef struct _EISA_MEMORY_CONFIGURATION {
4443 EISA_MEMORY_TYPE ConfigurationByte;
4444 UCHAR DataSize;
4445 USHORT AddressLowWord;
4446 UCHAR AddressHighByte;
4447 USHORT MemorySize;
4448 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
4449
4450 typedef struct _EISA_IRQ_DESCRIPTOR {
4451 UCHAR Interrupt:4;
4452 UCHAR Reserved:1;
4453 UCHAR LevelTriggered:1;
4454 UCHAR Shared:1;
4455 UCHAR MoreEntries:1;
4456 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
4457
4458 typedef struct _EISA_IRQ_CONFIGURATION {
4459 EISA_IRQ_DESCRIPTOR ConfigurationByte;
4460 UCHAR Reserved;
4461 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
4462
4463 typedef struct _DMA_CONFIGURATION_BYTE0 {
4464 UCHAR Channel:3;
4465 UCHAR Reserved:3;
4466 UCHAR Shared:1;
4467 UCHAR MoreEntries:1;
4468 } DMA_CONFIGURATION_BYTE0;
4469
4470 typedef struct _DMA_CONFIGURATION_BYTE1 {
4471 UCHAR Reserved0:2;
4472 UCHAR TransferSize:2;
4473 UCHAR Timing:2;
4474 UCHAR Reserved1:2;
4475 } DMA_CONFIGURATION_BYTE1;
4476
4477 typedef struct _EISA_DMA_CONFIGURATION {
4478 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
4479 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
4480 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
4481
4482 typedef struct _EISA_PORT_DESCRIPTOR {
4483 UCHAR NumberPorts:5;
4484 UCHAR Reserved:1;
4485 UCHAR Shared:1;
4486 UCHAR MoreEntries:1;
4487 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
4488
4489 typedef struct _EISA_PORT_CONFIGURATION {
4490 EISA_PORT_DESCRIPTOR Configuration;
4491 USHORT PortAddress;
4492 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
4493
4494 typedef struct _CM_EISA_SLOT_INFORMATION {
4495 UCHAR ReturnCode;
4496 UCHAR ReturnFlags;
4497 UCHAR MajorRevision;
4498 UCHAR MinorRevision;
4499 USHORT Checksum;
4500 UCHAR NumberFunctions;
4501 UCHAR FunctionInformation;
4502 ULONG CompressedId;
4503 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
4504
4505 typedef struct _CM_EISA_FUNCTION_INFORMATION {
4506 ULONG CompressedId;
4507 UCHAR IdSlotFlags1;
4508 UCHAR IdSlotFlags2;
4509 UCHAR MinorRevision;
4510 UCHAR MajorRevision;
4511 UCHAR Selections[26];
4512 UCHAR FunctionFlags;
4513 UCHAR TypeString[80];
4514 EISA_MEMORY_CONFIGURATION EisaMemory[9];
4515 EISA_IRQ_CONFIGURATION EisaIrq[7];
4516 EISA_DMA_CONFIGURATION EisaDma[4];
4517 EISA_PORT_CONFIGURATION EisaPort[20];
4518 UCHAR InitializationData[60];
4519 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
4520
4521 #include <poppack.h>
4522
4523 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
4524
4525 #define EISA_FUNCTION_ENABLED 0x80
4526 #define EISA_FREE_FORM_DATA 0x40
4527 #define EISA_HAS_PORT_INIT_ENTRY 0x20
4528 #define EISA_HAS_PORT_RANGE 0x10
4529 #define EISA_HAS_DMA_ENTRY 0x08
4530 #define EISA_HAS_IRQ_ENTRY 0x04
4531 #define EISA_HAS_MEMORY_ENTRY 0x02
4532 #define EISA_HAS_TYPE_ENTRY 0x01
4533 #define EISA_HAS_INFORMATION \
4534 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
4535 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
4536
4537 #define EISA_MORE_ENTRIES 0x80
4538 #define EISA_SYSTEM_MEMORY 0x00
4539 #define EISA_MEMORY_TYPE_RAM 0x01
4540
4541 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
4542
4543 #define EISA_INVALID_SLOT 0x80
4544 #define EISA_INVALID_FUNCTION 0x81
4545 #define EISA_INVALID_CONFIGURATION 0x82
4546 #define EISA_EMPTY_SLOT 0x83
4547 #define EISA_INVALID_BIOS_CALL 0x86
4548
4549 /*
4550 ** Plug and Play structures
4551 */
4552
4553 typedef VOID
4554 (NTAPI *PINTERFACE_REFERENCE)(
4555 PVOID Context);
4556
4557 typedef VOID
4558 (NTAPI *PINTERFACE_DEREFERENCE)(
4559 PVOID Context);
4560
4561 _Function_class_(TRANSLATE_BUS_ADDRESS)
4562 _IRQL_requires_same_
4563 typedef BOOLEAN
4564 (NTAPI TRANSLATE_BUS_ADDRESS)(
4565 _Inout_opt_ PVOID Context,
4566 _In_ PHYSICAL_ADDRESS BusAddress,
4567 _In_ ULONG Length,
4568 _Out_ PULONG AddressSpace,
4569 _Out_ PPHYSICAL_ADDRESS TranslatedAddress);
4570 typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
4571
4572 _Function_class_(GET_DMA_ADAPTER)
4573 _IRQL_requires_same_
4574 typedef struct _DMA_ADAPTER*
4575 (NTAPI GET_DMA_ADAPTER)(
4576 _Inout_opt_ PVOID Context,
4577 _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor,
4578 _Out_ PULONG NumberOfMapRegisters);
4579 typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
4580
4581 _Function_class_(GET_SET_DEVICE_DATA)
4582 _IRQL_requires_same_
4583 typedef ULONG
4584 (NTAPI GET_SET_DEVICE_DATA)(
4585 _Inout_opt_ PVOID Context,
4586 _In_ ULONG DataType,
4587 _Inout_updates_bytes_(Length) PVOID Buffer,
4588 _In_ ULONG Offset,
4589 _In_ ULONG Length);
4590 typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
4591
4592 typedef enum _DEVICE_INSTALL_STATE {
4593 InstallStateInstalled,
4594 InstallStateNeedsReinstall,
4595 InstallStateFailedInstall,
4596 InstallStateFinishInstall
4597 } DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE;
4598
4599 typedef struct _LEGACY_BUS_INFORMATION {
4600 GUID BusTypeGuid;
4601 INTERFACE_TYPE LegacyBusType;
4602 ULONG BusNumber;
4603 } LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
4604
4605 typedef enum _DEVICE_REMOVAL_POLICY {
4606 RemovalPolicyExpectNoRemoval = 1,
4607 RemovalPolicyExpectOrderlyRemoval = 2,
4608 RemovalPolicyExpectSurpriseRemoval = 3
4609 } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY;
4610
4611 typedef VOID
4612 (NTAPI *PREENUMERATE_SELF)(
4613 _In_ PVOID Context);
4614
4615 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD {
4616 USHORT Size;
4617 USHORT Version;
4618 PVOID Context;
4619 PINTERFACE_REFERENCE InterfaceReference;
4620 PINTERFACE_DEREFERENCE InterfaceDereference;
4621 PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf;
4622 } REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD;
4623
4624 typedef VOID
4625 (NTAPI *PIO_DEVICE_EJECT_CALLBACK)(
4626 _In_ NTSTATUS Status,
4627 _Inout_opt_ PVOID Context);
4628
4629 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
4630
4631 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
4632 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
4633 #define PCI_USE_REVISION 0x00000002
4634 #define PCI_USE_VENDEV_IDS 0x00000004
4635 #define PCI_USE_CLASS_SUBCLASS 0x00000008
4636 #define PCI_USE_PROGIF 0x00000010
4637 #define PCI_USE_LOCAL_BUS 0x00000020
4638 #define PCI_USE_LOCAL_DEVICE 0x00000040
4639
4640 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
4641 ULONG Size;
4642 ULONG Flags;
4643 USHORT VendorID;
4644 USHORT DeviceID;
4645 UCHAR RevisionID;
4646 USHORT SubVendorID;
4647 USHORT SubSystemID;
4648 UCHAR BaseClass;
4649 UCHAR SubClass;
4650 UCHAR ProgIf;
4651 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
4652
4653 _IRQL_requires_max_(PASSIVE_LEVEL)
4654 _Must_inspect_result_
4655 typedef BOOLEAN
4656 (NTAPI PCI_IS_DEVICE_PRESENT)(
4657 _In_ USHORT VendorID,
4658 _In_ USHORT DeviceID,
4659 _In_ UCHAR RevisionID,
4660 _In_ USHORT SubVendorID,
4661 _In_ USHORT SubSystemID,
4662 _In_ ULONG Flags);
4663 typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
4664
4665 _IRQL_requires_max_(PASSIVE_LEVEL)
4666 _Must_inspect_result_
4667 typedef BOOLEAN
4668 (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
4669 _In_ PVOID Context,
4670 _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
4671 typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
4672
4673 typedef struct _BUS_INTERFACE_STANDARD {
4674 USHORT Size;
4675 USHORT Version;
4676 PVOID Context;
4677 PINTERFACE_REFERENCE InterfaceReference;
4678 PINTERFACE_DEREFERENCE InterfaceDereference;
4679 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
4680 PGET_DMA_ADAPTER GetDmaAdapter;
4681 PGET_SET_DEVICE_DATA SetBusData;
4682 PGET_SET_DEVICE_DATA GetBusData;
4683 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
4684
4685 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
4686 USHORT Size;
4687 USHORT Version;
4688 PVOID Context;
4689 PINTERFACE_REFERENCE InterfaceReference;
4690 PINTERFACE_DEREFERENCE InterfaceDereference;
4691 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
4692 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
4693 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
4694
4695 _Struct_size_bytes_(Size)
4696 typedef struct _DEVICE_CAPABILITIES {
4697 _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES)) USHORT Size;
4698 USHORT Version;
4699 ULONG DeviceD1:1;
4700 ULONG DeviceD2:1;
4701 ULONG LockSupported:1;
4702 ULONG EjectSupported:1;
4703 ULONG Removable:1;
4704 ULONG DockDevice:1;
4705 ULONG UniqueID:1;
4706 ULONG SilentInstall:1;
4707 ULONG RawDeviceOK:1;
4708 ULONG SurpriseRemovalOK:1;
4709 ULONG WakeFromD0:1;
4710 ULONG WakeFromD1:1;
4711 ULONG WakeFromD2:1;
4712 ULONG WakeFromD3:1;
4713 ULONG HardwareDisabled:1;
4714 ULONG NonDynamic:1;
4715 ULONG WarmEjectSupported:1;
4716 ULONG NoDisplayInUI:1;
4717 ULONG Reserved:14;
4718 ULONG Address;
4719 ULONG UINumber;
4720 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
4721 SYSTEM_POWER_STATE SystemWake;
4722 DEVICE_POWER_STATE DeviceWake;
4723 ULONG D1Latency;
4724 ULONG D2Latency;
4725 ULONG D3Latency;
4726 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
4727
4728 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
4729 USHORT Version;
4730 USHORT Size;
4731 GUID Event;
4732 GUID InterfaceClassGuid;
4733 PUNICODE_STRING SymbolicLinkName;
4734 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
4735
4736 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
4737 USHORT Version;
4738 USHORT Size;
4739 GUID Event;
4740 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
4741
4742 #undef INTERFACE
4743
4744 typedef struct _INTERFACE {
4745 USHORT Size;
4746 USHORT Version;
4747 PVOID Context;
4748 PINTERFACE_REFERENCE InterfaceReference;
4749 PINTERFACE_DEREFERENCE InterfaceDereference;
4750 } INTERFACE, *PINTERFACE;
4751
4752 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
4753 USHORT Version;
4754 USHORT Size;
4755 GUID Event;
4756 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
4757
4758 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
4759
4760 /* PNP_DEVICE_STATE */
4761
4762 #define PNP_DEVICE_DISABLED 0x00000001
4763 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
4764 #define PNP_DEVICE_FAILED 0x00000004
4765 #define PNP_DEVICE_REMOVED 0x00000008
4766 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
4767 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
4768
4769 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
4770 USHORT Version;
4771 USHORT Size;
4772 GUID Event;
4773 struct _FILE_OBJECT *FileObject;
4774 LONG NameBufferOffset;
4775 UCHAR CustomDataBuffer[1];
4776 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
4777
4778 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
4779 USHORT Version;
4780 USHORT Size;
4781 GUID Event;
4782 struct _FILE_OBJECT *FileObject;
4783 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
4784
4785 #if (NTDDI_VERSION >= NTDDI_VISTA)
4786 #include <devpropdef.h>
4787 #define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001
4788 #endif
4789
4790 #define PNP_REPLACE_NO_MAP MAXLONGLONG
4791
4792 _Must_inspect_result_
4793 typedef NTSTATUS
4794 (NTAPI *PREPLACE_MAP_MEMORY)(
4795 _In_ PHYSICAL_ADDRESS TargetPhysicalAddress,
4796 _In_ PHYSICAL_ADDRESS SparePhysicalAddress,
4797 _Inout_ PLARGE_INTEGER NumberOfBytes,
4798 _Outptr_ PVOID *TargetAddress,
4799 _Outptr_ PVOID *SpareAddress);
4800
4801 typedef struct _PNP_REPLACE_MEMORY_LIST {
4802 ULONG AllocatedCount;
4803 ULONG Count;
4804 ULONGLONG TotalLength;
4805 struct {
4806 PHYSICAL_ADDRESS Address;
4807 ULONGLONG Length;
4808 } Ranges[ANYSIZE_ARRAY];
4809 } PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST;
4810
4811 typedef struct _PNP_REPLACE_PROCESSOR_LIST {
4812 PKAFFINITY Affinity;
4813 _Field_range_(<=, MAXIMUM_GROUPS) ULONG GroupCount;
4814 ULONG AllocatedCount;
4815 ULONG Count;
4816 ULONG ApicIds[ANYSIZE_ARRAY];
4817 } PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST;
4818
4819 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 {
4820 KAFFINITY AffinityMask;
4821 ULONG AllocatedCount;
4822 ULONG Count;
4823 ULONG ApicIds[ANYSIZE_ARRAY];
4824 } PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1;
4825
4826 #define PNP_REPLACE_PARAMETERS_VERSION 2
4827
4828 typedef struct _PNP_REPLACE_PARAMETERS {
4829 ULONG Size;
4830 ULONG Version;
4831 ULONG64 Target;
4832 ULONG64 Spare;
4833 PPNP_REPLACE_PROCESSOR_LIST TargetProcessors;
4834 PPNP_REPLACE_PROCESSOR_LIST SpareProcessors;
4835 PPNP_REPLACE_MEMORY_LIST TargetMemory;
4836 PPNP_REPLACE_MEMORY_LIST SpareMemory;
4837 PREPLACE_MAP_MEMORY MapMemory;
4838 } PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS;
4839
4840 typedef VOID
4841 (NTAPI *PREPLACE_UNLOAD)(
4842 VOID);
4843
4844 _Must_inspect_result_
4845 typedef NTSTATUS
4846 (NTAPI *PREPLACE_BEGIN)(
4847 _In_ PPNP_REPLACE_PARAMETERS Parameters,
4848 _Outptr_ PVOID *Context);
4849
4850 _Must_inspect_result_
4851 typedef NTSTATUS
4852 (NTAPI *PREPLACE_END)(
4853 _In_ PVOID Context);
4854
4855 _Must_inspect_result_
4856 typedef NTSTATUS
4857 (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)(
4858 _In_ PVOID Context,
4859 _In_ PHYSICAL_ADDRESS PhysicalAddress,
4860 _In_ LARGE_INTEGER ByteCount);
4861
4862 _Must_inspect_result_
4863 typedef NTSTATUS
4864 (NTAPI *PREPLACE_SET_PROCESSOR_ID)(
4865 _In_ PVOID Context,
4866 _In_ ULONG ApicId,
4867 _In_ BOOLEAN Target);
4868
4869 _Must_inspect_result_
4870 typedef NTSTATUS
4871 (NTAPI *PREPLACE_SWAP)(
4872 _In_ PVOID Context);
4873
4874 _Must_inspect_result_
4875 typedef NTSTATUS
4876 (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)(
4877 _In_ PVOID Context);
4878
4879 _Must_inspect_result_
4880 typedef NTSTATUS
4881 (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)(
4882 _In_ PVOID Context);
4883
4884 _Must_inspect_result_
4885 typedef NTSTATUS
4886 (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)(
4887 _In_ PVOID Context,
4888 _In_ PHYSICAL_ADDRESS SourceAddress,
4889 _Out_ PPHYSICAL_ADDRESS DestinationAddress);
4890
4891 _Must_inspect_result_
4892 typedef NTSTATUS
4893 (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)(
4894 _In_ PVOID Context,
4895 _In_ BOOLEAN Enable);
4896
4897 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1
4898 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
4899 FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
4900
4901 #define PNP_REPLACE_MEMORY_SUPPORTED 0x0001
4902 #define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002
4903 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004
4904 #define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008
4905 #define PNP_REPLACE_HARDWARE_QUIESCE 0x0010
4906
4907 typedef struct _PNP_REPLACE_DRIVER_INTERFACE {
4908 ULONG Size;
4909 ULONG Version;
4910 ULONG Flags;
4911 PREPLACE_UNLOAD Unload;
4912 PREPLACE_BEGIN BeginReplace;
4913 PREPLACE_END EndReplace;
4914 PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory;
4915 PREPLACE_SET_PROCESSOR_ID SetProcessorId;
4916 PREPLACE_SWAP Swap;
4917 PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror;
4918 PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory;
4919 PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination;
4920 PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce;
4921 } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE;
4922
4923 _Must_inspect_result_
4924 typedef NTSTATUS
4925 (NTAPI *PREPLACE_DRIVER_INIT)(
4926 _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface,
4927 _In_ PVOID Unused);
4928
4929 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
4930 DeviceUsageTypeUndefined,
4931 DeviceUsageTypePaging,
4932 DeviceUsageTypeHibernation,
4933 DeviceUsageTypeDumpFile
4934 } DEVICE_USAGE_NOTIFICATION_TYPE;
4935
4936 typedef struct _POWER_SEQUENCE {
4937 ULONG SequenceD1;
4938 ULONG SequenceD2;
4939 ULONG SequenceD3;
4940 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
4941
4942 #ifdef _PREFAST_
4943 #define __string_type 0x1000
4944 #define __guid_type 0x2000
4945 #define __multiString_type 0x4000
4946 #else
4947 #define __string_type 0
4948 #define __guid_type 0
4949 #define __multiString_type 0
4950 #endif
4951
4952 typedef enum {
4953 DevicePropertyDeviceDescription = 0x0 | __string_type,
4954 DevicePropertyHardwareID = 0x1 | __multiString_type,
4955 DevicePropertyCompatibleIDs = 0x2 | __multiString_type,
4956 DevicePropertyBootConfiguration = 0x3,
4957 DevicePropertyBootConfigurationTranslated = 0x4,
4958 DevicePropertyClassName = 0x5 | __string_type,
4959 DevicePropertyClassGuid = 0x6 | __string_type,
4960 DevicePropertyDriverKeyName = 0x7 | __string_type,
4961 DevicePropertyManufacturer = 0x8 | __string_type,
4962 DevicePropertyFriendlyName = 0x9 | __string_type,
4963 DevicePropertyLocationInformation = 0xa | __string_type,
4964 DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type,
4965 DevicePropertyBusTypeGuid = 0xc | __guid_type,
4966 DevicePropertyLegacyBusType = 0xd,
4967 DevicePropertyBusNumber = 0xe,
4968 DevicePropertyEnumeratorName = 0xf | __string_type,
4969 DevicePropertyAddress = 0x10,
4970 DevicePropertyUINumber = 0x11,
4971 DevicePropertyInstallState = 0x12,
4972 DevicePropertyRemovalPolicy = 0x13,
4973 DevicePropertyResourceRequirements = 0x14,
4974 DevicePropertyAllocatedResources = 0x15,
4975 DevicePropertyContainerID = 0x16 | __string_type
4976 } DEVICE_REGISTRY_PROPERTY;
4977
4978 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
4979 EventCategoryReserved,
4980 EventCategoryHardwareProfileChange,
4981 EventCategoryDeviceInterfaceChange,
4982 EventCategoryTargetDeviceChange
4983 } IO_NOTIFICATION_EVENT_CATEGORY;
4984
4985 typedef enum _IO_PRIORITY_HINT {
4986 IoPriorityVeryLow = 0,
4987 IoPriorityLow,
4988 IoPriorityNormal,
4989 IoPriorityHigh,
4990 IoPriorityCritical,
4991 MaxIoPriorityTypes
4992 } IO_PRIORITY_HINT;
4993
4994 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
4995
4996 _Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE)
4997 _IRQL_requires_max_(PASSIVE_LEVEL)
4998 typedef NTSTATUS
4999 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
5000 _In_ PVOID NotificationStructure,
5001 _Inout_opt_ PVOID Context);
5002 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
5003
5004 _Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK)
5005 _IRQL_requires_same_
5006 typedef VOID
5007 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
5008 _Inout_opt_ PVOID Context);
5009 typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
5010
5011 typedef enum _FILE_INFORMATION_CLASS {
5012 FileDirectoryInformation = 1,
5013 FileFullDirectoryInformation,
5014 FileBothDirectoryInformation,
5015 FileBasicInformation,
5016 FileStandardInformation,
5017 FileInternalInformation,
5018 FileEaInformation,
5019 FileAccessInformation,
5020 FileNameInformation,
5021 FileRenameInformation,
5022 FileLinkInformation,
5023 FileNamesInformation,
5024 FileDispositionInformation,
5025 FilePositionInformation,
5026 FileFullEaInformation,
5027 FileModeInformation,
5028 FileAlignmentInformation,
5029 FileAllInformation,
5030 FileAllocationInformation,
5031 FileEndOfFileInformation,
5032 FileAlternateNameInformation,
5033 FileStreamInformation,
5034 FilePipeInformation,
5035 FilePipeLocalInformation,
5036 FilePipeRemoteInformation,
5037 FileMailslotQueryInformation,
5038 FileMailslotSetInformation,
5039 FileCompressionInformation,
5040 FileObjectIdInformation,
5041 FileCompletionInformation,
5042 FileMoveClusterInformation,
5043 FileQuotaInformation,
5044 FileReparsePointInformation,
5045 FileNetworkOpenInformation,
5046 FileAttributeTagInformation,
5047 FileTrackingInformation,
5048 FileIdBothDirectoryInformation,
5049 FileIdFullDirectoryInformation,
5050 FileValidDataLengthInformation,
5051 FileShortNameInformation,
5052 #if (NTDDI_VERSION >= NTDDI_VISTA)
5053 FileIoCompletionNotificationInformation,
5054 FileIoStatusBlockRangeInformation,
5055 FileIoPriorityHintInformation,
5056 FileSfioReserveInformation,
5057 FileSfioVolumeInformation,
5058 FileHardLinkInformation,
5059 FileProcessIdsUsingFileInformation,
5060 FileNormalizedNameInformation,
5061 FileNetworkPhysicalNameInformation,
5062 #endif
5063 #if (NTDDI_VERSION >= NTDDI_WIN7)
5064 FileIdGlobalTxDirectoryInformation,
5065 FileIsRemoteDeviceInformation,
5066 FileAttributeCacheInformation,
5067 FileNumaNodeInformation,
5068 FileStandardLinkInformation,
5069 FileRemoteProtocolInformation,
5070 #endif
5071 FileMaximumInformation
5072 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
5073
5074 typedef struct _FILE_POSITION_INFORMATION {
5075 LARGE_INTEGER CurrentByteOffset;
5076 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
5077
5078 typedef struct _FILE_BASIC_INFORMATION {
5079 LARGE_INTEGER CreationTime;
5080 LARGE_INTEGER LastAccessTime;
5081 LARGE_INTEGER LastWriteTime;
5082 LARGE_INTEGER ChangeTime;
5083 ULONG FileAttributes;
5084 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
5085
5086 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
5087 IO_PRIORITY_HINT PriorityHint;
5088 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
5089
5090 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
5091 ULONG Flags;
5092 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
5093
5094 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
5095 PUCHAR IoStatusBlockRange;
5096 ULONG Length;
5097 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
5098
5099 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
5100 BOOLEAN IsRemote;
5101 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
5102
5103 typedef struct _FILE_NUMA_NODE_INFORMATION {
5104 USHORT NodeNumber;
5105 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
5106
5107 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
5108 ULONG NumberOfProcessIdsInList;
5109 ULONG_PTR ProcessIdList[1];
5110 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
5111
5112 typedef struct _FILE_STANDARD_INFORMATION {
5113 LARGE_INTEGER AllocationSize;
5114 LARGE_INTEGER EndOfFile;
5115 ULONG NumberOfLinks;
5116 BOOLEAN DeletePending;
5117 BOOLEAN Directory;
5118 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
5119
5120 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
5121 LARGE_INTEGER CreationTime;
5122 LARGE_INTEGER LastAccessTime;
5123 LARGE_INTEGER LastWriteTime;
5124 LARGE_INTEGER ChangeTime;
5125 LARGE_INTEGER AllocationSize;
5126 LARGE_INTEGER EndOfFile;
5127 ULONG FileAttributes;
5128 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
5129
5130 typedef enum _FSINFOCLASS {
5131 FileFsVolumeInformation = 1,
5132 FileFsLabelInformation,
5133 FileFsSizeInformation,
5134 FileFsDeviceInformation,
5135 FileFsAttributeInformation,
5136 FileFsControlInformation,
5137 FileFsFullSizeInformation,
5138 FileFsObjectIdInformation,
5139 FileFsDriverPathInformation,
5140 FileFsVolumeFlagsInformation,
5141 FileFsMaximumInformation
5142 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
5143
5144 typedef struct _FILE_FS_DEVICE_INFORMATION {
5145 DEVICE_TYPE DeviceType;
5146 ULONG Characteristics;
5147 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
5148
5149 typedef struct _FILE_FULL_EA_INFORMATION {
5150 ULONG NextEntryOffset;
5151 UCHAR Flags;
5152 UCHAR EaNameLength;
5153 USHORT EaValueLength;
5154 CHAR EaName[1];
5155 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
5156
5157 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
5158 ULONG RequestsPerPeriod;
5159 ULONG Period;
5160 BOOLEAN RetryFailures;
5161 BOOLEAN Discardable;
5162 ULONG RequestSize;
5163 ULONG NumOutstandingRequests;
5164 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
5165
5166 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
5167 ULONG MaximumRequestsPerPeriod;
5168 ULONG MinimumPeriod;
5169 ULONG MinimumTransferSize;
5170 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
5171
5172 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
5173 #define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
5174 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4
5175
5176 #define FM_LOCK_BIT (0x1)
5177 #define FM_LOCK_BIT_V (0x0)
5178 #define FM_LOCK_WAITER_WOKEN (0x2)
5179 #define FM_LOCK_WAITER_INC (0x4)
5180
5181 _Function_class_(FAST_IO_CHECK_IF_POSSIBLE)
5182 _IRQL_requires_same_
5183 typedef BOOLEAN
5184 (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
5185 _In_ struct _FILE_OBJECT *FileObject,
5186 _In_ PLARGE_INTEGER FileOffset,
5187 _In_ ULONG Length,
5188 _In_ BOOLEAN Wait,
5189 _In_ ULONG LockKey,
5190 _In_ BOOLEAN CheckForReadOperation,
5191 _Out_ PIO_STATUS_BLOCK IoStatus,
5192 _In_ struct _DEVICE_OBJECT *DeviceObject);
5193 typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
5194
5195 _Function_class_(FAST_IO_READ)
5196 _IRQL_requires_same_
5197 typedef BOOLEAN
5198 (NTAPI FAST_IO_READ)(
5199 _In_ struct _FILE_OBJECT *FileObject,
5200 _In_ PLARGE_INTEGER FileOffset,
5201 _In_ ULONG Length,
5202 _In_ BOOLEAN Wait,
5203 _In_ ULONG LockKey,
5204 _Out_ PVOID Buffer,
5205 _Out_ PIO_STATUS_BLOCK IoStatus,
5206 _In_ struct _DEVICE_OBJECT *DeviceObject);
5207 typedef FAST_IO_READ *PFAST_IO_READ;
5208
5209 _Function_class_(FAST_IO_WRITE)
5210 _IRQL_requires_same_
5211 typedef BOOLEAN
5212 (NTAPI FAST_IO_WRITE)(
5213 _In_ struct _FILE_OBJECT *FileObject,
5214 _In_ PLARGE_INTEGER FileOffset,
5215 _In_ ULONG Length,
5216 _In_ BOOLEAN Wait,
5217 _In_ ULONG LockKey,
5218 _In_ PVOID Buffer,
5219 _Out_ PIO_STATUS_BLOCK IoStatus,
5220 _In_ struct _DEVICE_OBJECT *DeviceObject);
5221 typedef FAST_IO_WRITE *PFAST_IO_WRITE;
5222
5223 _Function_class_(FAST_IO_QUERY_BASIC_INFO)
5224 _IRQL_requires_same_
5225 typedef BOOLEAN
5226 (NTAPI FAST_IO_QUERY_BASIC_INFO)(
5227 _In_ struct _FILE_OBJECT *FileObject,
5228 _In_ BOOLEAN Wait,
5229 _Out_ PFILE_BASIC_INFORMATION Buffer,
5230 _Out_ PIO_STATUS_BLOCK IoStatus,
5231 _In_ struct _DEVICE_OBJECT *DeviceObject);
5232 typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
5233
5234 _Function_class_(FAST_IO_QUERY_STANDARD_INFO)
5235 _IRQL_requires_same_
5236 typedef BOOLEAN
5237 (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
5238 _In_ struct _FILE_OBJECT *FileObject,
5239 _In_ BOOLEAN Wait,
5240 _Out_ PFILE_STANDARD_INFORMATION Buffer,
5241 _Out_ PIO_STATUS_BLOCK IoStatus,
5242 _In_ struct _DEVICE_OBJECT *DeviceObject);
5243 typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
5244
5245 _Function_class_(FAST_IO_LOCK)
5246 _IRQL_requires_same_
5247 typedef BOOLEAN
5248 (NTAPI FAST_IO_LOCK)(
5249 _In_ struct _FILE_OBJECT *FileObject,
5250 _In_ PLARGE_INTEGER FileOffset,
5251 _In_ PLARGE_INTEGER Length,
5252 _In_ PEPROCESS ProcessId,
5253 _In_ ULONG Key,
5254 _In_ BOOLEAN FailImmediately,
5255 _In_ BOOLEAN ExclusiveLock,
5256 _Out_ PIO_STATUS_BLOCK IoStatus,
5257 _In_ struct _DEVICE_OBJECT *DeviceObject);
5258 typedef FAST_IO_LOCK *PFAST_IO_LOCK;
5259
5260 _Function_class_(FAST_IO_UNLOCK_SINGLE)
5261 _IRQL_requires_same_
5262 typedef BOOLEAN
5263 (NTAPI FAST_IO_UNLOCK_SINGLE)(
5264 _In_ struct _FILE_OBJECT *FileObject,
5265 _In_ PLARGE_INTEGER FileOffset,
5266 _In_ PLARGE_INTEGER Length,
5267 _In_ PEPROCESS ProcessId,
5268 _In_ ULONG Key,
5269 _Out_ PIO_STATUS_BLOCK IoStatus,
5270 _In_ struct _DEVICE_OBJECT *DeviceObject);
5271 typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
5272
5273 _Function_class_(FAST_IO_UNLOCK_ALL)
5274 _IRQL_requires_same_
5275 typedef BOOLEAN
5276 (NTAPI FAST_IO_UNLOCK_ALL)(
5277 _In_ struct _FILE_OBJECT *FileObject,
5278 _In_ PEPROCESS ProcessId,
5279 _Out_ PIO_STATUS_BLOCK IoStatus,
5280 _In_ struct _DEVICE_OBJECT *DeviceObject);
5281 typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
5282
5283 _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY)
5284 _IRQL_requires_same_
5285 typedef BOOLEAN
5286 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
5287 _In_ struct _FILE_OBJECT *FileObject,
5288 _In_ PVOID ProcessId,
5289 _In_ ULONG Key,
5290 _Out_ PIO_STATUS_BLOCK IoStatus,
5291 _In_ struct _DEVICE_OBJECT *DeviceObject);
5292 typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
5293
5294 _Function_class_(FAST_IO_DEVICE_CONTROL)
5295 _IRQL_requires_same_
5296 typedef BOOLEAN
5297 (NTAPI FAST_IO_DEVICE_CONTROL)(
5298 _In_ struct _FILE_OBJECT *FileObject,
5299 _In_ BOOLEAN Wait,
5300 _In_opt_ PVOID InputBuffer,
5301 _In_ ULONG InputBufferLength,
5302 _Out_opt_ PVOID OutputBuffer,
5303 _In_ ULONG OutputBufferLength,
5304 _In_ ULONG IoControlCode,
5305 _Out_ PIO_STATUS_BLOCK IoStatus,
5306 _In_ struct _DEVICE_OBJECT *DeviceObject);
5307 typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
5308
5309 _Function_class_(FAST_IO_ACQUIRE_FILE)
5310 _IRQL_requires_same_
5311 typedef VOID
5312 (NTAPI FAST_IO_ACQUIRE_FILE)(
5313 _In_ struct _FILE_OBJECT *FileObject);
5314 typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
5315
5316 _Function_class_(FAST_IO_RELEASE_FILE)
5317 _IRQL_requires_same_
5318 typedef VOID
5319 (NTAPI FAST_IO_RELEASE_FILE)(
5320 _In_ struct _FILE_OBJECT *FileObject);
5321 typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
5322
5323 _Function_class_(FAST_IO_DETACH_DEVICE)
5324 _IRQL_requires_same_
5325 typedef VOID
5326 (NTAPI FAST_IO_DETACH_DEVICE)(
5327 _In_ struct _DEVICE_OBJECT *SourceDevice,
5328 _In_ struct _DEVICE_OBJECT *TargetDevice);
5329 typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
5330
5331 _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO)
5332 _IRQL_requires_same_
5333 typedef BOOLEAN
5334 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
5335 _In_ struct _FILE_OBJECT *FileObject,
5336 _In_ BOOLEAN Wait,
5337 _Out_ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
5338 _Out_ struct _IO_STATUS_BLOCK *IoStatus,
5339 _In_ struct _DEVICE_OBJECT *DeviceObject);
5340 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
5341
5342 _Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE)
5343 _IRQL_requires_same_
5344 typedef NTSTATUS
5345 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
5346 _In_ struct _FILE_OBJECT *FileObject,
5347 _In_ PLARGE_INTEGER EndingOffset,
5348 _Out_ struct _ERESOURCE **ResourceToRelease,
5349 _In_ struct _DEVICE_OBJECT *DeviceObject);
5350 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
5351
5352 _Function_class_(FAST_IO_MDL_READ)
5353 _IRQL_requires_same_
5354 typedef BOOLEAN
5355 (NTAPI FAST_IO_MDL_READ)(
5356 _In_ struct _FILE_OBJECT *FileObject,
5357 _In_ PLARGE_INTEGER FileOffset,
5358 _In_ ULONG Length,
5359 _In_ ULONG LockKey,
5360 _Out_ PMDL *MdlChain,
5361 _Out_ PIO_STATUS_BLOCK IoStatus,
5362 _In_ struct _DEVICE_OBJECT *DeviceObject);
5363 typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
5364
5365 _Function_class_(FAST_IO_MDL_READ_COMPLETE)
5366 _IRQL_requires_same_
5367 typedef BOOLEAN
5368 (NTAPI FAST_IO_MDL_READ_COMPLETE)(
5369 _In_ struct _FILE_OBJECT *FileObject,
5370 _In_ PMDL MdlChain,
5371 _In_ struct _DEVICE_OBJECT *DeviceObject);
5372 typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
5373
5374 _Function_class_(FAST_IO_PREPARE_MDL_WRITE)
5375 _IRQL_requires_same_
5376 typedef BOOLEAN
5377 (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
5378 _In_ struct _FILE_OBJECT *FileObject,
5379 _In_ PLARGE_INTEGER FileOffset,
5380 _In_ ULONG Length,
5381 _In_ ULONG LockKey,
5382 _Out_ PMDL *MdlChain,
5383 _Out_ PIO_STATUS_BLOCK IoStatus,
5384 _In_ struct _DEVICE_OBJECT *DeviceObject);
5385 typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
5386
5387 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE)
5388 _IRQL_requires_same_
5389 typedef BOOLEAN
5390 (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
5391 _In_ struct _FILE_OBJECT *FileObject,
5392 _In_ PLARGE_INTEGER FileOffset,
5393 _In_ PMDL MdlChain,
5394 _In_ struct _DEVICE_OBJECT *DeviceObject);
5395 typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
5396
5397 _Function_class_(FAST_IO_READ_COMPRESSED)
5398 _IRQL_requires_same_
5399 typedef BOOLEAN
5400 (NTAPI FAST_IO_READ_COMPRESSED)(
5401 _In_ struct _FILE_OBJECT *FileObject,
5402 _In_ PLARGE_INTEGER FileOffset,
5403 _In_ ULONG Length,
5404 _In_ ULONG LockKey,
5405 _Out_ PVOID Buffer,
5406 _Out_ PMDL *MdlChain,
5407 _Out_ PIO_STATUS_BLOCK IoStatus,
5408 _Out_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
5409 _In_ ULONG CompressedDataInfoLength,
5410 _In_ struct _DEVICE_OBJECT *DeviceObject);
5411 typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
5412
5413 _Function_class_(FAST_IO_WRITE_COMPRESSED)
5414 _IRQL_requires_same_
5415 typedef BOOLEAN
5416 (NTAPI FAST_IO_WRITE_COMPRESSED)(
5417 _In_ struct _FILE_OBJECT *FileObject,
5418 _In_ PLARGE_INTEGER FileOffset,
5419 _In_ ULONG Length,
5420 _In_ ULONG LockKey,
5421 _In_ PVOID Buffer,
5422 _Out_ PMDL *MdlChain,
5423 _Out_ PIO_STATUS_BLOCK IoStatus,
5424 _In_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
5425 _In_ ULONG CompressedDataInfoLength,
5426 _In_ struct _DEVICE_OBJECT *DeviceObject);
5427 typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
5428
5429 _Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED)
5430 _IRQL_requires_same_
5431 typedef BOOLEAN
5432 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
5433 _In_ struct _FILE_OBJECT *FileObject,
5434 _In_ PMDL MdlChain,
5435 _In_ struct _DEVICE_OBJECT *DeviceObject);
5436 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
5437
5438 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)
5439 _IRQL_requires_same_
5440 typedef BOOLEAN
5441 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
5442 _In_ struct _FILE_OBJECT *FileObject,
5443 _In_ PLARGE_INTEGER FileOffset,
5444 _In_ PMDL MdlChain,
5445 _In_ struct _DEVICE_OBJECT *DeviceObject);
5446 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
5447
5448 _Function_class_(FAST_IO_QUERY_OPEN)
5449 _IRQL_requires_same_
5450 typedef BOOLEAN
5451 (NTAPI FAST_IO_QUERY_OPEN)(
5452 _Inout_ struct _IRP *Irp,
5453 _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
5454 _In_ struct _DEVICE_OBJECT *DeviceObject);
5455 typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
5456
5457 _Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE)
5458 _IRQL_requires_same_
5459 typedef NTSTATUS
5460 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
5461 _In_ struct _FILE_OBJECT *FileObject,
5462 _In_ struct _ERESOURCE *ResourceToRelease,
5463 _In_ struct _DEVICE_OBJECT *DeviceObject);
5464 typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
5465
5466 _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH)
5467 _IRQL_requires_same_
5468 typedef NTSTATUS
5469 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
5470 _In_ struct _FILE_OBJECT *FileObject,
5471 _In_ struct _DEVICE_OBJECT *DeviceObject);
5472 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
5473
5474 _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH)
5475 _IRQL_requires_same_
5476 typedef NTSTATUS
5477 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
5478 _In_ struct _FILE_OBJECT *FileObject,
5479 _In_ struct _DEVICE_OBJECT *DeviceObject);
5480 typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
5481
5482 typedef struct _FAST_IO_DISPATCH {
5483 ULONG SizeOfFastIoDispatch;
5484 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
5485 PFAST_IO_READ FastIoRead;
5486 PFAST_IO_WRITE FastIoWrite;
5487 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
5488 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
5489 PFAST_IO_LOCK FastIoLock;
5490 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
5491 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
5492 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
5493 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
5494 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
5495 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
5496 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
5497 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
5498 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
5499 PFAST_IO_MDL_READ MdlRead;
5500 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
5501 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
5502 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
5503 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
5504 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
5505 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
5506 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
5507 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
5508 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
5509 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
5510 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
5511 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
5512
5513 typedef struct _SECTION_OBJECT_POINTERS {
5514 PVOID DataSectionObject;
5515 PVOID SharedCacheMap;
5516 PVOID ImageSectionObject;
5517 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
5518
5519 typedef struct _IO_COMPLETION_CONTEXT {
5520 PVOID Port;
5521 PVOID Key;
5522 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
5523
5524 /* FILE_OBJECT.Flags */
5525 #define FO_FILE_OPEN 0x00000001
5526 #define FO_SYNCHRONOUS_IO 0x00000002
5527 #define FO_ALERTABLE_IO 0x00000004
5528 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
5529 #define FO_WRITE_THROUGH 0x00000010
5530 #define FO_SEQUENTIAL_ONLY 0x00000020
5531 #define FO_CACHE_SUPPORTED 0x00000040
5532 #define FO_NAMED_PIPE 0x00000080
5533 #define FO_STREAM_FILE 0x00000100
5534 #define FO_MAILSLOT 0x00000200
5535 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
5536 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
5537 #define FO_DIRECT_DEVICE_OPEN 0x00000800
5538 #define FO_FILE_MODIFIED 0x00001000
5539 #define FO_FILE_SIZE_CHANGED 0x00002000
5540 #define FO_CLEANUP_COMPLETE 0x00004000
5541 #define FO_TEMPORARY_FILE 0x00008000
5542 #define FO_DELETE_ON_CLOSE 0x00010000
5543 #define FO_OPENED_CASE_SENSITIVE 0x00020000
5544 #define FO_HANDLE_CREATED 0x00040000
5545 #define FO_FILE_FAST_IO_READ 0x00080000
5546 #define FO_RANDOM_ACCESS 0x00100000
5547 #define FO_FILE_OPEN_CANCELLED 0x00200000
5548 #define FO_VOLUME_OPEN 0x00400000
5549 #define FO_REMOTE_ORIGIN 0x01000000
5550 #define FO_DISALLOW_EXCLUSIVE 0x02000000
5551 #define FO_SKIP_COMPLETION_PORT 0x02000000
5552 #define FO_SKIP_SET_EVENT 0x04000000
5553 #define FO_SKIP_SET_FAST_IO 0x08000000
5554 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
5555
5556 /* VPB.Flags */
5557 #define VPB_MOUNTED 0x0001
5558 #define VPB_LOCKED 0x0002
5559 #define VPB_PERSISTENT 0x0004
5560 #define VPB_REMOVE_PENDING 0x0008
5561 #define VPB_RAW_MOUNT 0x0010
5562 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
5563
5564 /* IRP.Flags */
5565
5566 #define SL_FORCE_ACCESS_CHECK 0x01
5567 #define SL_OPEN_PAGING_FILE 0x02
5568 #define SL_OPEN_TARGET_DIRECTORY 0x04
5569 #define SL_STOP_ON_SYMLINK 0x08
5570 #define SL_CASE_SENSITIVE 0x80
5571
5572 #define SL_KEY_SPECIFIED 0x01
5573 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
5574 #define SL_WRITE_THROUGH 0x04
5575 #define SL_FT_SEQUENTIAL_WRITE 0x08
5576 #define SL_FORCE_DIRECT_WRITE 0x10
5577 #define SL_REALTIME_STREAM 0x20
5578
5579 #define SL_READ_ACCESS_GRANTED 0x01
5580 #define SL_WRITE_ACCESS_GRANTED 0x04
5581
5582 #define SL_FAIL_IMMEDIATELY 0x01
5583 #define SL_EXCLUSIVE_LOCK 0x02
5584
5585 #define SL_RESTART_SCAN 0x01
5586 #define SL_RETURN_SINGLE_ENTRY 0x02
5587 #define SL_INDEX_SPECIFIED 0x04
5588
5589 #define SL_WATCH_TREE 0x01
5590
5591 #define SL_ALLOW_RAW_MOUNT 0x01
5592
5593 #define CTL_CODE(DeviceType, Function, Method, Access) \
5594 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
5595
5596 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
5597
5598 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
5599
5600 #define IRP_NOCACHE 0x00000001
5601 #define IRP_PAGING_IO 0x00000002
5602 #define IRP_MOUNT_COMPLETION 0x00000002
5603 #define IRP_SYNCHRONOUS_API 0x00000004
5604 #define IRP_ASSOCIATED_IRP 0x00000008
5605 #define IRP_BUFFERED_IO 0x00000010
5606 #define IRP_DEALLOCATE_BUFFER 0x00000020
5607 #define IRP_INPUT_OPERATION 0x00000040
5608 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
5609 #define IRP_CREATE_OPERATION 0x00000080
5610 #define IRP_READ_OPERATION 0x00000100
5611 #define IRP_WRITE_OPERATION 0x00000200
5612 #define IRP_CLOSE_OPERATION 0x00000400
5613 #define IRP_DEFER_IO_COMPLETION 0x00000800
5614 #define IRP_OB_QUERY_NAME 0x00001000
5615 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
5616 /* The following 2 are missing in latest WDK */
5617 #define IRP_RETRY_IO_COMPLETION 0x00004000
5618 #define IRP_CLASS_CACHE_OPERATION 0x00008000
5619
5620 #define IRP_QUOTA_CHARGED 0x01
5621 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
5622 #define IRP_ALLOCATED_FIXED_SIZE 0x04
5623 #define IRP_LOOKASIDE_ALLOCATION 0x08
5624
5625 /*
5626 ** IRP function codes
5627 */
5628
5629 #define IRP_MJ_CREATE 0x00
5630 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
5631 #define IRP_MJ_CLOSE 0x02
5632 #define IRP_MJ_READ 0x03
5633 #define IRP_MJ_WRITE 0x04
5634 #define IRP_MJ_QUERY_INFORMATION 0x05
5635 #define IRP_MJ_SET_INFORMATION 0x06
5636 #define IRP_MJ_QUERY_EA 0x07
5637 #define IRP_MJ_SET_EA 0x08
5638 #define IRP_MJ_FLUSH_BUFFERS 0x09
5639 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
5640 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
5641 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
5642 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
5643 #define IRP_MJ_DEVICE_CONTROL 0x0e
5644 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
5645 #define IRP_MJ_SCSI 0x0f
5646 #define IRP_MJ_SHUTDOWN 0x10
5647 #define IRP_MJ_LOCK_CONTROL 0x11
5648 #define IRP_MJ_CLEANUP 0x12
5649 #define IRP_MJ_CREATE_MAILSLOT 0x13
5650 #define IRP_MJ_QUERY_SECURITY 0x14
5651 #define IRP_MJ_SET_SECURITY 0x15
5652 #define IRP_MJ_POWER 0x16
5653 #define IRP_MJ_SYSTEM_CONTROL 0x17
5654 #define IRP_MJ_DEVICE_CHANGE 0x18
5655 #define IRP_MJ_QUERY_QUOTA 0x19
5656 #define IRP_MJ_SET_QUOTA 0x1a
5657 #define IRP_MJ_PNP 0x1b
5658 #define IRP_MJ_PNP_POWER 0x1b
5659 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
5660
5661 #define IRP_MN_SCSI_CLASS 0x01
5662
5663 #define IRP_MN_START_DEVICE 0x00
5664 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
5665 #define IRP_MN_REMOVE_DEVICE 0x02
5666 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
5667 #define IRP_MN_STOP_DEVICE 0x04
5668 #define IRP_MN_QUERY_STOP_DEVICE 0x05
5669 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
5670
5671 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
5672 #define IRP_MN_QUERY_INTERFACE 0x08
5673 #define IRP_MN_QUERY_CAPABILITIES 0x09
5674 #define IRP_MN_QUERY_RESOURCES 0x0A
5675 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
5676 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
5677 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
5678
5679 #define IRP_MN_READ_CONFIG 0x0F
5680 #define IRP_MN_WRITE_CONFIG 0x10
5681 #define IRP_MN_EJECT 0x11
5682 #define IRP_MN_SET_LOCK 0x12
5683 #define IRP_MN_QUERY_ID 0x13
5684 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
5685 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
5686 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
5687 #define IRP_MN_SURPRISE_REMOVAL 0x17
5688 #if (NTDDI_VERSION >= NTDDI_WIN7)
5689 #define IRP_MN_DEVICE_ENUMERATED 0x19
5690 #endif
5691
5692 #define IRP_MN_WAIT_WAKE 0x00
5693 #define IRP_MN_POWER_SEQUENCE 0x01
5694 #define IRP_MN_SET_POWER 0x02
5695 #define IRP_MN_QUERY_POWER 0x03
5696
5697 #define IRP_MN_QUERY_ALL_DATA 0x00
5698 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
5699 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
5700 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
5701 #define IRP_MN_ENABLE_EVENTS 0x04
5702 #define IRP_MN_DISABLE_EVENTS 0x05
5703 #define IRP_MN_ENABLE_COLLECTION 0x06
5704 #define IRP_MN_DISABLE_COLLECTION 0x07
5705 #define IRP_MN_REGINFO 0x08
5706 #define IRP_MN_EXECUTE_METHOD 0x09
5707
5708 #define IRP_MN_REGINFO_EX 0x0b
5709
5710 typedef struct _FILE_OBJECT {
5711 CSHORT Type;
5712 CSHORT Size;
5713 PDEVICE_OBJECT DeviceObject;
5714 PVPB Vpb;
5715 PVOID FsContext;
5716 PVOID FsContext2;
5717 PSECTION_OBJECT_POINTERS SectionObjectPointer;
5718 PVOID PrivateCacheMap;
5719 NTSTATUS FinalStatus;
5720 struct _FILE_OBJECT *RelatedFileObject;
5721 BOOLEAN LockOperation;
5722 BOOLEAN DeletePending;
5723 BOOLEAN ReadAccess;
5724 BOOLEAN WriteAccess;
5725 BOOLEAN DeleteAccess;
5726 BOOLEAN SharedRead;
5727 BOOLEAN SharedWrite;
5728 BOOLEAN SharedDelete;
5729 ULONG Flags;
5730 UNICODE_STRING FileName;
5731 LARGE_INTEGER CurrentByteOffset;
5732 volatile ULONG Waiters;
5733 volatile ULONG Busy;
5734 PVOID LastLock;
5735 KEVENT Lock;
5736 KEVENT Event;
5737 volatile PIO_COMPLETION_CONTEXT CompletionContext;
5738 KSPIN_LOCK IrpListLock;
5739 LIST_ENTRY IrpList;
5740 volatile PVOID FileObjectExtension;
5741 } FILE_OBJECT, *PFILE_OBJECT;
5742
5743 typedef struct _IO_ERROR_LOG_PACKET {
5744 UCHAR MajorFunctionCode;
5745 UCHAR RetryCount;
5746 USHORT DumpDataSize;
5747 USHORT NumberOfStrings;
5748 USHORT StringOffset;
5749 USHORT EventCategory;
5750 NTSTATUS ErrorCode;
5751 ULONG UniqueErrorValue;
5752 NTSTATUS FinalStatus;
5753 ULONG SequenceNumber;
5754 ULONG IoControlCode;
5755 LARGE_INTEGER DeviceOffset;
5756 ULONG DumpData[1];
5757 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
5758
5759 typedef struct _IO_ERROR_LOG_MESSAGE {
5760 USHORT Type;
5761 USHORT Size;
5762 USHORT DriverNameLength;
5763 LARGE_INTEGER TimeStamp;
5764 ULONG DriverNameOffset;
5765 IO_ERROR_LOG_PACKET EntryData;
5766 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
5767
5768 #define ERROR_LOG_LIMIT_SIZE 240
5769 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
5770 sizeof(IO_ERROR_LOG_PACKET) + \
5771 (sizeof(WCHAR) * 40))
5772 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
5773 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5774 #define IO_ERROR_LOG_MESSAGE_LENGTH \
5775 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
5776 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
5777 PORT_MAXIMUM_MESSAGE_LENGTH)
5778 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
5779 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5780
5781 #ifdef _WIN64
5782 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
5783 #else
5784 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
5785 #endif
5786
5787 typedef enum _DMA_WIDTH {
5788 Width8Bits,
5789 Width16Bits,
5790 Width32Bits,
5791 MaximumDmaWidth
5792 } DMA_WIDTH, *PDMA_WIDTH;
5793
5794 typedef enum _DMA_SPEED {
5795 Compatible,
5796 TypeA,
5797 TypeB,
5798 TypeC,
5799 TypeF,
5800 MaximumDmaSpeed
5801 } DMA_SPEED, *PDMA_SPEED;
5802
5803 /* DEVICE_DESCRIPTION.Version */
5804
5805 #define DEVICE_DESCRIPTION_VERSION 0x0000
5806 #define DEVICE_DESCRIPTION_VERSION1 0x0001
5807 #define DEVICE_DESCRIPTION_VERSION2 0x0002
5808
5809 typedef struct _DEVICE_DESCRIPTION {
5810 ULONG Version;
5811 BOOLEAN Master;
5812 BOOLEAN ScatterGather;
5813 BOOLEAN DemandMode;
5814 BOOLEAN AutoInitialize;
5815 BOOLEAN Dma32BitAddresses;
5816 BOOLEAN IgnoreCount;
5817 BOOLEAN Reserved1;
5818 BOOLEAN Dma64BitAddresses;
5819 ULONG BusNumber;
5820 ULONG DmaChannel;
5821 INTERFACE_TYPE InterfaceType;
5822 DMA_WIDTH DmaWidth;
5823 DMA_SPEED DmaSpeed;
5824 ULONG MaximumLength;
5825 ULONG DmaPort;
5826 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
5827
5828 typedef enum _DEVICE_RELATION_TYPE {
5829 BusRelations,
5830 EjectionRelations,
5831 PowerRelations,
5832 RemovalRelations,
5833 TargetDeviceRelation,
5834 SingleBusRelations,
5835 TransportRelations
5836 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
5837
5838 typedef struct _DEVICE_RELATIONS {
5839 ULONG Count;
5840 PDEVICE_OBJECT Objects[1];
5841 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
5842
5843 typedef struct _DEVOBJ_EXTENSION {
5844 CSHORT Type;
5845 USHORT Size;
5846 PDEVICE_OBJECT DeviceObject;
5847 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
5848
5849 typedef struct _SCATTER_GATHER_ELEMENT {
5850 PHYSICAL_ADDRESS Address;
5851 ULONG Length;
5852 ULONG_PTR Reserved;
5853 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
5854
5855 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
5856
5857 #if defined(_MSC_VER)
5858 #if _MSC_VER >= 1200
5859 #pragma warning(push)
5860 #endif
5861 #pragma warning(disable:4200)
5862 #endif /* _MSC_VER */
5863
5864 typedef struct _SCATTER_GATHER_LIST {
5865 ULONG NumberOfElements;
5866 ULONG_PTR Reserved;
5867 SCATTER_GATHER_ELEMENT Elements[1];
5868 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
5869
5870 #if defined(_MSC_VER)
5871 #if _MSC_VER >= 1200
5872 #pragma warning(pop)
5873 #else
5874 #pragma warning(default:4200)
5875 #endif
5876 #endif /* _MSC_VER */
5877
5878 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5879
5880 struct _SCATTER_GATHER_LIST;
5881 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
5882
5883 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5884
5885 _Function_class_(DRIVER_ADD_DEVICE)
5886 _IRQL_requires_(PASSIVE_LEVEL)
5887 _IRQL_requires_same_
5888 _When_(return>=0, _Kernel_clear_do_init_(__yes))
5889 typedef NTSTATUS
5890 (NTAPI DRIVER_ADD_DEVICE)(
5891 _In_ struct _DRIVER_OBJECT *DriverObject,
5892 _In_ struct _DEVICE_OBJECT *PhysicalDeviceObject);
5893 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
5894
5895 typedef struct _DRIVER_EXTENSION {
5896 struct _DRIVER_OBJECT *DriverObject;
5897 PDRIVER_ADD_DEVICE AddDevice;
5898 ULONG Count;
5899 UNICODE_STRING ServiceKeyName;
5900 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
5901
5902 #define DRVO_UNLOAD_INVOKED 0x00000001
5903 #define DRVO_LEGACY_DRIVER 0x00000002
5904 #define DRVO_BUILTIN_DRIVER 0x00000004
5905
5906 _Function_class_(DRIVER_INITIALIZE)
5907 _IRQL_requires_same_
5908 typedef NTSTATUS
5909 (NTAPI DRIVER_INITIALIZE)(
5910 _In_ struct _DRIVER_OBJECT *DriverObject,
5911 _In_ PUNICODE_STRING RegistryPath);
5912 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
5913
5914 _Function_class_(DRIVER_STARTIO)
5915 _IRQL_always_function_min_(DISPATCH_LEVEL)
5916 _IRQL_requires_(DISPATCH_LEVEL)
5917 _IRQL_requires_same_
5918 typedef VOID
5919 (NTAPI DRIVER_STARTIO)(
5920 _Inout_ struct _DEVICE_OBJECT *DeviceObject,
5921 _Inout_ struct _IRP *Irp);
5922 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
5923
5924 _Function_class_(DRIVER_UNLOAD)
5925 _IRQL_requires_(PASSIVE_LEVEL)
5926 _IRQL_requires_same_
5927 typedef VOID
5928 (NTAPI DRIVER_UNLOAD)(
5929 _In_ struct _DRIVER_OBJECT *DriverObject);
5930 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
5931
5932 _Function_class_(DRIVER_DISPATCH)
5933 _IRQL_requires_(PASSIVE_LEVEL)
5934 _IRQL_requires_same_
5935 typedef NTSTATUS
5936 (NTAPI DRIVER_DISPATCH)(
5937 _In_ struct _DEVICE_OBJECT *DeviceObject,
5938 _Inout_ struct _IRP *Irp);
5939 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
5940
5941 typedef struct _DRIVER_OBJECT {
5942 CSHORT Type;
5943 CSHORT Size;
5944 PDEVICE_OBJECT DeviceObject;
5945 ULONG Flags;
5946 PVOID DriverStart;
5947 ULONG DriverSize;
5948 PVOID DriverSection;
5949 PDRIVER_EXTENSION DriverExtension;
5950 UNICODE_STRING DriverName;
5951 PUNICODE_STRING HardwareDatabase;
5952 struct _FAST_IO_DISPATCH *FastIoDispatch;
5953 PDRIVER_INITIALIZE DriverInit;
5954 PDRIVER_STARTIO DriverStartIo;
5955 PDRIVER_UNLOAD DriverUnload;
5956 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
5957 } DRIVER_OBJECT, *PDRIVER_OBJECT;
5958
5959 typedef struct _DMA_ADAPTER {
5960 USHORT Version;
5961 USHORT Size;
5962 struct _DMA_OPERATIONS* DmaOperations;
5963 } DMA_ADAPTER, *PDMA_ADAPTER;
5964
5965 typedef VOID
5966 (NTAPI *PPUT_DMA_ADAPTER)(
5967 PDMA_ADAPTER DmaAdapter);
5968
5969 typedef PVOID
5970 (NTAPI *PALLOCATE_COMMON_BUFFER)(
5971 _In_ PDMA_ADAPTER DmaAdapter,
5972 _In_ ULONG Length,
5973 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
5974 _In_ BOOLEAN CacheEnabled);
5975
5976 typedef VOID
5977 (NTAPI *PFREE_COMMON_BUFFER)(
5978 _In_ PDMA_ADAPTER DmaAdapter,
5979 _In_ ULONG Length,
5980 _In_ PHYSICAL_ADDRESS LogicalAddress,
5981 _In_ PVOID VirtualAddress,
5982 _In_ BOOLEAN CacheEnabled);
5983
5984 typedef NTSTATUS
5985 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
5986 _In_ PDMA_ADAPTER DmaAdapter,
5987 _In_ PDEVICE_OBJECT DeviceObject,
5988 _In_ ULONG NumberOfMapRegisters,
5989 _In_ PDRIVER_CONTROL ExecutionRoutine,
5990 _In_ PVOID Context);
5991
5992 typedef BOOLEAN
5993 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
5994 _In_ PDMA_ADAPTER DmaAdapter,
5995 _In_ PMDL Mdl,
5996 _In_ PVOID MapRegisterBase,
5997 _In_ PVOID CurrentVa,
5998 _In_ ULONG Length,
5999 _In_ BOOLEAN WriteToDevice);
6000
6001 typedef VOID
6002 (NTAPI *PFREE_ADAPTER_CHANNEL)(
6003 _In_ PDMA_ADAPTER DmaAdapter);
6004
6005 typedef VOID
6006 (NTAPI *PFREE_MAP_REGISTERS)(
6007 _In_ PDMA_ADAPTER DmaAdapter,
6008 PVOID MapRegisterBase,
6009 ULONG NumberOfMapRegisters);
6010
6011 typedef PHYSICAL_ADDRESS
6012 (NTAPI *PMAP_TRANSFER)(
6013 _In_ PDMA_ADAPTER DmaAdapter,
6014 _In_ PMDL Mdl,
6015 _In_ PVOID MapRegisterBase,
6016 _In_ PVOID CurrentVa,
6017 _Inout_ PULONG Length,
6018 _In_ BOOLEAN WriteToDevice);
6019
6020 typedef ULONG
6021 (NTAPI *PGET_DMA_ALIGNMENT)(
6022 _In_ PDMA_ADAPTER DmaAdapter);
6023
6024 typedef ULONG
6025 (NTAPI *PREAD_DMA_COUNTER)(
6026 _In_ PDMA_ADAPTER DmaAdapter);
6027
6028 _Function_class_(DRIVER_LIST_CONTROL)
6029 _IRQL_requires_same_
6030 typedef VOID
6031 (NTAPI DRIVER_LIST_CONTROL)(
6032 _In_ struct _DEVICE_OBJECT *DeviceObject,
6033 _In_ struct _IRP *Irp,
6034 _In_ struct _SCATTER_GATHER_LIST *ScatterGather,
6035 _In_ PVOID Context);
6036 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
6037
6038 typedef NTSTATUS
6039 (NTAPI *PGET_SCATTER_GATHER_LIST)(
6040 _In_ PDMA_ADAPTER DmaAdapter,
6041 _In_ PDEVICE_OBJECT DeviceObject,
6042 _In_ PMDL Mdl,
6043 _In_ PVOID CurrentVa,
6044 _In_ ULONG Length,
6045 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
6046 _In_ PVOID Context,
6047 _In_ BOOLEAN WriteToDevice);
6048
6049 typedef VOID
6050 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
6051 _In_ PDMA_ADAPTER DmaAdapter,
6052 _In_ PSCATTER_GATHER_LIST ScatterGather,
6053 _In_ BOOLEAN WriteToDevice);
6054
6055 typedef NTSTATUS
6056 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
6057 _In_ PDMA_ADAPTER DmaAdapter,
6058 _In_ PMDL Mdl OPTIONAL,
6059 _In_ PVOID CurrentVa,
6060 _In_ ULONG Length,
6061 _Out_ PULONG ScatterGatherListSize,
6062 _Out_ OPTIONAL PULONG pNumberOfMapRegisters);
6063
6064 typedef NTSTATUS
6065 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
6066 _In_ PDMA_ADAPTER DmaAdapter,
6067 _In_ PDEVICE_OBJECT DeviceObject,
6068 _In_ PMDL Mdl,
6069 _In_ PVOID CurrentVa,
6070 _In_ ULONG Length,
6071 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
6072 _In_ PVOID Context,
6073 _In_ BOOLEAN WriteToDevice,
6074 _In_ PVOID ScatterGatherBuffer,
6075 _In_ ULONG ScatterGatherLength);
6076
6077 typedef NTSTATUS
6078 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
6079 _In_ PDMA_ADAPTER DmaAdapter,
6080 _In_ PSCATTER_GATHER_LIST ScatterGather,
6081 _In_ PMDL OriginalMdl,
6082 _Out_ PMDL *TargetMdl);
6083
6084 typedef struct _DMA_OPERATIONS {
6085 ULONG Size;
6086 PPUT_DMA_ADAPTER PutDmaAdapter;
6087 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
6088 PFREE_COMMON_BUFFER FreeCommonBuffer;
6089 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
6090 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
6091 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
6092 PFREE_MAP_REGISTERS FreeMapRegisters;
6093 PMAP_TRANSFER MapTransfer;
6094 PGET_DMA_ALIGNMENT GetDmaAlignment;
6095 PREAD_DMA_COUNTER ReadDmaCounter;
6096 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
6097 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
6098 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
6099 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
6100 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
6101 } DMA_OPERATIONS, *PDMA_OPERATIONS;
6102
6103 typedef struct _IO_RESOURCE_DESCRIPTOR {
6104 UCHAR Option;
6105 UCHAR Type;
6106 UCHAR ShareDisposition;
6107 UCHAR Spare1;
6108 USHORT Flags;
6109 USHORT Spare2;
6110 union {
6111 struct {
6112 ULONG Length;
6113 ULONG Alignment;
6114 PHYSICAL_ADDRESS MinimumAddress;
6115 PHYSICAL_ADDRESS MaximumAddress;
6116 } Port;
6117 struct {
6118 ULONG Length;
6119 ULONG Alignment;
6120 PHYSICAL_ADDRESS MinimumAddress;
6121 PHYSICAL_ADDRESS MaximumAddress;
6122 } Memory;
6123 struct {
6124 ULONG MinimumVector;
6125 ULONG MaximumVector;
6126 } Interrupt;
6127 struct {
6128 ULONG MinimumChannel;
6129 ULONG MaximumChannel;
6130 } Dma;
6131 struct {
6132 ULONG Length;
6133 ULONG Alignment;
6134 PHYSICAL_ADDRESS MinimumAddress;
6135 PHYSICAL_ADDRESS MaximumAddress;
6136 } Generic;
6137 struct {
6138 ULONG Data[3];
6139 } DevicePrivate;
6140 struct {
6141 ULONG Length;
6142 ULONG MinBusNumber;
6143 ULONG MaxBusNumber;
6144 ULONG Reserved;
6145 } BusNumber;
6146 struct {
6147 ULONG Priority;
6148 ULONG Reserved1;
6149 ULONG Reserved2;
6150 } ConfigData;
6151 } u;
6152 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
6153
6154 typedef struct _IO_RESOURCE_LIST {
6155 USHORT Version;
6156 USHORT Revision;
6157 ULONG Count;
6158 IO_RESOURCE_DESCRIPTOR Descriptors[1];
6159 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
6160
6161 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
6162 ULONG ListSize;
6163 INTERFACE_TYPE InterfaceType;
6164 ULONG BusNumber;
6165 ULONG SlotNumber;
6166 ULONG Reserved[3];
6167 ULONG AlternativeLists;
6168 IO_RESOURCE_LIST List[1];
6169 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
6170
6171 _Function_class_(DRIVER_CANCEL)
6172 _Requires_lock_held_(_Global_cancel_spin_lock_)
6173 _Releases_lock_(_Global_cancel_spin_lock_)
6174 _IRQL_requires_min_(DISPATCH_LEVEL)
6175 _IRQL_requires_(DISPATCH_LEVEL)
6176 typedef VOID
6177 (NTAPI DRIVER_CANCEL)(
6178 _Inout_ struct _DEVICE_OBJECT *DeviceObject,
6179 _Inout_ _IRQL_uses_cancel_ struct _IRP *Irp);
6180 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
6181
6182 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP {
6183 CSHORT Type;
6184 USHORT Size;
6185 struct _MDL *MdlAddress;
6186 ULONG Flags;
6187 union {
6188 struct _IRP *MasterIrp;
6189 volatile LONG IrpCount;
6190 PVOID SystemBuffer;
6191 } AssociatedIrp;
6192 LIST_ENTRY ThreadListEntry;
6193 IO_STATUS_BLOCK IoStatus;
6194 KPROCESSOR_MODE RequestorMode;
6195 BOOLEAN PendingReturned;
6196 CHAR StackCount;
6197 CHAR CurrentLocation;
6198 BOOLEAN Cancel;
6199 KIRQL CancelIrql;
6200 CCHAR ApcEnvironment;
6201 UCHAR AllocationFlags;
6202 PIO_STATUS_BLOCK UserIosb;
6203 PKEVENT UserEvent;
6204 union {
6205 struct {
6206 _ANONYMOUS_UNION union {
6207 PIO_APC_ROUTINE UserApcRoutine;
6208 PVOID IssuingProcess;
6209 } DUMMYUNIONNAME;
6210 PVOID UserApcContext;
6211 } AsynchronousParameters;
6212 LARGE_INTEGER AllocationSize;
6213 } Overlay;
6214 volatile PDRIVER_CANCEL CancelRoutine;
6215 PVOID UserBuffer;
6216 union {
6217 struct {
6218 _ANONYMOUS_UNION union {
6219 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
6220 _ANONYMOUS_STRUCT struct {
6221 PVOID DriverContext[4];
6222 } DUMMYSTRUCTNAME;
6223 } DUMMYUNIONNAME;
6224 PETHREAD Thread;
6225 PCHAR AuxiliaryBuffer;
6226 _ANONYMOUS_STRUCT struct {
6227 LIST_ENTRY ListEntry;
6228 _ANONYMOUS_UNION union {
6229 struct _IO_STACK_LOCATION *CurrentStackLocation;
6230 ULONG PacketType;
6231 } DUMMYUNIONNAME;
6232 } DUMMYSTRUCTNAME;
6233 struct _FILE_OBJECT *OriginalFileObject;
6234 } Overlay;
6235 KAPC Apc;
6236 PVOID CompletionKey;
6237 } Tail;
6238 } IRP, *PIRP;
6239
6240 typedef enum _IO_PAGING_PRIORITY {
6241 IoPagingPriorityInvalid,
6242 IoPagingPriorityNormal,
6243 IoPagingPriorityHigh,
6244 IoPagingPriorityReserved1,
6245 IoPagingPriorityReserved2
6246 } IO_PAGING_PRIORITY;
6247
6248 _Function_class_(IO_COMPLETION_ROUTINE)
6249 _IRQL_requires_same_
6250 typedef NTSTATUS
6251 (NTAPI IO_COMPLETION_ROUTINE)(
6252 _In_ struct _DEVICE_OBJECT *DeviceObject,
6253 _In_ struct _IRP *Irp,
6254 _In_opt_ PVOID Context);
6255 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
6256
6257 _Function_class_(IO_DPC_ROUTINE)
6258 _IRQL_always_function_min_(DISPATCH_LEVEL)
6259 _IRQL_requires_(DISPATCH_LEVEL)
6260 _IRQL_requires_same_
6261 typedef VOID
6262 (NTAPI IO_DPC_ROUTINE)(
6263 _In_ struct _KDPC *Dpc,
6264 _In_ struct _DEVICE_OBJECT *DeviceObject,
6265 _Inout_ struct _IRP *Irp,
6266 _In_opt_ PVOID Context);
6267 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
6268
6269 typedef NTSTATUS
6270 (NTAPI *PMM_DLL_INITIALIZE)(
6271 _In_ PUNICODE_STRING RegistryPath);
6272
6273 typedef NTSTATUS
6274 (NTAPI *PMM_DLL_UNLOAD)(
6275 VOID);
6276
6277 _Function_class_(IO_TIMER_ROUTINE)
6278 _IRQL_requires_same_
6279 typedef VOID
6280 (NTAPI IO_TIMER_ROUTINE)(
6281 _In_ struct _DEVICE_OBJECT *DeviceObject,
6282 _In_opt_ PVOID Context);
6283 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
6284
6285 typedef struct _IO_SECURITY_CONTEXT {
6286 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
6287 PACCESS_STATE AccessState;
6288 ACCESS_MASK DesiredAccess;
6289 ULONG FullCreateOptions;
6290 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
6291
6292 struct _IO_CSQ;
6293
6294 typedef struct _IO_CSQ_IRP_CONTEXT {
6295 ULONG Type;
6296 struct _IRP *Irp;
6297 struct _IO_CSQ *Csq;
6298 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
6299
6300 typedef VOID
6301 (NTAPI *PIO_CSQ_INSERT_IRP)(
6302 _In_ struct _IO_CSQ *Csq,
6303 _In_ PIRP Irp);
6304
6305 typedef NTSTATUS
6306 (NTAPI IO_CSQ_INSERT_IRP_EX)(
6307 _In_ struct _IO_CSQ *Csq,
6308 _In_ PIRP Irp,
6309 _In_ PVOID InsertContext);
6310 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
6311
6312 typedef VOID
6313 (NTAPI *PIO_CSQ_REMOVE_IRP)(
6314 _In_ struct _IO_CSQ *Csq,
6315 _In_ PIRP Irp);
6316
6317 typedef PIRP
6318 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
6319 _In_ struct _IO_CSQ *Csq,
6320 _In_ PIRP Irp,
6321 _In_ PVOID PeekContext);
6322
6323 typedef VOID
6324 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
6325 _In_ struct _IO_CSQ *Csq,
6326 _Out_ PKIRQL Irql);
6327
6328 typedef VOID
6329 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
6330 _In_ struct _IO_CSQ *Csq,
6331 _In_ KIRQL Irql);
6332
6333 typedef VOID
6334 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
6335 _In_ struct _IO_CSQ *Csq,
6336 _In_ PIRP Irp);
6337
6338 typedef struct _IO_CSQ {
6339 ULONG Type;
6340 PIO_CSQ_INSERT_IRP CsqInsertIrp;
6341 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
6342 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
6343 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
6344 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
6345 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
6346 PVOID ReservePointer;
6347 } IO_CSQ, *PIO_CSQ;
6348
6349 typedef enum _BUS_QUERY_ID_TYPE {
6350 BusQueryDeviceID,
6351 BusQueryHardwareIDs,
6352 BusQueryCompatibleIDs,
6353 BusQueryInstanceID,
6354 BusQueryDeviceSerialNumber
6355 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
6356
6357 typedef enum _DEVICE_TEXT_TYPE {
6358 DeviceTextDescription,
6359 DeviceTextLocationInformation
6360 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
6361
6362 typedef BOOLEAN
6363 (NTAPI *PGPE_SERVICE_ROUTINE)(
6364 PVOID,
6365 PVOID);
6366
6367 _IRQL_requires_max_(DISPATCH_LEVEL)
6368 _Must_inspect_result_
6369 typedef NTSTATUS
6370 (NTAPI *PGPE_CONNECT_VECTOR)(
6371 PDEVICE_OBJECT,
6372 ULONG,
6373 KINTERRUPT_MODE,
6374 BOOLEAN,
6375 PGPE_SERVICE_ROUTINE,
6376 PVOID,
6377 PVOID);
6378
6379 _IRQL_requires_max_(DISPATCH_LEVEL)
6380 _Must_inspect_result_
6381 typedef NTSTATUS
6382 (NTAPI *PGPE_DISCONNECT_VECTOR)(
6383 PVOID);
6384
6385 _IRQL_requires_max_(DISPATCH_LEVEL)
6386 _Must_inspect_result_
6387 typedef NTSTATUS
6388 (NTAPI *PGPE_ENABLE_EVENT)(
6389 PDEVICE_OBJECT,
6390 PVOID);
6391
6392 _IRQL_requires_max_(DISPATCH_LEVEL)
6393 _Must_inspect_result_
6394 typedef NTSTATUS
6395 (NTAPI *PGPE_DISABLE_EVENT)(
6396 PDEVICE_OBJECT,
6397 PVOID);
6398
6399 _IRQL_requires_max_(DISPATCH_LEVEL)
6400 _Must_inspect_result_
6401 typedef NTSTATUS
6402 (NTAPI *PGPE_CLEAR_STATUS)(
6403 PDEVICE_OBJECT,
6404 PVOID);
6405
6406 typedef VOID
6407 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
6408 PVOID,
6409 ULONG);
6410
6411 _IRQL_requires_max_(DISPATCH_LEVEL)
6412 _Must_inspect_result_
6413 typedef NTSTATUS
6414 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6415 PDEVICE_OBJECT,
6416 PDEVICE_NOTIFY_CALLBACK,
6417 PVOID);
6418
6419 _IRQL_requires_max_(DISPATCH_LEVEL)
6420 typedef VOID
6421 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6422 PDEVICE_OBJECT,
6423 PDEVICE_NOTIFY_CALLBACK);
6424
6425 typedef struct _ACPI_INTERFACE_STANDARD {
6426 USHORT Size;
6427 USHORT Version;
6428 PVOID Context;
6429 PINTERFACE_REFERENCE InterfaceReference;
6430 PINTERFACE_DEREFERENCE InterfaceDereference;
6431 PGPE_CONNECT_VECTOR GpeConnectVector;
6432 PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
6433 PGPE_ENABLE_EVENT GpeEnableEvent;
6434 PGPE_DISABLE_EVENT GpeDisableEvent;
6435 PGPE_CLEAR_STATUS GpeClearStatus;
6436 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
6437 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
6438 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
6439
6440 typedef BOOLEAN
6441 (NTAPI *PGPE_SERVICE_ROUTINE2)(
6442 PVOID ObjectContext,
6443 PVOID ServiceContext);
6444
6445 _IRQL_requires_max_(DISPATCH_LEVEL)
6446 _Must_inspect_result_
6447 typedef NTSTATUS
6448 (NTAPI *PGPE_CONNECT_VECTOR2)(
6449 PVOID Context,
6450 ULONG GpeNumber,
6451 KINTERRUPT_MODE Mode,
6452 BOOLEAN Shareable,
6453 PGPE_SERVICE_ROUTINE ServiceRoutine,
6454 PVOID ServiceContext,
6455 PVOID *ObjectContext);
6456
6457 _IRQL_requires_max_(DISPATCH_LEVEL)
6458 _Must_inspect_result_
6459 typedef NTSTATUS
6460 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
6461 PVOID Context,
6462 PVOID ObjectContext);
6463
6464 _IRQL_requires_max_(DISPATCH_LEVEL)
6465 _Must_inspect_result_
6466 typedef NTSTATUS
6467 (NTAPI *PGPE_ENABLE_EVENT2)(
6468 PVOID Context,
6469 PVOID ObjectContext);
6470
6471 _IRQL_requires_max_(DISPATCH_LEVEL)
6472 _Must_inspect_result_
6473 typedef NTSTATUS
6474 (NTAPI *PGPE_DISABLE_EVENT2)(
6475 PVOID Context,
6476 PVOID ObjectContext);
6477
6478 _IRQL_requires_max_(DISPATCH_LEVEL)
6479 _Must_inspect_result_
6480 typedef NTSTATUS
6481 (NTAPI *PGPE_CLEAR_STATUS2)(
6482 PVOID Context,
6483 PVOID ObjectContext);
6484
6485 _IRQL_requires_max_(DISPATCH_LEVEL)
6486 typedef VOID
6487 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
6488 PVOID NotificationContext,
6489 ULONG NotifyCode);
6490
6491 _IRQL_requires_max_(DISPATCH_LEVEL)
6492 _Must_inspect_result_
6493 typedef NTSTATUS
6494 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6495 PVOID Context,
6496 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
6497 PVOID NotificationContext);
6498
6499 _IRQL_requires_max_(DISPATCH_LEVEL)
6500 typedef VOID
6501 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6502 PVOID Context);
6503
6504 typedef struct _ACPI_INTERFACE_STANDARD2 {
6505 USHORT Size;
6506 USHORT Version;
6507 PVOID Context;
6508 PINTERFACE_REFERENCE InterfaceReference;
6509 PINTERFACE_DEREFERENCE InterfaceDereference;
6510 PGPE_CONNECT_VECTOR2 GpeConnectVector;
6511 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
6512 PGPE_ENABLE_EVENT2 GpeEnableEvent;
6513 PGPE_DISABLE_EVENT2 GpeDisableEvent;
6514 PGPE_CLEAR_STATUS2 GpeClearStatus;
6515 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
6516 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
6517 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
6518
6519 #if !defined(_AMD64_) && !defined(_IA64_)
6520 #include <pshpack4.h>
6521 #endif
6522 typedef struct _IO_STACK_LOCATION {
6523 UCHAR MajorFunction;
6524 UCHAR MinorFunction;
6525 UCHAR Flags;
6526 UCHAR Control;
6527 union {
6528 struct {
6529 PIO_SECURITY_CONTEXT SecurityContext;
6530 ULONG Options;
6531 USHORT POINTER_ALIGNMENT FileAttributes;
6532 USHORT ShareAccess;
6533 ULONG POINTER_ALIGNMENT EaLength;
6534 } Create;
6535 struct {
6536 ULONG Length;
6537 ULONG POINTER_ALIGNMENT Key;
6538 LARGE_INTEGER ByteOffset;
6539 } Read;
6540 struct {
6541 ULONG Length;
6542 ULONG POINTER_ALIGNMENT Key;
6543 LARGE_INTEGER ByteOffset;
6544 } Write;
6545 struct {
6546 ULONG Length;
6547 PUNICODE_STRING FileName;
6548 FILE_INFORMATION_CLASS FileInformationClass;
6549 ULONG FileIndex;
6550 } QueryDirectory;
6551 struct {
6552 ULONG Length;
6553 ULONG CompletionFilter;
6554 } NotifyDirectory;
6555 struct {
6556 ULONG Length;
6557 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
6558 } QueryFile;
6559 struct {
6560 ULONG Length;
6561 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
6562 PFILE_OBJECT FileObject;
6563 _ANONYMOUS_UNION union {
6564 _ANONYMOUS_STRUCT struct {
6565 BOOLEAN ReplaceIfExists;
6566 BOOLEAN AdvanceOnly;
6567 } DUMMYSTRUCTNAME;
6568 ULONG ClusterCount;
6569 HANDLE DeleteHandle;
6570 } DUMMYUNIONNAME;
6571 } SetFile;
6572 struct {
6573 ULONG Length;
6574 PVOID EaList;
6575 ULONG EaListLength;
6576 ULONG EaIndex;
6577 } QueryEa;
6578 struct {
6579 ULONG Length;
6580 } SetEa;
6581 struct {
6582 ULONG Length;
6583 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
6584 } QueryVolume;
6585 struct {
6586 ULONG Length;
6587 FS_INFORMATION_CLASS FsInformationClass;
6588 } SetVolume;
6589 struct {
6590 ULONG OutputBufferLength;
6591 ULONG InputBufferLength;
6592 ULONG FsControlCode;
6593 PVOID Type3InputBuffer;
6594 } FileSystemControl;
6595 struct {
6596 PLARGE_INTEGER Length;
6597 ULONG Key;
6598 LARGE_INTEGER ByteOffset;
6599 } LockControl;
6600 struct {
6601 ULONG OutputBufferLength;
6602 ULONG POINTER_ALIGNMENT InputBufferLength;
6603 ULONG POINTER_ALIGNMENT IoControlCode;
6604 PVOID Type3InputBuffer;
6605 } DeviceIoControl;
6606 struct {
6607 SECURITY_INFORMATION SecurityInformation;
6608 ULONG POINTER_ALIGNMENT Length;
6609 } QuerySecurity;
6610 struct {
6611 SECURITY_INFORMATION SecurityInformation;
6612 PSECURITY_DESCRIPTOR SecurityDescriptor;
6613 } SetSecurity;
6614 struct {
6615 PVPB Vpb;
6616 PDEVICE_OBJECT DeviceObject;
6617 } MountVolume;
6618 struct {
6619 PVPB Vpb;
6620 PDEVICE_OBJECT DeviceObject;
6621 } VerifyVolume;
6622 struct {
6623 struct _SCSI_REQUEST_BLOCK *Srb;
6624 } Scsi;
6625 struct {
6626 ULONG Length;
6627 PSID StartSid;
6628 struct _FILE_GET_QUOTA_INFORMATION *SidList;
6629 ULONG SidListLength;
6630 } QueryQuota;
6631 struct {
6632 ULONG Length;
6633 } SetQuota;
6634 struct {
6635 DEVICE_RELATION_TYPE Type;
6636 } QueryDeviceRelations;
6637 struct {
6638 CONST GUID *InterfaceType;
6639 USHORT Size;
6640 USHORT Version;
6641 PINTERFACE Interface;
6642 PVOID InterfaceSpecificData;
6643 } QueryInterface;
6644 struct {
6645 PDEVICE_CAPABILITIES Capabilities;
6646 } DeviceCapabilities;
6647 struct {
6648 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
6649 } FilterResourceRequirements;
6650 struct {
6651 ULONG WhichSpace;
6652 PVOID Buffer;
6653 ULONG Offset;
6654 ULONG POINTER_ALIGNMENT Length;
6655 } ReadWriteConfig;
6656 struct {
6657 BOOLEAN Lock;
6658 } SetLock;
6659 struct {
6660 BUS_QUERY_ID_TYPE IdType;
6661 } QueryId;
6662 struct {
6663 DEVICE_TEXT_TYPE DeviceTextType;
6664 LCID POINTER_ALIGNMENT LocaleId;
6665 } QueryDeviceText;
6666 struct {
6667 BOOLEAN InPath;
6668 BOOLEAN Reserved[3];
6669 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
6670 } UsageNotification;
6671 struct {
6672 SYSTEM_POWER_STATE PowerState;
6673 } WaitWake;
6674 struct {
6675 PPOWER_SEQUENCE PowerSequence;
6676 } PowerSequence;
6677 struct {
6678 ULONG SystemContext;
6679 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
6680 POWER_STATE POINTER_ALIGNMENT State;
6681 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
6682 } Power;
6683 struct {
6684 PCM_RESOURCE_LIST AllocatedResources;
6685 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
6686 } StartDevice;
6687 struct {
6688 ULONG_PTR ProviderId;
6689 PVOID DataPath;
6690 ULONG BufferSize;
6691 PVOID Buffer;
6692 } WMI;
6693 struct {
6694 PVOID Argument1;
6695 PVOID Argument2;
6696 PVOID Argument3;
6697 PVOID Argument4;
6698 } Others;
6699 } Parameters;
6700 PDEVICE_OBJECT DeviceObject;
6701 PFILE_OBJECT FileObject;
6702 PIO_COMPLETION_ROUTINE CompletionRoutine;
6703 PVOID Context;
6704 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
6705 #if !defined(_AMD64_) && !defined(_IA64_)
6706 #include <poppack.h>
6707 #endif
6708
6709 /* IO_STACK_LOCATION.Control */
6710
6711 #define SL_PENDING_RETURNED 0x01
6712 #define SL_ERROR_RETURNED 0x02
6713 #define SL_INVOKE_ON_CANCEL 0x20
6714 #define SL_INVOKE_ON_SUCCESS 0x40
6715 #define SL_INVOKE_ON_ERROR 0x80
6716
6717 #define METHOD_BUFFERED 0
6718 #define METHOD_IN_DIRECT 1
6719 #define METHOD_OUT_DIRECT 2
6720 #define METHOD_NEITHER 3
6721
6722 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
6723 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
6724
6725 #define FILE_SUPERSEDED 0x00000000
6726 #define FILE_OPENED 0x00000001
6727 #define FILE_CREATED 0x00000002
6728 #define FILE_OVERWRITTEN 0x00000003
6729 #define FILE_EXISTS 0x00000004
6730 #define FILE_DOES_NOT_EXIST 0x00000005
6731
6732 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
6733 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
6734
6735 /* also in winnt.h */
6736 #define FILE_LIST_DIRECTORY 0x00000001
6737 #define FILE_READ_DATA 0x00000001
6738 #define FILE_ADD_FILE 0x00000002
6739 #define FILE_WRITE_DATA 0x00000002
6740 #define FILE_ADD_SUBDIRECTORY 0x00000004
6741 #define FILE_APPEND_DATA 0x00000004
6742 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
6743 #define FILE_READ_EA 0x00000008
6744 #define FILE_WRITE_EA 0x00000010
6745 #define FILE_EXECUTE 0x00000020
6746 #define FILE_TRAVERSE 0x00000020
6747 #define FILE_DELETE_CHILD 0x00000040
6748 #define FILE_READ_ATTRIBUTES 0x00000080
6749 #define FILE_WRITE_ATTRIBUTES 0x00000100
6750
6751 #define FILE_SHARE_READ 0x00000001
6752 #define FILE_SHARE_WRITE 0x00000002
6753 #define FILE_SHARE_DELETE 0x00000004
6754 #define FILE_SHARE_VALID_FLAGS 0x00000007
6755
6756 #define FILE_ATTRIBUTE_READONLY 0x00000001
6757 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
6758 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
6759 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
6760 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
6761 #define FILE_ATTRIBUTE_DEVICE 0x00000040
6762 #define FILE_ATTRIBUTE_NORMAL 0x00000080
6763 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
6764 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
6765 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
6766 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
6767 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
6768 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
6769 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
6770 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
6771
6772 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
6773 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
6774
6775 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
6776 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
6777 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
6778 #define FILE_VALID_SET_FLAGS 0x00000036
6779
6780 #define FILE_SUPERSEDE 0x00000000
6781 #define FILE_OPEN 0x00000001
6782 #define FILE_CREATE 0x00000002
6783 #define FILE_OPEN_IF 0x00000003
6784 #define FILE_OVERWRITE 0x00000004
6785 #define FILE_OVERWRITE_IF 0x00000005
6786 #define FILE_MAXIMUM_DISPOSITION 0x00000005
6787
6788 #define FILE_DIRECTORY_FILE 0x00000001
6789 #define FILE_WRITE_THROUGH 0x00000002
6790 #define FILE_SEQUENTIAL_ONLY 0x00000004
6791 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
6792 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
6793 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
6794 #define FILE_NON_DIRECTORY_FILE 0x00000040
6795 #define FILE_CREATE_TREE_CONNECTION 0x00000080
6796 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
6797 #define FILE_NO_EA_KNOWLEDGE 0x00000200
6798 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
6799 #define FILE_RANDOM_ACCESS 0x00000800
6800 #define FILE_DELETE_ON_CLOSE 0x00001000
6801 #define FILE_OPEN_BY_FILE_ID 0x00002000
6802 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
6803 #define FILE_NO_COMPRESSION 0x00008000
6804 #if (NTDDI_VERSION >= NTDDI_WIN7)
6805 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
6806 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
6807 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
6808 #define FILE_RESERVE_OPFILTER 0x00100000
6809 #define FILE_OPEN_REPARSE_POINT 0x00200000
6810 #define FILE_OPEN_NO_RECALL 0x00400000
6811 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
6812
6813 #define FILE_ANY_ACCESS 0x00000000
6814 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
6815 #define FILE_READ_ACCESS 0x00000001
6816 #define FILE_WRITE_ACCESS 0x00000002
6817
6818 #define FILE_ALL_ACCESS \
6819 (STANDARD_RIGHTS_REQUIRED | \
6820 SYNCHRONIZE | \
6821 0x1FF)
6822
6823 #define FILE_GENERIC_EXECUTE \
6824 (STANDARD_RIGHTS_EXECUTE | \
6825 FILE_READ_ATTRIBUTES | \
6826 FILE_EXECUTE | \
6827 SYNCHRONIZE)
6828
6829 #define FILE_GENERIC_READ \
6830 (STANDARD_RIGHTS_READ | \
6831 FILE_READ_DATA | \
6832 FILE_READ_ATTRIBUTES | \
6833 FILE_READ_EA | \
6834 SYNCHRONIZE)
6835
6836 #define FILE_GENERIC_WRITE \
6837 (STANDARD_RIGHTS_WRITE | \
6838 FILE_WRITE_DATA | \
6839 FILE_WRITE_ATTRIBUTES | \
6840 FILE_WRITE_EA | \
6841 FILE_APPEND_DATA | \
6842 SYNCHRONIZE)
6843
6844 /* end winnt.h */
6845
6846 #define WMIREG_ACTION_REGISTER 1
6847 #define WMIREG_ACTION_DEREGISTER 2
6848 #define WMIREG_ACTION_REREGISTER 3
6849 #define WMIREG_ACTION_UPDATE_GUIDS 4
6850 #define WMIREG_ACTION_BLOCK_IRPS 5
6851
6852 #define WMIREGISTER 0
6853 #define WMIUPDATE 1
6854
6855 _Function_class_(WMI_NOTIFICATION_CALLBACK)
6856 _IRQL_requires_same_
6857 typedef VOID
6858 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
6859 PVOID Wnode,
6860 PVOID Context);
6861 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
6862
6863 #ifndef _PCI_X_
6864 #define _PCI_X_
6865
6866 typedef struct _PCI_SLOT_NUMBER {
6867 union {
6868 struct {
6869 ULONG DeviceNumber:5;
6870 ULONG FunctionNumber:3;
6871 ULONG Reserved:24;
6872 } bits;
6873 ULONG AsULONG;
6874 } u;
6875 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
6876
6877 #define PCI_TYPE0_ADDRESSES 6
6878 #define PCI_TYPE1_ADDRESSES 2
6879 #define PCI_TYPE2_ADDRESSES 5
6880
6881 typedef struct _PCI_COMMON_HEADER {
6882 PCI_COMMON_HEADER_LAYOUT
6883 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
6884
6885 #ifdef __cplusplus
6886 typedef struct _PCI_COMMON_CONFIG {
6887 PCI_COMMON_HEADER_LAYOUT
6888 UCHAR DeviceSpecific[192];
6889 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
6890 #else
6891 typedef struct _PCI_COMMON_CONFIG {
6892 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
6893 UCHAR DeviceSpecific[192];
6894 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
6895 #endif
6896
6897 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
6898
6899 #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
6900
6901 #define PCI_MAX_DEVICES 32
6902 #define PCI_MAX_FUNCTION 8
6903 #define PCI_MAX_BRIDGE_NUMBER 0xFF
6904 #define PCI_INVALID_VENDORID 0xFFFF
6905
6906 /* PCI_COMMON_CONFIG.HeaderType */
6907 #define PCI_MULTIFUNCTION 0x80
6908 #define PCI_DEVICE_TYPE 0x00
6909 #define PCI_BRIDGE_TYPE 0x01
6910 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
6911
6912 #define PCI_CONFIGURATION_TYPE(PciData) \
6913 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
6914
6915 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
6916 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
6917
6918 /* PCI_COMMON_CONFIG.Command */
6919 #define PCI_ENABLE_IO_SPACE 0x0001
6920 #define PCI_ENABLE_MEMORY_SPACE 0x0002
6921 #define PCI_ENABLE_BUS_MASTER 0x0004
6922 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
6923 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
6924 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
6925 #define PCI_ENABLE_PARITY 0x0040
6926 #define PCI_ENABLE_WAIT_CYCLE 0x0080
6927 #define PCI_ENABLE_SERR 0x0100
6928 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
6929 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
6930
6931 /* PCI_COMMON_CONFIG.Status */
6932 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
6933 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
6934 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
6935 #define PCI_STATUS_UDF_SUPPORTED 0x0040
6936 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
6937 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
6938 #define PCI_STATUS_DEVSEL 0x0600
6939 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
6940 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
6941 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
6942 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
6943 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
6944
6945 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
6946
6947 #define PCI_WHICHSPACE_CONFIG 0x0
6948 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
6949
6950 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
6951 #define PCI_CAPABILITY_ID_AGP 0x02
6952 #define PCI_CAPABILITY_ID_VPD 0x03
6953 #define PCI_CAPABILITY_ID_SLOT_ID 0x04
6954 #define PCI_CAPABILITY_ID_MSI 0x05
6955 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
6956 #define PCI_CAPABILITY_ID_PCIX 0x07
6957 #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
6958 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
6959 #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
6960 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
6961 #define PCI_CAPABILITY_ID_SHPC 0x0C
6962 #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
6963 #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
6964 #define PCI_CAPABILITY_ID_SECURE 0x0F
6965 #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
6966 #define PCI_CAPABILITY_ID_MSIX 0x11
6967
6968 typedef struct _PCI_CAPABILITIES_HEADER {
6969 UCHAR CapabilityID;
6970 UCHAR Next;
6971 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
6972
6973 typedef struct _PCI_PMC {
6974 UCHAR Version:3;
6975 UCHAR PMEClock:1;
6976 UCHAR Rsvd1:1;
6977 UCHAR DeviceSpecificInitialization:1;
6978 UCHAR Rsvd2:2;
6979 struct _PM_SUPPORT {
6980 UCHAR Rsvd2:1;
6981 UCHAR D1:1;
6982 UCHAR D2:1;
6983 UCHAR PMED0:1;
6984 UCHAR PMED1:1;
6985 UCHAR PMED2:1;
6986 UCHAR PMED3Hot:1;
6987 UCHAR PMED3Cold:1;
6988 } Support;
6989 } PCI_PMC, *PPCI_PMC;
6990
6991 typedef struct _PCI_PMCSR {
6992 USHORT PowerState:2;
6993 USHORT Rsvd1:6;
6994 USHORT PMEEnable:1;
6995 USHORT DataSelect:4;
6996 USHORT DataScale:2;
6997 USHORT PMEStatus:1;
6998 } PCI_PMCSR, *PPCI_PMCSR;
6999
7000 typedef struct _PCI_PMCSR_BSE {
7001 UCHAR Rsvd1:6;
7002 UCHAR D3HotSupportsStopClock:1;
7003 UCHAR BusPowerClockControlEnabled:1;
7004 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
7005
7006 typedef struct _PCI_PM_CAPABILITY {
7007 PCI_CAPABILITIES_HEADER Header;
7008 union {
7009 PCI_PMC Capabilities;
7010 USHORT AsUSHORT;
7011 } PMC;
7012 union {
7013 PCI_PMCSR ControlStatus;
7014 USHORT AsUSHORT;
7015 } PMCSR;
7016 union {
7017 PCI_PMCSR_BSE BridgeSupport;
7018 UCHAR AsUCHAR;
7019 } PMCSR_BSE;
7020 UCHAR Data;
7021 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
7022
7023 typedef struct {
7024 PCI_CAPABILITIES_HEADER Header;
7025 union {
7026 struct {
7027 USHORT DataParityErrorRecoveryEnable:1;
7028 USHORT EnableRelaxedOrdering:1;
7029 USHORT MaxMemoryReadByteCount:2;
7030 USHORT MaxOutstandingSplitTransactions:3;
7031 USHORT Reserved:9;
7032 } bits;
7033 USHORT AsUSHORT;
7034 } Command;
7035 union {
7036 struct {
7037 ULONG FunctionNumber:3;
7038 ULONG DeviceNumber:5;
7039 ULONG BusNumber:8;
7040 ULONG Device64Bit:1;
7041 ULONG Capable133MHz:1;
7042 ULONG SplitCompletionDiscarded:1;
7043 ULONG UnexpectedSplitCompletion:1;
7044 ULONG DeviceComplexity:1;
7045 ULONG DesignedMaxMemoryReadByteCount:2;
7046 ULONG DesignedMaxOutstandingSplitTransactions:3;
7047 ULONG DesignedMaxCumulativeReadSize:3;
7048 ULONG ReceivedSplitCompletionErrorMessage:1;
7049 ULONG CapablePCIX266:1;
7050 ULONG CapablePCIX533:1;
7051 } bits;
7052 ULONG AsULONG;
7053 } Status;
7054 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
7055
7056 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
7057 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
7058 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
7059 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
7060 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
7061 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
7062 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
7063 #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
7064 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
7065 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
7066 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
7067
7068 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
7069 USHORT CapabilityID;
7070 USHORT Version:4;
7071 USHORT Next:12;
7072 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
7073
7074 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
7075 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7076 ULONG LowSerialNumber;
7077 ULONG HighSerialNumber;
7078 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
7079
7080 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
7081 _ANONYMOUS_STRUCT struct {
7082 ULONG Undefined:1;
7083 ULONG Reserved1:3;
7084 ULONG DataLinkProtocolError:1;
7085 ULONG SurpriseDownError:1;
7086 ULONG Reserved2:6;
7087 ULONG PoisonedTLP:1;
7088 ULONG FlowControlProtocolError:1;
7089 ULONG CompletionTimeout:1;
7090 ULONG CompleterAbort:1;
7091 ULONG UnexpectedCompletion:1;
7092 ULONG ReceiverOverflow:1;
7093 ULONG MalformedTLP:1;
7094 ULONG ECRCError:1;
7095 ULONG UnsupportedRequestError:1;
7096 ULONG Reserved3:11;
7097 } DUMMYSTRUCTNAME;
7098 ULONG AsULONG;
7099 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
7100
7101 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
7102 _ANONYMOUS_STRUCT struct {
7103 ULONG Undefined:1;
7104 ULONG Reserved1:3;
7105 ULONG DataLinkProtocolError:1;
7106 ULONG SurpriseDownError:1;
7107 ULONG Reserved2:6;
7108 ULONG PoisonedTLP:1;
7109 ULONG FlowControlProtocolError:1;
7110 ULONG CompletionTimeout:1;
7111 ULONG CompleterAbort:1;
7112 ULONG UnexpectedCompletion:1;
7113 ULONG ReceiverOverflow:1;
7114 ULONG MalformedTLP:1;
7115 ULONG ECRCError:1;
7116 ULONG UnsupportedRequestError:1;
7117 ULONG Reserved3:11;
7118 } DUMMYSTRUCTNAME;
7119 ULONG AsULONG;
7120 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
7121
7122 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
7123 _ANONYMOUS_STRUCT struct {
7124 ULONG Undefined:1;
7125 ULONG Reserved1:3;
7126 ULONG DataLinkProtocolError:1;
7127 ULONG SurpriseDownError:1;
7128 ULONG Reserved2:6;
7129 ULONG PoisonedTLP:1;
7130 ULONG FlowControlProtocolError:1;
7131 ULONG CompletionTimeout:1;
7132 ULONG CompleterAbort:1;
7133 ULONG UnexpectedCompletion:1;
7134 ULONG ReceiverOverflow:1;
7135 ULONG MalformedTLP:1;
7136 ULONG ECRCError:1;
7137 ULONG UnsupportedRequestError:1;
7138 ULONG Reserved3:11;
7139 } DUMMYSTRUCTNAME;
7140 ULONG AsULONG;
7141 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
7142
7143 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
7144 _ANONYMOUS_STRUCT struct {
7145 ULONG ReceiverError:1;
7146 ULONG Reserved1:5;
7147 ULONG BadTLP:1;
7148 ULONG BadDLLP:1;
7149 ULONG ReplayNumRollover:1;
7150 ULONG Reserved2:3;
7151 ULONG ReplayTimerTimeout:1;
7152 ULONG AdvisoryNonFatalError:1;
7153 ULONG Reserved3:18;
7154 } DUMMYSTRUCTNAME;
7155 ULONG AsULONG;
7156 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
7157
7158 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
7159 _ANONYMOUS_STRUCT struct {
7160 ULONG ReceiverError:1;
7161 ULONG Reserved1:5;
7162 ULONG BadTLP:1;
7163 ULONG BadDLLP:1;
7164 ULONG ReplayNumRollover:1;
7165 ULONG Reserved2:3;
7166 ULONG ReplayTimerTimeout:1;
7167 ULONG AdvisoryNonFatalError:1;
7168 ULONG Reserved3:18;
7169 } DUMMYSTRUCTNAME;
7170 ULONG AsULONG;
7171 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
7172
7173 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
7174 _ANONYMOUS_STRUCT struct {
7175 ULONG FirstErrorPointer:5;
7176 ULONG ECRCGenerationCapable:1;
7177 ULONG ECRCGenerationEnable:1;
7178 ULONG ECRCCheckCapable:1;
7179 ULONG ECRCCheckEnable:1;
7180 ULONG Reserved:23;
7181 } DUMMYSTRUCTNAME;
7182 ULONG AsULONG;
7183 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
7184
7185 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
7186 _ANONYMOUS_STRUCT struct {
7187 ULONG CorrectableErrorReportingEnable:1;
7188 ULONG NonFatalErrorReportingEnable:1;
7189 ULONG FatalErrorReportingEnable:1;
7190 ULONG Reserved:29;
7191 } DUMMYSTRUCTNAME;
7192 ULONG AsULONG;
7193 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
7194
7195 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
7196 _ANONYMOUS_STRUCT struct {
7197 ULONG CorrectableErrorReceived:1;
7198 ULONG MultipleCorrectableErrorsReceived:1;
7199 ULONG UncorrectableErrorReceived:1;
7200 ULONG MultipleUncorrectableErrorsReceived:1;
7201 ULONG FirstUncorrectableFatal:1;
7202 ULONG NonFatalErrorMessagesReceived:1;
7203 ULONG FatalErrorMessagesReceived:1;
7204 ULONG Reserved:20;
7205 ULONG AdvancedErrorInterruptMessageNumber:5;
7206 } DUMMYSTRUCTNAME;
7207 ULONG AsULONG;
7208 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
7209
7210 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
7211 _ANONYMOUS_STRUCT struct {
7212 USHORT CorrectableSourceIdFun:3;
7213 USHORT CorrectableSourceIdDev:5;
7214 USHORT CorrectableSourceIdBus:8;
7215 USHORT UncorrectableSourceIdFun:3;
7216 USHORT UncorrectableSourceIdDev:5;
7217 USHORT UncorrectableSourceIdBus:8;
7218 } DUMMYSTRUCTNAME;
7219 ULONG AsULONG;
7220 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
7221
7222 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
7223 _ANONYMOUS_STRUCT struct {
7224 ULONG TargetAbortOnSplitCompletion:1;
7225 ULONG MasterAbortOnSplitCompletion:1;
7226 ULONG ReceivedTargetAbort:1;
7227 ULONG ReceivedMasterAbort:1;
7228 ULONG RsvdZ:1;
7229 ULONG UnexpectedSplitCompletionError:1;
7230 ULONG UncorrectableSplitCompletion:1;
7231 ULONG UncorrectableDataError:1;
7232 ULONG UncorrectableAttributeError:1;
7233 ULONG UncorrectableAddressError:1;
7234 ULONG DelayedTransactionDiscardTimerExpired:1;
7235 ULONG PERRAsserted:1;
7236 ULONG SERRAsserted:1;
7237 ULONG InternalBridgeError:1;
7238 ULONG Reserved:18;
7239 } DUMMYSTRUCTNAME;
7240 ULONG AsULONG;
7241 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
7242
7243 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
7244 _ANONYMOUS_STRUCT struct {
7245 ULONG TargetAbortOnSplitCompletion:1;
7246 ULONG MasterAbortOnSplitCompletion:1;
7247 ULONG ReceivedTargetAbort:1;
7248 ULONG ReceivedMasterAbort:1;
7249 ULONG RsvdZ:1;
7250 ULONG UnexpectedSplitCompletionError:1;
7251 ULONG UncorrectableSplitCompletion:1;
7252 ULONG UncorrectableDataError:1;
7253 ULONG UncorrectableAttributeError:1;
7254 ULONG UncorrectableAddressError:1;
7255 ULONG DelayedTransactionDiscardTimerExpired:1;
7256 ULONG PERRAsserted:1;
7257 ULONG SERRAsserted:1;
7258 ULONG InternalBridgeError:1;
7259 ULONG Reserved:18;
7260 } DUMMYSTRUCTNAME;
7261 ULONG AsULONG;
7262 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
7263
7264 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
7265 _ANONYMOUS_STRUCT struct {
7266 ULONG TargetAbortOnSplitCompletion:1;
7267 ULONG MasterAbortOnSplitCompletion:1;
7268 ULONG ReceivedTargetAbort:1;
7269 ULONG ReceivedMasterAbort:1;
7270 ULONG RsvdZ:1;
7271 ULONG UnexpectedSplitCompletionError:1;
7272 ULONG UncorrectableSplitCompletion:1;
7273 ULONG UncorrectableDataError:1;
7274 ULONG UncorrectableAttributeError:1;
7275 ULONG UncorrectableAddressError:1;
7276 ULONG DelayedTransactionDiscardTimerExpired:1;
7277 ULONG PERRAsserted:1;
7278 ULONG SERRAsserted:1;
7279 ULONG InternalBridgeError:1;
7280 ULONG Reserved:18;
7281 } DUMMYSTRUCTNAME;
7282 ULONG AsULONG;
7283 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
7284
7285 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
7286 _ANONYMOUS_STRUCT struct {
7287 ULONG SecondaryUncorrectableFirstErrorPtr:5;
7288 ULONG Reserved:27;
7289 } DUMMYSTRUCTNAME;
7290 ULONG AsULONG;
7291 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
7292
7293 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
7294 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
7295 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
7296
7297 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
7298 (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
7299 ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
7300 ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
7301
7302 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
7303 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7304 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7305 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7306 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7307 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7308 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7309 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7310 ULONG HeaderLog[4];
7311 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7312 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7313 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7314 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7315 ULONG SecHeaderLog[4];
7316 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
7317
7318 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
7319 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7320 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7321 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7322 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7323 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7324 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7325 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7326 ULONG HeaderLog[4];
7327 PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
7328 PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
7329 PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
7330 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
7331
7332 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
7333 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7334 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7335 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7336 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7337 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7338 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7339 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7340 ULONG HeaderLog[4];
7341 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7342 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7343 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7344 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7345 ULONG SecHeaderLog[4];
7346 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
7347
7348 typedef union _PCI_EXPRESS_SRIOV_CAPS {
7349 _ANONYMOUS_STRUCT struct {
7350 ULONG VFMigrationCapable:1;
7351 ULONG Reserved1:20;
7352 ULONG VFMigrationInterruptNumber:11;
7353 } DUMMYSTRUCTNAME;
7354 ULONG AsULONG;
7355 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
7356
7357 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
7358 _ANONYMOUS_STRUCT struct {
7359 USHORT VFEnable:1;
7360 USHORT VFMigrationEnable:1;
7361 USHORT VFMigrationInterruptEnable:1;
7362 USHORT VFMemorySpaceEnable:1;
7363 USHORT ARICapableHierarchy:1;
7364 USHORT Reserved1:11;
7365 } DUMMYSTRUCTNAME;
7366 USHORT AsUSHORT;
7367 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
7368
7369 typedef union _PCI_EXPRESS_SRIOV_STATUS {
7370 _ANONYMOUS_STRUCT struct {
7371 USHORT VFMigrationStatus:1;
7372 USHORT Reserved1:15;
7373 } DUMMYSTRUCTNAME;
7374 USHORT AsUSHORT;
7375 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
7376
7377 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
7378 _ANONYMOUS_STRUCT struct {
7379 ULONG VFMigrationStateBIR:3;
7380 ULONG VFMigrationStateOffset:29;
7381 } DUMMYSTRUCTNAME;
7382 ULONG AsULONG;
7383 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
7384
7385 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
7386 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7387 PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
7388 PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
7389 PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
7390 USHORT InitialVFs;
7391 USHORT TotalVFs;
7392 USHORT NumVFs;
7393 UCHAR FunctionDependencyLink;
7394 UCHAR RsvdP1;
7395 USHORT FirstVFOffset;
7396 USHORT VFStride;
7397 USHORT RsvdP2;
7398 USHORT VFDeviceId;
7399 ULONG SupportedPageSizes;
7400 ULONG SystemPageSize;
7401 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
7402 PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
7403 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
7404
7405 /* PCI device classes */
7406 #define PCI_CLASS_PRE_20 0x00
7407 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
7408 #define PCI_CLASS_NETWORK_CTLR 0x02
7409 #define PCI_CLASS_DISPLAY_CTLR 0x03
7410 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
7411 #define PCI_CLASS_MEMORY_CTLR 0x05
7412 #define PCI_CLASS_BRIDGE_DEV 0x06
7413 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
7414 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
7415 #define PCI_CLASS_INPUT_DEV 0x09
7416 #define PCI_CLASS_DOCKING_STATION 0x0a
7417 #define PCI_CLASS_PROCESSOR 0x0b
7418 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
7419 #define PCI_CLASS_WIRELESS_CTLR 0x0d
7420 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
7421 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
7422 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
7423 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
7424 #define PCI_CLASS_NOT_DEFINED 0xff
7425
7426 /* PCI device subclasses for class 0 */
7427 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
7428 #define PCI_SUBCLASS_PRE_20_VGA 0x01
7429
7430 /* PCI device subclasses for class 1 (mass storage controllers)*/
7431 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
7432 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
7433 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
7434 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
7435 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
7436 #define PCI_SUBCLASS_MSC_OTHER 0x80
7437
7438 /* PCI device subclasses for class 2 (network controllers)*/
7439 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
7440 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
7441 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
7442 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
7443 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
7444 #define PCI_SUBCLASS_NET_OTHER 0x80
7445
7446 /* PCI device subclasses for class 3 (display controllers)*/
7447 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
7448 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
7449 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
7450 #define PCI_SUBCLASS_VID_OTHER 0x80
7451
7452 /* PCI device subclasses for class 4 (multimedia device)*/
7453 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
7454 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
7455 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
7456 #define PCI_SUBCLASS_MM_OTHER 0x80
7457
7458 /* PCI device subclasses for class 5 (memory controller)*/
7459 #define PCI_SUBCLASS_MEM_RAM 0x00
7460 #define PCI_SUBCLASS_MEM_FLASH 0x01
7461 #define PCI_SUBCLASS_MEM_OTHER 0x80
7462
7463 /* PCI device subclasses for class 6 (bridge device)*/
7464 #define PCI_SUBCLASS_BR_HOST 0x00
7465 #define PCI_SUBCLASS_BR_ISA 0x01
7466 #define PCI_SUBCLASS_BR_EISA 0x02
7467 #define PCI_SUBCLASS_BR_MCA 0x03
7468 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
7469 #define PCI_SUBCLASS_BR_PCMCIA 0x05
7470 #define PCI_SUBCLASS_BR_NUBUS 0x06
7471 #define PCI_SUBCLASS_BR_CARDBUS 0x07
7472 #define PCI_SUBCLASS_BR_RACEWAY 0x08
7473 #define PCI_SUBCLASS_BR_OTHER 0x80
7474
7475 #define PCI_SUBCLASS_COM_SERIAL 0x00
7476 #define PCI_SUBCLASS_COM_PARALLEL 0x01
7477 #define PCI_SUBCLASS_COM_MULTIPORT 0x02
7478 #define PCI_SUBCLASS_COM_MODEM 0x03
7479 #define PCI_SUBCLASS_COM_OTHER 0x80
7480
7481 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
7482 #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
7483 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
7484 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
7485 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
7486 #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
7487 #define PCI_SUBCLASS_SYS_OTHER 0x80
7488
7489 #define PCI_SUBCLASS_INP_KEYBOARD 0x00
7490 #define PCI_SUBCLASS_INP_DIGITIZER 0x01
7491 #define PCI_SUBCLASS_INP_MOUSE 0x02
7492 #define PCI_SUBCLASS_INP_SCANNER 0x03
7493 #define PCI_SUBCLASS_INP_GAMEPORT 0x04
7494 #define PCI_SUBCLASS_INP_OTHER 0x80
7495
7496 #define PCI_SUBCLASS_DOC_GENERIC 0x00
7497 #define PCI_SUBCLASS_DOC_OTHER 0x80
7498
7499 #define PCI_SUBCLASS_PROC_386 0x00
7500 #define PCI_SUBCLASS_PROC_486 0x01
7501 #define PCI_SUBCLASS_PROC_PENTIUM 0x02
7502 #define PCI_SUBCLASS_PROC_ALPHA 0x10
7503 #define PCI_SUBCLASS_PROC_POWERPC 0x20
7504 #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
7505
7506 /* PCI device subclasses for class C (serial bus controller)*/
7507 #define PCI_SUBCLASS_SB_IEEE1394 0x00
7508 #define PCI_SUBCLASS_SB_ACCESS 0x01
7509 #define PCI_SUBCLASS_SB_SSA 0x02
7510 #define PCI_SUBCLASS_SB_USB 0x03
7511 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
7512 #define PCI_SUBCLASS_SB_SMBUS 0x05
7513
7514 #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
7515 #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
7516 #define PCI_SUBCLASS_WIRELESS_RF 0x10
7517 #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
7518
7519 #define PCI_SUBCLASS_INTIO_I2O 0x00
7520
7521 #define PCI_SUBCLASS_SAT_TV 0x01
7522 #define PCI_SUBCLASS_SAT_AUDIO 0x02
7523 #define PCI_SUBCLASS_SAT_VOICE 0x03
7524 #define PCI_SUBCLASS_SAT_DATA 0x04
7525
7526 #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
7527 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
7528 #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
7529
7530 #define PCI_SUBCLASS_DASP_DPIO 0x00
7531 #define PCI_SUBCLASS_DASP_OTHER 0x80
7532
7533 #define PCI_ADDRESS_IO_SPACE 0x00000001
7534 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
7535 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
7536 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
7537 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
7538 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
7539
7540 #define PCI_TYPE_32BIT 0
7541 #define PCI_TYPE_20BIT 2
7542 #define PCI_TYPE_64BIT 4
7543
7544 #define PCI_ROMADDRESS_ENABLED 0x00000001
7545
7546 #endif /* _PCI_X_ */
7547
7548 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
7549
7550 _IRQL_requires_max_(PASSIVE_LEVEL)
7551 _Must_inspect_result_
7552 typedef NTSTATUS
7553 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
7554 _Inout_ PVOID Context);
7555 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
7556
7557 _IRQL_requires_max_(PASSIVE_LEVEL)
7558 _Must_inspect_result_
7559 typedef NTSTATUS
7560 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
7561 _Inout_ PVOID Context);
7562 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
7563
7564 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
7565 USHORT Size;
7566 USHORT Version;
7567 PVOID Context;
7568 PINTERFACE_REFERENCE InterfaceReference;
7569 PINTERFACE_DEREFERENCE InterfaceDereference;
7570 PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
7571 PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
7572 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
7573
7574 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
7575
7576 typedef ULONG
7577 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
7578 _In_ PVOID Context,
7579 _Out_writes_bytes_(Length) PVOID Buffer,
7580 _In_ ULONG Offset,
7581 _In_ ULONG Length);
7582
7583 typedef ULONG
7584 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
7585 _In_ PVOID Context,
7586 _In_reads_bytes_(Length) PVOID Buffer,
7587 _In_ ULONG Offset,
7588 _In_ ULONG Length);
7589
7590 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
7591 USHORT Size;
7592 USHORT Version;
7593 PVOID Context;
7594 PINTERFACE_REFERENCE InterfaceReference;
7595 PINTERFACE_DEREFERENCE InterfaceDereference;
7596 PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
7597 PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
7598 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
7599
7600 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
7601
7602 _Must_inspect_result_
7603 typedef NTSTATUS
7604 (NTAPI PCI_MSIX_SET_ENTRY)(
7605 _In_ PVOID Context,
7606 _In_ ULONG TableEntry,
7607 _In_ ULONG MessageNumber);
7608 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
7609
7610 _Must_inspect_result_
7611 typedef NTSTATUS
7612 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
7613 _In_ PVOID Context,
7614 _In_ ULONG TableEntry);
7615 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
7616
7617 _Must_inspect_result_
7618 typedef NTSTATUS
7619 (NTAPI PCI_MSIX_GET_ENTRY)(
7620 _In_ PVOID Context,
7621 _In_ ULONG TableEntry,
7622 _Out_ PULONG MessageNumber,
7623 _Out_ PBOOLEAN Masked);
7624 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
7625
7626 _Must_inspect_result_
7627 typedef NTSTATUS
7628 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
7629 _In_ PVOID Context,
7630 _Out_ PULONG TableSize);
7631 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
7632
7633 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
7634 USHORT Size;
7635 USHORT Version;
7636 PVOID Context;
7637 PINTERFACE_REFERENCE InterfaceReference;
7638 PINTERFACE_DEREFERENCE InterfaceDereference;
7639 PPCI_MSIX_SET_ENTRY SetTableEntry;
7640 PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
7641 PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
7642 PPCI_MSIX_GET_ENTRY GetTableEntry;
7643 PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
7644 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
7645
7646 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
7647 RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
7648
7649 /******************************************************************************
7650 * Object Manager Types *
7651 ******************************************************************************/
7652
7653 #define MAXIMUM_FILENAME_LENGTH 256
7654 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
7655
7656 #define OBJECT_TYPE_CREATE 0x0001
7657 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
7658
7659 #define DIRECTORY_QUERY 0x0001
7660 #define DIRECTORY_TRAVERSE 0x0002
7661 #define DIRECTORY_CREATE_OBJECT 0x0004
7662 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
7663 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
7664
7665 #define SYMBOLIC_LINK_QUERY 0x0001
7666 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
7667
7668 #define DUPLICATE_CLOSE_SOURCE 0x00000001
7669 #define DUPLICATE_SAME_ACCESS 0x00000002
7670 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
7671
7672 #define OB_FLT_REGISTRATION_VERSION_0100 0x0100
7673 #define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
7674
7675 typedef ULONG OB_OPERATION;
7676
7677 #define OB_OPERATION_HANDLE_CREATE 0x00000001
7678 #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
7679
7680 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
7681 _Inout_ ACCESS_MASK DesiredAccess;
7682 _In_ ACCESS_MASK OriginalDesiredAccess;
7683 } OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;
7684
7685 typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION {
7686 _Inout_ ACCESS_MASK DesiredAccess;
7687 _In_ ACCESS_MASK OriginalDesiredAccess;
7688 _In_ PVOID SourceProcess;
7689 _In_ PVOID TargetProcess;
7690 } OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION;
7691
7692 typedef union _OB_PRE_OPERATION_PARAMETERS {
7693 _Inout_ OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation;
7694 _Inout_ OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
7695 } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;
7696
7697 typedef struct _OB_PRE_OPERATION_INFORMATION {
7698 _In_ OB_OPERATION Operation;
7699 _ANONYMOUS_UNION union {
7700 _In_ ULONG Flags;
7701 _ANONYMOUS_STRUCT struct {
7702 _In_ ULONG KernelHandle:1;
7703 _In_ ULONG Reserved:31;
7704 } DUMMYSTRUCTNAME;
7705 } DUMMYUNIONNAME;
7706 _In_ PVOID Object;
7707 _In_ POBJECT_TYPE ObjectType;
7708 _Out_ PVOID CallContext;
7709 _In_ POB_PRE_OPERATION_PARAMETERS Parameters;
7710 } OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;
7711
7712 typedef struct _OB_POST_CREATE_HANDLE_INFORMATION {
7713 _In_ ACCESS_MASK GrantedAccess;
7714 } OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION;
7715
7716 typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION {
7717 _In_ ACCESS_MASK GrantedAccess;
7718 } OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION;
7719
7720 typedef union _OB_POST_OPERATION_PARAMETERS {
7721 _In_ OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation;
7722 _In_ OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
7723 } OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS;
7724
7725 typedef struct _OB_POST_OPERATION_INFORMATION {
7726 _In_ OB_OPERATION Operation;
7727 _ANONYMOUS_UNION union {
7728 _In_ ULONG Flags;
7729 _ANONYMOUS_STRUCT struct {
7730 _In_ ULONG KernelHandle:1;
7731 _In_ ULONG Reserved:31;
7732 } DUMMYSTRUCTNAME;
7733 } DUMMYUNIONNAME;
7734 _In_ PVOID Object;
7735 _In_ POBJECT_TYPE ObjectType;
7736 _In_ PVOID CallContext;
7737 _In_ NTSTATUS ReturnStatus;
7738 _In_ POB_POST_OPERATION_PARAMETERS Parameters;
7739 } OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION;
7740
7741 typedef enum _OB_PREOP_CALLBACK_STATUS {
7742 OB_PREOP_SUCCESS
7743 } OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS;
7744
7745 typedef OB_PREOP_CALLBACK_STATUS
7746 (NTAPI *POB_PRE_OPERATION_CALLBACK)(
7747 _In_ PVOID RegistrationContext,
7748 _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation);
7749
7750 typedef VOID
7751 (NTAPI *POB_POST_OPERATION_CALLBACK)(
7752 _In_ PVOID RegistrationContext,
7753 _In_ POB_POST_OPERATION_INFORMATION OperationInformation);
7754
7755 typedef struct _OB_OPERATION_REGISTRATION {
7756 _In_ POBJECT_TYPE *ObjectType;
7757 _In_ OB_OPERATION Operations;
7758 _In_ POB_PRE_OPERATION_CALLBACK PreOperation;
7759 _In_ POB_POST_OPERATION_CALLBACK PostOperation;
7760 } OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
7761
7762 typedef struct _OB_CALLBACK_REGISTRATION {
7763 _In_ USHORT Version;
7764 _In_ USHORT OperationRegistrationCount;
7765 _In_ UNICODE_STRING Altitude;
7766 _In_ PVOID RegistrationContext;
7767 _In_ OB_OPERATION_REGISTRATION *OperationRegistration;
7768 } OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
7769
7770 typedef struct _OBJECT_NAME_INFORMATION {
7771 UNICODE_STRING Name;
7772 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
7773
7774 /* Exported object types */
7775 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType;
7776 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
7777 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
7778 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
7779 extern POBJECT_TYPE NTSYSAPI PsThreadType;
7780 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
7781 extern POBJECT_TYPE NTSYSAPI PsProcessType;
7782
7783
7784 /******************************************************************************
7785 * Process Manager Types *
7786 ******************************************************************************/
7787
7788 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
7789 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
7790 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
7791 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
7792 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
7793
7794 /* Thread Access Rights */
7795 #define THREAD_TERMINATE 0x0001
7796 #define THREAD_SUSPEND_RESUME 0x0002
7797 #define THREAD_ALERT 0x0004
7798 #define THREAD_GET_CONTEXT 0x0008
7799 #define THREAD_SET_CONTEXT 0x0010
7800 #define THREAD_SET_INFORMATION 0x0020
7801 #define THREAD_SET_LIMITED_INFORMATION 0x0400
7802 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
7803
7804 #define PROCESS_DUP_HANDLE (0x0040)
7805
7806 #if (NTDDI_VERSION >= NTDDI_VISTA)
7807 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7808 #else
7809 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
7810 #endif
7811
7812 #if (NTDDI_VERSION >= NTDDI_VISTA)
7813 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7814 #else
7815 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
7816 #endif
7817
7818 #define LOW_PRIORITY 0
7819 #define LOW_REALTIME_PRIORITY 16
7820 #define HIGH_PRIORITY 31
7821 #define MAXIMUM_PRIORITY 32
7822
7823
7824 /******************************************************************************
7825 * WMI Library Support Types *
7826 ******************************************************************************/
7827
7828 #ifdef RUN_WPP
7829 #include <evntrace.h>
7830 #include <stdarg.h>
7831 #endif
7832
7833 #ifndef _TRACEHANDLE_DEFINED
7834 #define _TRACEHANDLE_DEFINED
7835 typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
7836 #endif
7837
7838 #ifndef TRACE_INFORMATION_CLASS_DEFINE
7839
7840 typedef struct _ETW_TRACE_SESSION_SETTINGS {
7841 ULONG Version;
7842 ULONG BufferSize;
7843 ULONG MinimumBuffers;
7844 ULONG MaximumBuffers;
7845 ULONG LoggerMode;
7846 ULONG FlushTimer;
7847 ULONG FlushThreshold;
7848 ULONG ClockType;
7849 } ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS;
7850
7851 typedef enum _TRACE_INFORMATION_CLASS {
7852 TraceIdClass,
7853 TraceHandleClass,
7854 TraceEnableFlagsClass,
7855 TraceEnableLevelClass,
7856 GlobalLoggerHandleClass,
7857 EventLoggerHandleClass,
7858 AllLoggerHandlesClass,
7859 TraceHandleByNameClass,
7860 LoggerEventsLostClass,
7861 TraceSessionSettingsClass,
7862 LoggerEventsLoggedClass,
7863 MaxTraceInformationClass
7864 } TRACE_INFORMATION_CLASS;
7865
7866 #endif /* TRACE_INFORMATION_CLASS_DEFINE */
7867
7868 #ifndef _ETW_KM_
7869 #define _ETW_KM_
7870 #endif
7871
7872 #include <evntprov.h>
7873
7874 _IRQL_requires_same_
7875 typedef VOID
7876 (NTAPI *PETWENABLECALLBACK)(
7877 _In_ LPCGUID SourceId,
7878 _In_ ULONG ControlCode,
7879 _In_ UCHAR Level,
7880 _In_ ULONGLONG MatchAnyKeyword,
7881 _In_ ULONGLONG MatchAllKeyword,
7882 _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData,
7883 _Inout_opt_ PVOID CallbackContext);
7884
7885 #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001
7886
7887
7888 /******************************************************************************
7889 * Runtime Library Functions *
7890 ******************************************************************************/
7891
7892
7893 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
7894
7895 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
7896
7897 FORCEINLINE
7898 VOID
7899 InitializeListHead(
7900 _Out_ PLIST_ENTRY ListHead)
7901 {
7902 ListHead->Flink = ListHead->Blink = ListHead;
7903 }
7904
7905 _Must_inspect_result_
7906 FORCEINLINE
7907 BOOLEAN
7908 IsListEmpty(
7909 _In_ const LIST_ENTRY * ListHead)
7910 {
7911 return (BOOLEAN)(ListHead->Flink == ListHead);
7912 }
7913
7914 FORCEINLINE
7915 BOOLEAN
7916 RemoveEntryList(
7917 _In_ PLIST_ENTRY Entry)
7918 {
7919 PLIST_ENTRY OldFlink;
7920 PLIST_ENTRY OldBlink;
7921
7922 OldFlink = Entry->Flink;
7923 OldBlink = Entry->Blink;
7924 OldFlink->Blink = OldBlink;
7925 OldBlink->Flink = OldFlink;
7926 return (BOOLEAN)(OldFlink == OldBlink);
7927 }
7928
7929 FORCEINLINE
7930 PLIST_ENTRY
7931 RemoveHeadList(
7932 _Inout_ PLIST_ENTRY ListHead)
7933 {
7934 PLIST_ENTRY Flink;
7935 PLIST_ENTRY Entry;
7936
7937 Entry = ListHead->Flink;
7938 Flink = Entry->Flink;
7939 ListHead->Flink = Flink;
7940 Flink->Blink = ListHead;
7941 return Entry;
7942 }
7943
7944 FORCEINLINE
7945 PLIST_ENTRY
7946 RemoveTailList(
7947 _Inout_ PLIST_ENTRY ListHead)
7948 {
7949 PLIST_ENTRY Blink;
7950 PLIST_ENTRY Entry;
7951
7952 Entry = ListHead->Blink;
7953 Blink = Entry->Blink;
7954 ListHead->Blink = Blink;
7955 Blink->Flink = ListHead;
7956 return Entry;
7957 }
7958
7959 FORCEINLINE
7960 VOID
7961 InsertTailList(
7962 _Inout_ PLIST_ENTRY ListHead,
7963 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
7964 {
7965 PLIST_ENTRY OldBlink;
7966 OldBlink = ListHead->Blink;
7967 Entry->Flink = ListHead;
7968 Entry->Blink = OldBlink;
7969 OldBlink->Flink = Entry;
7970 ListHead->Blink = Entry;
7971 }
7972
7973 FORCEINLINE
7974 VOID
7975 InsertHeadList(
7976 _Inout_ PLIST_ENTRY ListHead,
7977 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
7978 {
7979 PLIST_ENTRY OldFlink;
7980 OldFlink = ListHead->Flink;
7981 Entry->Flink = OldFlink;
7982 Entry->Blink = ListHead;
7983 OldFlink->Blink = Entry;
7984 ListHead->Flink = Entry;
7985 }
7986
7987 FORCEINLINE
7988 VOID
7989 AppendTailList(
7990 _Inout_ PLIST_ENTRY ListHead,
7991 _Inout_ PLIST_ENTRY ListToAppend)
7992 {
7993 PLIST_ENTRY ListEnd = ListHead->Blink;
7994
7995 ListHead->Blink->Flink = ListToAppend;
7996 ListHead->Blink = ListToAppend->Blink;
7997 ListToAppend->Blink->Flink = ListHead;
7998 ListToAppend->Blink = ListEnd;
7999 }
8000
8001 FORCEINLINE
8002 PSINGLE_LIST_ENTRY
8003 PopEntryList(
8004 _Inout_ PSINGLE_LIST_ENTRY ListHead)
8005 {
8006 PSINGLE_LIST_ENTRY FirstEntry;
8007 FirstEntry = ListHead->Next;
8008 if (FirstEntry != NULL) {
8009 ListHead->Next = FirstEntry->Next;
8010 }
8011 return FirstEntry;
8012 }
8013
8014 FORCEINLINE
8015 VOID
8016 PushEntryList(
8017 _Inout_ PSINGLE_LIST_ENTRY ListHead,
8018 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry)
8019 {
8020 Entry->Next = ListHead->Next;
8021 ListHead->Next = Entry;
8022 }
8023
8024 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
8025
8026 __analysis_noreturn
8027 NTSYSAPI
8028 VOID
8029 NTAPI
8030 RtlAssert(
8031 _In_ PVOID FailedAssertion,
8032 _In_ PVOID FileName,
8033 _In_ ULONG LineNumber,
8034 _In_opt_ PSTR Message);
8035
8036 /* VOID
8037 * RtlCopyMemory(
8038 * IN VOID UNALIGNED *Destination,
8039 * IN CONST VOID UNALIGNED *Source,
8040 * IN SIZE_T Length)
8041 */
8042 #define RtlCopyMemory(Destination, Source, Length) \
8043 memcpy(Destination, Source, Length)
8044
8045 #define RtlCopyBytes RtlCopyMemory
8046
8047 #if defined(_M_AMD64)
8048 NTSYSAPI
8049 VOID
8050 NTAPI
8051 RtlCopyMemoryNonTemporal(
8052 _Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination,
8053 _In_reads_bytes_(Length) const VOID UNALIGNED *Source,
8054 _In_ SIZE_T Length);
8055 #else
8056 #define RtlCopyMemoryNonTemporal RtlCopyMemory
8057 #endif
8058
8059 /* BOOLEAN
8060 * RtlEqualLuid(
8061 * IN PLUID Luid1,
8062 * IN PLUID Luid2)
8063 */
8064 #define RtlEqualLuid(Luid1, Luid2) \
8065 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
8066
8067 /* ULONG
8068 * RtlEqualMemory(
8069 * IN VOID UNALIGNED *Destination,
8070 * IN CONST VOID UNALIGNED *Source,
8071 * IN SIZE_T Length)
8072 */
8073 #define RtlEqualMemory(Destination, Source, Length) \
8074 (!memcmp(Destination, Source, Length))
8075
8076 /* VOID
8077 * RtlFillMemory(
8078 * IN VOID UNALIGNED *Destination,
8079 * IN SIZE_T Length,
8080 * IN UCHAR Fill)
8081 */
8082 #define RtlFillMemory(Destination, Length, Fill) \
8083 memset(Destination, Fill, Length)
8084
8085 #define RtlFillBytes RtlFillMemory
8086
8087 _IRQL_requires_max_(PASSIVE_LEVEL)
8088 NTSYSAPI
8089 VOID
8090 NTAPI
8091 RtlFreeUnicodeString(
8092 _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem))
8093 PUNICODE_STRING UnicodeString);
8094
8095 _IRQL_requires_max_(PASSIVE_LEVEL)
8096 _Must_inspect_result_
8097 NTSYSAPI
8098 NTSTATUS
8099 NTAPI
8100 RtlGUIDFromString(
8101 _In_ PUNICODE_STRING GuidString,
8102 _Out_ GUID *Guid);
8103
8104 _IRQL_requires_max_(DISPATCH_LEVEL)
8105 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
8106 //_At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
8107 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR)))
8108 NTSYSAPI
8109 VOID
8110 NTAPI
8111 RtlInitUnicodeString(
8112 _Out_ PUNICODE_STRING DestinationString,
8113 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString);
8114
8115 /* VOID
8116 * RtlMoveMemory(
8117 * IN VOID UNALIGNED *Destination,
8118 * IN CONST VOID UNALIGNED *Source,
8119 * IN SIZE_T Length)
8120 */
8121 #define RtlMoveMemory(Destination, Source, Length) \
8122 memmove(Destination, Source, Length)
8123
8124 _IRQL_requires_max_(PASSIVE_LEVEL)
8125 _Must_inspect_result_
8126 NTSYSAPI
8127 NTSTATUS
8128 NTAPI
8129 RtlStringFromGUID(
8130 _In_ REFGUID Guid,
8131 _Out_ _At_(GuidString->Buffer, __drv_allocatesMem(Mem))
8132 PUNICODE_STRING GuidString);
8133
8134 /* VOID
8135 * RtlZeroMemory(
8136 * IN VOID UNALIGNED *Destination,
8137 * IN SIZE_T Length)
8138 */
8139 #define RtlZeroMemory(Destination, Length) \
8140 memset(Destination, 0, Length)
8141
8142 #define RtlZeroBytes RtlZeroMemory
8143
8144 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8145
8146 _Must_inspect_result_
8147 NTSYSAPI
8148 BOOLEAN
8149 NTAPI
8150 RtlAreBitsClear(
8151 _In_ PRTL_BITMAP BitMapHeader,
8152 _In_ ULONG StartingIndex,
8153 _In_ ULONG Length);
8154
8155 _Must_inspect_result_
8156 NTSYSAPI
8157 BOOLEAN
8158 NTAPI
8159 RtlAreBitsSet(
8160 _In_ PRTL_BITMAP BitMapHeader,
8161 _In_ ULONG StartingIndex,
8162 _In_ ULONG Length);
8163
8164 _IRQL_requires_max_(PASSIVE_LEVEL)
8165 _Must_inspect_result_
8166 NTSYSAPI
8167 NTSTATUS
8168 NTAPI
8169 RtlAnsiStringToUnicodeString(
8170 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
8171 _When_(!AllocateDestinationString, _Inout_)
8172 PUNICODE_STRING DestinationString,
8173 _In_ PANSI_STRING SourceString,
8174 _In_ BOOLEAN AllocateDestinationString);
8175
8176 _IRQL_requires_max_(PASSIVE_LEVEL)
8177 NTSYSAPI
8178 ULONG
8179 NTAPI
8180 RtlxAnsiStringToUnicodeSize(
8181 _In_ PCANSI_STRING AnsiString);
8182
8183 #define RtlAnsiStringToUnicodeSize(String) ( \
8184 NLS_MB_CODE_PAGE_TAG ? \
8185 RtlxAnsiStringToUnicodeSize(String) : \
8186 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
8187 )
8188
8189 _Success_(1)
8190 _Unchanged_(Destination->MaximumLength)
8191 _Unchanged_(Destination->Buffer)
8192 _When_(_Old_(Destination->Length) + Source->Length <= Destination->MaximumLength,
8193 _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + Source->Length))
8194 _At_(return, _Out_range_(==, 0)))
8195 _When_(_Old_(Destination->Length) + Source->Length > Destination->MaximumLength,
8196 _Unchanged_(Destination->Length)
8197 _At_(return, _Out_range_(<, 0)))
8198 NTSYSAPI
8199 NTSTATUS
8200 NTAPI
8201 RtlAppendUnicodeStringToString(
8202 _Inout_ PUNICODE_STRING Destination,
8203 _In_ PCUNICODE_STRING Source);
8204
8205 _Success_(1)
8206 _Unchanged_(Destination->MaximumLength)
8207 _Unchanged_(Destination->Buffer)
8208 /* _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) <= Destination->MaximumLength,
8209 _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR)))
8210 _At_(return, _Out_range_(==, 0)))
8211 _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) > Destination->MaximumLength,
8212 _Unchanged_(Destination->Length)
8213 _At_(return, _Out_range_(<, 0))) */
8214 NTSYSAPI
8215 NTSTATUS
8216 NTAPI
8217 RtlAppendUnicodeToString(
8218 _Inout_ PUNICODE_STRING Destination,
8219 _In_opt_z_ PCWSTR Source);
8220
8221 _IRQL_requires_max_(PASSIVE_LEVEL)
8222 _Must_inspect_result_
8223 NTSYSAPI
8224 NTSTATUS
8225 NTAPI
8226 RtlCheckRegistryKey(
8227 _In_ ULONG RelativeTo,
8228 _In_ PWSTR Path);
8229
8230 NTSYSAPI
8231 VOID
8232 NTAPI
8233 RtlClearAllBits(
8234 _In_ PRTL_BITMAP BitMapHeader);
8235
8236 NTSYSAPI
8237 VOID
8238 NTAPI
8239 RtlClearBits(
8240 _In_ PRTL_BITMAP BitMapHeader,
8241 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,
8242 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear);
8243
8244 _Must_inspect_result_
8245 NTSYSAPI
8246 SIZE_T
8247 NTAPI
8248 RtlCompareMemory(
8249 _In_ const VOID *Source1,
8250 _In_ const VOID *Source2,
8251 _In_ SIZE_T Length);
8252
8253 _IRQL_requires_max_(PASSIVE_LEVEL)
8254 _Must_inspect_result_
8255 NTSYSAPI
8256 LONG
8257 NTAPI
8258 RtlCompareUnicodeString(
8259 _In_ PCUNICODE_STRING String1,
8260 _In_ PCUNICODE_STRING String2,
8261 _In_ BOOLEAN CaseInSensitive);
8262
8263 _IRQL_requires_max_(PASSIVE_LEVEL)
8264 _Must_inspect_result_
8265 NTSYSAPI
8266 LONG
8267 NTAPI
8268 RtlCompareUnicodeStrings(
8269 _In_reads_(String1Length) PCWCH String1,
8270 _In_ SIZE_T String1Length,
8271 _In_reads_(String2Length) PCWCH String2,
8272 _In_ SIZE_T String2Length,
8273 _In_ BOOLEAN CaseInSensitive);
8274
8275 _Unchanged_(DestinationString->Buffer)
8276 _Unchanged_(DestinationString->MaximumLength)
8277 _At_(DestinationString->Length,
8278 _When_(SourceString->Length > DestinationString->MaximumLength,
8279 _Post_equal_to_(DestinationString->MaximumLength))
8280 _When_(SourceString->Length <= DestinationString->MaximumLength,
8281 _Post_equal_to_(SourceString->Length)))
8282 NTSYSAPI
8283 VOID
8284 NTAPI
8285 RtlCopyUnicodeString(
8286 _Inout_ PUNICODE_STRING DestinationString,
8287 _In_opt_ PCUNICODE_STRING SourceString);
8288
8289 _IRQL_requires_max_(PASSIVE_LEVEL)
8290 NTSYSAPI
8291 NTSTATUS
8292 NTAPI
8293 RtlCreateRegistryKey(
8294 _In_ ULONG RelativeTo,
8295 _In_ PWSTR Path);
8296
8297 _IRQL_requires_max_(APC_LEVEL)
8298 NTSYSAPI
8299 NTSTATUS
8300 NTAPI
8301 RtlCreateSecurityDescriptor(
8302 _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor,
8303 _In_ ULONG Revision);
8304
8305 _IRQL_requires_max_(PASSIVE_LEVEL)
8306 NTSYSAPI
8307 NTSTATUS
8308 NTAPI
8309 RtlDeleteRegistryValue(
8310 _In_ ULONG RelativeTo,
8311 _In_ PCWSTR Path,
8312 _In_z_ PCWSTR ValueName);
8313
8314 _IRQL_requires_max_(PASSIVE_LEVEL)
8315 _Must_inspect_result_
8316 NTSYSAPI
8317 BOOLEAN
8318 NTAPI
8319 RtlEqualUnicodeString(
8320 _In_ CONST UNICODE_STRING *String1,
8321 _In_ CONST UNICODE_STRING *String2,
8322 _In_ BOOLEAN CaseInSensitive);
8323
8324 #if !defined(_AMD64_) && !defined(_IA64_)
8325 NTSYSAPI
8326 LARGE_INTEGER
8327 NTAPI
8328 RtlExtendedIntegerMultiply(
8329 _In_ LARGE_INTEGER Multiplicand,
8330 _In_ LONG Multiplier);
8331
8332 NTSYSAPI
8333 LARGE_INTEGER
8334 NTAPI
8335 RtlExtendedLargeIntegerDivide(
8336 _In_ LARGE_INTEGER Dividend,
8337 _In_ ULONG Divisor,
8338 _Out_opt_ PULONG Remainder);
8339 #endif
8340
8341 #if defined(_X86_) || defined(_IA64_)
8342 NTSYSAPI
8343 LARGE_INTEGER
8344 NTAPI
8345 RtlExtendedMagicDivide(
8346 _In_ LARGE_INTEGER Dividend,
8347 _In_ LARGE_INTEGER MagicDivisor,
8348 _In_ CCHAR ShiftCount);
8349 #endif
8350
8351 _IRQL_requires_max_(PASSIVE_LEVEL)
8352 NTSYSAPI
8353 VOID
8354 NTAPI
8355 RtlFreeAnsiString(
8356 _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem))
8357 PANSI_STRING AnsiString);
8358
8359 _Success_(return != -1)
8360 _Must_inspect_result_
8361 NTSYSAPI
8362 ULONG
8363 NTAPI
8364 RtlFindClearBits(
8365 _In_ PRTL_BITMAP BitMapHeader,
8366 _In_ ULONG NumberToFind,
8367 _In_ ULONG HintIndex);
8368
8369 _Success_(return != -1)
8370 NTSYSAPI
8371 ULONG
8372 NTAPI
8373 RtlFindClearBitsAndSet(
8374 _In_ PRTL_BITMAP BitMapHeader,
8375 _In_ ULONG NumberToFind,
8376 _In_ ULONG HintIndex);
8377
8378 NTSYSAPI
8379 ULONG
8380 NTAPI
8381 RtlFindFirstRunClear(
8382 _In_ PRTL_BITMAP BitMapHeader,
8383 _Out_ PULONG StartingIndex);
8384
8385 NTSYSAPI
8386 ULONG
8387 NTAPI
8388 RtlFindClearRuns(
8389 _In_ PRTL_BITMAP BitMapHeader,
8390 _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray,
8391 _In_range_(>, 0) ULONG SizeOfRunArray,
8392 _In_ BOOLEAN LocateLongestRuns);
8393
8394 NTSYSAPI
8395 ULONG
8396 NTAPI
8397 RtlFindLastBackwardRunClear(
8398 _In_ PRTL_BITMAP BitMapHeader,
8399 _In_ ULONG FromIndex,
8400 _Out_ PULONG StartingRunIndex);
8401
8402 _Success_(return != -1)
8403 _Must_inspect_result_
8404 NTSYSAPI
8405 CCHAR
8406 NTAPI
8407 RtlFindLeastSignificantBit(
8408 _In_ ULONGLONG Set);
8409
8410 NTSYSAPI
8411 ULONG
8412 NTAPI
8413 RtlFindLongestRunClear(
8414 _In_ PRTL_BITMAP BitMapHeader,
8415 _Out_ PULONG StartingIndex);
8416
8417 _Success_(return != -1)
8418 _Must_inspect_result_
8419 NTSYSAPI
8420 CCHAR
8421 NTAPI
8422 RtlFindMostSignificantBit(
8423 _In_ ULONGLONG Set);
8424
8425 NTSYSAPI
8426 ULONG
8427 NTAPI
8428 RtlFindNextForwardRunClear(
8429 _In_ PRTL_BITMAP BitMapHeader,
8430 _In_ ULONG FromIndex,
8431 _Out_ PULONG StartingRunIndex);
8432
8433 _Success_(return != -1)
8434 _Must_inspect_result_
8435 NTSYSAPI
8436 ULONG
8437 NTAPI
8438 RtlFindSetBits(
8439 _In_ PRTL_BITMAP BitMapHeader,
8440 _In_ ULONG NumberToFind,
8441 _In_ ULONG HintIndex);
8442
8443 _Success_(return != -1)
8444 NTSYSAPI
8445 ULONG
8446 NTAPI
8447 RtlFindSetBitsAndClear(
8448 _In_ PRTL_BITMAP BitMapHeader,
8449 _In_ ULONG NumberToFind,
8450 _In_ ULONG HintIndex);
8451
8452 _IRQL_requires_max_(DISPATCH_LEVEL)
8453 NTSYSAPI
8454 VOID
8455 NTAPI
8456 RtlInitAnsiString(
8457 _Out_ PANSI_STRING DestinationString,
8458 _In_opt_z_ __drv_aliasesMem PCSZ SourceString);
8459
8460 NTSYSAPI
8461 VOID
8462 NTAPI
8463 RtlInitializeBitMap(
8464 _Out_ PRTL_BITMAP BitMapHeader,
8465 _In_ __drv_aliasesMem PULONG BitMapBuffer,
8466 _In_ ULONG SizeOfBitMap);
8467
8468 _IRQL_requires_max_(DISPATCH_LEVEL)
8469 NTSYSAPI
8470 VOID
8471 NTAPI
8472 RtlInitString(
8473 _Out_ PSTRING DestinationString,
8474 _In_opt_z_ __drv_aliasesMem PCSZ SourceString);
8475
8476 _IRQL_requires_max_(PASSIVE_LEVEL)
8477 _At_(String->MaximumLength, _Const_)
8478 NTSYSAPI
8479 NTSTATUS
8480 NTAPI
8481 RtlIntegerToUnicodeString(
8482 _In_ ULONG Value,
8483 _In_opt_ ULONG Base,
8484 _Inout_ PUNICODE_STRING String);
8485
8486 _IRQL_requires_max_(PASSIVE_LEVEL)
8487 _At_(String->MaximumLength, _Const_)
8488 NTSYSAPI
8489 NTSTATUS
8490 NTAPI
8491 RtlInt64ToUnicodeString(
8492 _In_ ULONGLONG Value,
8493 _In_opt_ ULONG Base,
8494 _Inout_ PUNICODE_STRING String);
8495
8496 #ifdef _WIN64
8497 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8498 RtlInt64ToUnicodeString(Value, Base, String)
8499 #else
8500 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8501 RtlIntegerToUnicodeString(Value, Base, String)
8502 #endif
8503
8504 /* BOOLEAN
8505 * RtlIsZeroLuid(
8506 * IN PLUID L1);
8507 */
8508 #define RtlIsZeroLuid(_L1) \
8509 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
8510
8511 _IRQL_requires_max_(APC_LEVEL)
8512 NTSYSAPI
8513 ULONG
8514 NTAPI
8515 RtlLengthSecurityDescriptor(
8516 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
8517
8518 NTSYSAPI
8519 ULONG
8520 NTAPI
8521 RtlNumberOfClearBits(
8522 _In_ PRTL_BITMAP BitMapHeader);
8523
8524 NTSYSAPI
8525 ULONG
8526 NTAPI
8527 RtlNumberOfSetBits(
8528 _In_ PRTL_BITMAP BitMapHeader);
8529
8530 _IRQL_requires_max_(PASSIVE_LEVEL)
8531 NTSYSAPI
8532 NTSTATUS
8533 NTAPI
8534 RtlQueryRegistryValues(
8535 _In_ ULONG RelativeTo,
8536 _In_ PCWSTR Path,
8537 _Inout_ _At_(*(*QueryTable).EntryContext, _Post_valid_)
8538 PRTL_QUERY_REGISTRY_TABLE QueryTable,
8539 _In_opt_ PVOID Context,
8540 _In_opt_ PVOID Environment);
8541
8542 #define SHORT_SIZE (sizeof(USHORT))
8543 #define SHORT_MASK (SHORT_SIZE - 1)
8544 #define LONG_SIZE (sizeof(LONG))
8545 #define LONGLONG_SIZE (sizeof(LONGLONG))
8546 #define LONG_MASK (LONG_SIZE - 1)
8547 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
8548 #define LOWBYTE_MASK 0x00FF
8549
8550 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
8551 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
8552 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
8553 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
8554
8555 NTSYSAPI
8556 VOID
8557 NTAPI
8558 RtlSetAllBits(
8559 _In_ PRTL_BITMAP BitMapHeader);
8560
8561 NTSYSAPI
8562 VOID
8563 NTAPI
8564 RtlSetBits(
8565 _In_ PRTL_BITMAP BitMapHeader,
8566 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,
8567 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet);
8568
8569 _IRQL_requires_max_(APC_LEVEL)
8570 NTSYSAPI
8571 NTSTATUS
8572 NTAPI
8573 RtlSetDaclSecurityDescriptor(
8574 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
8575 _In_ BOOLEAN DaclPresent,
8576 _In_opt_ PACL Dacl,
8577 _In_opt_ BOOLEAN DaclDefaulted);
8578
8579 #if defined(_AMD64_)
8580
8581 /* VOID
8582 * RtlStoreUlong(
8583 * IN PULONG Address,
8584 * IN ULONG Value);
8585 */
8586 #define RtlStoreUlong(Address,Value) \
8587 *(ULONG UNALIGNED *)(Address) = (Value)
8588
8589 /* VOID
8590 * RtlStoreUlonglong(
8591 * IN OUT PULONGLONG Address,
8592 * ULONGLONG Value);
8593 */
8594 #define RtlStoreUlonglong(Address,Value) \
8595 *(ULONGLONG UNALIGNED *)(Address) = (Value)
8596
8597 /* VOID
8598 * RtlStoreUshort(
8599 * IN PUSHORT Address,
8600 * IN USHORT Value);
8601 */
8602 #define RtlStoreUshort(Address,Value) \
8603 *(USHORT UNALIGNED *)(Address) = (Value)
8604
8605 /* VOID
8606 * RtlRetrieveUshort(
8607 * PUSHORT DestinationAddress,
8608 * PUSHORT SourceAddress);
8609 */
8610 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8611 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
8612
8613 /* VOID
8614 * RtlRetrieveUlong(
8615 * PULONG DestinationAddress,
8616 * PULONG SourceAddress);
8617 */
8618 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8619 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
8620
8621 #else
8622
8623 #define RtlStoreUlong(Address,Value) \
8624 if ((ULONG_PTR)(Address) & LONG_MASK) { \
8625 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
8626 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
8627 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
8628 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
8629 } \
8630 else { \
8631 *((PULONG)(Address)) = (ULONG) (Value); \
8632 }
8633
8634 #define RtlStoreUlonglong(Address,Value) \
8635 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
8636 RtlStoreUlong((ULONG_PTR)(Address), \
8637 (ULONGLONG)(Value) & 0xFFFFFFFF); \
8638 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
8639 (ULONGLONG)(Value) >> 32); \
8640 } else { \
8641 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
8642 }
8643
8644 #define RtlStoreUshort(Address,Value) \
8645 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
8646 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
8647 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
8648 } \
8649 else { \
8650 *((PUSHORT) (Address)) = (USHORT)Value; \
8651 }
8652
8653 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8654 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8655 { \
8656 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8657 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8658 } \
8659 else \
8660 { \
8661 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
8662 }
8663
8664 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8665 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8666 { \
8667 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8668 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8669 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
8670 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
8671 } \
8672 else \
8673 { \
8674 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
8675 }
8676
8677 #endif /* defined(_AMD64_) */
8678
8679 #ifdef _WIN64
8680 /* VOID
8681 * RtlStoreUlongPtr(
8682 * IN OUT PULONG_PTR Address,
8683 * IN ULONG_PTR Value);
8684 */
8685 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
8686 #else
8687 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
8688 #endif /* _WIN64 */
8689
8690 _Success_(return != 0)
8691 NTSYSAPI
8692 BOOLEAN
8693 NTAPI
8694 RtlTimeFieldsToTime(
8695 _In_ PTIME_FIELDS TimeFields,
8696 _Out_ PLARGE_INTEGER Time);
8697
8698 NTSYSAPI
8699 VOID
8700 NTAPI
8701 RtlTimeToTimeFields(
8702 _In_ PLARGE_INTEGER Time,
8703 _Out_ PTIME_FIELDS TimeFields);
8704
8705 NTSYSAPI
8706 ULONG
8707 FASTCALL
8708 RtlUlongByteSwap(
8709 _In_ ULONG Source);
8710
8711 NTSYSAPI
8712 ULONGLONG
8713 FASTCALL
8714 RtlUlonglongByteSwap(
8715 _In_ ULONGLONG Source);
8716
8717 _When_(AllocateDestinationString,
8718 _At_(DestinationString->MaximumLength,
8719 _Out_range_(<=, (SourceString->MaximumLength / sizeof(WCHAR)))))
8720 _When_(!AllocateDestinationString,
8721 _At_(DestinationString->Buffer, _Const_)
8722 _At_(DestinationString->MaximumLength, _Const_))
8723 _IRQL_requires_max_(PASSIVE_LEVEL)
8724 _When_(AllocateDestinationString, _Must_inspect_result_)
8725 NTSYSAPI
8726 NTSTATUS
8727 NTAPI
8728 RtlUnicodeStringToAnsiString(
8729 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
8730 _When_(!AllocateDestinationString, _Inout_)
8731 PANSI_STRING DestinationString,
8732 _In_ PCUNICODE_STRING SourceString,
8733 _In_ BOOLEAN AllocateDestinationString);
8734
8735 _IRQL_requires_max_(PASSIVE_LEVEL)
8736 NTSYSAPI
8737 ULONG
8738 NTAPI
8739 RtlxUnicodeStringToAnsiSize(
8740 _In_ PCUNICODE_STRING UnicodeString);
8741
8742 #define RtlUnicodeStringToAnsiSize(String) ( \
8743 NLS_MB_CODE_PAGE_TAG ? \
8744 RtlxUnicodeStringToAnsiSize(String) : \
8745 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
8746 )
8747
8748 _IRQL_requires_max_(PASSIVE_LEVEL)
8749 NTSYSAPI
8750 NTSTATUS
8751 NTAPI
8752 RtlUnicodeStringToInteger(
8753 _In_ PCUNICODE_STRING String,
8754 _In_opt_ ULONG Base,
8755 _Out_ PULONG Value);
8756
8757 _IRQL_requires_max_(PASSIVE_LEVEL)
8758 NTSYSAPI
8759 WCHAR
8760 NTAPI
8761 RtlUpcaseUnicodeChar(
8762 _In_ WCHAR SourceCharacter);
8763
8764 NTSYSAPI
8765 USHORT
8766 FASTCALL
8767 RtlUshortByteSwap(
8768 _In_ USHORT Source);
8769
8770 _IRQL_requires_max_(APC_LEVEL)
8771 _Must_inspect_result_
8772 NTSYSAPI
8773 BOOLEAN
8774 NTAPI
8775 RtlValidRelativeSecurityDescriptor(
8776 _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,
8777 _In_ ULONG SecurityDescriptorLength,
8778 _In_ SECURITY_INFORMATION RequiredInformation);
8779
8780 _IRQL_requires_max_(APC_LEVEL)
8781 _Must_inspect_result_
8782 NTSYSAPI
8783 BOOLEAN
8784 NTAPI
8785 RtlValidSecurityDescriptor(
8786 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
8787
8788 _IRQL_requires_max_(PASSIVE_LEVEL)
8789 NTSYSAPI
8790 NTSTATUS
8791 NTAPI
8792 RtlWriteRegistryValue(
8793 _In_ ULONG RelativeTo,
8794 _In_ PCWSTR Path,
8795 _In_z_ PCWSTR ValueName,
8796 _In_ ULONG ValueType,
8797 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
8798 _In_ ULONG ValueLength);
8799
8800
8801 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8802
8803
8804 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
8805 NTSYSAPI
8806 VOID
8807 FASTCALL
8808 RtlPrefetchMemoryNonTemporal(
8809 _In_ PVOID Source,
8810 _In_ SIZE_T Length);
8811 #endif
8812
8813
8814 #if (NTDDI_VERSION >= NTDDI_WINXP)
8815
8816
8817 NTSYSAPI
8818 VOID
8819 NTAPI
8820 RtlClearBit(
8821 _In_ PRTL_BITMAP BitMapHeader,
8822 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
8823
8824 _IRQL_requires_max_(PASSIVE_LEVEL)
8825 NTSYSAPI
8826 WCHAR
8827 NTAPI
8828 RtlDowncaseUnicodeChar(
8829 _In_ WCHAR SourceCharacter);
8830
8831 NTSYSAPI
8832 VOID
8833 NTAPI
8834 RtlSetBit(
8835 _In_ PRTL_BITMAP BitMapHeader,
8836 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
8837
8838 _Must_inspect_result_
8839 NTSYSAPI
8840 BOOLEAN
8841 NTAPI
8842 RtlTestBit(
8843 _In_ PRTL_BITMAP BitMapHeader,
8844 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
8845
8846 _IRQL_requires_max_(PASSIVE_LEVEL)
8847 NTSYSAPI
8848 NTSTATUS
8849 NTAPI
8850 RtlHashUnicodeString(
8851 _In_ CONST UNICODE_STRING *String,
8852 _In_ BOOLEAN CaseInSensitive,
8853 _In_ ULONG HashAlgorithm,
8854 _Out_ PULONG HashValue);
8855
8856
8857
8858 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
8859
8860
8861 #if (NTDDI_VERSION >= NTDDI_VISTA)
8862
8863 NTSYSAPI
8864 ULONG
8865 NTAPI
8866 RtlNumberOfSetBitsUlongPtr(
8867 _In_ ULONG_PTR Target);
8868
8869 NTSYSAPI
8870 ULONGLONG
8871 NTAPI
8872 RtlIoDecodeMemIoResource(
8873 _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
8874 _Out_opt_ PULONGLONG Alignment,
8875 _Out_opt_ PULONGLONG MinimumAddress,
8876 _Out_opt_ PULONGLONG MaximumAddress);
8877
8878 NTSYSAPI
8879 NTSTATUS
8880 NTAPI
8881 RtlIoEncodeMemIoResource(
8882 _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
8883 _In_ UCHAR Type,
8884 _In_ ULONGLONG Length,
8885 _In_ ULONGLONG Alignment,
8886 _In_ ULONGLONG MinimumAddress,
8887 _In_ ULONGLONG MaximumAddress);
8888
8889 NTSYSAPI
8890 ULONGLONG
8891 NTAPI
8892 RtlCmDecodeMemIoResource(
8893 _In_ struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
8894 _Out_opt_ PULONGLONG Start);
8895
8896 NTSYSAPI
8897 NTSTATUS
8898 NTAPI
8899 RtlFindClosestEncodableLength(
8900 _In_ ULONGLONG SourceLength,
8901 _Out_ PULONGLONG TargetLength);
8902
8903 NTSYSAPI
8904 NTSTATUS
8905 NTAPI
8906 RtlCmEncodeMemIoResource(
8907 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
8908 _In_ UCHAR Type,
8909 _In_ ULONGLONG Length,
8910 _In_ ULONGLONG Start);
8911
8912
8913 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8914
8915 #if (NTDDI_VERSION >= NTDDI_WIN7)
8916
8917 _IRQL_requires_max_(PASSIVE_LEVEL)
8918 _Must_inspect_result_
8919 NTSYSAPI
8920 NTSTATUS
8921 NTAPI
8922 RtlUnicodeToUTF8N(
8923 _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount)
8924 PCHAR UTF8StringDestination,
8925 _In_ ULONG UTF8StringMaxByteCount,
8926 _Out_ PULONG UTF8StringActualByteCount,
8927 _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource,
8928 _In_ ULONG UnicodeStringByteCount);
8929
8930 _IRQL_requires_max_(PASSIVE_LEVEL)
8931 _Must_inspect_result_
8932 NTSYSAPI
8933 NTSTATUS
8934 NTAPI
8935 RtlUTF8ToUnicodeN(
8936 _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount)
8937 PWSTR UnicodeStringDestination,
8938 _In_ ULONG UnicodeStringMaxByteCount,
8939 _Out_ PULONG UnicodeStringActualByteCount,
8940 _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource,
8941 _In_ ULONG UTF8StringByteCount);
8942
8943 NTSYSAPI
8944 ULONG64
8945 NTAPI
8946 RtlGetEnabledExtendedFeatures(
8947 IN ULONG64 FeatureMask);
8948
8949
8950 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
8951
8952
8953 #if !defined(MIDL_PASS)
8954 /* inline funftions */
8955 //DECLSPEC_DEPRECATED_DDK_WINXP
8956 static __inline
8957 LARGE_INTEGER
8958 NTAPI_INLINE
8959 RtlConvertLongToLargeInteger(
8960 _In_ LONG SignedInteger)
8961 {
8962 LARGE_INTEGER ret;
8963 ret.QuadPart = SignedInteger;
8964 return ret;
8965 }
8966
8967 //DECLSPEC_DEPRECATED_DDK_WINXP
8968 static __inline
8969 LARGE_INTEGER
8970 NTAPI_INLINE
8971 RtlConvertUlongToLargeInteger(
8972 _In_ ULONG UnsignedInteger)
8973 {
8974 LARGE_INTEGER ret;
8975 ret.QuadPart = UnsignedInteger;
8976 return ret;
8977 }
8978
8979 //DECLSPEC_DEPRECATED_DDK_WINXP
8980 static __inline
8981 LARGE_INTEGER
8982 NTAPI_INLINE
8983 RtlLargeIntegerShiftLeft(
8984 _In_ LARGE_INTEGER LargeInteger,
8985 _In_ CCHAR ShiftCount)
8986 {
8987 LARGE_INTEGER Result;
8988
8989 Result.QuadPart = LargeInteger.QuadPart << ShiftCount;
8990 return Result;
8991 }
8992
8993 //DECLSPEC_DEPRECATED_DDK_WINXP
8994 static __inline
8995 LARGE_INTEGER
8996 NTAPI_INLINE
8997 RtlLargeIntegerShiftRight(
8998 _In_ LARGE_INTEGER LargeInteger,
8999 _In_ CCHAR ShiftCount)
9000 {
9001 LARGE_INTEGER Result;
9002
9003 Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount;
9004 return Result;
9005 }
9006
9007 //DECLSPEC_DEPRECATED_DDK
9008 static __inline
9009 ULONG
9010 NTAPI_INLINE
9011 RtlEnlargedUnsignedDivide(
9012 _In_ ULARGE_INTEGER Dividend,
9013 _In_ ULONG Divisor,
9014 _Out_opt_ PULONG Remainder)
9015 {
9016 if (Remainder)
9017 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9018 return (ULONG)(Dividend.QuadPart / Divisor);
9019 }
9020
9021 //DECLSPEC_DEPRECATED_DDK
9022 static __inline
9023 LARGE_INTEGER
9024 NTAPI_INLINE
9025 RtlLargeIntegerNegate(
9026 _In_ LARGE_INTEGER Subtrahend)
9027 {
9028 LARGE_INTEGER Difference;
9029
9030 Difference.QuadPart = -Subtrahend.QuadPart;
9031 return Difference;
9032 }
9033
9034 //DECLSPEC_DEPRECATED_DDK
9035 static __inline
9036 LARGE_INTEGER
9037 NTAPI_INLINE
9038 RtlLargeIntegerSubtract(
9039 _In_ LARGE_INTEGER Minuend,
9040 _In_ LARGE_INTEGER Subtrahend)
9041 {
9042 LARGE_INTEGER Difference;
9043
9044 Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
9045 return Difference;
9046 }
9047
9048 //DECLSPEC_DEPRECATED_DDK
9049 static __inline
9050 LARGE_INTEGER
9051 NTAPI_INLINE
9052 RtlEnlargedUnsignedMultiply(
9053 _In_ ULONG Multiplicand,
9054 _In_ ULONG Multiplier)
9055 {
9056 LARGE_INTEGER ret;
9057 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9058 return ret;
9059 }
9060
9061 //DECLSPEC_DEPRECATED_DDK
9062 static __inline
9063 LARGE_INTEGER
9064 NTAPI_INLINE
9065 RtlEnlargedIntegerMultiply(
9066 _In_ LONG Multiplicand,
9067 _In_ LONG Multiplier)
9068 {
9069 LARGE_INTEGER ret;
9070 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9071 return ret;
9072 }
9073
9074 _At_(AnsiString->Buffer, _Post_equal_to_(Buffer))
9075 _At_(AnsiString->Length, _Post_equal_to_(0))
9076 _At_(AnsiString->MaximumLength, _Post_equal_to_(BufferSize))
9077 FORCEINLINE
9078 VOID
9079 RtlInitEmptyAnsiString(
9080 _Out_ PANSI_STRING AnsiString,
9081 _Pre_maybenull_ _Pre_readable_size_(BufferSize) __drv_aliasesMem PCHAR Buffer,
9082 _In_ USHORT BufferSize)
9083 {
9084 AnsiString->Length = 0;
9085 AnsiString->MaximumLength = BufferSize;
9086 AnsiString->Buffer = Buffer;
9087 }
9088
9089 _At_(UnicodeString->Buffer, _Post_equal_to_(Buffer))
9090 _At_(UnicodeString->Length, _Post_equal_to_(0))
9091 _At_(UnicodeString->MaximumLength, _Post_equal_to_(BufferSize))
9092 FORCEINLINE
9093 VOID
9094 RtlInitEmptyUnicodeString(
9095 _Out_ PUNICODE_STRING UnicodeString,
9096 _Writable_bytes_(BufferSize)
9097 _When_(BufferSize != 0, _Notnull_)
9098 __drv_aliasesMem PWSTR Buffer,
9099 _In_ USHORT BufferSize)
9100 {
9101 UnicodeString->Length = 0;
9102 UnicodeString->MaximumLength = BufferSize;
9103 UnicodeString->Buffer = Buffer;
9104 }
9105
9106 #if defined(_AMD64_) || defined(_IA64_)
9107
9108
9109 static __inline
9110 LARGE_INTEGER
9111 NTAPI_INLINE
9112 RtlExtendedIntegerMultiply(
9113 _In_ LARGE_INTEGER Multiplicand,
9114 _In_ LONG Multiplier)
9115 {
9116 LARGE_INTEGER ret;
9117 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
9118 return ret;
9119 }
9120
9121 static __inline
9122 LARGE_INTEGER
9123 NTAPI_INLINE
9124 RtlExtendedLargeIntegerDivide(
9125 _In_ LARGE_INTEGER Dividend,
9126 _In_ ULONG Divisor,
9127 _Out_opt_ PULONG Remainder)
9128 {
9129 LARGE_INTEGER ret;
9130 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
9131 if (Remainder)
9132 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9133 return ret;
9134 }
9135
9136
9137
9138 #endif /* defined(_AMD64_) || defined(_IA64_) */
9139
9140
9141 #if defined(_AMD64_)
9142
9143 #define MultiplyHigh __mulh
9144 #define UnsignedMultiplyHigh __umulh
9145
9146 //DECLSPEC_DEPRECATED_DDK
9147 static __inline
9148 LARGE_INTEGER
9149 NTAPI_INLINE
9150 RtlExtendedMagicDivide(
9151 _In_ LARGE_INTEGER Dividend,
9152 _In_ LARGE_INTEGER MagicDivisor,
9153 _In_ CCHAR ShiftCount)
9154 {
9155 LARGE_INTEGER ret;
9156 ULONG64 ret64;
9157 BOOLEAN Pos;
9158 Pos = (Dividend.QuadPart >= 0);
9159 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
9160 MagicDivisor.QuadPart);
9161 ret64 >>= ShiftCount;
9162 ret.QuadPart = Pos ? ret64 : -(LONG64)ret64;
9163 return ret;
9164 }
9165 #endif
9166
9167 //DECLSPEC_DEPRECATED_DDK
9168 static __inline
9169 LARGE_INTEGER
9170 NTAPI_INLINE
9171 RtlLargeIntegerAdd(
9172 _In_ LARGE_INTEGER Addend1,
9173 _In_ LARGE_INTEGER Addend2)
9174 {
9175 LARGE_INTEGER ret;
9176 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
9177 return ret;
9178 }
9179
9180 /* VOID
9181 * RtlLargeIntegerAnd(
9182 * IN OUT LARGE_INTEGER Result,
9183 * IN LARGE_INTEGER Source,
9184 * IN LARGE_INTEGER Mask);
9185 */
9186 #define RtlLargeIntegerAnd(Result, Source, Mask) \
9187 Result.QuadPart = Source.QuadPart & Mask.QuadPart
9188
9189 //DECLSPEC_DEPRECATED_DDK
9190 static __inline
9191 LARGE_INTEGER
9192 NTAPI_INLINE
9193 RtlLargeIntegerArithmeticShift(
9194 _In_ LARGE_INTEGER LargeInteger,
9195 _In_ CCHAR ShiftCount)
9196 {
9197 LARGE_INTEGER ret;
9198 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
9199 return ret;
9200 }
9201
9202 /* BOOLEAN
9203 * RtlLargeIntegerEqualTo(
9204 * IN LARGE_INTEGER Operand1,
9205 * IN LARGE_INTEGER Operand2);
9206 */
9207 #define RtlLargeIntegerEqualTo(X,Y) \
9208 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
9209
9210 FORCEINLINE
9211 PVOID
9212 RtlSecureZeroMemory(
9213 _Out_writes_bytes_all_(Size) PVOID Pointer,
9214 _In_ SIZE_T Size)
9215 {
9216 volatile char* vptr = (volatile char*)Pointer;
9217 #if defined(_M_AMD64)
9218 __stosb((PUCHAR)vptr, 0, Size);
9219 #else
9220 char * endptr = (char *)vptr + Size;
9221 while (vptr < endptr) {
9222 *vptr = 0; vptr++;
9223 }
9224 #endif
9225 return Pointer;
9226 }
9227
9228 #if defined(_M_AMD64)
9229 _Must_inspect_result_
9230 FORCEINLINE
9231 BOOLEAN
9232 RtlCheckBit(
9233 _In_ PRTL_BITMAP BitMapHeader,
9234 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition)
9235 {
9236 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
9237 }
9238 #else
9239 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
9240 #endif /* defined(_M_AMD64) */
9241
9242 #define RtlLargeIntegerGreaterThan(X,Y) ( \
9243 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
9244 ((X).HighPart > (Y).HighPart) \
9245 )
9246
9247 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
9248 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
9249 ((X).HighPart > (Y).HighPart) \
9250 )
9251
9252 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
9253 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
9254 )
9255
9256 #define RtlLargeIntegerLessThan(X,Y) ( \
9257 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
9258 ((X).HighPart < (Y).HighPart) \
9259 )
9260
9261 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
9262 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
9263 ((X).HighPart < (Y).HighPart) \
9264 )
9265
9266 #define RtlLargeIntegerGreaterThanZero(X) ( \
9267 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
9268 ((X).HighPart > 0 ) \
9269 )
9270
9271 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
9272
9273 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
9274
9275 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
9276
9277 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
9278
9279 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
9280
9281 #endif /* !defined(MIDL_PASS) */
9282
9283 /* Byte Swap Functions */
9284 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
9285 ((defined(_M_AMD64) || defined(_M_IA64)) \
9286 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
9287
9288 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
9289 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
9290 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
9291
9292 #endif
9293
9294 #if DBG
9295
9296 #define ASSERT(exp) \
9297 (VOID)((!(exp)) ? \
9298 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
9299
9300 #define ASSERTMSG(msg, exp) \
9301 (VOID)((!(exp)) ? \
9302 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
9303
9304 #define RTL_SOFT_ASSERT(exp) \
9305 (VOID)((!(exp)) ? \
9306 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
9307
9308 #define RTL_SOFT_ASSERTMSG(msg, exp) \
9309 (VOID)((!(exp)) ? \
9310 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
9311
9312 #define RTL_VERIFY(exp) ASSERT(exp)
9313 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
9314
9315 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
9316 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
9317
9318 #if defined(_MSC_VER)
9319
9320 #define NT_ASSERT(exp) \
9321 ((!(exp)) ? \
9322 (__annotation(L"Debug", L"AssertFail", L#exp), \
9323 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9324
9325 #define NT_ASSERTMSG(msg, exp) \
9326 ((!(exp)) ? \
9327 (__annotation(L"Debug", L"AssertFail", L##msg), \
9328 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9329
9330 #define NT_ASSERTMSGW(msg, exp) \
9331 ((!(exp)) ? \
9332 (__annotation(L"Debug", L"AssertFail", msg), \
9333 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9334
9335 #define NT_VERIFY NT_ASSERT
9336 #define NT_VERIFYMSG NT_ASSERTMSG
9337 #define NT_VERIFYMSGW NT_ASSERTMSGW
9338
9339 #else
9340
9341 /* GCC doesn't support __annotation (nor PDB) */
9342 #define NT_ASSERT(exp) \
9343 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
9344
9345 #define NT_ASSERTMSG NT_ASSERT
9346 #define NT_ASSERTMSGW NT_ASSERT
9347
9348 #endif
9349
9350 #else /* !DBG */
9351
9352 #define ASSERT(exp) ((VOID) 0)
9353 #define ASSERTMSG(msg, exp) ((VOID) 0)
9354
9355 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
9356 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
9357
9358 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
9359 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9360
9361 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
9362 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9363
9364 #define NT_ASSERT(exp) ((VOID)0)
9365 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
9366 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
9367
9368 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
9369 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
9370 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
9371
9372 #endif /* DBG */
9373
9374 #define InitializeListHead32(ListHead) (\
9375 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
9376
9377 #if !defined(_WINBASE_)
9378
9379 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
9380
9381 NTKERNELAPI
9382 VOID
9383 InitializeSListHead(
9384 _Out_ PSLIST_HEADER SListHead);
9385
9386 #else
9387
9388 FORCEINLINE
9389 VOID
9390 InitializeSListHead(
9391 _Out_ PSLIST_HEADER SListHead)
9392 {
9393 #if defined(_IA64_)
9394 ULONG64 FeatureBits;
9395 #endif
9396
9397 #if defined(_WIN64)
9398 if (((ULONG_PTR)SListHead & 0xf) != 0) {
9399 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
9400 }
9401 #endif
9402 RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
9403 #if defined(_IA64_)
9404 FeatureBits = __getReg(CV_IA64_CPUID4);
9405 if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
9406 SListHead->Header16.HeaderType = 1;
9407 SListHead->Header16.Init = 1;
9408 }
9409 #endif
9410 }
9411
9412 #endif
9413
9414 #if defined(_WIN64)
9415
9416 #define InterlockedPopEntrySList(Head) \
9417 ExpInterlockedPopEntrySList(Head)
9418
9419 #define InterlockedPushEntrySList(Head, Entry) \
9420 ExpInterlockedPushEntrySList(Head, Entry)
9421
9422 #define InterlockedFlushSList(Head) \
9423 ExpInterlockedFlushSList(Head)
9424
9425 #define QueryDepthSList(Head) \
9426 ExQueryDepthSList(Head)
9427
9428 #else /* !defined(_WIN64) */
9429
9430 NTKERNELAPI
9431 PSLIST_ENTRY
9432 FASTCALL
9433 InterlockedPopEntrySList(
9434 _Inout_ PSLIST_HEADER ListHead);
9435
9436 NTKERNELAPI
9437 PSLIST_ENTRY
9438 FASTCALL
9439 InterlockedPushEntrySList(
9440 _Inout_ PSLIST_HEADER ListHead,
9441 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry);
9442
9443 #define InterlockedFlushSList(ListHead) \
9444 ExInterlockedFlushSList(ListHead)
9445
9446 #define QueryDepthSList(Head) \
9447 ExQueryDepthSList(Head)
9448
9449 #endif /* !defined(_WIN64) */
9450
9451 #endif /* !defined(_WINBASE_) */
9452
9453 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
9454 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
9455 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
9456 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
9457 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
9458 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
9459 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
9460 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
9461 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
9462 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
9463 (PCONTEXT_EX)(Context + 1), \
9464 Chunk)
9465
9466 BOOLEAN
9467 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)(
9468 _In_ ULONG Version);
9469
9470 BOOLEAN
9471 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
9472 _In_ ULONG Version);
9473
9474 #ifndef RtlIsNtDdiVersionAvailable
9475 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
9476 #endif
9477
9478 #ifndef RtlIsServicePackVersionInstalled
9479 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
9480 #endif
9481
9482 #define RtlInterlockedSetBits(Flags, Flag) \
9483 InterlockedOr((PLONG)(Flags), Flag)
9484
9485 #define RtlInterlockedAndBits(Flags, Flag) \
9486 InterlockedAnd((PLONG)(Flags), Flag)
9487
9488 #define RtlInterlockedClearBits(Flags, Flag) \
9489 RtlInterlockedAndBits(Flags, ~(Flag))
9490
9491 #define RtlInterlockedXorBits(Flags, Flag) \
9492 InterlockedXor(Flags, Flag)
9493
9494 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
9495 (VOID) RtlInterlockedSetBits(Flags, Flag)
9496
9497 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
9498 (VOID) RtlInterlockedAndBits(Flags, Flag)
9499
9500 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
9501 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
9502
9503
9504 /******************************************************************************
9505 * Kernel Functions *
9506 ******************************************************************************/
9507 #if defined(_M_IX86)
9508 /** Kernel definitions for x86 **/
9509
9510 /* Interrupt request levels */
9511 #define PASSIVE_LEVEL 0
9512 #define LOW_LEVEL 0
9513 #define APC_LEVEL 1
9514 #define DISPATCH_LEVEL 2
9515 #define CMCI_LEVEL 5
9516 #define PROFILE_LEVEL 27
9517 #define CLOCK1_LEVEL 28
9518 #define CLOCK2_LEVEL 28
9519 #define IPI_LEVEL 29
9520 #define POWER_LEVEL 30
9521 #define HIGH_LEVEL 31
9522 #define CLOCK_LEVEL CLOCK2_LEVEL
9523
9524 #define KIP0PCRADDRESS 0xffdff000
9525 #define KI_USER_SHARED_DATA 0xffdf0000
9526 #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
9527
9528 #define PAGE_SIZE 0x1000
9529 #define PAGE_SHIFT 12L
9530 #define KeGetDcacheFillSize() 1L
9531
9532 #define EFLAG_SIGN 0x8000
9533 #define EFLAG_ZERO 0x4000
9534 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
9535
9536 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
9537 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
9538 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
9539
9540
9541 typedef struct _KFLOATING_SAVE {
9542 ULONG ControlWord;
9543 ULONG StatusWord;
9544 ULONG ErrorOffset;
9545 ULONG ErrorSelector;
9546 ULONG DataOffset;
9547 ULONG DataSelector;
9548 ULONG Cr0NpxState;
9549 ULONG Spare1;
9550 } KFLOATING_SAVE, *PKFLOATING_SAVE;
9551
9552 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
9553
9554 #define YieldProcessor _mm_pause
9555
9556 FORCEINLINE
9557 VOID
9558 KeMemoryBarrier(VOID)
9559 {
9560 LONG Barrier, *Dummy = &Barrier;
9561 UNREFERENCED_LOCAL_VARIABLE(Dummy);
9562
9563 #if defined(__GNUC__)
9564 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
9565 #elif defined(_MSC_VER)
9566 __asm xchg [Barrier], eax
9567 #endif
9568 }
9569
9570 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
9571
9572 _IRQL_requires_max_(HIGH_LEVEL)
9573 _IRQL_saves_
9574 NTHALAPI
9575 KIRQL
9576 NTAPI
9577 KeGetCurrentIrql(VOID);
9578
9579 _IRQL_requires_max_(HIGH_LEVEL)
9580 NTHALAPI
9581 VOID
9582 FASTCALL
9583 KfLowerIrql(
9584 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql);
9585 #define KeLowerIrql(a) KfLowerIrql(a)
9586
9587 _IRQL_requires_max_(HIGH_LEVEL)
9588 _IRQL_raises_(NewIrql)
9589 _IRQL_saves_
9590 NTHALAPI
9591 KIRQL
9592 FASTCALL
9593 KfRaiseIrql(
9594 _In_ KIRQL NewIrql);
9595 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9596
9597 _IRQL_requires_max_(DISPATCH_LEVEL)
9598 _IRQL_saves_
9599 _IRQL_raises_(DISPATCH_LEVEL)
9600 NTHALAPI
9601 KIRQL
9602 NTAPI
9603 KeRaiseIrqlToDpcLevel(VOID);
9604
9605 NTHALAPI
9606 KIRQL
9607 NTAPI
9608 KeRaiseIrqlToSynchLevel(VOID);
9609
9610 _Requires_lock_not_held_(*SpinLock)
9611 _Acquires_lock_(*SpinLock)
9612 _IRQL_requires_max_(DISPATCH_LEVEL)
9613 _IRQL_saves_
9614 _IRQL_raises_(DISPATCH_LEVEL)
9615 NTHALAPI
9616 KIRQL
9617 FASTCALL
9618 KfAcquireSpinLock(
9619 _Inout_ PKSPIN_LOCK SpinLock);
9620 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
9621
9622 _Requires_lock_held_(*SpinLock)
9623 _Releases_lock_(*SpinLock)
9624 _IRQL_requires_(DISPATCH_LEVEL)
9625 NTHALAPI
9626 VOID
9627 FASTCALL
9628 KfReleaseSpinLock(
9629 _Inout_ PKSPIN_LOCK SpinLock,
9630 _In_ _IRQL_restores_ KIRQL NewIrql);
9631 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
9632
9633 _Requires_lock_not_held_(*SpinLock)
9634 _Acquires_lock_(*SpinLock)
9635 _IRQL_requires_min_(DISPATCH_LEVEL)
9636 NTKERNELAPI
9637 VOID
9638 FASTCALL
9639 KefAcquireSpinLockAtDpcLevel(
9640 _Inout_ PKSPIN_LOCK SpinLock);
9641 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
9642
9643 _Requires_lock_held_(*SpinLock)
9644 _Releases_lock_(*SpinLock)
9645 _IRQL_requires_min_(DISPATCH_LEVEL)
9646 NTKERNELAPI
9647 VOID
9648 FASTCALL
9649 KefReleaseSpinLockFromDpcLevel(
9650 _Inout_ PKSPIN_LOCK SpinLock);
9651 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
9652
9653 NTSYSAPI
9654 PKTHREAD
9655 NTAPI
9656 KeGetCurrentThread(VOID);
9657
9658 _Always_(_Post_satisfies_(return<=0))
9659 _Must_inspect_result_
9660 _IRQL_requires_max_(DISPATCH_LEVEL)
9661 _Kernel_float_saved_
9662 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
9663 NTKERNELAPI
9664 NTSTATUS
9665 NTAPI
9666 KeSaveFloatingPointState(
9667 _Out_ PKFLOATING_SAVE FloatSave);
9668
9669 _Success_(1)
9670 _Kernel_float_restored_
9671 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
9672 NTKERNELAPI
9673 NTSTATUS
9674 NTAPI
9675 KeRestoreFloatingPointState(
9676 _In_ PKFLOATING_SAVE FloatSave);
9677
9678 /* VOID
9679 * KeFlushIoBuffers(
9680 * IN PMDL Mdl,
9681 * IN BOOLEAN ReadOperation,
9682 * IN BOOLEAN DmaOperation)
9683 */
9684 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
9685
9686 /* x86 and x64 performs a 0x2C interrupt */
9687 #define DbgRaiseAssertionFailure __int2c
9688
9689 FORCEINLINE
9690 VOID
9691 _KeQueryTickCount(
9692 OUT PLARGE_INTEGER CurrentCount)
9693 {
9694 for (;;) {
9695 #ifdef NONAMELESSUNION
9696 CurrentCount->s.HighPart = KeTickCount.High1Time;
9697 CurrentCount->s.LowPart = KeTickCount.LowPart;
9698 if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
9699 #else
9700 CurrentCount->HighPart = KeTickCount.High1Time;
9701 CurrentCount->LowPart = KeTickCount.LowPart;
9702 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
9703 #endif
9704 YieldProcessor();
9705 }
9706 }
9707 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
9708
9709
9710
9711
9712
9713 #elif defined(_M_AMD64)
9714 /** Kernel definitions for AMD64 **/
9715
9716 /* Interrupt request levels */
9717 #define PASSIVE_LEVEL 0
9718 #define LOW_LEVEL 0
9719 #define APC_LEVEL 1
9720 #define DISPATCH_LEVEL 2
9721 #define CMCI_LEVEL 5
9722 #define CLOCK_LEVEL 13
9723 #define IPI_LEVEL 14
9724 #define DRS_LEVEL 14
9725 #define POWER_LEVEL 14
9726 #define PROFILE_LEVEL 15
9727 #define HIGH_LEVEL 15
9728
9729 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
9730 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
9731 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
9732 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
9733 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
9734
9735 #define PAGE_SIZE 0x1000
9736 #define PAGE_SHIFT 12L
9737
9738 #define EFLAG_SIGN 0x8000
9739 #define EFLAG_ZERO 0x4000
9740 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
9741
9742 typedef struct _KFLOATING_SAVE {
9743 ULONG Dummy;
9744 } KFLOATING_SAVE, *PKFLOATING_SAVE;
9745
9746 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
9747
9748 #define KeQueryInterruptTime() \
9749 (*(volatile ULONG64*)SharedInterruptTime)
9750
9751 #define KeQuerySystemTime(CurrentCount) \
9752 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
9753
9754 #define KeQueryTickCount(CurrentCount) \
9755 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
9756
9757 #define KeGetDcacheFillSize() 1L
9758
9759 #define YieldProcessor _mm_pause
9760 #define FastFence __faststorefence
9761 #define LoadFence _mm_lfence
9762 #define MemoryFence _mm_mfence
9763 #define StoreFence _mm_sfence
9764 #define LFENCE_ACQUIRE() LoadFence()
9765
9766 FORCEINLINE
9767 VOID
9768 KeMemoryBarrier(VOID)
9769 {
9770 // FIXME: Do we really need lfence after the __faststorefence ?
9771 FastFence();
9772 LFENCE_ACQUIRE();
9773 }
9774
9775 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
9776
9777 FORCEINLINE
9778 KIRQL
9779 KeGetCurrentIrql(VOID)
9780 {
9781 return (KIRQL)__readcr8();
9782 }
9783
9784 FORCEINLINE
9785 VOID
9786 KeLowerIrql(IN KIRQL NewIrql)
9787 {
9788 ASSERT((KIRQL)__readcr8() >= NewIrql);
9789 __writecr8(NewIrql);
9790 }
9791
9792 FORCEINLINE
9793 KIRQL
9794 KfRaiseIrql(IN KIRQL NewIrql)
9795 {
9796 KIRQL OldIrql;
9797
9798 OldIrql = (KIRQL)__readcr8();
9799 ASSERT(OldIrql <= NewIrql);
9800 __writecr8(NewIrql);
9801 return OldIrql;
9802 }
9803 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9804
9805 FORCEINLINE
9806 KIRQL
9807 KeRaiseIrqlToDpcLevel(VOID)
9808 {
9809 return KfRaiseIrql(DISPATCH_LEVEL);
9810 }
9811
9812 FORCEINLINE
9813 KIRQL
9814 KeRaiseIrqlToSynchLevel(VOID)
9815 {
9816 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
9817 }
9818
9819 FORCEINLINE
9820 PKTHREAD
9821 KeGetCurrentThread(VOID)
9822 {
9823 return (struct _KTHREAD *)__readgsqword(0x188);
9824 }
9825
9826 FORCEINLINE
9827 NTSTATUS
9828 KeSaveFloatingPointState(PVOID FloatingState)
9829 {
9830 UNREFERENCED_PARAMETER(FloatingState);
9831 return STATUS_SUCCESS;
9832 }
9833
9834 FORCEINLINE
9835 NTSTATUS
9836 KeRestoreFloatingPointState(PVOID FloatingState)
9837 {
9838 UNREFERENCED_PARAMETER(FloatingState);
9839 return STATUS_SUCCESS;
9840 }
9841
9842 /* VOID
9843 * KeFlushIoBuffers(
9844 * IN PMDL Mdl,
9845 * IN BOOLEAN ReadOperation,
9846 * IN BOOLEAN DmaOperation)
9847 */
9848 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
9849
9850 /* x86 and x64 performs a 0x2C interrupt */
9851 #define DbgRaiseAssertionFailure __int2c
9852
9853 #elif defined(_M_IA64)
9854 /** Kernel definitions for IA64 **/
9855
9856 /* Interrupt request levels */
9857 #define PASSIVE_LEVEL 0
9858 #define LOW_LEVEL 0
9859 #define APC_LEVEL 1
9860 #define DISPATCH_LEVEL 2
9861 #define CMC_LEVEL 3
9862 #define DEVICE_LEVEL_BASE 4
9863 #define PC_LEVEL 12
9864 #define IPI_LEVEL 14
9865 #define DRS_LEVEL 14
9866 #define CLOCK_LEVEL 13
9867 #define POWER_LEVEL 15
9868 #define PROFILE_LEVEL 15
9869 #define HIGH_LEVEL 15
9870
9871 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
9872 extern volatile LARGE_INTEGER KeTickCount;
9873
9874 #define PAUSE_PROCESSOR __yield();
9875
9876 FORCEINLINE
9877 VOID
9878 KeFlushWriteBuffer(VOID)
9879 {
9880 __mf ();
9881 return;
9882 }
9883
9884 NTSYSAPI
9885 PKTHREAD
9886 NTAPI
9887 KeGetCurrentThread(VOID);
9888
9889
9890 #elif defined(_M_PPC)
9891
9892 /* Interrupt request levels */
9893 #define PASSIVE_LEVEL 0
9894 #define LOW_LEVEL 0
9895 #define APC_LEVEL 1
9896 #define DISPATCH_LEVEL 2
9897 #define PROFILE_LEVEL 27
9898 #define CLOCK1_LEVEL 28
9899 #define CLOCK2_LEVEL 28
9900 #define IPI_LEVEL 29
9901 #define POWER_LEVEL 30
9902 #define HIGH_LEVEL 31
9903
9904 //
9905 // Used to contain PFNs and PFN counts
9906 //
9907 typedef ULONG PFN_COUNT;
9908 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
9909 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
9910
9911
9912 typedef struct _KFLOATING_SAVE {
9913 ULONG Dummy;
9914 } KFLOATING_SAVE, *PKFLOATING_SAVE;
9915
9916 typedef struct _KPCR_TIB {
9917 PVOID ExceptionList; /* 00 */
9918 PVOID StackBase; /* 04 */
9919 PVOID StackLimit; /* 08 */
9920 PVOID SubSystemTib; /* 0C */
9921 _ANONYMOUS_UNION union {
9922 PVOID FiberData; /* 10 */
9923 ULONG Version; /* 10 */
9924 } DUMMYUNIONNAME;
9925 PVOID ArbitraryUserPointer; /* 14 */
9926 struct _KPCR_TIB *Self; /* 18 */
9927 } KPCR_TIB, *PKPCR_TIB; /* 1C */
9928
9929 #define PCR_MINOR_VERSION 1
9930 #define PCR_MAJOR_VERSION 1
9931
9932 typedef struct _KPCR {
9933 KPCR_TIB Tib; /* 00 */
9934 struct _KPCR *Self; /* 1C */
9935 struct _KPRCB *Prcb; /* 20 */
9936 KIRQL Irql; /* 24 */
9937 ULONG IRR; /* 28 */
9938 ULONG IrrActive; /* 2C */
9939 ULONG IDR; /* 30 */
9940 PVOID KdVersionBlock; /* 34 */
9941 PUSHORT IDT; /* 38 */
9942 PUSHORT GDT; /* 3C */
9943 struct _KTSS *TSS; /* 40 */
9944 USHORT MajorVersion; /* 44 */
9945 USHORT MinorVersion; /* 46 */
9946 KAFFINITY SetMember; /* 48 */
9947 ULONG StallScaleFactor; /* 4C */
9948 UCHAR SpareUnused; /* 50 */
9949 UCHAR Number; /* 51 */
9950 } KPCR, *PKPCR; /* 54 */
9951
9952 #define KeGetPcr() PCR
9953
9954 #define YieldProcessor() __asm__ __volatile__("nop");
9955
9956 FORCEINLINE
9957 ULONG
9958 NTAPI
9959 KeGetCurrentProcessorNumber(VOID)
9960 {
9961 ULONG Number;
9962 __asm__ __volatile__ (
9963 "lwz %0, %c1(12)\n"
9964 : "=r" (Number)
9965 : "i" (FIELD_OFFSET(KPCR, Number))
9966 );
9967 return Number;
9968 }
9969
9970 NTHALAPI
9971 VOID
9972 FASTCALL
9973 KfLowerIrql(
9974 IN KIRQL NewIrql);
9975 #define KeLowerIrql(a) KfLowerIrql(a)
9976
9977 NTHALAPI
9978 KIRQL
9979 FASTCALL
9980 KfRaiseIrql(
9981 IN KIRQL NewIrql);
9982 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9983
9984 NTHALAPI
9985 KIRQL
9986 NTAPI
9987 KeRaiseIrqlToDpcLevel(VOID);
9988
9989 NTHALAPI
9990 KIRQL
9991 NTAPI
9992 KeRaiseIrqlToSynchLevel(VOID);
9993
9994
9995
9996 #elif defined(_M_MIPS)
9997 #error MIPS Headers are totally incorrect
9998
9999 //
10000 // Used to contain PFNs and PFN counts
10001 //
10002 typedef ULONG PFN_COUNT;
10003 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
10004 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
10005
10006 #define PASSIVE_LEVEL 0
10007 #define APC_LEVEL 1
10008 #define DISPATCH_LEVEL 2
10009 #define PROFILE_LEVEL 27
10010 #define IPI_LEVEL 29
10011 #define HIGH_LEVEL 31
10012
10013 typedef struct _KPCR {
10014 struct _KPRCB *Prcb; /* 20 */
10015 KIRQL Irql; /* 24 */
10016 ULONG IRR; /* 28 */
10017 ULONG IDR; /* 30 */
10018 } KPCR, *PKPCR;
10019
10020 #define KeGetPcr() PCR
10021
10022 typedef struct _KFLOATING_SAVE {
10023 } KFLOATING_SAVE, *PKFLOATING_SAVE;
10024
10025 static __inline
10026 ULONG
10027 NTAPI
10028 KeGetCurrentProcessorNumber(VOID)
10029 {
10030 return 0;
10031 }
10032
10033 #define YieldProcessor() __asm__ __volatile__("nop");
10034
10035 #define KeLowerIrql(a) KfLowerIrql(a)
10036 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
10037
10038 NTKERNELAPI
10039 VOID
10040 NTAPI
10041 KfLowerIrql(
10042 IN KIRQL NewIrql);
10043
10044 NTKERNELAPI
10045 KIRQL
10046 NTAPI
10047 KfRaiseIrql(
10048 IN KIRQL NewIrql);
10049
10050 NTKERNELAPI
10051 KIRQL
10052 NTAPI
10053 KeRaiseIrqlToDpcLevel(VOID);
10054
10055 NTKERNELAPI
10056 KIRQL
10057 NTAPI
10058 KeRaiseIrqlToSynchLevel(VOID);
10059
10060
10061 #elif defined(_M_ARM)
10062 #include <armddk.h>
10063 #else
10064 #error Unknown Architecture
10065 #endif
10066
10067 NTKERNELAPI
10068 VOID
10069 NTAPI
10070 KeInitializeEvent(
10071 _Out_ PRKEVENT Event,
10072 _In_ EVENT_TYPE Type,
10073 _In_ BOOLEAN State);
10074
10075 _IRQL_requires_max_(DISPATCH_LEVEL)
10076 NTKERNELAPI
10077 VOID
10078 NTAPI
10079 KeClearEvent(
10080 _Inout_ PRKEVENT Event);
10081
10082 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10083
10084 #if defined(_NTDDK_) || defined(_NTIFS_)
10085 _Maybe_raises_SEH_exception_
10086 _IRQL_requires_max_(APC_LEVEL)
10087 NTKERNELAPI
10088 VOID
10089 NTAPI
10090 ProbeForRead(
10091 __in_data_source(USER_MODE) _In_reads_bytes_(Length) CONST VOID *Address, /* CONST is added */
10092 _In_ SIZE_T Length,
10093 _In_ ULONG Alignment);
10094 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
10095
10096 _Maybe_raises_SEH_exception_
10097 _IRQL_requires_max_(APC_LEVEL)
10098 NTKERNELAPI
10099 VOID
10100 NTAPI
10101 ProbeForWrite(
10102 __in_data_source(USER_MODE) _Inout_updates_bytes_(Length) PVOID Address,
10103 _In_ SIZE_T Length,
10104 _In_ ULONG Alignment);
10105
10106 #if defined(SINGLE_GROUP_LEGACY_API)
10107
10108 _IRQL_requires_min_(PASSIVE_LEVEL)
10109 _IRQL_requires_max_(APC_LEVEL)
10110 NTKERNELAPI
10111 VOID
10112 NTAPI
10113 KeRevertToUserAffinityThread(VOID);
10114
10115 _IRQL_requires_min_(PASSIVE_LEVEL)
10116 _IRQL_requires_max_(APC_LEVEL)
10117 NTKERNELAPI
10118 VOID
10119 NTAPI
10120 KeSetSystemAffinityThread(
10121 _In_ KAFFINITY Affinity);
10122
10123 NTKERNELAPI
10124 VOID
10125 NTAPI
10126 KeSetTargetProcessorDpc(
10127 _Inout_ PRKDPC Dpc,
10128 _In_ CCHAR Number);
10129
10130 NTKERNELAPI
10131 KAFFINITY
10132 NTAPI
10133 KeQueryActiveProcessors(VOID);
10134 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
10135
10136 #if !defined(_M_AMD64)
10137 NTKERNELAPI
10138 ULONGLONG
10139 NTAPI
10140 KeQueryInterruptTime(VOID);
10141
10142 NTKERNELAPI
10143 VOID
10144 NTAPI
10145 KeQuerySystemTime(
10146 _Out_ PLARGE_INTEGER CurrentTime);
10147 #endif /* !_M_AMD64 */
10148
10149 #if !defined(_X86_) && !defined(_M_ARM)
10150 _Requires_lock_not_held_(*SpinLock)
10151 _Acquires_lock_(*SpinLock)
10152 _IRQL_requires_max_(DISPATCH_LEVEL)
10153 _IRQL_saves_
10154 _IRQL_raises_(DISPATCH_LEVEL)
10155 NTKERNELAPI
10156 KIRQL
10157 NTAPI
10158 KeAcquireSpinLockRaiseToDpc(
10159 _Inout_ PKSPIN_LOCK SpinLock);
10160
10161 #define KeAcquireSpinLock(SpinLock, OldIrql) \
10162 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
10163
10164 _Requires_lock_not_held_(*SpinLock)
10165 _Acquires_lock_(*SpinLock)
10166 _IRQL_requires_min_(DISPATCH_LEVEL)
10167 NTKERNELAPI
10168 VOID
10169 NTAPI
10170 KeAcquireSpinLockAtDpcLevel(
10171 _Inout_ PKSPIN_LOCK SpinLock);
10172
10173 _Requires_lock_held_(*SpinLock)
10174 _Releases_lock_(*SpinLock)
10175 _IRQL_requires_(DISPATCH_LEVEL)
10176 NTKERNELAPI
10177 VOID
10178 NTAPI
10179 KeReleaseSpinLock(
10180 _Inout_ PKSPIN_LOCK SpinLock,
10181 _In_ _IRQL_restores_ KIRQL NewIrql);
10182
10183 _Requires_lock_held_(*SpinLock)
10184 _Releases_lock_(*SpinLock)
10185 _IRQL_requires_min_(DISPATCH_LEVEL)
10186 NTKERNELAPI
10187 VOID
10188 NTAPI
10189 KeReleaseSpinLockFromDpcLevel(
10190 _Inout_ PKSPIN_LOCK SpinLock);
10191 #endif /* !_X86_ */
10192
10193 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
10194 NTKERNELAPI
10195 VOID
10196 NTAPI
10197 KeInitializeSpinLock(
10198 _Out_ PKSPIN_LOCK SpinLock);
10199 #else
10200 FORCEINLINE
10201 VOID
10202 KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
10203 {
10204 /* Clear the lock */
10205 *SpinLock = 0;
10206 }
10207 #endif
10208
10209 DECLSPEC_NORETURN
10210 NTKERNELAPI
10211 VOID
10212 NTAPI
10213 KeBugCheckEx(
10214 _In_ ULONG BugCheckCode,
10215 _In_ ULONG_PTR BugCheckParameter1,
10216 _In_ ULONG_PTR BugCheckParameter2,
10217 _In_ ULONG_PTR BugCheckParameter3,
10218 _In_ ULONG_PTR BugCheckParameter4);
10219
10220 _IRQL_requires_max_(DISPATCH_LEVEL)
10221 NTKERNELAPI
10222 BOOLEAN
10223 NTAPI
10224 KeCancelTimer(
10225 _Inout_ PKTIMER);
10226
10227 _IRQL_requires_min_(PASSIVE_LEVEL)
10228 _IRQL_requires_max_(APC_LEVEL)
10229 NTKERNELAPI
10230 NTSTATUS
10231 NTAPI
10232 KeDelayExecutionThread(
10233 _In_ KPROCESSOR_MODE WaitMode,
10234 _In_ BOOLEAN Alertable,
10235 _In_ PLARGE_INTEGER Interval);
10236
10237 _Must_inspect_result_
10238 NTKERNELAPI
10239 BOOLEAN
10240 NTAPI
10241 KeDeregisterBugCheckCallback(
10242 _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
10243
10244 _Acquires_lock_(_Global_critical_region_)
10245 _IRQL_requires_max_(APC_LEVEL)
10246 NTKERNELAPI
10247 VOID
10248 NTAPI
10249 KeEnterCriticalRegion(VOID);
10250
10251 _IRQL_requires_max_(DISPATCH_LEVEL)
10252 NTKERNELAPI
10253 VOID
10254 NTAPI
10255 KeInitializeDeviceQueue(
10256 _Out_ PKDEVICE_QUEUE DeviceQueue);
10257
10258 NTKERNELAPI
10259 VOID
10260 NTAPI
10261 KeInitializeDpc(
10262 _Out_ __drv_aliasesMem PRKDPC Dpc,
10263 _In_ PKDEFERRED_ROUTINE DeferredRoutine,
10264 _In_opt_ __drv_aliasesMem PVOID DeferredContext);
10265
10266 NTKERNELAPI
10267 VOID
10268 NTAPI
10269 KeInitializeMutex(
10270 _Out_ PRKMUTEX Mutex,
10271 _In_ ULONG Level);
10272
10273 _IRQL_requires_max_(PASSIVE_LEVEL)
10274 NTKERNELAPI
10275 VOID
10276 NTAPI
10277 KeInitializeSemaphore(
10278 _Out_ PRKSEMAPHORE Semaphore,
10279 _In_ LONG Count,
10280 _In_ LONG Limit);
10281
10282 _IRQL_requires_max_(DISPATCH_LEVEL)
10283 NTKERNELAPI
10284 VOID
10285 NTAPI
10286 KeInitializeTimer(
10287 _Out_ PKTIMER Timer);
10288
10289 _IRQL_requires_max_(DISPATCH_LEVEL)
10290 NTKERNELAPI
10291 VOID
10292 NTAPI
10293 KeInitializeTimerEx(
10294 _Out_ PKTIMER Timer,
10295 _In_ TIMER_TYPE Type);
10296
10297 _IRQL_requires_(DISPATCH_LEVEL)
10298 NTKERNELAPI
10299 BOOLEAN
10300 NTAPI
10301 KeInsertByKeyDeviceQueue(
10302 _Inout_ PKDEVICE_QUEUE DeviceQueue,
10303 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
10304 _In_ ULONG SortKey);
10305
10306 _IRQL_requires_(DISPATCH_LEVEL)
10307 NTKERNELAPI
10308 BOOLEAN
10309 NTAPI
10310 KeInsertDeviceQueue(
10311 _Inout_ PKDEVICE_QUEUE DeviceQueue,
10312 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
10313
10314 NTKERNELAPI
10315 BOOLEAN
10316 NTAPI
10317 KeInsertQueueDpc(
10318 _Inout_ PRKDPC Dpc,
10319 _In_opt_ PVOID SystemArgument1,
10320 _In_opt_ PVOID SystemArgument2);
10321
10322 _Releases_lock_(_Global_critical_region_)
10323 _IRQL_requires_max_(APC_LEVEL)
10324 NTKERNELAPI
10325 VOID
10326 NTAPI
10327 KeLeaveCriticalRegion(VOID);
10328
10329 NTHALAPI
10330 LARGE_INTEGER
10331 NTAPI
10332 KeQueryPerformanceCounter(
10333 _Out_opt_ PLARGE_INTEGER PerformanceFrequency);
10334
10335 _IRQL_requires_max_(PASSIVE_LEVEL)
10336 NTKERNELAPI
10337 KPRIORITY
10338 NTAPI
10339 KeQueryPriorityThread(
10340 _In_ PRKTHREAD Thread);
10341
10342 NTKERNELAPI
10343 ULONG
10344 NTAPI
10345 KeQueryTimeIncrement(VOID);
10346
10347 _IRQL_requires_max_(DISPATCH_LEVEL)
10348 NTKERNELAPI
10349 LONG
10350 NTAPI
10351 KeReadStateEvent(
10352 _In_ PRKEVENT Event);
10353
10354 _IRQL_requires_max_(DISPATCH_LEVEL)
10355 NTKERNELAPI
10356 LONG
10357 NTAPI
10358 KeReadStateMutex(
10359 _In_ PRKMUTEX Mutex);
10360
10361 _IRQL_requires_max_(DISPATCH_LEVEL)
10362 NTKERNELAPI
10363 LONG
10364 NTAPI
10365 KeReadStateSemaphore(
10366 _In_ PRKSEMAPHORE Semaphore);
10367
10368 _IRQL_requires_max_(DISPATCH_LEVEL)
10369 NTKERNELAPI
10370 BOOLEAN
10371 NTAPI
10372 KeReadStateTimer(
10373 _In_ PKTIMER Timer);
10374
10375 _Must_inspect_result_
10376 NTKERNELAPI
10377 BOOLEAN
10378 NTAPI
10379 KeRegisterBugCheckCallback(
10380 _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
10381 _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
10382 _In_reads_bytes_opt_(Length) PVOID Buffer,
10383 _In_ ULONG Length,
10384 _In_ PUCHAR Component);
10385
10386 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
10387 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
10388 NTKERNELAPI
10389 LONG
10390 NTAPI
10391 KeReleaseMutex(
10392 _Inout_ PRKMUTEX Mutex,
10393 _In_ BOOLEAN Wait);
10394
10395 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
10396 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
10397 NTKERNELAPI
10398 LONG
10399 NTAPI
10400 KeReleaseSemaphore(
10401 _Inout_ PRKSEMAPHORE Semaphore,
10402 _In_ KPRIORITY Increment,
10403 _In_ LONG Adjustment,
10404 _In_ _Literal_ BOOLEAN Wait);
10405
10406 _IRQL_requires_(DISPATCH_LEVEL)
10407 NTKERNELAPI
10408 PKDEVICE_QUEUE_ENTRY
10409 NTAPI
10410 KeRemoveByKeyDeviceQueue(
10411 _Inout_ PKDEVICE_QUEUE DeviceQueue,
10412 _In_ ULONG SortKey);
10413
10414 _IRQL_requires_(DISPATCH_LEVEL)
10415 NTKERNELAPI
10416 PKDEVICE_QUEUE_ENTRY
10417 NTAPI
10418 KeRemoveDeviceQueue(
10419 _Inout_ PKDEVICE_QUEUE DeviceQueue);
10420
10421 _IRQL_requires_max_(DISPATCH_LEVEL)
10422 NTKERNELAPI
10423 BOOLEAN
10424 NTAPI
10425 KeRemoveEntryDeviceQueue(
10426 _Inout_ PKDEVICE_QUEUE DeviceQueue,
10427 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
10428
10429 _IRQL_requires_max_(HIGH_LEVEL)
10430 NTKERNELAPI
10431 BOOLEAN
10432 NTAPI
10433 KeRemoveQueueDpc(
10434 _Inout_ PRKDPC Dpc);
10435
10436 _IRQL_requires_max_(DISPATCH_LEVEL)
10437 NTKERNELAPI
10438 LONG
10439 NTAPI
10440 KeResetEvent(
10441 _Inout_ PRKEVENT Event);
10442
10443 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
10444 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
10445 NTKERNELAPI
10446 LONG
10447 NTAPI
10448 KeSetEvent(
10449 _Inout_ PRKEVENT Event,
10450 _In_ KPRIORITY Increment,
10451 _In_ _Literal_ BOOLEAN Wait);
10452
10453 NTKERNELAPI
10454 VOID
10455 NTAPI
10456 KeSetImportanceDpc(
10457 _Inout_ PRKDPC Dpc,
10458 _In_ KDPC_IMPORTANCE Importance);
10459
10460 _IRQL_requires_min_(PASSIVE_LEVEL)
10461 _IRQL_requires_max_(DISPATCH_LEVEL)
10462 NTKERNELAPI
10463 KPRIORITY
10464 NTAPI
10465 KeSetPriorityThread(
10466 _Inout_ PKTHREAD Thread,
10467 _In_ KPRIORITY Priority);
10468
10469 _IRQL_requires_max_(DISPATCH_LEVEL)
10470 NTKERNELAPI
10471 BOOLEAN
10472 NTAPI
10473 KeSetTimer(
10474 _Inout_ PKTIMER Timer,
10475 _In_ LARGE_INTEGER DueTime,
10476 _In_opt_ PKDPC Dpc);
10477
10478 _IRQL_requires_max_(DISPATCH_LEVEL)
10479 NTKERNELAPI
10480 BOOLEAN
10481 NTAPI
10482 KeSetTimerEx(
10483 _Inout_ PKTIMER Timer,
10484 _In_ LARGE_INTEGER DueTime,
10485 _In_ LONG Period OPTIONAL,
10486 _In_opt_ PKDPC Dpc);
10487
10488 NTHALAPI
10489 VOID
10490 NTAPI
10491 KeStallExecutionProcessor(
10492 _In_ ULONG MicroSeconds);
10493
10494 _IRQL_requires_max_(HIGH_LEVEL)
10495 NTKERNELAPI
10496 BOOLEAN
10497 NTAPI
10498 KeSynchronizeExecution(
10499 _Inout_ PKINTERRUPT Interrupt,
10500 _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
10501 _In_opt_ __drv_aliasesMem PVOID SynchronizeContext);
10502
10503 _IRQL_requires_min_(PASSIVE_LEVEL)
10504 _When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL))
10505 _When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL))
10506 NTKERNELAPI
10507 NTSTATUS
10508 NTAPI
10509 KeWaitForMultipleObjects(
10510 _In_ ULONG Count,
10511 _In_reads_(Count) PVOID Object[],
10512 _In_ __drv_strictTypeMatch(__drv_typeConst) WAIT_TYPE WaitType,
10513 _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason,
10514 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode,
10515 _In_ BOOLEAN Alertable,
10516 _In_opt_ PLARGE_INTEGER Timeout,
10517 _Out_opt_ PKWAIT_BLOCK WaitBlockArray);
10518
10519 #define KeWaitForMutexObject KeWaitForSingleObject
10520
10521 _IRQL_requires_min_(PASSIVE_LEVEL)
10522 _When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL))
10523 _When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL))
10524 NTKERNELAPI
10525 NTSTATUS
10526 NTAPI
10527 KeWaitForSingleObject(
10528 _In_ _Points_to_data_ PVOID Object,
10529 _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason,
10530 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode,
10531 _In_ BOOLEAN Alertable,
10532 _In_opt_ PLARGE_INTEGER Timeout);
10533
10534 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10535
10536 #if (NTDDI_VERSION >= NTDDI_WINXP)
10537
10538 _Requires_lock_not_held_(*LockHandle)
10539 _Acquires_lock_(*LockHandle)
10540 _Post_same_lock_(*SpinLock, *LockHandle)
10541 _IRQL_requires_max_(DISPATCH_LEVEL)
10542 _IRQL_saves_global_(QueuedSpinLock,LockHandle)
10543 _IRQL_raises_(DISPATCH_LEVEL)
10544 _DECL_HAL_KE_IMPORT
10545 VOID
10546 FASTCALL
10547 KeAcquireInStackQueuedSpinLock(
10548 _Inout_ PKSPIN_LOCK SpinLock,
10549 _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
10550
10551 _Requires_lock_not_held_(*LockHandle)
10552 _Acquires_lock_(*LockHandle)
10553 _Post_same_lock_(*SpinLock, *LockHandle)
10554 _IRQL_requires_min_(DISPATCH_LEVEL)
10555 NTKERNELAPI
10556 VOID
10557 FASTCALL
10558 KeAcquireInStackQueuedSpinLockAtDpcLevel(
10559 _Inout_ PKSPIN_LOCK SpinLock,
10560 _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
10561
10562 _Requires_lock_not_held_(*Interrupt->ActualLock)
10563 _Acquires_lock_(*Interrupt->ActualLock)
10564 _IRQL_requires_max_(HIGH_LEVEL)
10565 _IRQL_saves_
10566 _IRQL_raises_(HIGH_LEVEL)
10567 NTKERNELAPI
10568 KIRQL
10569 NTAPI
10570 KeAcquireInterruptSpinLock(
10571 _Inout_ PKINTERRUPT Interrupt);
10572
10573 _IRQL_requires_min_(PASSIVE_LEVEL)
10574 _IRQL_requires_max_(DISPATCH_LEVEL)
10575 NTKERNELAPI
10576 BOOLEAN
10577 NTAPI
10578 KeAreApcsDisabled(VOID);
10579
10580 NTKERNELAPI
10581 ULONG
10582 NTAPI
10583 KeGetRecommendedSharedDataAlignment(VOID);
10584
10585 _IRQL_requires_max_(PASSIVE_LEVEL)
10586 NTKERNELAPI
10587 ULONG
10588 NTAPI
10589 KeQueryRuntimeThread(
10590 _In_ PKTHREAD Thread,
10591 _Out_ PULONG UserTime);
10592
10593 _Requires_lock_held_(*LockHandle)
10594 _Releases_lock_(*LockHandle)
10595 _IRQL_requires_(DISPATCH_LEVEL)
10596 NTKERNELAPI
10597 VOID
10598 FASTCALL
10599 KeReleaseInStackQueuedSpinLockFromDpcLevel(
10600 _In_ PKLOCK_QUEUE_HANDLE LockHandle);
10601
10602 _Requires_lock_held_(*Interrupt->ActualLock)
10603 _Releases_lock_(*Interrupt->ActualLock)
10604 _IRQL_requires_(HIGH_LEVEL)
10605 NTKERNELAPI
10606 VOID
10607 NTAPI
10608 KeReleaseInterruptSpinLock(
10609 _Inout_ PKINTERRUPT Interrupt,
10610 _In_ _IRQL_restores_ KIRQL OldIrql);
10611
10612 _IRQL_requires_(DISPATCH_LEVEL)
10613 NTKERNELAPI
10614 PKDEVICE_QUEUE_ENTRY
10615 NTAPI
10616 KeRemoveByKeyDeviceQueueIfBusy(
10617 _Inout_ PKDEVICE_QUEUE DeviceQueue,
10618 _In_ ULONG SortKey);
10619
10620 _Requires_lock_held_(*LockHandle)
10621 _Releases_lock_(*LockHandle)
10622 _IRQL_requires_(DISPATCH_LEVEL)
10623 _IRQL_restores_global_(QueuedSpinLock,LockHandle)
10624 _DECL_HAL_KE_IMPORT
10625 VOID
10626 FASTCALL
10627 KeReleaseInStackQueuedSpinLock(
10628 _In_ PKLOCK_QUEUE_HANDLE LockHandle);
10629
10630 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10631
10632 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
10633
10634 _Must_inspect_result_
10635 NTKERNELAPI
10636 BOOLEAN
10637 NTAPI
10638 KeDeregisterBugCheckReasonCallback(
10639 _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
10640
10641 _Must_inspect_result_
10642 NTKERNELAPI
10643 BOOLEAN
10644 NTAPI
10645 KeRegisterBugCheckReasonCallback(
10646 _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
10647 _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
10648 _In_ KBUGCHECK_CALLBACK_REASON Reason,
10649 _In_ PUCHAR Component);
10650
10651 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
10652
10653 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10654 _IRQL_requires_max_(APC_LEVEL)
10655 NTKERNELAPI
10656 VOID
10657 NTAPI
10658 KeFlushQueuedDpcs(VOID);
10659 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
10660 #if (NTDDI_VERSION >= NTDDI_WS03)
10661
10662 _IRQL_requires_max_(APC_LEVEL)
10663 NTKERNELAPI
10664 PVOID
10665 NTAPI
10666 KeRegisterNmiCallback(
10667 _In_ PNMI_CALLBACK CallbackRoutine,
10668 _In_opt_ PVOID Context);
10669
10670 _IRQL_requires_max_(APC_LEVEL)
10671 NTKERNELAPI
10672 NTSTATUS
10673 NTAPI
10674 KeDeregisterNmiCallback(
10675 _In_ PVOID Handle);
10676
10677 NTKERNELAPI
10678 VOID
10679 NTAPI
10680 KeInitializeThreadedDpc(
10681 _Out_ PRKDPC Dpc,
10682 _In_ PKDEFERRED_ROUTINE DeferredRoutine,
10683 _In_opt_ PVOID DeferredContext);
10684
10685 _IRQL_requires_min_(PASSIVE_LEVEL)
10686 _IRQL_requires_max_(IPI_LEVEL-1)
10687 NTKERNELAPI
10688 ULONG_PTR
10689 NTAPI
10690 KeIpiGenericCall(
10691 _In_ PKIPI_BROADCAST_WORKER BroadcastFunction,
10692 _In_ ULONG_PTR Context);
10693
10694 _Requires_lock_not_held_(*SpinLock)
10695 _Acquires_lock_(*SpinLock)
10696 _IRQL_requires_max_(DISPATCH_LEVEL)
10697 _IRQL_saves_
10698 NTKERNELAPI
10699 KIRQL
10700 FASTCALL
10701 KeAcquireSpinLockForDpc(
10702 _Inout_ PKSPIN_LOCK SpinLock);
10703
10704 _Requires_lock_held_(*SpinLock)
10705 _Releases_lock_(*SpinLock)
10706 _IRQL_requires_(DISPATCH_LEVEL)
10707 NTKERNELAPI
10708 VOID
10709 FASTCALL
10710 KeReleaseSpinLockForDpc(
10711 _Inout_ PKSPIN_LOCK SpinLock,
10712 _In_ _IRQL_restores_ KIRQL OldIrql);
10713
10714 _Must_inspect_result_
10715 NTKERNELAPI
10716 BOOLEAN
10717 FASTCALL
10718 KeTestSpinLock(
10719 _In_ PKSPIN_LOCK SpinLock);
10720
10721 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10722 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10723
10724 _Must_inspect_result_
10725 _IRQL_requires_min_(DISPATCH_LEVEL)
10726 _Post_satisfies_(return == 1 || return == 0)
10727 NTKERNELAPI
10728 BOOLEAN
10729 FASTCALL
10730 KeTryToAcquireSpinLockAtDpcLevel(
10731 _Inout_ _Requires_lock_not_held_(*_Curr_)
10732 _When_(return!=0, _Acquires_lock_(*_Curr_))
10733 PKSPIN_LOCK SpinLock);
10734
10735 _IRQL_requires_min_(PASSIVE_LEVEL)
10736 _IRQL_requires_max_(DISPATCH_LEVEL)
10737 NTKERNELAPI
10738 BOOLEAN
10739 NTAPI
10740 KeAreAllApcsDisabled(VOID);
10741
10742 _Acquires_lock_(_Global_critical_region_)
10743 _Requires_lock_not_held_(*Mutex)
10744 _Acquires_lock_(*Mutex)
10745 _IRQL_requires_max_(APC_LEVEL)
10746 _IRQL_requires_min_(PASSIVE_LEVEL)
10747 NTKERNELAPI
10748 VOID
10749 FASTCALL
10750 KeAcquireGuardedMutex(
10751 _Inout_ PKGUARDED_MUTEX GuardedMutex);
10752
10753 _Requires_lock_not_held_(*FastMutex)
10754 _Acquires_lock_(*FastMutex)
10755 _IRQL_requires_max_(APC_LEVEL)
10756 _IRQL_requires_min_(PASSIVE_LEVEL)
10757 NTKERNELAPI
10758 VOID
10759 FASTCALL
10760 KeAcquireGuardedMutexUnsafe(
10761 _Inout_ PKGUARDED_MUTEX GuardedMutex);
10762
10763 _Acquires_lock_(_Global_critical_region_)
10764 _IRQL_requires_max_(APC_LEVEL)
10765 NTKERNELAPI
10766 VOID
10767 NTAPI
10768 KeEnterGuardedRegion(VOID);
10769
10770 _Releases_lock_(_Global_critical_region_)
10771 _IRQL_requires_max_(APC_LEVEL)
10772 NTKERNELAPI
10773 VOID
10774 NTAPI
10775 KeLeaveGuardedRegion(VOID);
10776
10777 _IRQL_requires_max_(APC_LEVEL)
10778 _IRQL_requires_min_(PASSIVE_LEVEL)
10779 NTKERNELAPI
10780 VOID
10781 FASTCALL
10782 KeInitializeGuardedMutex(
10783 _Out_ PKGUARDED_MUTEX GuardedMutex);
10784
10785 _Requires_lock_held_(*FastMutex)
10786 _Releases_lock_(*FastMutex)
10787 _IRQL_requires_max_(APC_LEVEL)
10788 NTKERNELAPI
10789 VOID
10790 FASTCALL
10791 KeReleaseGuardedMutexUnsafe(
10792 _Inout_ PKGUARDED_MUTEX GuardedMutex);
10793
10794 _Releases_lock_(_Global_critical_region_)
10795 _Requires_lock_held_(*Mutex)
10796 _Releases_lock_(*Mutex)
10797 _IRQL_requires_max_(APC_LEVEL)
10798 NTKERNELAPI
10799 VOID
10800 FASTCALL
10801 KeReleaseGuardedMutex(
10802 _Inout_ PKGUARDED_MUTEX GuardedMutex);
10803
10804 _Must_inspect_result_
10805 _Success_(return != FALSE)
10806 _IRQL_requires_max_(APC_LEVEL)
10807 _Post_satisfies_(return == 1 || return == 0)
10808 NTKERNELAPI
10809 BOOLEAN
10810 FASTCALL
10811 KeTryToAcquireGuardedMutex(
10812 _When_ (return, _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)) _Acquires_lock_(_Global_critical_region_)
10813 _Inout_ PKGUARDED_MUTEX GuardedMutex);
10814 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
10815
10816 #if (NTDDI_VERSION >= NTDDI_VISTA)
10817 _Requires_lock_not_held_(*LockHandle)
10818 _Acquires_lock_(*LockHandle)
10819 _Post_same_lock_(*SpinLock, *LockHandle)
10820 _IRQL_requires_max_(DISPATCH_LEVEL)
10821 _IRQL_saves_global_(QueuedSpinLock,LockHandle)
10822 NTKERNELAPI
10823 VOID
10824 FASTCALL
10825 KeAcquireInStackQueuedSpinLockForDpc(
10826 _Inout_ PKSPIN_LOCK SpinLock,
10827 _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
10828
10829 _Requires_lock_held_(*LockHandle)
10830 _Releases_lock_(*LockHandle)
10831 _IRQL_requires_(DISPATCH_LEVEL)
10832 _IRQL_restores_global_(QueuedSpinLock,LockHandle)
10833 NTKERNELAPI
10834 VOID
10835 FASTCALL
10836 KeReleaseInStackQueuedSpinLockForDpc(
10837 _In_ PKLOCK_QUEUE_HANDLE LockHandle);
10838
10839 _IRQL_requires_(DISPATCH_LEVEL)
10840 NTKERNELAPI
10841 NTSTATUS
10842 NTAPI
10843 KeQueryDpcWatchdogInformation(
10844 _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
10845 #if defined(SINGLE_GROUP_LEGACY_API)
10846
10847 _IRQL_requires_min_(PASSIVE_LEVEL)
10848 _IRQL_requires_max_(APC_LEVEL)
10849 NTKERNELAPI
10850 KAFFINITY
10851 NTAPI
10852 KeSetSystemAffinityThreadEx(
10853 _In_ KAFFINITY Affinity);
10854
10855 _IRQL_requires_min_(PASSIVE_LEVEL)
10856 _IRQL_requires_max_(APC_LEVEL)
10857 NTKERNELAPI
10858 VOID
10859 NTAPI
10860 KeRevertToUserAffinityThreadEx(
10861 _In_ KAFFINITY Affinity);
10862
10863 NTKERNELAPI
10864 ULONG
10865 NTAPI
10866 KeQueryActiveProcessorCount(
10867 _Out_opt_ PKAFFINITY ActiveProcessors);
10868
10869 NTKERNELAPI
10870 ULONG
10871 NTAPI
10872 KeQueryMaximumProcessorCount(VOID);
10873 #endif /* SINGLE_GROUP_LEGACY_API */
10874
10875 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10876
10877 #if (NTDDI_VERSION >= NTDDI_WS08)
10878
10879 _IRQL_requires_max_(APC_LEVEL)
10880 PVOID
10881 NTAPI
10882 KeRegisterProcessorChangeCallback(
10883 _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
10884 _In_opt_ PVOID CallbackContext,
10885 _In_ ULONG Flags);
10886
10887 _IRQL_requires_max_(APC_LEVEL)
10888 VOID
10889 NTAPI
10890 KeDeregisterProcessorChangeCallback(
10891 _In_ PVOID CallbackHandle);
10892
10893 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
10894 #if (NTDDI_VERSION >= NTDDI_WIN7)
10895
10896 _IRQL_requires_max_(DISPATCH_LEVEL)
10897 _IRQL_requires_min_(PASSIVE_LEVEL)
10898 _IRQL_requires_same_
10899 ULONG64
10900 NTAPI
10901 KeQueryTotalCycleTimeProcess(
10902 _Inout_ PKPROCESS Process,
10903 _Out_ PULONG64 CycleTimeStamp);
10904
10905 _IRQL_requires_max_(APC_LEVEL)
10906 _IRQL_requires_min_(PASSIVE_LEVEL)
10907 _IRQL_requires_same_
10908 ULONG64
10909 NTAPI
10910 KeQueryTotalCycleTimeThread(
10911 _Inout_ PKTHREAD Thread,
10912 _Out_ PULONG64 CycleTimeStamp);
10913
10914 _Must_inspect_result_
10915 NTKERNELAPI
10916 NTSTATUS
10917 NTAPI
10918 KeSetTargetProcessorDpcEx(
10919 _Inout_ PKDPC Dpc,
10920 _In_ PPROCESSOR_NUMBER ProcNumber);
10921
10922 _IRQL_requires_min_(PASSIVE_LEVEL)
10923 _IRQL_requires_max_(APC_LEVEL)
10924 NTKERNELAPI
10925 VOID
10926 NTAPI
10927 KeSetSystemGroupAffinityThread(
10928 _In_ PGROUP_AFFINITY Affinity,
10929 _Out_opt_ PGROUP_AFFINITY PreviousAffinity);
10930
10931 _IRQL_requires_min_(PASSIVE_LEVEL)
10932 _IRQL_requires_max_(APC_LEVEL)
10933 NTKERNELAPI
10934 VOID
10935 NTAPI
10936 KeRevertToUserGroupAffinityThread(
10937 _In_ PGROUP_AFFINITY PreviousAffinity);
10938
10939 _IRQL_requires_max_(DISPATCH_LEVEL)
10940 NTKERNELAPI
10941 BOOLEAN
10942 NTAPI
10943 KeSetCoalescableTimer(
10944 _Inout_ PKTIMER Timer,
10945 _In_ LARGE_INTEGER DueTime,
10946 _In_ ULONG Period,
10947 _In_ ULONG TolerableDelay,
10948 _In_opt_ PKDPC Dpc);
10949
10950 NTKERNELAPI
10951 ULONGLONG
10952 NTAPI
10953 KeQueryUnbiasedInterruptTime(VOID);
10954
10955 NTKERNELAPI
10956 ULONG
10957 NTAPI
10958 KeQueryActiveProcessorCountEx(
10959 _In_ USHORT GroupNumber);
10960
10961 NTKERNELAPI
10962 ULONG
10963 NTAPI
10964 KeQueryMaximumProcessorCountEx(
10965 _In_ USHORT GroupNumber);
10966
10967 NTKERNELAPI
10968 USHORT
10969 NTAPI
10970 KeQueryActiveGroupCount(VOID);
10971
10972 NTKERNELAPI
10973 USHORT
10974 NTAPI
10975 KeQueryMaximumGroupCount(VOID);
10976
10977 NTKERNELAPI
10978 KAFFINITY
10979 NTAPI
10980 KeQueryGroupAffinity(
10981 _In_ USHORT GroupNumber);
10982
10983 NTKERNELAPI
10984 ULONG
10985 NTAPI
10986 KeGetCurrentProcessorNumberEx(
10987 _Out_opt_ PPROCESSOR_NUMBER ProcNumber);
10988
10989 NTKERNELAPI
10990 VOID
10991 NTAPI
10992 KeQueryNodeActiveAffinity(
10993 _In_ USHORT NodeNumber,
10994 _Out_opt_ PGROUP_AFFINITY Affinity,
10995 _Out_opt_ PUSHORT Count);
10996
10997 NTKERNELAPI
10998 USHORT
10999 NTAPI
11000 KeQueryNodeMaximumProcessorCount(
11001 _In_ USHORT NodeNumber);
11002
11003 NTKERNELAPI
11004 USHORT
11005 NTAPI
11006 KeQueryHighestNodeNumber(VOID);
11007
11008 NTKERNELAPI
11009 USHORT
11010 NTAPI
11011 KeGetCurrentNodeNumber(VOID);
11012
11013 _IRQL_requires_max_(DISPATCH_LEVEL)
11014 NTKERNELAPI
11015 NTSTATUS
11016 NTAPI
11017 KeQueryLogicalProcessorRelationship(
11018 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
11019 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
11020 _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information,
11021 _Inout_ PULONG Length);
11022
11023 _Must_inspect_result_
11024 _IRQL_requires_max_(DISPATCH_LEVEL)
11025 _Ret_range_(<=, 0)
11026 _When_(return==0, _Kernel_float_saved_)
11027 NTKERNELAPI
11028 NTSTATUS
11029 NTAPI
11030 KeSaveExtendedProcessorState(
11031 _In_ ULONG64 Mask,
11032 _Out_ _Requires_lock_not_held_(*_Curr_)
11033 _When_(return==0, _Acquires_lock_(*_Curr_))
11034 PXSTATE_SAVE XStateSave);
11035
11036 _Kernel_float_restored_
11037 NTKERNELAPI
11038 VOID
11039 NTAPI
11040 KeRestoreExtendedProcessorState(
11041 _In_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
11042 PXSTATE_SAVE XStateSave);
11043
11044 NTSTATUS
11045 NTAPI
11046 KeGetProcessorNumberFromIndex(
11047 _In_ ULONG ProcIndex,
11048 _Out_ PPROCESSOR_NUMBER ProcNumber);
11049
11050 ULONG
11051 NTAPI
11052 KeGetProcessorIndexFromNumber(
11053 _In_ PPROCESSOR_NUMBER ProcNumber);
11054 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
11055 #if !defined(_IA64_)
11056 NTHALAPI
11057 VOID
11058 NTAPI
11059 KeFlushWriteBuffer(VOID);
11060 #endif
11061
11062 /* VOID
11063 * KeInitializeCallbackRecord(
11064 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
11065 */
11066 #define KeInitializeCallbackRecord(CallbackRecord) \
11067 CallbackRecord->State = BufferEmpty;
11068
11069 #if defined(_PREFAST_)
11070
11071 void __PREfastPagedCode(void);
11072 void __PREfastPagedCodeLocked(void);
11073 #define PAGED_CODE() __PREfastPagedCode();
11074 #define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked();
11075
11076 #elif DBG
11077
11078 #if (NTDDI_VERSION >= NTDDI_VISTA)
11079 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
11080 #else
11081 #define PAGED_ASSERT( exp ) ASSERT( exp )
11082 #endif
11083
11084 #define PAGED_CODE() { \
11085 if (KeGetCurrentIrql() > APC_LEVEL) { \
11086 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
11087 PAGED_ASSERT(FALSE); \
11088 } \
11089 }
11090
11091 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
11092
11093 #else
11094
11095 #define PAGED_CODE() NOP_FUNCTION;
11096 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
11097
11098 #endif /* DBG */
11099
11100 /******************************************************************************
11101 * Memory manager Functions *
11102 ******************************************************************************/
11103 /* Alignment Macros */
11104 #define ALIGN_DOWN_BY(size, align) \
11105 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
11106
11107 #define ALIGN_UP_BY(size, align) \
11108 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
11109
11110 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
11111 ((PVOID)ALIGN_DOWN_BY(ptr, align))
11112
11113 #define ALIGN_UP_POINTER_BY(ptr, align) \
11114 ((PVOID)ALIGN_UP_BY(ptr, align))
11115
11116 #define ALIGN_DOWN(size, type) \
11117 ALIGN_DOWN_BY(size, sizeof(type))
11118
11119 #define ALIGN_UP(size, type) \
11120 ALIGN_UP_BY(size, sizeof(type))
11121
11122 #define ALIGN_DOWN_POINTER(ptr, type) \
11123 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
11124
11125 #define ALIGN_UP_POINTER(ptr, type) \
11126 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
11127
11128 #ifndef FIELD_OFFSET
11129 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
11130 #endif
11131
11132 #ifndef FIELD_SIZE
11133 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
11134 #endif
11135
11136 #define POOL_TAGGING 1
11137
11138 #if DBG
11139 #define IF_DEBUG if (TRUE)
11140 #else
11141 #define IF_DEBUG if (FALSE)
11142 #endif /* DBG */
11143
11144 /* ULONG
11145 * BYTE_OFFSET(
11146 * IN PVOID Va)
11147 */
11148 #define BYTE_OFFSET(Va) \
11149 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
11150
11151 /* ULONG
11152 * BYTES_TO_PAGES(
11153 * IN ULONG Size)
11154 */
11155 #define BYTES_TO_PAGES(Size) \
11156 (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT)
11157
11158 /* PVOID
11159 * PAGE_ALIGN(
11160 * IN PVOID Va)
11161 */
11162 #define PAGE_ALIGN(Va) \
11163 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
11164
11165 /* ULONG_PTR
11166 * ROUND_TO_PAGES(
11167 * IN ULONG_PTR Size)
11168 */
11169 #define ROUND_TO_PAGES(Size) \
11170 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
11171
11172 /* ULONG
11173 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
11174 * IN PVOID Va,
11175 * IN ULONG Size)
11176 */
11177 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
11178 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
11179 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
11180
11181 #define COMPUTE_PAGES_SPANNED(Va, Size) \
11182 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
11183
11184 /*
11185 * ULONG
11186 * MmGetMdlByteCount(
11187 * IN PMDL Mdl)
11188 */
11189 #define MmGetMdlByteCount(_Mdl) \
11190 ((_Mdl)->ByteCount)
11191
11192 /*
11193 * ULONG
11194 * MmGetMdlByteOffset(
11195 * IN PMDL Mdl)
11196 */
11197 #define MmGetMdlByteOffset(_Mdl) \
11198 ((_Mdl)->ByteOffset)
11199
11200 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
11201
11202 /*
11203 * PPFN_NUMBER
11204 * MmGetMdlPfnArray(
11205 * IN PMDL Mdl)
11206 */
11207 #define MmGetMdlPfnArray(_Mdl) \
11208 ((PPFN_NUMBER) ((_Mdl) + 1))
11209
11210 /*
11211 * PVOID
11212 * MmGetMdlVirtualAddress(
11213 * IN PMDL Mdl)
11214 */
11215 #define MmGetMdlVirtualAddress(_Mdl) \
11216 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
11217
11218 #define MmGetProcedureAddress(Address) (Address)
11219 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
11220
11221 /* PVOID MmGetSystemAddressForMdl(
11222 * IN PMDL Mdl);
11223 */
11224 #define MmGetSystemAddressForMdl(Mdl) \
11225 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
11226 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11227 ((Mdl)->MappedSystemVa) : \
11228 (MmMapLockedPages((Mdl), KernelMode)))
11229
11230 /* PVOID
11231 * MmGetSystemAddressForMdlSafe(
11232 * IN PMDL Mdl,
11233 * IN MM_PAGE_PRIORITY Priority)
11234 */
11235 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
11236 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
11237 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11238 (_Mdl)->MappedSystemVa : \
11239 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
11240 KernelMode, MmCached, NULL, FALSE, (_Priority)))
11241
11242 /*
11243 * VOID
11244 * MmInitializeMdl(
11245 * IN PMDL MemoryDescriptorList,
11246 * IN PVOID BaseVa,
11247 * IN SIZE_T Length)
11248 */
11249 #define MmInitializeMdl(_MemoryDescriptorList, \
11250 _BaseVa, \
11251 _Length) \
11252 { \
11253 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
11254 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
11255 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
11256 (_MemoryDescriptorList)->MdlFlags = 0; \
11257 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
11258 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
11259 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
11260 }
11261
11262 /*
11263 * VOID
11264 * MmPrepareMdlForReuse(
11265 * IN PMDL Mdl)
11266 */
11267 #define MmPrepareMdlForReuse(_Mdl) \
11268 { \
11269 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
11270 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
11271 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
11272 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
11273 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
11274 } \
11275 }
11276
11277 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11278 _Must_inspect_result_
11279 _IRQL_requires_max_(DISPATCH_LEVEL)
11280 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
11281 NTKERNELAPI
11282 PVOID
11283 NTAPI
11284 MmAllocateContiguousMemory(
11285 _In_ SIZE_T NumberOfBytes,
11286 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress);
11287
11288 _Must_inspect_result_
11289 _IRQL_requires_max_(DISPATCH_LEVEL)
11290 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
11291 NTKERNELAPI
11292 PVOID
11293 NTAPI
11294 MmAllocateContiguousMemorySpecifyCache(
11295 _In_ SIZE_T NumberOfBytes,
11296 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
11297 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
11298 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
11299 _In_ MEMORY_CACHING_TYPE CacheType);
11300
11301 _Must_inspect_result_
11302 _IRQL_requires_max_(DISPATCH_LEVEL)
11303 NTKERNELAPI
11304 PMDL
11305 NTAPI
11306 MmAllocatePagesForMdl(
11307 _In_ PHYSICAL_ADDRESS LowAddress,
11308 _In_ PHYSICAL_ADDRESS HighAddress,
11309 _In_ PHYSICAL_ADDRESS SkipBytes,
11310 _In_ SIZE_T TotalBytes);
11311
11312 _IRQL_requires_max_(DISPATCH_LEVEL)
11313 NTKERNELAPI
11314 VOID
11315 NTAPI
11316 MmBuildMdlForNonPagedPool(
11317 _Inout_ PMDLX MemoryDescriptorList);
11318
11319 //DECLSPEC_DEPRECATED_DDK
11320 NTKERNELAPI
11321 PMDL
11322 NTAPI
11323 MmCreateMdl(
11324 _Out_writes_bytes_opt_ (sizeof (MDL) + (sizeof (PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base, Length)))
11325 PMDL MemoryDescriptorList,
11326 _In_reads_bytes_opt_ (Length) PVOID Base,
11327 _In_ SIZE_T Length);
11328
11329 _IRQL_requires_max_(DISPATCH_LEVEL)
11330 NTKERNELAPI
11331 VOID
11332 NTAPI
11333 MmFreeContiguousMemory(
11334 _In_ PVOID BaseAddress);
11335
11336 _IRQL_requires_max_ (DISPATCH_LEVEL)
11337 NTKERNELAPI
11338 VOID
11339 NTAPI
11340 MmFreeContiguousMemorySpecifyCache(
11341 _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
11342 _In_ SIZE_T NumberOfBytes,
11343 _In_ MEMORY_CACHING_TYPE CacheType);
11344
11345 _IRQL_requires_max_(DISPATCH_LEVEL)
11346 NTKERNELAPI
11347 VOID
11348 NTAPI
11349 MmFreePagesFromMdl(
11350 _Inout_ PMDLX MemoryDescriptorList);
11351
11352 _IRQL_requires_max_(PASSIVE_LEVEL)
11353 NTKERNELAPI
11354 PVOID
11355 NTAPI
11356 MmGetSystemRoutineAddress(
11357 _In_ PUNICODE_STRING SystemRoutineName);
11358
11359 NTKERNELAPI
11360 LOGICAL
11361 NTAPI
11362 MmIsDriverVerifying(
11363 _In_ struct _DRIVER_OBJECT *DriverObject);
11364
11365 _Must_inspect_result_
11366 _IRQL_requires_max_(APC_LEVEL)
11367 NTKERNELAPI
11368 PVOID
11369 NTAPI
11370 MmLockPagableDataSection(
11371 _In_ PVOID AddressWithinSection);
11372
11373 _Must_inspect_result_
11374 _IRQL_requires_max_(DISPATCH_LEVEL)
11375 _Out_writes_bytes_opt_ (NumberOfBytes)
11376 NTKERNELAPI
11377 PVOID
11378 NTAPI
11379 MmMapIoSpace(
11380 _In_ PHYSICAL_ADDRESS PhysicalAddress,
11381 _In_ SIZE_T NumberOfBytes,
11382 _In_ MEMORY_CACHING_TYPE CacheType);
11383
11384 _Must_inspect_result_
11385 _When_(AccessMode==0, _IRQL_requires_max_(DISPATCH_LEVEL))
11386 _When_(AccessMode==1, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL))
11387 NTKERNELAPI
11388 PVOID
11389 NTAPI
11390 MmMapLockedPages(
11391 _Inout_ PMDL MemoryDescriptorList,
11392 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
11393 KPROCESSOR_MODE AccessMode);
11394
11395 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
11396 _When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL))
11397 _When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL) _Post_notnull_)
11398 _At_(MemoryDescriptorList->MappedSystemVa, _Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
11399 _Must_inspect_result_
11400 _Success_(return != NULL)
11401 NTKERNELAPI
11402 PVOID
11403 NTAPI
11404 MmMapLockedPagesSpecifyCache(
11405 _Inout_ PMDLX MemoryDescriptorList,
11406 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
11407 KPROCESSOR_MODE AccessMode,
11408 _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType,
11409 _In_opt_ PVOID BaseAddress,
11410 _In_ ULONG BugCheckOnFailure,
11411 _In_ MM_PAGE_PRIORITY Priority);
11412
11413 _IRQL_requires_max_(APC_LEVEL)
11414 NTKERNELAPI
11415 PVOID
11416 NTAPI
11417 MmPageEntireDriver(
11418 _In_ PVOID AddressWithinSection);
11419
11420 _IRQL_requires_max_(DISPATCH_LEVEL)
11421 _At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset,
11422 _Field_size_bytes_opt_(MemoryDescriptorList->ByteCount))
11423 NTKERNELAPI
11424 VOID
11425 NTAPI
11426 MmProbeAndLockPages(
11427 _Inout_ PMDLX MemoryDescriptorList,
11428 _In_ KPROCESSOR_MODE AccessMode,
11429 _In_ LOCK_OPERATION Operation);
11430
11431 NTKERNELAPI
11432 MM_SYSTEMSIZE
11433 NTAPI
11434 MmQuerySystemSize(VOID);
11435
11436 _IRQL_requires_max_(APC_LEVEL)
11437 NTKERNELAPI
11438 VOID
11439 NTAPI
11440 MmResetDriverPaging(
11441 _In_ PVOID AddressWithinSection);
11442
11443 NTKERNELAPI
11444 SIZE_T
11445 NTAPI
11446 MmSizeOfMdl(
11447 _In_reads_bytes_opt_ (Length) PVOID Base,
11448 _In_ SIZE_T Length);
11449
11450 _IRQL_requires_max_(DISPATCH_LEVEL)
11451 NTKERNELAPI
11452 VOID
11453 NTAPI
11454 MmUnlockPagableImageSection(
11455 _In_ PVOID ImageSectionHandle);
11456
11457 _IRQL_requires_max_(DISPATCH_LEVEL)
11458 NTKERNELAPI
11459 VOID
11460 NTAPI
11461 MmUnlockPages(
11462 _Inout_ PMDLX MemoryDescriptorList);
11463
11464 _IRQL_requires_max_(DISPATCH_LEVEL)
11465 NTKERNELAPI
11466 VOID
11467 NTAPI
11468 MmUnmapIoSpace(
11469 _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
11470 _In_ SIZE_T NumberOfBytes);
11471
11472 _IRQL_requires_max_ (APC_LEVEL)
11473 NTKERNELAPI
11474 VOID
11475 NTAPI
11476 MmProbeAndLockProcessPages(
11477 _Inout_ PMDL MemoryDescriptorList,
11478 _In_ PEPROCESS Process,
11479 _In_ KPROCESSOR_MODE AccessMode,
11480 _In_ LOCK_OPERATION Operation);
11481
11482 _IRQL_requires_max_(DISPATCH_LEVEL)
11483 NTKERNELAPI
11484 VOID
11485 NTAPI
11486 MmUnmapLockedPages(
11487 _In_ PVOID BaseAddress,
11488 _Inout_ PMDL MemoryDescriptorList);
11489
11490 _Must_inspect_result_
11491 _IRQL_requires_max_(DISPATCH_LEVEL)
11492 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
11493 NTKERNELAPI
11494 PVOID
11495 NTAPI
11496 MmAllocateContiguousMemorySpecifyCacheNode(
11497 _In_ SIZE_T NumberOfBytes,
11498 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
11499 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
11500 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
11501 _In_ MEMORY_CACHING_TYPE CacheType,
11502 _In_ NODE_REQUIREMENT PreferredNode);
11503
11504 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11505
11506 #if (NTDDI_VERSION >= NTDDI_WINXP)
11507
11508 _IRQL_requires_max_(DISPATCH_LEVEL)
11509 NTKERNELAPI
11510 NTSTATUS
11511 NTAPI
11512 MmAdvanceMdl(
11513 _Inout_ PMDLX Mdl,
11514 _In_ ULONG NumberOfBytes);
11515
11516 _Must_inspect_result_
11517 _IRQL_requires_max_(APC_LEVEL)
11518 _When_ (return != NULL, _Out_writes_bytes_opt_ (NumberOfBytes))
11519 NTKERNELAPI
11520 PVOID
11521 NTAPI
11522 MmAllocateMappingAddress(
11523 _In_ SIZE_T NumberOfBytes,
11524 _In_ ULONG PoolTag);
11525
11526 _IRQL_requires_max_(APC_LEVEL)
11527 NTKERNELAPI
11528 VOID
11529 NTAPI
11530 MmFreeMappingAddress(
11531 _In_ PVOID BaseAddress,
11532 _In_ ULONG PoolTag);
11533
11534 _IRQL_requires_max_ (APC_LEVEL)
11535 NTKERNELAPI
11536 NTSTATUS
11537 NTAPI
11538 MmIsVerifierEnabled(
11539 _Out_ PULONG VerifierFlags);
11540
11541 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
11542 _IRQL_requires_max_(DISPATCH_LEVEL)
11543 _At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset,
11544 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
11545 _Must_inspect_result_
11546 _Success_(return != NULL)
11547 NTKERNELAPI
11548 PVOID
11549 NTAPI
11550 MmMapLockedPagesWithReservedMapping(
11551 _In_ PVOID MappingAddress,
11552 _In_ ULONG PoolTag,
11553 _Inout_ PMDLX MemoryDescriptorList,
11554 _In_ __drv_strictTypeMatch(__drv_typeCond)
11555 MEMORY_CACHING_TYPE CacheType);
11556
11557 _Must_inspect_result_
11558 _IRQL_requires_max_(DISPATCH_LEVEL)
11559 NTKERNELAPI
11560 NTSTATUS
11561 NTAPI
11562 MmProtectMdlSystemAddress(
11563 _In_ PMDLX MemoryDescriptorList,
11564 _In_ ULONG NewProtect);
11565
11566 _IRQL_requires_max_(DISPATCH_LEVEL)
11567 NTKERNELAPI
11568 VOID
11569 NTAPI
11570 MmUnmapReservedMapping(
11571 _In_ PVOID BaseAddress,
11572 _In_ ULONG PoolTag,
11573 _Inout_ PMDLX MemoryDescriptorList);
11574
11575 _IRQL_requires_max_ (APC_LEVEL)
11576 NTKERNELAPI
11577 NTSTATUS
11578 NTAPI
11579 MmAddVerifierThunks(
11580 _In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer,
11581 _In_ ULONG ThunkBufferSize);
11582
11583 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
11584 #if (NTDDI_VERSION >= NTDDI_WS03)
11585 _IRQL_requires_max_ (DISPATCH_LEVEL)
11586 NTKERNELAPI
11587 LOGICAL
11588 NTAPI
11589 MmIsIoSpaceActive(
11590 _In_ PHYSICAL_ADDRESS StartAddress,
11591 _In_ SIZE_T NumberOfBytes);
11592
11593 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
11594 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11595 _Must_inspect_result_
11596 _IRQL_requires_max_ (DISPATCH_LEVEL)
11597 NTKERNELAPI
11598 PMDL
11599 NTAPI
11600 MmAllocatePagesForMdlEx(
11601 _In_ PHYSICAL_ADDRESS LowAddress,
11602 _In_ PHYSICAL_ADDRESS HighAddress,
11603 _In_ PHYSICAL_ADDRESS SkipBytes,
11604 _In_ SIZE_T TotalBytes,
11605 _In_ MEMORY_CACHING_TYPE CacheType,
11606 _In_ ULONG Flags);
11607 #endif
11608
11609 #if (NTDDI_VERSION >= NTDDI_VISTA)
11610 _IRQL_requires_max_ (APC_LEVEL)
11611 NTKERNELAPI
11612 LOGICAL
11613 NTAPI
11614 MmIsDriverVerifyingByAddress(
11615 _In_ PVOID AddressWithinSection);
11616 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11617
11618 /******************************************************************************
11619 * Security Manager Functions *
11620 ******************************************************************************/
11621
11622 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11623 _IRQL_requires_max_(PASSIVE_LEVEL)
11624 NTKERNELAPI
11625 BOOLEAN
11626 NTAPI
11627 SeAccessCheck(
11628 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
11629 _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
11630 _In_ BOOLEAN SubjectContextLocked,
11631 _In_ ACCESS_MASK DesiredAccess,
11632 _In_ ACCESS_MASK PreviouslyGrantedAccess,
11633 _Outptr_opt_ PPRIVILEGE_SET *Privileges,
11634 _In_ PGENERIC_MAPPING GenericMapping,
11635 _In_ KPROCESSOR_MODE AccessMode,
11636 _Out_ PACCESS_MASK GrantedAccess,
11637 _Out_ PNTSTATUS AccessStatus);
11638
11639 _IRQL_requires_max_(PASSIVE_LEVEL)
11640 NTKERNELAPI
11641 NTSTATUS
11642 NTAPI
11643 SeAssignSecurity(
11644 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,
11645 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor,
11646 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
11647 _In_ BOOLEAN IsDirectoryObject,
11648 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext,
11649 _In_ PGENERIC_MAPPING GenericMapping,
11650 _In_ POOL_TYPE PoolType);
11651
11652 NTKERNELAPI
11653 NTSTATUS
11654 NTAPI
11655 SeAssignSecurityEx(
11656 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,
11657 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor,
11658 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
11659 _In_opt_ GUID *ObjectType,
11660 _In_ BOOLEAN IsDirectoryObject,
11661 _In_ ULONG AutoInheritFlags,
11662 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext,
11663 _In_ PGENERIC_MAPPING GenericMapping,
11664 _In_ POOL_TYPE PoolType);
11665
11666 _IRQL_requires_max_(PASSIVE_LEVEL)
11667 NTKERNELAPI
11668 NTSTATUS
11669 NTAPI
11670 SeDeassignSecurity(
11671 _Inout_ PSECURITY_DESCRIPTOR *SecurityDescriptor);
11672
11673 _IRQL_requires_max_(PASSIVE_LEVEL)
11674 NTKERNELAPI
11675 BOOLEAN
11676 NTAPI
11677 SeValidSecurityDescriptor(
11678 _In_ ULONG Length,
11679 _In_reads_bytes_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor);
11680
11681 NTKERNELAPI
11682 ULONG
11683 NTAPI
11684 SeObjectCreateSaclAccessBits(
11685 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
11686
11687 NTKERNELAPI
11688 VOID
11689 NTAPI
11690 SeReleaseSubjectContext(
11691 _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11692
11693 NTKERNELAPI
11694 VOID
11695 NTAPI
11696 SeUnlockSubjectContext(
11697 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11698
11699 NTKERNELAPI
11700 VOID
11701 NTAPI
11702 SeCaptureSubjectContext(
11703 _Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11704
11705 NTKERNELAPI
11706 VOID
11707 NTAPI
11708 SeLockSubjectContext(
11709 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11710
11711
11712 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11713
11714 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11715
11716 _At_(AuditParameters->ParameterCount, _Const_)
11717 NTSTATUS
11718 NTAPI
11719 SeSetAuditParameter(
11720 _Inout_ PSE_ADT_PARAMETER_ARRAY AuditParameters,
11721 _In_ SE_ADT_PARAMETER_TYPE Type,
11722 _In_range_(<,SE_MAX_AUDIT_PARAMETERS) ULONG Index,
11723 _In_reads_(_Inexpressible_("depends on SE_ADT_PARAMETER_TYPE"))
11724 PVOID Data);
11725
11726 NTSTATUS
11727 NTAPI
11728 SeReportSecurityEvent(
11729 _In_ ULONG Flags,
11730 _In_ PUNICODE_STRING SourceName,
11731 _In_opt_ PSID UserSid,
11732 _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters);
11733
11734 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11735
11736 #if (NTDDI_VERSION >= NTDDI_VISTA)
11737 NTKERNELAPI
11738 ULONG
11739 NTAPI
11740 SeComputeAutoInheritByObjectType(
11741 _In_ PVOID ObjectType,
11742 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
11743 _In_opt_ PSECURITY_DESCRIPTOR ParentSecurityDescriptor);
11744
11745 #ifdef SE_NTFS_WORLD_CACHE
11746 VOID
11747 NTAPI
11748 SeGetWorldRights(
11749 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
11750 _In_ PGENERIC_MAPPING GenericMapping,
11751 _Out_ PACCESS_MASK GrantedAccess);
11752 #endif /* SE_NTFS_WORLD_CACHE */
11753 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11754 /******************************************************************************
11755 * Configuration Manager Functions *
11756 ******************************************************************************/
11757
11758 #if (NTDDI_VERSION >= NTDDI_WINXP)
11759 _IRQL_requires_max_(APC_LEVEL)
11760 NTKERNELAPI
11761 NTSTATUS
11762 NTAPI
11763 CmRegisterCallback(
11764 _In_ PEX_CALLBACK_FUNCTION Function,
11765 _In_opt_ PVOID Context,
11766 _Out_ PLARGE_INTEGER Cookie);
11767
11768 _IRQL_requires_max_(APC_LEVEL)
11769 NTKERNELAPI
11770 NTSTATUS
11771 NTAPI
11772 CmUnRegisterCallback(
11773 _In_ LARGE_INTEGER Cookie);
11774 #endif
11775
11776 #if (NTDDI_VERSION >= NTDDI_VISTA)
11777
11778 _IRQL_requires_max_(APC_LEVEL)
11779 NTKERNELAPI
11780 NTSTATUS
11781 NTAPI
11782 CmRegisterCallbackEx(
11783 _In_ PEX_CALLBACK_FUNCTION Function,
11784 _In_ PCUNICODE_STRING Altitude,
11785 _In_ PVOID Driver,
11786 _In_opt_ PVOID Context,
11787 _Out_ PLARGE_INTEGER Cookie,
11788 _Reserved_ PVOID Reserved);
11789
11790 _IRQL_requires_max_(APC_LEVEL)
11791 NTKERNELAPI
11792 VOID
11793 NTAPI
11794 CmGetCallbackVersion(
11795 _Out_opt_ PULONG Major,
11796 _Out_opt_ PULONG Minor);
11797
11798 _IRQL_requires_max_(APC_LEVEL)
11799 NTKERNELAPI
11800 NTSTATUS
11801 NTAPI
11802 CmSetCallbackObjectContext(
11803 _Inout_ PVOID Object,
11804 _In_ PLARGE_INTEGER Cookie,
11805 _In_ PVOID NewContext,
11806 _Out_opt_ PVOID *OldContext);
11807
11808 _IRQL_requires_max_(APC_LEVEL)
11809 NTKERNELAPI
11810 NTSTATUS
11811 NTAPI
11812 CmCallbackGetKeyObjectID(
11813 _In_ PLARGE_INTEGER Cookie,
11814 _In_ PVOID Object,
11815 _Out_opt_ PULONG_PTR ObjectID,
11816 _Outptr_opt_ PCUNICODE_STRING *ObjectName);
11817
11818 _IRQL_requires_max_(APC_LEVEL)
11819 NTKERNELAPI
11820 PVOID
11821 NTAPI
11822 CmGetBoundTransaction(
11823 _In_ PLARGE_INTEGER Cookie,
11824 _In_ PVOID Object);
11825
11826 #endif // NTDDI_VERSION >= NTDDI_VISTA
11827
11828
11829 /******************************************************************************
11830 * I/O Manager Functions *
11831 ******************************************************************************/
11832
11833 /*
11834 * NTSTATUS
11835 * IoAcquireRemoveLock(
11836 * IN PIO_REMOVE_LOCK RemoveLock,
11837 * IN OPTIONAL PVOID Tag)
11838 */
11839 #if DBG
11840 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11841 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11842 #else
11843 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11844 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
11845 #endif
11846
11847 /*
11848 * VOID
11849 * IoAdjustPagingPathCount(
11850 * IN PLONG Count,
11851 * IN BOOLEAN Increment)
11852 */
11853 #define IoAdjustPagingPathCount(_Count, \
11854 _Increment) \
11855 { \
11856 if (_Increment) \
11857 { \
11858 InterlockedIncrement(_Count); \
11859 } \
11860 else \
11861 { \
11862 InterlockedDecrement(_Count); \
11863 } \
11864 }
11865
11866 #if !defined(_M_AMD64)
11867 NTHALAPI
11868 VOID
11869 NTAPI
11870 READ_PORT_BUFFER_UCHAR(
11871 IN PUCHAR Port,
11872 IN PUCHAR Buffer,
11873 IN ULONG Count);
11874
11875 NTHALAPI
11876 VOID
11877 NTAPI
11878 READ_PORT_BUFFER_ULONG(
11879 IN PULONG Port,
11880 IN PULONG Buffer,
11881 IN ULONG Count);
11882
11883 NTHALAPI
11884 VOID
11885 NTAPI
11886 READ_PORT_BUFFER_USHORT(
11887 IN PUSHORT Port,
11888 IN PUSHORT Buffer,
11889 IN ULONG Count);
11890
11891 NTHALAPI
11892 UCHAR
11893 NTAPI
11894 READ_PORT_UCHAR(
11895 IN PUCHAR Port);
11896
11897 NTHALAPI
11898 ULONG
11899 NTAPI
11900 READ_PORT_ULONG(
11901 IN PULONG Port);
11902
11903 NTHALAPI
11904 USHORT
11905 NTAPI
11906 READ_PORT_USHORT(
11907 IN PUSHORT Port);
11908
11909 NTKERNELAPI
11910 VOID
11911 NTAPI
11912 READ_REGISTER_BUFFER_UCHAR(
11913 IN PUCHAR Register,
11914 IN PUCHAR Buffer,
11915 IN ULONG Count);
11916
11917 NTKERNELAPI
11918 VOID
11919 NTAPI
11920 READ_REGISTER_BUFFER_ULONG(
11921 IN PULONG Register,
11922 IN PULONG Buffer,
11923 IN ULONG Count);
11924
11925 NTKERNELAPI
11926 VOID
11927 NTAPI
11928 READ_REGISTER_BUFFER_USHORT(
11929 IN PUSHORT Register,
11930 IN PUSHORT Buffer,
11931 IN ULONG Count);
11932
11933 NTKERNELAPI
11934 UCHAR
11935 NTAPI
11936 READ_REGISTER_UCHAR(
11937 IN PUCHAR Register);
11938
11939 NTKERNELAPI
11940 ULONG
11941 NTAPI
11942 READ_REGISTER_ULONG(
11943 IN PULONG Register);
11944
11945 NTKERNELAPI
11946 USHORT
11947 NTAPI
11948 READ_REGISTER_USHORT(
11949 IN PUSHORT Register);
11950
11951 NTHALAPI
11952 VOID
11953 NTAPI
11954 WRITE_PORT_BUFFER_UCHAR(
11955 IN PUCHAR Port,
11956 IN PUCHAR Buffer,
11957 IN ULONG Count);
11958
11959 NTHALAPI
11960 VOID
11961 NTAPI
11962 WRITE_PORT_BUFFER_ULONG(
11963 IN PULONG Port,
11964 IN PULONG Buffer,
11965 IN ULONG Count);
11966
11967 NTHALAPI
11968 VOID
11969 NTAPI
11970 WRITE_PORT_BUFFER_USHORT(
11971 IN PUSHORT Port,
11972 IN PUSHORT Buffer,
11973 IN ULONG Count);
11974
11975 NTHALAPI
11976 VOID
11977 NTAPI
11978 WRITE_PORT_UCHAR(
11979 IN PUCHAR Port,
11980 IN UCHAR Value);
11981
11982 NTHALAPI
11983 VOID
11984 NTAPI
11985 WRITE_PORT_ULONG(
11986 IN PULONG Port,
11987 IN ULONG Value);
11988
11989 NTHALAPI
11990 VOID
11991 NTAPI
11992 WRITE_PORT_USHORT(
11993 IN PUSHORT Port,
11994 IN USHORT Value);
11995
11996 NTKERNELAPI
11997 VOID
11998 NTAPI
11999 WRITE_REGISTER_BUFFER_UCHAR(
12000 IN PUCHAR Register,
12001 IN PUCHAR Buffer,
12002 IN ULONG Count);
12003
12004 NTKERNELAPI
12005 VOID
12006 NTAPI
12007 WRITE_REGISTER_BUFFER_ULONG(
12008 IN PULONG Register,
12009 IN PULONG Buffer,
12010 IN ULONG Count);
12011
12012 NTKERNELAPI
12013 VOID
12014 NTAPI
12015 WRITE_REGISTER_BUFFER_USHORT(
12016 IN PUSHORT Register,
12017 IN PUSHORT Buffer,
12018 IN ULONG Count);
12019
12020 NTKERNELAPI
12021 VOID
12022 NTAPI
12023 WRITE_REGISTER_UCHAR(
12024 IN PUCHAR Register,
12025 IN UCHAR Value);
12026
12027 NTKERNELAPI
12028 VOID
12029 NTAPI
12030 WRITE_REGISTER_ULONG(
12031 IN PULONG Register,
12032 IN ULONG Value);
12033
12034 NTKERNELAPI
12035 VOID
12036 NTAPI
12037 WRITE_REGISTER_USHORT(
12038 IN PUSHORT Register,
12039 IN USHORT Value);
12040
12041 #else
12042
12043 FORCEINLINE
12044 VOID
12045 READ_PORT_BUFFER_UCHAR(
12046 IN PUCHAR Port,
12047 IN PUCHAR Buffer,
12048 IN ULONG Count)
12049 {
12050 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12051 }
12052
12053 FORCEINLINE
12054 VOID
12055 READ_PORT_BUFFER_ULONG(
12056 IN PULONG Port,
12057 IN PULONG Buffer,
12058 IN ULONG Count)
12059 {
12060 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12061 }
12062
12063 FORCEINLINE
12064 VOID
12065 READ_PORT_BUFFER_USHORT(
12066 IN PUSHORT Port,
12067 IN PUSHORT Buffer,
12068 IN ULONG Count)
12069 {
12070 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12071 }
12072
12073 FORCEINLINE
12074 UCHAR
12075 READ_PORT_UCHAR(
12076 IN PUCHAR Port)
12077 {
12078 return __inbyte((USHORT)(ULONG_PTR)Port);
12079 }
12080
12081 FORCEINLINE
12082 ULONG
12083 READ_PORT_ULONG(
12084 IN PULONG Port)
12085 {
12086 return __indword((USHORT)(ULONG_PTR)Port);
12087 }
12088
12089 FORCEINLINE
12090 USHORT
12091 READ_PORT_USHORT(
12092 IN PUSHORT Port)
12093 {
12094 return __inword((USHORT)(ULONG_PTR)Port);
12095 }
12096
12097 FORCEINLINE
12098 VOID
12099 READ_REGISTER_BUFFER_UCHAR(
12100 IN PUCHAR Register,
12101 IN PUCHAR Buffer,
12102 IN ULONG Count)
12103 {
12104 __movsb(Register, Buffer, Count);
12105 }
12106
12107 FORCEINLINE
12108 VOID
12109 READ_REGISTER_BUFFER_ULONG(
12110 IN PULONG Register,
12111 IN PULONG Buffer,
12112 IN ULONG Count)
12113 {
12114 __movsd(Register, Buffer, Count);
12115 }
12116
12117 FORCEINLINE
12118 VOID
12119 READ_REGISTER_BUFFER_USHORT(
12120 IN PUSHORT Register,
12121 IN PUSHORT Buffer,
12122 IN ULONG Count)
12123 {
12124 __movsw(Register, Buffer, Count);
12125 }
12126
12127 FORCEINLINE
12128 UCHAR
12129 READ_REGISTER_UCHAR(
12130 IN volatile UCHAR *Register)
12131 {
12132 return *Register;
12133 }
12134
12135 FORCEINLINE
12136 ULONG
12137 READ_REGISTER_ULONG(
12138 IN volatile ULONG *Register)
12139 {
12140 return *Register;
12141 }
12142
12143 FORCEINLINE
12144 USHORT
12145 READ_REGISTER_USHORT(
12146 IN volatile USHORT *Register)
12147 {
12148 return *Register;
12149 }
12150
12151 FORCEINLINE
12152 VOID
12153 WRITE_PORT_BUFFER_UCHAR(
12154 IN PUCHAR Port,
12155 IN PUCHAR Buffer,
12156 IN ULONG Count)
12157 {
12158 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12159 }
12160
12161 FORCEINLINE
12162 VOID
12163 WRITE_PORT_BUFFER_ULONG(
12164 IN PULONG Port,
12165 IN PULONG Buffer,
12166 IN ULONG Count)
12167 {
12168 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12169 }
12170
12171 FORCEINLINE
12172 VOID
12173 WRITE_PORT_BUFFER_USHORT(
12174 IN PUSHORT Port,
12175 IN PUSHORT Buffer,
12176 IN ULONG Count)
12177 {
12178 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12179 }
12180
12181 FORCEINLINE
12182 VOID
12183 WRITE_PORT_UCHAR(
12184 IN PUCHAR Port,
12185 IN UCHAR Value)
12186 {
12187 __outbyte((USHORT)(ULONG_PTR)Port, Value);
12188 }
12189
12190 FORCEINLINE
12191 VOID
12192 WRITE_PORT_ULONG(
12193 IN PULONG Port,
12194 IN ULONG Value)
12195 {
12196 __outdword((USHORT)(ULONG_PTR)Port, Value);
12197 }
12198
12199 FORCEINLINE
12200 VOID
12201 WRITE_PORT_USHORT(
12202 IN PUSHORT Port,
12203 IN USHORT Value)
12204 {
12205 __outword((USHORT)(ULONG_PTR)Port, Value);
12206 }
12207
12208 FORCEINLINE
12209 VOID
12210 WRITE_REGISTER_BUFFER_UCHAR(
12211 IN PUCHAR Register,
12212 IN PUCHAR Buffer,
12213 IN ULONG Count)
12214 {
12215 LONG Synch;
12216 __movsb(Register, Buffer, Count);
12217 InterlockedOr(&Synch, 1);
12218 }
12219
12220 FORCEINLINE
12221 VOID
12222 WRITE_REGISTER_BUFFER_ULONG(
12223 IN PULONG Register,
12224 IN PULONG Buffer,
12225 IN ULONG Count)
12226 {
12227 LONG Synch;
12228 __movsd(Register, Buffer, Count);
12229 InterlockedOr(&Synch, 1);
12230 }
12231
12232 FORCEINLINE
12233 VOID
12234 WRITE_REGISTER_BUFFER_USHORT(
12235 IN PUSHORT Register,
12236 IN PUSHORT Buffer,
12237 IN ULONG Count)
12238 {
12239 LONG Synch;
12240 __movsw(Register, Buffer, Count);
12241 InterlockedOr(&Synch, 1);
12242 }
12243
12244 FORCEINLINE
12245 VOID
12246 WRITE_REGISTER_UCHAR(
12247 IN volatile UCHAR *Register,
12248 IN UCHAR Value)
12249 {
12250 LONG Synch;
12251 *Register = Value;
12252 InterlockedOr(&Synch, 1);
12253 }
12254
12255 FORCEINLINE
12256 VOID
12257 WRITE_REGISTER_ULONG(
12258 IN volatile ULONG *Register,
12259 IN ULONG Value)
12260 {
12261 LONG Synch;
12262 *Register = Value;
12263 InterlockedOr(&Synch, 1);
12264 }
12265
12266 FORCEINLINE
12267 VOID
12268 WRITE_REGISTER_USHORT(
12269 IN volatile USHORT *Register,
12270 IN USHORT Value)
12271 {
12272 LONG Sync;
12273 *Register = Value;
12274 InterlockedOr(&Sync, 1);
12275 }
12276 #endif
12277
12278 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
12279 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
12280
12281 #define DMA_MACROS_DEFINED
12282
12283 _IRQL_requires_max_(DISPATCH_LEVEL)
12284 _IRQL_requires_min_(DISPATCH_LEVEL)
12285 FORCEINLINE
12286 NTSTATUS
12287 IoAllocateAdapterChannel(
12288 _In_ PDMA_ADAPTER DmaAdapter,
12289 _In_ PDEVICE_OBJECT DeviceObject,
12290 _In_ ULONG NumberOfMapRegisters,
12291 _In_ PDRIVER_CONTROL ExecutionRoutine,
12292 _In_ PVOID Context)
12293 {
12294 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
12295 AllocateAdapterChannel =
12296 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
12297 ASSERT(AllocateAdapterChannel);
12298 return AllocateAdapterChannel(DmaAdapter,
12299 DeviceObject,
12300 NumberOfMapRegisters,
12301 ExecutionRoutine,
12302 Context);
12303 }
12304
12305 FORCEINLINE
12306 BOOLEAN
12307 NTAPI
12308 IoFlushAdapterBuffers(
12309 _In_ PDMA_ADAPTER DmaAdapter,
12310 _In_ PMDL Mdl,
12311 _In_ PVOID MapRegisterBase,
12312 _In_ PVOID CurrentVa,
12313 _In_ ULONG Length,
12314 _In_ BOOLEAN WriteToDevice)
12315 {
12316 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
12317 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
12318 ASSERT(FlushAdapterBuffers);
12319 return FlushAdapterBuffers(DmaAdapter,
12320 Mdl,
12321 MapRegisterBase,
12322 CurrentVa,
12323 Length,
12324 WriteToDevice);
12325 }
12326
12327 FORCEINLINE
12328 VOID
12329 NTAPI
12330 IoFreeAdapterChannel(
12331 _In_ PDMA_ADAPTER DmaAdapter)
12332 {
12333 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
12334 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
12335 ASSERT(FreeAdapterChannel);
12336 FreeAdapterChannel(DmaAdapter);
12337 }
12338
12339 FORCEINLINE
12340 VOID
12341 NTAPI
12342 IoFreeMapRegisters(
12343 _In_ PDMA_ADAPTER DmaAdapter,
12344 _In_ PVOID MapRegisterBase,
12345 _In_ ULONG NumberOfMapRegisters)
12346 {
12347 PFREE_MAP_REGISTERS FreeMapRegisters;
12348 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
12349 ASSERT(FreeMapRegisters);
12350 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
12351 }
12352
12353 FORCEINLINE
12354 PHYSICAL_ADDRESS
12355 NTAPI
12356 IoMapTransfer(
12357 _In_ PDMA_ADAPTER DmaAdapter,
12358 _In_ PMDL Mdl,
12359 _In_ PVOID MapRegisterBase,
12360 _In_ PVOID CurrentVa,
12361 _Inout_ PULONG Length,
12362 _In_ BOOLEAN WriteToDevice)
12363 {
12364 PMAP_TRANSFER MapTransfer;
12365
12366 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
12367 ASSERT(MapTransfer);
12368 return MapTransfer(DmaAdapter,
12369 Mdl,
12370 MapRegisterBase,
12371 CurrentVa,
12372 Length,
12373 WriteToDevice);
12374 }
12375 #endif
12376
12377 #if (NTDDI_VERSION >= NTDDI_WIN2K)
12378
12379 _Acquires_lock_(_Global_cancel_spin_lock_)
12380 _Requires_lock_not_held_(_Global_cancel_spin_lock_)
12381 _IRQL_requires_max_(DISPATCH_LEVEL)
12382 _IRQL_raises_(DISPATCH_LEVEL)
12383 NTKERNELAPI
12384 VOID
12385 NTAPI
12386 IoAcquireCancelSpinLock(
12387 _Out_ _At_(*Irql, _IRQL_saves_) PKIRQL Irql);
12388
12389 _IRQL_requires_max_(DISPATCH_LEVEL)
12390 NTKERNELAPI
12391 NTSTATUS
12392 NTAPI
12393 IoAcquireRemoveLockEx(
12394 _Inout_ PIO_REMOVE_LOCK RemoveLock,
12395 _In_opt_ PVOID Tag,
12396 _In_ PCSTR File,
12397 _In_ ULONG Line,
12398 _In_ ULONG RemlockSize);
12399
12400 _IRQL_requires_max_(DISPATCH_LEVEL)
12401 _Ret_range_(<=, 0)
12402 NTKERNELAPI
12403 NTSTATUS
12404 NTAPI
12405 IoAllocateDriverObjectExtension(
12406 _In_ PDRIVER_OBJECT DriverObject,
12407 _In_ PVOID ClientIdentificationAddress,
12408 _In_ ULONG DriverObjectExtensionSize,
12409 _Post_ _At_(*DriverObjectExtension, _When_(return==0,
12410 __drv_aliasesMem __drv_allocatesMem(Mem) _Post_notnull_))
12411 _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize))
12412 PVOID *DriverObjectExtension);
12413
12414 _IRQL_requires_max_(DISPATCH_LEVEL)
12415 NTKERNELAPI
12416 PVOID
12417 NTAPI
12418 IoAllocateErrorLogEntry(
12419 _In_ PVOID IoObject,
12420 _In_ UCHAR EntrySize);
12421
12422 _Must_inspect_result_
12423 _IRQL_requires_max_(DISPATCH_LEVEL)
12424 NTKERNELAPI
12425 PIRP
12426 NTAPI
12427 IoAllocateIrp(
12428 _In_ CCHAR StackSize,
12429 _In_ BOOLEAN ChargeQuota);
12430
12431 _IRQL_requires_max_(DISPATCH_LEVEL)
12432 NTKERNELAPI
12433 PMDL
12434 NTAPI
12435 IoAllocateMdl(
12436 _In_opt_ __drv_aliasesMem PVOID VirtualAddress,
12437 _In_ ULONG Length,
12438 _In_ BOOLEAN SecondaryBuffer,
12439 _In_ BOOLEAN ChargeQuota,
12440 _Inout_opt_ PIRP Irp);
12441
12442 __drv_allocatesMem(Mem)
12443 _IRQL_requires_max_(DISPATCH_LEVEL)
12444 NTKERNELAPI
12445 PIO_WORKITEM
12446 NTAPI
12447 IoAllocateWorkItem(
12448 _In_ PDEVICE_OBJECT DeviceObject);
12449
12450 _IRQL_requires_max_(APC_LEVEL)
12451 _Ret_range_(<=, 0)
12452 NTKERNELAPI
12453 NTSTATUS
12454 NTAPI
12455 IoAttachDevice(
12456 _In_ _Kernel_requires_resource_held_(Memory) _When_(return==0, __drv_aliasesMem)
12457 PDEVICE_OBJECT SourceDevice,
12458 _In_ PUNICODE_STRING TargetDevice,
12459 _Out_ PDEVICE_OBJECT *AttachedDevice);
12460
12461 _Must_inspect_result_
12462 _IRQL_requires_max_(DISPATCH_LEVEL)
12463 NTKERNELAPI
12464 PDEVICE_OBJECT
12465 NTAPI
12466 IoAttachDeviceToDeviceStack(
12467 _In_ _Kernel_requires_resource_held_(Memory) _When_(return!=0, __drv_aliasesMem)
12468 PDEVICE_OBJECT SourceDevice,
12469 _In_ PDEVICE_OBJECT TargetDevice);
12470
12471 _Must_inspect_result_
12472 __drv_aliasesMem
12473 _IRQL_requires_max_(DISPATCH_LEVEL)
12474 NTKERNELAPI
12475 PIRP
12476 NTAPI
12477 IoBuildAsynchronousFsdRequest(
12478 _In_ ULONG MajorFunction,
12479 _In_ PDEVICE_OBJECT DeviceObject,
12480 _Inout_opt_ PVOID Buffer,
12481 _In_opt_ ULONG Length,
12482 _In_opt_ PLARGE_INTEGER StartingOffset,
12483 _In_opt_ PIO_STATUS_BLOCK IoStatusBlock);
12484
12485 _Must_inspect_result_
12486 __drv_aliasesMem
12487 _IRQL_requires_max_(PASSIVE_LEVEL)
12488 NTKERNELAPI
12489 PIRP
12490 NTAPI
12491 IoBuildDeviceIoControlRequest(
12492 _In_ ULONG IoControlCode,
12493 _In_ PDEVICE_OBJECT DeviceObject,
12494 _In_opt_ PVOID InputBuffer,
12495 _In_ ULONG InputBufferLength,
12496 _Out_opt_ PVOID OutputBuffer,
12497 _In_ ULONG OutputBufferLength,
12498 _In_ BOOLEAN InternalDeviceIoControl,
12499 _In_ PKEVENT Event,
12500 _Out_ PIO_STATUS_BLOCK IoStatusBlock);
12501
12502 _IRQL_requires_max_(DISPATCH_LEVEL)
12503 NTKERNELAPI
12504 VOID
12505 NTAPI
12506 IoBuildPartialMdl(
12507 _In_ PMDL SourceMdl,
12508 _Inout_ PMDL TargetMdl,
12509 _In_ PVOID VirtualAddress,
12510 _In_ ULONG Length);
12511
12512 _Must_inspect_result_
12513 __drv_aliasesMem
12514 _IRQL_requires_max_(PASSIVE_LEVEL)
12515 NTKERNELAPI
12516 PIRP
12517 NTAPI
12518 IoBuildSynchronousFsdRequest(
12519 _In_ ULONG MajorFunction,
12520 _In_ PDEVICE_OBJECT DeviceObject,
12521 _Inout_opt_ PVOID Buffer,
12522 _In_opt_ ULONG Length,
12523 _In_opt_ PLARGE_INTEGER StartingOffset,
12524 _In_ PKEVENT Event,
12525 _Out_ PIO_STATUS_BLOCK IoStatusBlock);
12526
12527 _IRQL_requires_max_(DISPATCH_LEVEL)
12528 _Success_(TRUE)
12529 NTKERNELAPI
12530 NTSTATUS
12531 FASTCALL
12532 IofCallDriver(
12533 _In_ PDEVICE_OBJECT DeviceObject,
12534 _Inout_ __drv_aliasesMem PIRP Irp);
12535 #define IoCallDriver IofCallDriver
12536
12537 _IRQL_requires_max_(DISPATCH_LEVEL)
12538 NTKERNELAPI
12539 VOID
12540 FASTCALL
12541 IofCompleteRequest(
12542 _In_ PIRP Irp,
12543 _In_ CCHAR PriorityBoost);
12544 #define IoCompleteRequest IofCompleteRequest
12545
12546 _IRQL_requires_max_(DISPATCH_LEVEL)
12547 NTKERNELAPI
12548 BOOLEAN
12549 NTAPI
12550 IoCancelIrp(
12551 _In_ PIRP Irp);
12552
12553 _IRQL_requires_max_(PASSIVE_LEVEL)
12554 NTKERNELAPI
12555 NTSTATUS
12556 NTAPI
12557 IoCheckShareAccess(
12558 _In_ ACCESS_MASK DesiredAccess,
12559 _In_ ULONG DesiredShareAccess,
12560 _Inout_ PFILE_OBJECT FileObject,
12561 _Inout_ PSHARE_ACCESS ShareAccess,
12562 _In_ BOOLEAN Update);
12563
12564 _IRQL_requires_max_(DISPATCH_LEVEL)
12565 NTKERNELAPI
12566 VOID
12567 FASTCALL
12568 IofCompleteRequest(
12569 _In_ PIRP Irp,
12570 _In_ CCHAR PriorityBoost);
12571
12572 _IRQL_requires_max_(PASSIVE_LEVEL)
12573 NTKERNELAPI
12574 NTSTATUS
12575 NTAPI
12576 IoConnectInterrupt(
12577 _Out_ PKINTERRUPT *InterruptObject,
12578 _In_ PKSERVICE_ROUTINE ServiceRoutine,
12579 _In_opt_ PVOID ServiceContext,
12580 _In_opt_ PKSPIN_LOCK SpinLock,
12581 _In_ ULONG Vector,
12582 _In_ KIRQL Irql,
12583 _In_ KIRQL SynchronizeIrql,
12584 _In_ KINTERRUPT_MODE InterruptMode,
12585 _In_ BOOLEAN ShareVector,
12586 _In_ KAFFINITY ProcessorEnableMask,
12587 _In_ BOOLEAN FloatingSave);
12588
12589 _IRQL_requires_max_(APC_LEVEL)
12590 _Ret_range_(<=, 0)
12591 NTKERNELAPI
12592 NTSTATUS
12593 NTAPI
12594 IoCreateDevice(
12595 _In_ PDRIVER_OBJECT DriverObject,
12596 _In_ ULONG DeviceExtensionSize,
12597 _In_opt_ PUNICODE_STRING DeviceName,
12598 _In_ DEVICE_TYPE DeviceType,
12599 _In_ ULONG DeviceCharacteristics,
12600 _In_ BOOLEAN Exclusive,
12601 _Outptr_result_nullonfailure_
12602 _At_(*DeviceObject,
12603 __drv_allocatesMem(Mem)
12604 _When_((((_In_function_class_(DRIVER_INITIALIZE))
12605 ||(_In_function_class_(DRIVER_DISPATCH)))),
12606 __drv_aliasesMem))
12607 PDEVICE_OBJECT *DeviceObject);
12608
12609 _IRQL_requires_max_(PASSIVE_LEVEL)
12610 NTKERNELAPI
12611 NTSTATUS
12612 NTAPI
12613 IoCreateFile(
12614 _Out_ PHANDLE FileHandle,
12615 _In_ ACCESS_MASK DesiredAccess,
12616 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
12617 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
12618 _In_opt_ PLARGE_INTEGER AllocationSize,
12619 _In_ ULONG FileAttributes,
12620 _In_ ULONG ShareAccess,
12621 _In_ ULONG Disposition,
12622 _In_ ULONG CreateOptions,
12623 _In_opt_ PVOID EaBuffer,
12624 _In_ ULONG EaLength,
12625 _In_ CREATE_FILE_TYPE CreateFileType,
12626 _In_opt_ PVOID InternalParameters,
12627 _In_ ULONG Options);
12628
12629 _IRQL_requires_max_(PASSIVE_LEVEL)
12630 NTKERNELAPI
12631 PKEVENT
12632 NTAPI
12633 IoCreateNotificationEvent(
12634 _In_ PUNICODE_STRING EventName,
12635 _Out_ PHANDLE EventHandle);
12636
12637 _IRQL_requires_max_(PASSIVE_LEVEL)
12638 NTKERNELAPI
12639 NTSTATUS
12640 NTAPI
12641 IoCreateSymbolicLink(
12642 _In_ PUNICODE_STRING SymbolicLinkName,
12643 _In_ PUNICODE_STRING DeviceName);
12644
12645 _IRQL_requires_max_(PASSIVE_LEVEL)
12646 NTKERNELAPI
12647 PKEVENT
12648 NTAPI
12649 IoCreateSynchronizationEvent(
12650 _In_ PUNICODE_STRING EventName,
12651 _Out_ PHANDLE EventHandle);
12652
12653 _IRQL_requires_max_(PASSIVE_LEVEL)
12654 NTKERNELAPI
12655 NTSTATUS
12656 NTAPI
12657 IoCreateUnprotectedSymbolicLink(
12658 _In_ PUNICODE_STRING SymbolicLinkName,
12659 _In_ PUNICODE_STRING DeviceName);
12660
12661 _IRQL_requires_max_(APC_LEVEL)
12662 _Kernel_clear_do_init_(__yes)
12663 NTKERNELAPI
12664 VOID
12665 NTAPI
12666 IoDeleteDevice(
12667 _In_ _Kernel_requires_resource_held_(Memory) __drv_freesMem(Mem)
12668 PDEVICE_OBJECT DeviceObject);
12669
12670 _IRQL_requires_max_(PASSIVE_LEVEL)
12671 NTKERNELAPI
12672 NTSTATUS
12673 NTAPI
12674 IoDeleteSymbolicLink(
12675 _In_ PUNICODE_STRING SymbolicLinkName);
12676
12677 _IRQL_requires_max_(PASSIVE_LEVEL)
12678 NTKERNELAPI
12679 VOID
12680 NTAPI
12681 IoDetachDevice(
12682 _Inout_ PDEVICE_OBJECT TargetDevice);
12683
12684 _IRQL_requires_max_(PASSIVE_LEVEL)
12685 NTKERNELAPI
12686 VOID
12687 NTAPI
12688 IoDisconnectInterrupt(
12689 _In_ PKINTERRUPT InterruptObject);
12690
12691 __drv_freesMem(Mem)
12692 _IRQL_requires_max_(DISPATCH_LEVEL)
12693 NTKERNELAPI
12694 VOID
12695 NTAPI
12696 IoFreeIrp(
12697 _In_ PIRP Irp);
12698
12699 _IRQL_requires_max_(DISPATCH_LEVEL)
12700 NTKERNELAPI
12701 VOID
12702 NTAPI
12703 IoFreeMdl(
12704 PMDL Mdl);
12705
12706 _IRQL_requires_max_(DISPATCH_LEVEL)
12707 NTKERNELAPI
12708 VOID
12709 NTAPI
12710 IoFreeWorkItem(
12711 _In_ __drv_freesMem(Mem) PIO_WORKITEM IoWorkItem);
12712
12713 NTKERNELAPI
12714 PDEVICE_OBJECT
12715 NTAPI
12716 IoGetAttachedDevice(
12717 IN PDEVICE_OBJECT DeviceObject);
12718
12719 _IRQL_requires_max_(DISPATCH_LEVEL)
12720 NTKERNELAPI
12721 PDEVICE_OBJECT
12722 NTAPI
12723 IoGetAttachedDeviceReference(
12724 _In_ PDEVICE_OBJECT DeviceObject);
12725
12726 NTKERNELAPI
12727 NTSTATUS
12728 NTAPI
12729 IoGetBootDiskInformation(
12730 _Inout_ PBOOTDISK_INFORMATION BootDiskInformation,
12731 _In_ ULONG Size);
12732
12733 _IRQL_requires_max_(PASSIVE_LEVEL)
12734 _Must_inspect_result_
12735 NTKERNELAPI
12736 NTSTATUS
12737 NTAPI
12738 IoGetDeviceInterfaceAlias(
12739 _In_ PUNICODE_STRING SymbolicLinkName,
12740 _In_ CONST GUID *AliasInterfaceClassGuid,
12741 _Out_
12742 _When_(return==0, _At_(AliasSymbolicLinkName->Buffer, __drv_allocatesMem(Mem)))
12743 PUNICODE_STRING AliasSymbolicLinkName);
12744
12745 NTKERNELAPI
12746 PEPROCESS
12747 NTAPI
12748 IoGetCurrentProcess(VOID);
12749
12750 _IRQL_requires_max_(PASSIVE_LEVEL)
12751 _Must_inspect_result_
12752 NTKERNELAPI
12753 NTSTATUS
12754 NTAPI
12755 IoGetDeviceInterfaces(
12756 _In_ CONST GUID *InterfaceClassGuid,
12757 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
12758 _In_ ULONG Flags,
12759 _Outptr_result_nullonfailure_
12760 _At_(*SymbolicLinkList, _When_(return==0, __drv_allocatesMem(Mem)))
12761 PZZWSTR *SymbolicLinkList);
12762
12763 _IRQL_requires_max_(PASSIVE_LEVEL)
12764 NTKERNELAPI
12765 NTSTATUS
12766 NTAPI
12767 IoGetDeviceObjectPointer(
12768 _In_ PUNICODE_STRING ObjectName,
12769 _In_ ACCESS_MASK DesiredAccess,
12770 _Out_ PFILE_OBJECT *FileObject,
12771 _Out_ PDEVICE_OBJECT *DeviceObject);
12772
12773 _IRQL_requires_max_(PASSIVE_LEVEL)
12774 _When_((DeviceProperty & __string_type),
12775 _At_(PropertyBuffer, _Post_z_))
12776 _When_((DeviceProperty & __multiString_type),
12777 _At_(PropertyBuffer, _Post_ _NullNull_terminated_))
12778 NTKERNELAPI
12779 NTSTATUS
12780 NTAPI
12781 IoGetDeviceProperty(
12782 _In_ PDEVICE_OBJECT DeviceObject,
12783 _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty,
12784 _In_ ULONG BufferLength,
12785 _Out_writes_bytes_opt_(BufferLength) PVOID PropertyBuffer,
12786 _Deref_out_range_(<=, BufferLength) PULONG ResultLength);
12787
12788 _Must_inspect_result_
12789 _IRQL_requires_max_(PASSIVE_LEVEL)
12790 NTKERNELAPI
12791 PDMA_ADAPTER
12792 NTAPI
12793 IoGetDmaAdapter(
12794 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
12795 _In_ PDEVICE_DESCRIPTION DeviceDescription,
12796 _Out_ _When_(return!=0, _Kernel_IoGetDmaAdapter_ _At_(*NumberOfMapRegisters, _Must_inspect_result_))
12797 PULONG NumberOfMapRegisters);
12798
12799 __drv_aliasesMem
12800 _IRQL_requires_max_(DISPATCH_LEVEL)
12801 NTKERNELAPI
12802 PVOID
12803 NTAPI
12804 IoGetDriverObjectExtension(
12805 _In_ PDRIVER_OBJECT DriverObject,
12806 _In_ PVOID ClientIdentificationAddress);
12807
12808 _IRQL_requires_max_(APC_LEVEL)
12809 NTKERNELAPI
12810 PVOID
12811 NTAPI
12812 IoGetInitialStack(VOID);
12813
12814 NTKERNELAPI
12815 PDEVICE_OBJECT
12816 NTAPI
12817 IoGetRelatedDeviceObject(
12818 _In_ PFILE_OBJECT FileObject);
12819
12820 _IRQL_requires_max_(DISPATCH_LEVEL)
12821 NTKERNELAPI
12822 VOID
12823 NTAPI
12824 IoQueueWorkItem(
12825 _Inout_ PIO_WORKITEM IoWorkItem,
12826 _In_ PIO_WORKITEM_ROUTINE WorkerRoutine,
12827 _In_ WORK_QUEUE_TYPE QueueType,
12828 _In_opt_ __drv_aliasesMem PVOID Context);
12829
12830 _IRQL_requires_max_(DISPATCH_LEVEL)
12831 NTKERNELAPI
12832 VOID
12833 NTAPI
12834 IoInitializeIrp(
12835 _Inout_ PIRP Irp,
12836 _In_ USHORT PacketSize,
12837 _In_ CCHAR StackSize);
12838
12839 _IRQL_requires_max_(PASSIVE_LEVEL)
12840 NTKERNELAPI
12841 VOID
12842 NTAPI
12843 IoInitializeRemoveLockEx(
12844 _Out_ PIO_REMOVE_LOCK Lock,
12845 _In_ ULONG AllocateTag,
12846 _In_ ULONG MaxLockedMinutes,
12847 _In_ ULONG HighWatermark,
12848 _In_ ULONG RemlockSize);
12849
12850 _IRQL_requires_max_(PASSIVE_LEVEL)
12851 NTKERNELAPI
12852 NTSTATUS
12853 NTAPI
12854 IoInitializeTimer(
12855 _In_ PDEVICE_OBJECT DeviceObject,
12856 _In_ PIO_TIMER_ROUTINE TimerRoutine,
12857 _In_opt_ __drv_aliasesMem PVOID Context);
12858
12859 _IRQL_requires_max_(DISPATCH_LEVEL)
12860 NTKERNELAPI
12861 VOID
12862 NTAPI
12863 IoInvalidateDeviceRelations(
12864 _In_ PDEVICE_OBJECT DeviceObject,
12865 _In_ DEVICE_RELATION_TYPE Type);
12866
12867 _IRQL_requires_max_(DISPATCH_LEVEL)
12868 NTKERNELAPI
12869 VOID
12870 NTAPI
12871 IoInvalidateDeviceState(
12872 _In_ PDEVICE_OBJECT PhysicalDeviceObject);
12873
12874 _IRQL_requires_max_(PASSIVE_LEVEL)
12875 NTKERNELAPI
12876 BOOLEAN
12877 NTAPI
12878 IoIsWdmVersionAvailable(
12879 _When_(MajorVersion!=1&&MajorVersion!=6, _In_ __drv_reportError("MajorVersion must be 1 or 6"))
12880 UCHAR MajorVersion,
12881 _In_ _When_(MinorVersion!=0 && MinorVersion!=5 &&
12882 MinorVersion!=16 && MinorVersion!=32 &&
12883 MinorVersion!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30"))
12884 UCHAR MinorVersion);
12885
12886 _IRQL_requires_max_(PASSIVE_LEVEL)
12887 _Must_inspect_result_
12888 NTKERNELAPI
12889 NTSTATUS
12890 NTAPI
12891 IoOpenDeviceInterfaceRegistryKey(
12892 _In_ PUNICODE_STRING SymbolicLinkName,
12893 _In_ ACCESS_MASK DesiredAccess,
12894 _Out_ PHANDLE DeviceInterfaceKey);
12895
12896 _IRQL_requires_max_(PASSIVE_LEVEL)
12897 _Must_inspect_result_
12898 NTKERNELAPI
12899 NTSTATUS
12900 NTAPI
12901 IoOpenDeviceRegistryKey(
12902 _In_ PDEVICE_OBJECT DeviceObject,
12903 _In_ ULONG DevInstKeyType,
12904 _In_ ACCESS_MASK DesiredAccess,
12905 _Out_ PHANDLE DevInstRegKey);
12906
12907 _IRQL_requires_max_(PASSIVE_LEVEL)
12908 _Must_inspect_result_
12909 NTKERNELAPI
12910 NTSTATUS
12911 NTAPI
12912 IoRegisterDeviceInterface(
12913 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
12914 _In_ CONST GUID *InterfaceClassGuid,
12915 _In_opt_ PUNICODE_STRING ReferenceString,
12916 _Out_ _When_(return==0, _At_(SymbolicLinkName->Buffer, __drv_allocatesMem(Mem)))
12917 PUNICODE_STRING SymbolicLinkName);
12918
12919 _IRQL_requires_max_(PASSIVE_LEVEL)
12920 _Must_inspect_result_
12921 NTKERNELAPI
12922 NTSTATUS
12923 NTAPI
12924 IoRegisterPlugPlayNotification(
12925 _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
12926 _In_ ULONG EventCategoryFlags,
12927 _In_opt_ PVOID EventCategoryData,
12928 _In_ PDRIVER_OBJECT DriverObject,
12929 _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
12930 _Inout_opt_ __drv_aliasesMem PVOID Context,
12931 _Outptr_result_nullonfailure_
12932 _At_(*NotificationEntry, _When_(return==0, __drv_allocatesMem(Mem)))
12933 PVOID *NotificationEntry);
12934
12935 _IRQL_requires_max_(PASSIVE_LEVEL)
12936 NTKERNELAPI
12937 NTSTATUS
12938 NTAPI
12939 IoRegisterShutdownNotification(
12940 _In_ PDEVICE_OBJECT DeviceObject);
12941
12942 _Requires_lock_held_(_Global_cancel_spin_lock_)
12943 _Releases_lock_(_Global_cancel_spin_lock_)
12944 _IRQL_requires_max_(DISPATCH_LEVEL)
12945 _IRQL_requires_min_(DISPATCH_LEVEL)
12946 NTKERNELAPI
12947 VOID
12948 NTAPI
12949 IoReleaseCancelSpinLock(
12950 _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql);
12951
12952 _IRQL_requires_max_(PASSIVE_LEVEL)
12953 NTKERNELAPI
12954 VOID
12955 NTAPI
12956 IoReleaseRemoveLockAndWaitEx(
12957 _Inout_ PIO_REMOVE_LOCK RemoveLock,
12958 _In_opt_ PVOID Tag,
12959 _In_ ULONG RemlockSize);
12960
12961 NTKERNELAPI
12962 VOID
12963 NTAPI
12964 IoReleaseRemoveLockEx(
12965 _Inout_ PIO_REMOVE_LOCK RemoveLock,
12966 _In_opt_ PVOID Tag,
12967 _In_ ULONG RemlockSize);
12968
12969 _IRQL_requires_max_(PASSIVE_LEVEL)
12970 NTKERNELAPI
12971 VOID
12972 NTAPI
12973 IoRemoveShareAccess(
12974 _In_ PFILE_OBJECT FileObject,
12975 _Inout_ PSHARE_ACCESS ShareAccess);
12976
12977 _IRQL_requires_max_(PASSIVE_LEVEL)
12978 NTKERNELAPI
12979 NTSTATUS
12980 NTAPI
12981 IoReportTargetDeviceChange(
12982 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
12983 _In_ PVOID NotificationStructure);
12984
12985 _IRQL_requires_max_(DISPATCH_LEVEL)
12986 NTKERNELAPI
12987 NTSTATUS
12988 NTAPI
12989 IoReportTargetDeviceChangeAsynchronous(
12990 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
12991 _In_ PVOID NotificationStructure,
12992 _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback,
12993 _In_opt_ PVOID Context);
12994
12995 _IRQL_requires_max_(DISPATCH_LEVEL)
12996 NTKERNELAPI
12997 VOID
12998 NTAPI
12999 IoRequestDeviceEject(
13000 _In_ PDEVICE_OBJECT PhysicalDeviceObject);
13001
13002 _IRQL_requires_max_(DISPATCH_LEVEL)
13003 NTKERNELAPI
13004 VOID
13005 NTAPI
13006 IoReuseIrp(
13007 _Inout_ PIRP Irp,
13008 _In_ NTSTATUS Status);
13009
13010 _IRQL_requires_max_(PASSIVE_LEVEL)
13011 _Must_inspect_result_
13012 NTKERNELAPI
13013 NTSTATUS
13014 NTAPI
13015 IoSetDeviceInterfaceState(
13016 _In_ PUNICODE_STRING SymbolicLinkName,
13017 _In_ BOOLEAN Enable);
13018
13019 NTKERNELAPI
13020 VOID
13021 NTAPI
13022 IoSetShareAccess(
13023 _In_ ACCESS_MASK DesiredAccess,
13024 _In_ ULONG DesiredShareAccess,
13025 _Inout_ PFILE_OBJECT FileObject,
13026 _Out_ PSHARE_ACCESS ShareAccess);
13027
13028 _IRQL_requires_max_(DISPATCH_LEVEL)
13029 _IRQL_requires_min_(DISPATCH_LEVEL)
13030 NTKERNELAPI
13031 VOID
13032 NTAPI
13033 IoStartNextPacket(
13034 _In_ PDEVICE_OBJECT DeviceObject,
13035 _In_ BOOLEAN Cancelable);
13036
13037 _IRQL_requires_max_(DISPATCH_LEVEL)
13038 NTKERNELAPI
13039 VOID
13040 NTAPI
13041 IoStartNextPacketByKey(
13042 _In_ PDEVICE_OBJECT DeviceObject,
13043 _In_ BOOLEAN Cancelable,
13044 _In_ ULONG Key);
13045
13046 _IRQL_requires_max_(DISPATCH_LEVEL)
13047 NTKERNELAPI
13048 VOID
13049 NTAPI
13050 IoStartPacket(
13051 _In_ PDEVICE_OBJECT DeviceObject,
13052 _In_ PIRP Irp,
13053 _In_opt_ PULONG Key,
13054 _In_opt_ PDRIVER_CANCEL CancelFunction);
13055
13056 _IRQL_requires_max_(DISPATCH_LEVEL)
13057 NTKERNELAPI
13058 VOID
13059 NTAPI
13060 IoStartTimer(
13061 _In_ PDEVICE_OBJECT DeviceObject);
13062
13063 _IRQL_requires_max_(DISPATCH_LEVEL)
13064 NTKERNELAPI
13065 VOID
13066 NTAPI
13067 IoStopTimer(
13068 _In_ PDEVICE_OBJECT DeviceObject);
13069
13070 _IRQL_requires_max_(PASSIVE_LEVEL)
13071 __drv_freesMem(Pool)
13072 NTKERNELAPI
13073 NTSTATUS
13074 NTAPI
13075 IoUnregisterPlugPlayNotification(
13076 _In_ PVOID NotificationEntry);
13077
13078 _IRQL_requires_max_(PASSIVE_LEVEL)
13079 NTKERNELAPI
13080 VOID
13081 NTAPI
13082 IoUnregisterShutdownNotification(
13083 _In_ PDEVICE_OBJECT DeviceObject);
13084
13085 _IRQL_requires_max_(PASSIVE_LEVEL)
13086 NTKERNELAPI
13087 VOID
13088 NTAPI
13089 IoUpdateShareAccess(
13090 _In_ PFILE_OBJECT FileObject,
13091 _Inout_ PSHARE_ACCESS ShareAccess);
13092
13093 _IRQL_requires_max_(PASSIVE_LEVEL)
13094 NTKERNELAPI
13095 NTSTATUS
13096 NTAPI
13097 IoWMIAllocateInstanceIds(
13098 _In_ GUID *Guid,
13099 _In_ ULONG InstanceCount,
13100 _Out_ ULONG *FirstInstanceId);
13101
13102 NTKERNELAPI
13103 NTSTATUS
13104 NTAPI
13105 IoWMIQuerySingleInstanceMultiple(
13106 _In_reads_(ObjectCount) PVOID *DataBlockObjectList,
13107 _In_reads_(ObjectCount) PUNICODE_STRING InstanceNames,
13108 _In_ ULONG ObjectCount,
13109 _Inout_ ULONG *InOutBufferSize,
13110 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13111
13112 _IRQL_requires_max_(PASSIVE_LEVEL)
13113 NTKERNELAPI
13114 NTSTATUS
13115 NTAPI
13116 IoWMIRegistrationControl(
13117 _In_ PDEVICE_OBJECT DeviceObject,
13118 _In_ ULONG Action);
13119
13120 NTKERNELAPI
13121 NTSTATUS
13122 NTAPI
13123 IoWMISuggestInstanceName(
13124 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
13125 _In_opt_ PUNICODE_STRING SymbolicLinkName,
13126 _In_ BOOLEAN CombineNames,
13127 _Out_ PUNICODE_STRING SuggestedInstanceName);
13128
13129 _Must_inspect_result_
13130 _IRQL_requires_max_(DISPATCH_LEVEL)
13131 _Ret_range_(<=, 0)
13132 NTKERNELAPI
13133 NTSTATUS
13134 NTAPI
13135 IoWMIWriteEvent(
13136 _Inout_ _When_(return==0, __drv_aliasesMem) PVOID WnodeEventItem);
13137
13138 _IRQL_requires_max_(DISPATCH_LEVEL)
13139 NTKERNELAPI
13140 VOID
13141 NTAPI
13142 IoWriteErrorLogEntry(
13143 _In_ PVOID ElEntry);
13144
13145 NTKERNELAPI
13146 PIRP
13147 NTAPI
13148 IoGetTopLevelIrp(VOID);
13149
13150 _IRQL_requires_max_(PASSIVE_LEVEL)
13151 NTKERNELAPI
13152 NTSTATUS
13153 NTAPI
13154 IoRegisterLastChanceShutdownNotification(
13155 _In_ PDEVICE_OBJECT DeviceObject);
13156
13157 NTKERNELAPI
13158 VOID
13159 NTAPI
13160 IoSetTopLevelIrp(
13161 _In_opt_ PIRP Irp);
13162
13163
13164 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13165
13166
13167 #if (NTDDI_VERSION >= NTDDI_WINXP)
13168
13169 NTKERNELAPI
13170 NTSTATUS
13171 NTAPI
13172 IoCsqInitialize(
13173 _Out_ PIO_CSQ Csq,
13174 _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp,
13175 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
13176 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
13177 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
13178 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
13179 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
13180
13181 NTKERNELAPI
13182 VOID
13183 NTAPI
13184 IoCsqInsertIrp(
13185 _Inout_ PIO_CSQ Csq,
13186 _Inout_ PIRP Irp,
13187 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context);
13188
13189 NTKERNELAPI
13190 PIRP
13191 NTAPI
13192 IoCsqRemoveIrp(
13193 _Inout_ PIO_CSQ Csq,
13194 _Inout_ PIO_CSQ_IRP_CONTEXT Context);
13195
13196 NTKERNELAPI
13197 PIRP
13198 NTAPI
13199 IoCsqRemoveNextIrp(
13200 _Inout_ PIO_CSQ Csq,
13201 _In_opt_ PVOID PeekContext);
13202
13203 NTKERNELAPI
13204 BOOLEAN
13205 NTAPI
13206 IoForwardIrpSynchronously(
13207 _In_ PDEVICE_OBJECT DeviceObject,
13208 _In_ PIRP Irp);
13209
13210 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
13211
13212 NTKERNELAPI
13213 VOID
13214 NTAPI
13215 IoFreeErrorLogEntry(
13216 _In_ PVOID ElEntry);
13217
13218 _IRQL_requires_max_(DISPATCH_LEVEL)
13219 _Must_inspect_result_
13220 NTKERNELAPI
13221 NTSTATUS
13222 NTAPI
13223 IoSetCompletionRoutineEx(
13224 _In_ PDEVICE_OBJECT DeviceObject,
13225 _In_ PIRP Irp,
13226 _In_ PIO_COMPLETION_ROUTINE CompletionRoutine,
13227 _In_opt_ PVOID Context,
13228 _In_ BOOLEAN InvokeOnSuccess,
13229 _In_ BOOLEAN InvokeOnError,
13230 _In_ BOOLEAN InvokeOnCancel);
13231
13232 VOID
13233 NTAPI
13234 IoSetStartIoAttributes(
13235 _In_ PDEVICE_OBJECT DeviceObject,
13236 _In_ BOOLEAN DeferredStartIo,
13237 _In_ BOOLEAN NonCancelable);
13238
13239 NTKERNELAPI
13240 NTSTATUS
13241 NTAPI
13242 IoWMIDeviceObjectToInstanceName(
13243 _In_ PVOID DataBlockObject,
13244 _In_ PDEVICE_OBJECT DeviceObject,
13245 _Out_ PUNICODE_STRING InstanceName);
13246
13247 NTKERNELAPI
13248 NTSTATUS
13249 NTAPI
13250 IoWMIExecuteMethod(
13251 _In_ PVOID DataBlockObject,
13252 _In_ PUNICODE_STRING InstanceName,
13253 _In_ ULONG MethodId,
13254 _In_ ULONG InBufferSize,
13255 _Inout_ PULONG OutBufferSize,
13256 _Inout_updates_bytes_to_opt_(*OutBufferSize, InBufferSize) PUCHAR InOutBuffer);
13257
13258 NTKERNELAPI
13259 NTSTATUS
13260 NTAPI
13261 IoWMIHandleToInstanceName(
13262 _In_ PVOID DataBlockObject,
13263 _In_ HANDLE FileHandle,
13264 _Out_ PUNICODE_STRING InstanceName);
13265
13266 NTKERNELAPI
13267 NTSTATUS
13268 NTAPI
13269 IoWMIOpenBlock(
13270 _In_ GUID *DataBlockGuid,
13271 _In_ ULONG DesiredAccess,
13272 _Out_ PVOID *DataBlockObject);
13273
13274 NTKERNELAPI
13275 NTSTATUS
13276 NTAPI
13277 IoWMIQueryAllData(
13278 _In_ PVOID DataBlockObject,
13279 _Inout_ ULONG *InOutBufferSize,
13280 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13281
13282 NTKERNELAPI
13283 NTSTATUS
13284 NTAPI
13285 IoWMIQueryAllDataMultiple(
13286 _In_reads_(ObjectCount) PVOID *DataBlockObjectList,
13287 _In_ ULONG ObjectCount,
13288 _Inout_ ULONG *InOutBufferSize,
13289 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13290
13291 NTKERNELAPI
13292 NTSTATUS
13293 NTAPI
13294 IoWMIQuerySingleInstance(
13295 _In_ PVOID DataBlockObject,
13296 _In_ PUNICODE_STRING InstanceName,
13297 _Inout_ ULONG *InOutBufferSize,
13298 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13299
13300 NTKERNELAPI
13301 NTSTATUS
13302 NTAPI
13303 IoWMISetNotificationCallback(
13304 _Inout_ PVOID Object,
13305 _In_ WMI_NOTIFICATION_CALLBACK Callback,
13306 _In_opt_ PVOID Context);
13307
13308 NTKERNELAPI
13309 NTSTATUS
13310 NTAPI
13311 IoWMISetSingleInstance(
13312 _In_ PVOID DataBlockObject,
13313 _In_ PUNICODE_STRING InstanceName,
13314 _In_ ULONG Version,
13315 _In_ ULONG ValueBufferSize,
13316 _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer);
13317
13318 NTKERNELAPI
13319 NTSTATUS
13320 NTAPI
13321 IoWMISetSingleItem(
13322 _In_ PVOID DataBlockObject,
13323 _In_ PUNICODE_STRING InstanceName,
13324 _In_ ULONG DataItemId,
13325 _In_ ULONG Version,
13326 _In_ ULONG ValueBufferSize,
13327 _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer);
13328
13329 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13330
13331 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
13332 NTKERNELAPI
13333 NTSTATUS
13334 NTAPI
13335 IoValidateDeviceIoControlAccess(
13336 _In_ PIRP Irp,
13337 _In_ ULONG RequiredAccess);
13338 #endif
13339
13340 #if (NTDDI_VERSION >= NTDDI_WS03)
13341 NTKERNELAPI
13342 NTSTATUS
13343 NTAPI
13344 IoCsqInitializeEx(
13345 _Out_ PIO_CSQ Csq,
13346 _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
13347 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
13348 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
13349 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
13350 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
13351 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
13352
13353 NTKERNELAPI
13354 NTSTATUS
13355 NTAPI
13356 IoCsqInsertIrpEx(
13357 _Inout_ PIO_CSQ Csq,
13358 _Inout_ PIRP Irp,
13359 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context,
13360 _In_opt_ PVOID InsertContext);
13361 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
13362
13363
13364 #if (NTDDI_VERSION >= NTDDI_VISTA)
13365 NTKERNELAPI
13366 NTSTATUS
13367 NTAPI
13368 IoGetBootDiskInformationLite(
13369 _Outptr_ PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
13370
13371 NTKERNELAPI
13372 NTSTATUS
13373 NTAPI
13374 IoCheckShareAccessEx(
13375 _In_ ACCESS_MASK DesiredAccess,
13376 _In_ ULONG DesiredShareAccess,
13377 _Inout_ PFILE_OBJECT FileObject,
13378 _Inout_ PSHARE_ACCESS ShareAccess,
13379 _In_ BOOLEAN Update,
13380 _In_ PBOOLEAN WritePermission);
13381
13382 NTKERNELAPI
13383 NTSTATUS
13384 NTAPI
13385 IoConnectInterruptEx(
13386 _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
13387
13388 NTKERNELAPI
13389 VOID
13390 NTAPI
13391 IoDisconnectInterruptEx(
13392 _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
13393
13394 LOGICAL
13395 NTAPI
13396 IoWithinStackLimits(
13397 _In_ ULONG_PTR RegionStart,
13398 _In_ SIZE_T RegionSize);
13399
13400 NTKERNELAPI
13401 VOID
13402 NTAPI
13403 IoSetShareAccessEx(
13404 _In_ ACCESS_MASK DesiredAccess,
13405 _In_ ULONG DesiredShareAccess,
13406 _Inout_ PFILE_OBJECT FileObject,
13407 _Out_ PSHARE_ACCESS ShareAccess,
13408 _In_ PBOOLEAN WritePermission);
13409
13410 ULONG
13411 NTAPI
13412 IoSizeofWorkItem(VOID);
13413
13414 VOID
13415 NTAPI
13416 IoInitializeWorkItem(
13417 _In_ PVOID IoObject,
13418 _Out_ PIO_WORKITEM IoWorkItem);
13419
13420 VOID
13421 NTAPI
13422 IoUninitializeWorkItem(
13423 _Inout_ PIO_WORKITEM IoWorkItem);
13424
13425 _IRQL_requires_max_(DISPATCH_LEVEL)
13426 VOID
13427 NTAPI
13428 IoQueueWorkItemEx(
13429 _Inout_ PIO_WORKITEM IoWorkItem,
13430 _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
13431 _In_ WORK_QUEUE_TYPE QueueType,
13432 _In_opt_ __drv_aliasesMem PVOID Context);
13433
13434 IO_PRIORITY_HINT
13435 NTAPI
13436 IoGetIoPriorityHint(
13437 _In_ PIRP Irp);
13438
13439 NTSTATUS
13440 NTAPI
13441 IoSetIoPriorityHint(
13442 _In_ PIRP Irp,
13443 _In_ IO_PRIORITY_HINT PriorityHint);
13444
13445 NTSTATUS
13446 NTAPI
13447 IoAllocateSfioStreamIdentifier(
13448 _In_ PFILE_OBJECT FileObject,
13449 _In_ ULONG Length,
13450 _In_ PVOID Signature,
13451 _Out_ PVOID *StreamIdentifier);
13452
13453 PVOID
13454 NTAPI
13455 IoGetSfioStreamIdentifier(
13456 _In_ PFILE_OBJECT FileObject,
13457 _In_ PVOID Signature);
13458
13459 NTSTATUS
13460 NTAPI
13461 IoFreeSfioStreamIdentifier(
13462 _In_ PFILE_OBJECT FileObject,
13463 _In_ PVOID Signature);
13464
13465 _IRQL_requires_max_(DISPATCH_LEVEL)
13466 _Must_inspect_result_
13467 NTKERNELAPI
13468 NTSTATUS
13469 NTAPI
13470 IoRequestDeviceEjectEx(
13471 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
13472 _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback,
13473 _In_opt_ PVOID Context,
13474 _In_opt_ PDRIVER_OBJECT DriverObject);
13475
13476 _IRQL_requires_max_(PASSIVE_LEVEL)
13477 _Must_inspect_result_
13478 NTKERNELAPI
13479 NTSTATUS
13480 NTAPI
13481 IoSetDevicePropertyData(
13482 _In_ PDEVICE_OBJECT Pdo,
13483 _In_ CONST DEVPROPKEY *PropertyKey,
13484 _In_ LCID Lcid,
13485 _In_ ULONG Flags,
13486 _In_ DEVPROPTYPE Type,
13487 _In_ ULONG Size,
13488 _In_opt_ PVOID Data);
13489
13490 _IRQL_requires_max_(PASSIVE_LEVEL)
13491 _Must_inspect_result_
13492 NTKERNELAPI
13493 NTSTATUS
13494 NTAPI
13495 IoGetDevicePropertyData(
13496 _In_ PDEVICE_OBJECT Pdo,
13497 _In_ CONST DEVPROPKEY *PropertyKey,
13498 _In_ LCID Lcid,
13499 _Reserved_ ULONG Flags,
13500 _In_ ULONG Size,
13501 _Out_ PVOID Data,
13502 _Out_ PULONG RequiredSize,
13503 _Out_ PDEVPROPTYPE Type);
13504
13505 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13506
13507 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
13508
13509 #if (NTDDI_VERSION >= NTDDI_WS08)
13510 _IRQL_requires_max_(PASSIVE_LEVEL)
13511 _Must_inspect_result_
13512 NTKERNELAPI
13513 NTSTATUS
13514 NTAPI
13515 IoReplacePartitionUnit(
13516 _In_ PDEVICE_OBJECT TargetPdo,
13517 _In_ PDEVICE_OBJECT SparePdo,
13518 _In_ ULONG Flags);
13519 #endif
13520
13521 #if (NTDDI_VERSION >= NTDDI_WIN7)
13522
13523 NTKERNELAPI
13524 NTSTATUS
13525 NTAPI
13526 IoGetAffinityInterrupt(
13527 _In_ PKINTERRUPT InterruptObject,
13528 _Out_ PGROUP_AFFINITY GroupAffinity);
13529
13530 NTSTATUS
13531 NTAPI
13532 IoGetContainerInformation(
13533 _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass,
13534 _In_opt_ PVOID ContainerObject,
13535 _Inout_updates_bytes_opt_(BufferLength) PVOID Buffer,
13536 _In_ ULONG BufferLength);
13537
13538 NTSTATUS
13539 NTAPI
13540 IoRegisterContainerNotification(
13541 _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
13542 _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
13543 _In_reads_bytes_opt_(NotificationInformationLength) PVOID NotificationInformation,
13544 _In_ ULONG NotificationInformationLength,
13545 _Out_ PVOID CallbackRegistration);
13546
13547 VOID
13548 NTAPI
13549 IoUnregisterContainerNotification(
13550 _In_ PVOID CallbackRegistration);
13551
13552 _IRQL_requires_max_(PASSIVE_LEVEL)
13553 __drv_freesMem(Pool)
13554 NTKERNELAPI
13555 NTSTATUS
13556 NTAPI
13557 IoUnregisterPlugPlayNotificationEx(
13558 _In_ PVOID NotificationEntry);
13559
13560 _IRQL_requires_max_(PASSIVE_LEVEL)
13561 _Must_inspect_result_
13562 NTKERNELAPI
13563 NTSTATUS
13564 NTAPI
13565 IoGetDeviceNumaNode(
13566 _In_ PDEVICE_OBJECT Pdo,
13567 _Out_ PUSHORT NodeNumber);
13568
13569 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13570
13571 #if defined(_WIN64)
13572 NTKERNELAPI
13573 ULONG
13574 NTAPI
13575 IoWMIDeviceObjectToProviderId(
13576 _In_ PDEVICE_OBJECT DeviceObject);
13577 #else
13578 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
13579 #endif
13580
13581 /*
13582 * USHORT
13583 * IoSizeOfIrp(
13584 * IN CCHAR StackSize)
13585 */
13586 #define IoSizeOfIrp(_StackSize) \
13587 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
13588
13589 FORCEINLINE
13590 VOID
13591 IoSkipCurrentIrpStackLocation(
13592 _Inout_ PIRP Irp)
13593 {
13594 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
13595 Irp->CurrentLocation++;
13596 #ifdef NONAMELESSUNION
13597 Irp->Tail.Overlay.s.u.CurrentStackLocation++;
13598 #else
13599 Irp->Tail.Overlay.CurrentStackLocation++;
13600 #endif
13601 }
13602
13603 FORCEINLINE
13604 VOID
13605 IoSetNextIrpStackLocation(
13606 _Inout_ PIRP Irp)
13607 {
13608 ASSERT(Irp->CurrentLocation > 0);
13609 Irp->CurrentLocation--;
13610 #ifdef NONAMELESSUNION
13611 Irp->Tail.Overlay.s.u.CurrentStackLocation--;
13612 #else
13613 Irp->Tail.Overlay.CurrentStackLocation--;
13614 #endif
13615 }
13616
13617 __drv_aliasesMem
13618 FORCEINLINE
13619 PIO_STACK_LOCATION
13620 IoGetNextIrpStackLocation(
13621 _In_ PIRP Irp)
13622 {
13623 ASSERT(Irp->CurrentLocation > 0);
13624 #ifdef NONAMELESSUNION
13625 return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
13626 #else
13627 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
13628 #endif
13629 }
13630
13631 _IRQL_requires_max_(DISPATCH_LEVEL)
13632 FORCEINLINE
13633 VOID
13634 IoSetCompletionRoutine(
13635 _In_ PIRP Irp,
13636 _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine,
13637 _In_opt_ __drv_aliasesMem PVOID Context,
13638 _In_ BOOLEAN InvokeOnSuccess,
13639 _In_ BOOLEAN InvokeOnError,
13640 _In_ BOOLEAN InvokeOnCancel)
13641 {
13642 PIO_STACK_LOCATION irpSp;
13643 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
13644 irpSp = IoGetNextIrpStackLocation(Irp);
13645 irpSp->CompletionRoutine = CompletionRoutine;
13646 irpSp->Context = Context;
13647 irpSp->Control = 0;
13648
13649 if (InvokeOnSuccess) {
13650 irpSp->Control = SL_INVOKE_ON_SUCCESS;
13651 }
13652
13653 if (InvokeOnError) {
13654 irpSp->Control |= SL_INVOKE_ON_ERROR;
13655 }
13656
13657 if (InvokeOnCancel) {
13658 irpSp->Control |= SL_INVOKE_ON_CANCEL;
13659 }
13660 }
13661
13662 _IRQL_requires_max_(DISPATCH_LEVEL)
13663 _Ret_maybenull_
13664 FORCEINLINE
13665 PDRIVER_CANCEL
13666 IoSetCancelRoutine(
13667 _Inout_ PIRP Irp,
13668 _In_opt_ PDRIVER_CANCEL CancelRoutine)
13669 {
13670 return (PDRIVER_CANCEL)(ULONG_PTR) InterlockedExchangePointer((PVOID *)&(Irp)->CancelRoutine, (PVOID)(ULONG_PTR)(CancelRoutine));
13671 }
13672
13673 FORCEINLINE
13674 VOID
13675 IoRequestDpc(
13676 _Inout_ PDEVICE_OBJECT DeviceObject,
13677 _In_opt_ PIRP Irp,
13678 _In_opt_ __drv_aliasesMem PVOID Context)
13679 {
13680 KeInsertQueueDpc(&DeviceObject->Dpc, Irp, Context);
13681 }
13682
13683 /*
13684 * VOID
13685 * IoReleaseRemoveLock(
13686 * IN PIO_REMOVE_LOCK RemoveLock,
13687 * IN PVOID Tag)
13688 */
13689 #define IoReleaseRemoveLock(_RemoveLock, \
13690 _Tag) \
13691 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13692
13693 /*
13694 * VOID
13695 * IoReleaseRemoveLockAndWait(
13696 * IN PIO_REMOVE_LOCK RemoveLock,
13697 * IN PVOID Tag)
13698 */
13699 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
13700 _Tag) \
13701 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13702
13703 #if defined(_WIN64)
13704 _IRQL_requires_max_(DISPATCH_LEVEL)
13705 NTKERNELAPI
13706 BOOLEAN
13707 IoIs32bitProcess(
13708 _In_opt_ PIRP Irp);
13709 #endif
13710
13711 #define PLUGPLAY_REGKEY_DEVICE 1
13712 #define PLUGPLAY_REGKEY_DRIVER 2
13713 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
13714
13715 __drv_aliasesMem
13716 FORCEINLINE
13717 PIO_STACK_LOCATION
13718 IoGetCurrentIrpStackLocation(
13719 _In_ PIRP Irp)
13720 {
13721 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
13722 #ifdef NONAMELESSUNION
13723 return Irp->Tail.Overlay.s.u.CurrentStackLocation;
13724 #else
13725 return Irp->Tail.Overlay.CurrentStackLocation;
13726 #endif
13727 }
13728
13729 FORCEINLINE
13730 VOID
13731 IoMarkIrpPending(
13732 _Inout_ PIRP Irp)
13733 {
13734 IoGetCurrentIrpStackLocation((Irp))->Control |= SL_PENDING_RETURNED;
13735 }
13736
13737 /*
13738 * BOOLEAN
13739 * IoIsErrorUserInduced(
13740 * IN NTSTATUS Status);
13741 */
13742 #define IoIsErrorUserInduced(Status) \
13743 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
13744 ((Status) == STATUS_IO_TIMEOUT) || \
13745 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
13746 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
13747 ((Status) == STATUS_VERIFY_REQUIRED) || \
13748 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
13749 ((Status) == STATUS_WRONG_VOLUME)))
13750
13751 /* VOID
13752 * IoInitializeRemoveLock(
13753 * IN PIO_REMOVE_LOCK Lock,
13754 * IN ULONG AllocateTag,
13755 * IN ULONG MaxLockedMinutes,
13756 * IN ULONG HighWatermark)
13757 */
13758 #define IoInitializeRemoveLock( \
13759 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
13760 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
13761 HighWatermark, sizeof(IO_REMOVE_LOCK))
13762
13763 FORCEINLINE
13764 VOID
13765 IoInitializeDpcRequest(
13766 _In_ PDEVICE_OBJECT DeviceObject,
13767 _In_ PIO_DPC_ROUTINE DpcRoutine)
13768 {
13769 #ifdef _MSC_VER
13770 #pragma warning(push)
13771 #pragma warning(disable:28024)
13772 #endif
13773 KeInitializeDpc(&DeviceObject->Dpc,
13774 (PKDEFERRED_ROUTINE) DpcRoutine,
13775 DeviceObject);
13776 #ifdef _MSC_VER
13777 #pragma warning(pop)
13778 #endif
13779 }
13780
13781 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
13782
13783 /*
13784 * ULONG
13785 * IoGetFunctionCodeFromCtlCode(
13786 * IN ULONG ControlCode)
13787 */
13788 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
13789 (((_ControlCode) >> 2) & 0x00000FFF)
13790
13791 FORCEINLINE
13792 VOID
13793 IoCopyCurrentIrpStackLocationToNext(
13794 _Inout_ PIRP Irp)
13795 {
13796 PIO_STACK_LOCATION irpSp;
13797 PIO_STACK_LOCATION nextIrpSp;
13798 irpSp = IoGetCurrentIrpStackLocation(Irp);
13799 nextIrpSp = IoGetNextIrpStackLocation(Irp);
13800 RtlCopyMemory(nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
13801 nextIrpSp->Control = 0;
13802 }
13803
13804 _IRQL_requires_max_(APC_LEVEL)
13805 NTKERNELAPI
13806 VOID
13807 NTAPI
13808 IoGetStackLimits(
13809 _Out_ PULONG_PTR LowLimit,
13810 _Out_ PULONG_PTR HighLimit);
13811
13812 _IRQL_requires_max_(APC_LEVEL)
13813 FORCEINLINE
13814 ULONG_PTR
13815 IoGetRemainingStackSize(VOID)
13816 {
13817 ULONG_PTR End, Begin;
13818 ULONG_PTR Result;
13819
13820 IoGetStackLimits(&Begin, &End);
13821 Result = (ULONG_PTR)(&End) - Begin;
13822 return Result;
13823 }
13824
13825 #if (NTDDI_VERSION >= NTDDI_WS03)
13826 FORCEINLINE
13827 VOID
13828 IoInitializeThreadedDpcRequest(
13829 _In_ PDEVICE_OBJECT DeviceObject,
13830 _In_ PIO_DPC_ROUTINE DpcRoutine)
13831 {
13832 #ifdef _MSC_VER
13833 #pragma warning(push)
13834 #pragma warning(disable:28024)
13835 #pragma warning(disable:28128)
13836 #endif
13837 KeInitializeThreadedDpc(&DeviceObject->Dpc,
13838 (PKDEFERRED_ROUTINE) DpcRoutine,
13839 DeviceObject );
13840 #ifdef _MSC_VER
13841 #pragma warning(pop)
13842 #endif
13843 }
13844 #endif
13845
13846 /******************************************************************************
13847 * Power Management Support Functions *
13848 ******************************************************************************/
13849
13850 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
13851
13852 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13853
13854 _IRQL_requires_max_(DISPATCH_LEVEL)
13855 NTKERNELAPI
13856 NTSTATUS
13857 NTAPI
13858 PoCallDriver(
13859 _In_ struct _DEVICE_OBJECT *DeviceObject,
13860 _Inout_ __drv_aliasesMem struct _IRP *Irp);
13861
13862 _IRQL_requires_max_(APC_LEVEL)
13863 NTKERNELAPI
13864 PULONG
13865 NTAPI
13866 PoRegisterDeviceForIdleDetection(
13867 _In_ struct _DEVICE_OBJECT *DeviceObject,
13868 _In_ ULONG ConservationIdleTime,
13869 _In_ ULONG PerformanceIdleTime,
13870 _In_ DEVICE_POWER_STATE State);
13871
13872 _IRQL_requires_max_(APC_LEVEL)
13873 NTKERNELAPI
13874 PVOID
13875 NTAPI
13876 PoRegisterSystemState(
13877 _Inout_opt_ PVOID StateHandle,
13878 _In_ EXECUTION_STATE Flags);
13879
13880 _IRQL_requires_max_(DISPATCH_LEVEL)
13881 NTKERNELAPI
13882 NTSTATUS
13883 NTAPI
13884 PoRequestPowerIrp(
13885 _In_ struct _DEVICE_OBJECT *DeviceObject,
13886 _In_ UCHAR MinorFunction,
13887 _In_ POWER_STATE PowerState,
13888 _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction,
13889 _In_opt_ __drv_aliasesMem PVOID Context,
13890 _Outptr_opt_ struct _IRP **Irp);
13891
13892 _IRQL_requires_max_(DISPATCH_LEVEL)
13893 NTKERNELAPI
13894 POWER_STATE
13895 NTAPI
13896 PoSetPowerState(
13897 _In_ struct _DEVICE_OBJECT *DeviceObject,
13898 _In_ POWER_STATE_TYPE Type,
13899 _In_ POWER_STATE State);
13900
13901 _IRQL_requires_max_(DISPATCH_LEVEL)
13902 NTKERNELAPI
13903 VOID
13904 NTAPI
13905 PoSetSystemState(
13906 _In_ EXECUTION_STATE Flags);
13907
13908 _IRQL_requires_max_(DISPATCH_LEVEL)
13909 NTKERNELAPI
13910 VOID
13911 NTAPI
13912 PoStartNextPowerIrp(
13913 _Inout_ struct _IRP *Irp);
13914
13915 _IRQL_requires_max_(APC_LEVEL)
13916 NTKERNELAPI
13917 VOID
13918 NTAPI
13919 PoUnregisterSystemState(
13920 _Inout_ PVOID StateHandle);
13921
13922 NTKERNELAPI
13923 NTSTATUS
13924 NTAPI
13925 PoRequestShutdownEvent(
13926 OUT PVOID *Event);
13927
13928 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13929
13930 #if (NTDDI_VERSION >= NTDDI_VISTA)
13931
13932 _IRQL_requires_max_(DISPATCH_LEVEL)
13933 NTKERNELAPI
13934 VOID
13935 NTAPI
13936 PoSetSystemWake(
13937 _Inout_ struct _IRP *Irp);
13938
13939 _IRQL_requires_max_(DISPATCH_LEVEL)
13940 NTKERNELAPI
13941 BOOLEAN
13942 NTAPI
13943 PoGetSystemWake(
13944 _In_ struct _IRP *Irp);
13945
13946 _IRQL_requires_max_(APC_LEVEL)
13947 NTKERNELAPI
13948 NTSTATUS
13949 NTAPI
13950 PoRegisterPowerSettingCallback(
13951 _In_opt_ PDEVICE_OBJECT DeviceObject,
13952 _In_ LPCGUID SettingGuid,
13953 _In_ PPOWER_SETTING_CALLBACK Callback,
13954 _In_opt_ PVOID Context,
13955 _Outptr_opt_ PVOID *Handle);
13956
13957 _IRQL_requires_max_(APC_LEVEL)
13958 NTKERNELAPI
13959 NTSTATUS
13960 NTAPI
13961 PoUnregisterPowerSettingCallback(
13962 _Inout_ PVOID Handle);
13963
13964 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13965
13966 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
13967 NTKERNELAPI
13968 VOID
13969 NTAPI
13970 PoSetDeviceBusyEx(
13971 _Inout_ PULONG IdlePointer);
13972 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
13973
13974 #if (NTDDI_VERSION >= NTDDI_WIN7)
13975
13976 NTKERNELAPI
13977 VOID
13978 NTAPI
13979 PoStartDeviceBusy(
13980 _Inout_ PULONG IdlePointer);
13981
13982 NTKERNELAPI
13983 VOID
13984 NTAPI
13985 PoEndDeviceBusy(
13986 _Inout_ PULONG IdlePointer);
13987
13988 _IRQL_requires_max_(DISPATCH_LEVEL)
13989 NTKERNELAPI
13990 BOOLEAN
13991 NTAPI
13992 PoQueryWatchdogTime(
13993 _In_ PDEVICE_OBJECT Pdo,
13994 _Out_ PULONG SecondsRemaining);
13995
13996 _IRQL_requires_max_(APC_LEVEL)
13997 NTKERNELAPI
13998 VOID
13999 NTAPI
14000 PoDeletePowerRequest(
14001 _Inout_ PVOID PowerRequest);
14002
14003 _IRQL_requires_max_(DISPATCH_LEVEL)
14004 NTKERNELAPI
14005 NTSTATUS
14006 NTAPI
14007 PoSetPowerRequest(
14008 _Inout_ PVOID PowerRequest,
14009 _In_ POWER_REQUEST_TYPE Type);
14010
14011 _IRQL_requires_max_(DISPATCH_LEVEL)
14012 NTKERNELAPI
14013 NTSTATUS
14014 NTAPI
14015 PoClearPowerRequest(
14016 _Inout_ PVOID PowerRequest,
14017 _In_ POWER_REQUEST_TYPE Type);
14018
14019 _IRQL_requires_max_(APC_LEVEL)
14020 NTKERNELAPI
14021 NTSTATUS
14022 NTAPI
14023 PoCreatePowerRequest(
14024 _Outptr_ PVOID *PowerRequest,
14025 _In_ PDEVICE_OBJECT DeviceObject,
14026 _In_opt_ PCOUNTED_REASON_CONTEXT Context);
14027
14028 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14029
14030 /******************************************************************************
14031 * Executive Functions *
14032 ******************************************************************************/
14033
14034 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
14035 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
14036 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
14037
14038 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
14039 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
14040 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
14041 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
14042
14043 #define ExInitializeSListHead InitializeSListHead
14044
14045 #if defined(_NTHAL_) && defined(_X86_)
14046
14047 NTKERNELAPI
14048 VOID
14049 FASTCALL
14050 ExiAcquireFastMutex(
14051 IN OUT PFAST_MUTEX FastMutex);
14052
14053 NTKERNELAPI
14054 VOID
14055 FASTCALL
14056 ExiReleaseFastMutex(
14057 IN OUT PFAST_MUTEX FastMutex);
14058
14059 NTKERNELAPI
14060 BOOLEAN
14061 FASTCALL
14062 ExiTryToAcquireFastMutex(
14063 IN OUT PFAST_MUTEX FastMutex);
14064
14065 #define ExAcquireFastMutex ExiAcquireFastMutex
14066 #define ExReleaseFastMutex ExiReleaseFastMutex
14067 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
14068
14069 #else
14070
14071 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14072
14073 _IRQL_raises_(APC_LEVEL)
14074 _IRQL_saves_global_(OldIrql, FastMutex)
14075 NTKERNELAPI
14076 VOID
14077 FASTCALL
14078 ExAcquireFastMutex(
14079 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14080 PFAST_MUTEX FastMutex);
14081
14082 _IRQL_requires_(APC_LEVEL)
14083 _IRQL_restores_global_(OldIrql, FastMutex)
14084 NTKERNELAPI
14085 VOID
14086 FASTCALL
14087 ExReleaseFastMutex(
14088 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14089 PFAST_MUTEX FastMutex);
14090
14091 _Must_inspect_result_
14092 _Success_(return!=FALSE)
14093 _IRQL_raises_(APC_LEVEL)
14094 _IRQL_saves_global_(OldIrql, FastMutex)
14095 NTKERNELAPI
14096 BOOLEAN
14097 FASTCALL
14098 ExTryToAcquireFastMutex(
14099 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14100 PFAST_MUTEX FastMutex);
14101
14102 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14103
14104 #endif /* defined(_NTHAL_) && defined(_X86_) */
14105
14106 #if defined(_X86_)
14107 #define ExInterlockedAddUlong ExfInterlockedAddUlong
14108 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
14109 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
14110 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
14111 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
14112 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
14113 #endif /* defined(_X86_) */
14114
14115 #if defined(_WIN64)
14116
14117 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
14118 defined(_NTHAL_) || defined(_NTOSP_)
14119 NTKERNELAPI
14120 USHORT
14121 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead);
14122 #else
14123 FORCEINLINE
14124 USHORT
14125 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead)
14126 {
14127 return (USHORT)(ListHead->Alignment & 0xffff);
14128 }
14129 #endif
14130
14131 NTKERNELAPI
14132 PSLIST_ENTRY
14133 ExpInterlockedFlushSList(
14134 PSLIST_HEADER ListHead);
14135
14136 NTKERNELAPI
14137 PSLIST_ENTRY
14138 ExpInterlockedPopEntrySList(
14139 _Inout_ PSLIST_HEADER ListHead);
14140
14141 NTKERNELAPI
14142 PSLIST_ENTRY
14143 ExpInterlockedPushEntrySList(
14144 _Inout_ PSLIST_HEADER ListHead,
14145 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry);
14146
14147 #define ExInterlockedFlushSList(Head) \
14148 ExpInterlockedFlushSList(Head)
14149 #define ExInterlockedPopEntrySList(Head, Lock) \
14150 ExpInterlockedPopEntrySList(Head)
14151 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
14152 ExpInterlockedPushEntrySList(Head, Entry)
14153
14154 #else /* !defined(_WIN64) */
14155
14156 #ifdef NONAMELESSUNION
14157 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
14158 #else
14159 #define ExQueryDepthSList(listhead) (listhead)->Depth
14160 #endif
14161
14162 NTKERNELAPI
14163 PSINGLE_LIST_ENTRY
14164 FASTCALL
14165 ExInterlockedFlushSList(
14166 _Inout_ PSLIST_HEADER ListHead);
14167
14168 #endif /* !defined(_WIN64) */
14169
14170 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14171
14172 NTKERNELAPI
14173 PSINGLE_LIST_ENTRY
14174 FASTCALL
14175 ExInterlockedPopEntrySList(
14176 _Inout_ PSLIST_HEADER ListHead,
14177 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14178
14179 NTKERNELAPI
14180 PSINGLE_LIST_ENTRY
14181 FASTCALL
14182 ExInterlockedPushEntrySList(
14183 _Inout_ PSLIST_HEADER ListHead,
14184 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry,
14185 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14186
14187 _IRQL_requires_max_(APC_LEVEL)
14188 NTKERNELAPI
14189 PVOID
14190 NTAPI
14191 ExAllocateFromPagedLookasideList(
14192 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside);
14193
14194 _IRQL_requires_max_(APC_LEVEL)
14195 NTKERNELAPI
14196 VOID
14197 NTAPI
14198 ExFreeToPagedLookasideList(
14199 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside,
14200 _In_ PVOID Entry);
14201
14202 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
14203
14204 #if !defined(_WIN64)
14205 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
14206 InterlockedPopEntrySList(_ListHead)
14207 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
14208 InterlockedPushEntrySList(_ListHead, _ListEntry)
14209 #endif
14210
14211 _IRQL_requires_max_(APC_LEVEL)
14212 static __inline
14213 PVOID
14214 ExAllocateFromPagedLookasideList(
14215 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside)
14216 {
14217 PVOID Entry;
14218
14219 Lookaside->L.TotalAllocates++;
14220 #ifdef NONAMELESSUNION
14221 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
14222 if (Entry == NULL) {
14223 Lookaside->L.u2.AllocateMisses++;
14224 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
14225 Lookaside->L.Size,
14226 Lookaside->L.Tag);
14227 }
14228 #else /* NONAMELESSUNION */
14229 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14230 if (Entry == NULL) {
14231 Lookaside->L.AllocateMisses++;
14232 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
14233 Lookaside->L.Size,
14234 Lookaside->L.Tag);
14235 }
14236 #endif /* NONAMELESSUNION */
14237 return Entry;
14238 }
14239
14240 _IRQL_requires_max_(APC_LEVEL)
14241 static __inline
14242 VOID
14243 ExFreeToPagedLookasideList(
14244 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside,
14245 _In_ PVOID Entry)
14246 {
14247 Lookaside->L.TotalFrees++;
14248 #ifdef NONAMELESSUNION
14249 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
14250 Lookaside->L.u3.FreeMisses++;
14251 (Lookaside->L.u5.Free)(Entry);
14252 } else {
14253 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
14254 }
14255 #else /* NONAMELESSUNION */
14256 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14257 Lookaside->L.FreeMisses++;
14258 (Lookaside->L.Free)(Entry);
14259 } else {
14260 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14261 }
14262 #endif /* NONAMELESSUNION */
14263 }
14264
14265 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
14266
14267
14268 /* ERESOURCE_THREAD
14269 * ExGetCurrentResourceThread(
14270 * VOID);
14271 */
14272 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
14273
14274 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
14275
14276 /* VOID
14277 * ExInitializeWorkItem(
14278 * IN PWORK_QUEUE_ITEM Item,
14279 * IN PWORKER_THREAD_ROUTINE Routine,
14280 * IN PVOID Context)
14281 */
14282 #define ExInitializeWorkItem(Item, Routine, Context) \
14283 { \
14284 (Item)->WorkerRoutine = Routine; \
14285 (Item)->Parameter = Context; \
14286 (Item)->List.Flink = NULL; \
14287 }
14288
14289 FORCEINLINE
14290 VOID
14291 ExInitializeFastMutex(
14292 _Out_ PFAST_MUTEX FastMutex)
14293 {
14294 FastMutex->Count = FM_LOCK_BIT;
14295 FastMutex->Owner = NULL;
14296 FastMutex->Contention = 0;
14297 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
14298 return;
14299 }
14300
14301
14302 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14303 _IRQL_requires_max_(APC_LEVEL)
14304 _Requires_lock_held_(_Global_critical_region_)
14305 NTKERNELAPI
14306 VOID
14307 FASTCALL
14308 ExAcquireFastMutexUnsafe(
14309 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14310 PFAST_MUTEX FastMutex);
14311
14312 _IRQL_requires_max_(APC_LEVEL)
14313 _Requires_lock_held_(_Global_critical_region_)
14314 NTKERNELAPI
14315 VOID
14316 FASTCALL
14317 ExReleaseFastMutexUnsafe(
14318 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14319 PFAST_MUTEX FastMutex);
14320
14321 _Requires_lock_held_(_Global_critical_region_)
14322 _Requires_lock_not_held_(*Resource)
14323 _When_(Wait!=0, _Acquires_exclusive_lock_(*Resource))
14324 _IRQL_requires_max_(APC_LEVEL)
14325 _When_(Wait!=0, _Post_satisfies_(return == 1))
14326 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14327 NTKERNELAPI
14328 BOOLEAN
14329 NTAPI
14330 ExAcquireResourceExclusiveLite(
14331 _Inout_ PERESOURCE Resource,
14332 _In_ _Literal_ BOOLEAN Wait);
14333
14334 _IRQL_requires_max_(APC_LEVEL)
14335 _Requires_lock_held_(_Global_critical_region_)
14336 _When_(Wait!=0, _Post_satisfies_(return == 1))
14337 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14338 NTKERNELAPI
14339 BOOLEAN
14340 NTAPI
14341 ExAcquireResourceSharedLite(
14342 _Inout_ _Requires_lock_not_held_(*_Curr_)
14343 _When_(return!=0, _Acquires_shared_lock_(*_Curr_))
14344 PERESOURCE Resource,
14345 _In_ BOOLEAN Wait);
14346
14347 _IRQL_requires_max_(APC_LEVEL)
14348 _Requires_lock_held_(_Global_critical_region_)
14349 _When_(Wait!=0, _Post_satisfies_(return == 1))
14350 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14351 NTKERNELAPI
14352 BOOLEAN
14353 NTAPI
14354 ExAcquireSharedStarveExclusive(
14355 _Inout_ _Requires_lock_not_held_(*_Curr_)
14356 _When_(return!=0, _Acquires_shared_lock_(*_Curr_))
14357 PERESOURCE Resource,
14358 _In_ BOOLEAN Wait);
14359
14360 _IRQL_requires_max_(APC_LEVEL)
14361 _Requires_lock_held_(_Global_critical_region_)
14362 _When_(Wait!=0, _Post_satisfies_(return == 1))
14363 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14364 NTKERNELAPI
14365 BOOLEAN
14366 NTAPI
14367 ExAcquireSharedWaitForExclusive(
14368 _Inout_ _Requires_lock_not_held_(*_Curr_)
14369 _When_(return!=0, _Acquires_lock_(*_Curr_))
14370 PERESOURCE Resource,
14371 _In_ BOOLEAN Wait);
14372
14373 __drv_preferredFunction("ExAllocatePoolWithTag",
14374 "No tag interferes with debugging.")
14375 __drv_allocatesMem(Mem)
14376 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14377 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14378 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14379 __drv_reportError("Must succeed pool allocations are forbidden. "
14380 "Allocation failures cause a system crash"))
14381 _When_((PoolType & (NonPagedPoolMustSucceed |
14382 POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
14383 _Post_maybenull_ _Must_inspect_result_)
14384 _When_((PoolType & (NonPagedPoolMustSucceed |
14385 POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
14386 _Post_notnull_)
14387 _Post_writable_byte_size_(NumberOfBytes)
14388 NTKERNELAPI
14389 PVOID
14390 NTAPI
14391 ExAllocatePool(
14392 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
14393 _In_ SIZE_T NumberOfBytes);
14394
14395 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
14396 "No tag interferes with debugging.")
14397 __drv_allocatesMem(Mem)
14398 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14399 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14400 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14401 __drv_reportError("Must succeed pool allocations are forbidden. "
14402 "Allocation failures cause a system crash"))
14403 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0,
14404 _Post_maybenull_ _Must_inspect_result_)
14405 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_)
14406 _Post_writable_byte_size_(NumberOfBytes)
14407 NTKERNELAPI
14408 PVOID
14409 NTAPI
14410 ExAllocatePoolWithQuota(
14411 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
14412 _In_ SIZE_T NumberOfBytes);
14413
14414 __drv_allocatesMem(Mem)
14415 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14416 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14417 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14418 __drv_reportError("Must succeed pool allocations are forbidden. "
14419 "Allocation failures cause a system crash"))
14420 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0,
14421 _Post_maybenull_ _Must_inspect_result_)
14422 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_)
14423 _Post_writable_byte_size_(NumberOfBytes)
14424 NTKERNELAPI
14425 PVOID
14426 NTAPI
14427 ExAllocatePoolWithQuotaTag(
14428 _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
14429 _In_ SIZE_T NumberOfBytes,
14430 _In_ ULONG Tag);
14431
14432 #ifndef POOL_TAGGING
14433 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
14434 #endif
14435
14436 __drv_allocatesMem(Mem)
14437 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14438 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14439 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14440 __drv_reportError("Must succeed pool allocations are forbidden. "
14441 "Allocation failures cause a system crash"))
14442 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
14443 _Post_maybenull_ _Must_inspect_result_)
14444 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
14445 _Post_notnull_)
14446 _Post_writable_byte_size_(NumberOfBytes)
14447 NTKERNELAPI
14448 PVOID
14449 NTAPI
14450 ExAllocatePoolWithTag(
14451 _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
14452 _In_ SIZE_T NumberOfBytes,
14453 _In_ ULONG Tag);
14454
14455 #ifndef POOL_TAGGING
14456 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
14457 #endif
14458
14459 __drv_allocatesMem(Mem)
14460 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14461 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14462 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14463 __drv_reportError("Must succeed pool allocations are forbidden. "
14464 "Allocation failures cause a system crash"))
14465 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
14466 _Post_maybenull_ _Must_inspect_result_)
14467 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
14468 _Post_notnull_)
14469 _Post_writable_byte_size_(NumberOfBytes)
14470 NTKERNELAPI
14471 PVOID
14472 NTAPI
14473 ExAllocatePoolWithTagPriority(
14474 _In_ __drv_strictTypeMatch(__drv_typeCond) POOL_TYPE PoolType,
14475 _In_ SIZE_T NumberOfBytes,
14476 _In_ ULONG Tag,
14477 _In_ __drv_strictTypeMatch(__drv_typeExpr) EX_POOL_PRIORITY Priority);
14478
14479 _IRQL_requires_max_(DISPATCH_LEVEL)
14480 NTKERNELAPI
14481 VOID
14482 NTAPI
14483 ExConvertExclusiveToSharedLite(
14484 _Inout_ _Requires_lock_held_(*_Curr_) PERESOURCE Resource);
14485
14486 _IRQL_requires_max_(APC_LEVEL)
14487 NTKERNELAPI
14488 NTSTATUS
14489 NTAPI
14490 ExCreateCallback(
14491 _Outptr_ PCALLBACK_OBJECT *CallbackObject,
14492 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
14493 _In_ BOOLEAN Create,
14494 _In_ BOOLEAN AllowMultipleCallbacks);
14495
14496 NTKERNELAPI
14497 VOID
14498 NTAPI
14499 ExDeleteNPagedLookasideList(
14500 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside);
14501
14502 _IRQL_requires_max_(APC_LEVEL)
14503 NTKERNELAPI
14504 VOID
14505 NTAPI
14506 ExDeletePagedLookasideList(
14507 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside);
14508
14509 _IRQL_requires_max_(DISPATCH_LEVEL)
14510 NTKERNELAPI
14511 NTSTATUS
14512 NTAPI
14513 ExDeleteResourceLite(
14514 _Inout_ PERESOURCE Resource);
14515
14516 _IRQL_requires_max_(DISPATCH_LEVEL)
14517 NTKERNELAPI
14518 VOID
14519 NTAPI
14520 ExFreePool(
14521 _In_ __drv_freesMem(Mem) PVOID P);
14522
14523 _IRQL_requires_max_(DISPATCH_LEVEL)
14524 NTKERNELAPI
14525 VOID
14526 NTAPI
14527 ExFreePoolWithTag(
14528 _In_ __drv_freesMem(Mem) PVOID P,
14529 _In_ ULONG Tag);
14530
14531 _IRQL_requires_max_(DISPATCH_LEVEL)
14532 NTKERNELAPI
14533 ULONG
14534 NTAPI
14535 ExGetExclusiveWaiterCount(
14536 _In_ PERESOURCE Resource);
14537
14538 _IRQL_requires_max_(DISPATCH_LEVEL)
14539 NTKERNELAPI
14540 KPROCESSOR_MODE
14541 NTAPI
14542 ExGetPreviousMode(VOID);
14543
14544 _IRQL_requires_max_(DISPATCH_LEVEL)
14545 NTKERNELAPI
14546 ULONG
14547 NTAPI
14548 ExGetSharedWaiterCount(
14549 _In_ PERESOURCE Resource);
14550
14551 _IRQL_requires_max_(DISPATCH_LEVEL)
14552 NTKERNELAPI
14553 VOID
14554 NTAPI
14555 ExInitializeNPagedLookasideList(
14556 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside,
14557 _In_opt_ PALLOCATE_FUNCTION Allocate,
14558 _In_opt_ PFREE_FUNCTION Free,
14559 _In_ ULONG Flags,
14560 _In_ SIZE_T Size,
14561 _In_ ULONG Tag,
14562 _In_ USHORT Depth);
14563
14564 _IRQL_requires_max_(APC_LEVEL)
14565 NTKERNELAPI
14566 VOID
14567 NTAPI
14568 ExInitializePagedLookasideList(
14569 _Out_ PPAGED_LOOKASIDE_LIST Lookaside,
14570 _In_opt_ PALLOCATE_FUNCTION Allocate,
14571 _In_opt_ PFREE_FUNCTION Free,
14572 _In_ ULONG Flags,
14573 _In_ SIZE_T Size,
14574 _In_ ULONG Tag,
14575 _In_ USHORT Depth);
14576
14577 _IRQL_requires_max_(DISPATCH_LEVEL)
14578 NTKERNELAPI
14579 NTSTATUS
14580 NTAPI
14581 ExInitializeResourceLite(
14582 _Out_ PERESOURCE Resource);
14583
14584 NTKERNELAPI
14585 LARGE_INTEGER
14586 NTAPI
14587 ExInterlockedAddLargeInteger(
14588 _Inout_ PLARGE_INTEGER Addend,
14589 _In_ LARGE_INTEGER Increment,
14590 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14591
14592 #if defined(_WIN64)
14593 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14594 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
14595 #else
14596 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14597 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
14598 #endif
14599
14600 NTKERNELAPI
14601 ULONG
14602 FASTCALL
14603 ExInterlockedAddUlong(
14604 _Inout_ PULONG Addend,
14605 _In_ ULONG Increment,
14606 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14607
14608 #if defined(_AMD64_) || defined(_IA64_)
14609
14610 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14611 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
14612
14613 #elif defined(_X86_)
14614
14615 NTKERNELAPI
14616 LONGLONG
14617 FASTCALL
14618 ExfInterlockedCompareExchange64(
14619 _Inout_ _Interlocked_operand_ LONGLONG volatile *Destination,
14620 _In_ PLONGLONG Exchange,
14621 _In_ PLONGLONG Comperand);
14622
14623 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14624 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
14625
14626 #else
14627
14628 NTKERNELAPI
14629 LONGLONG
14630 FASTCALL
14631 ExInterlockedCompareExchange64(
14632 IN OUT LONGLONG volatile *Destination,
14633 IN PLONGLONG Exchange,
14634 IN PLONGLONG Comparand,
14635 IN PKSPIN_LOCK Lock);
14636
14637 #endif /* defined(_AMD64_) || defined(_IA64_) */
14638
14639 NTKERNELAPI
14640 PLIST_ENTRY
14641 FASTCALL
14642 ExInterlockedInsertHeadList(
14643 _Inout_ PLIST_ENTRY ListHead,
14644 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry,
14645 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14646
14647 NTKERNELAPI
14648 PLIST_ENTRY
14649 FASTCALL
14650 ExInterlockedInsertTailList(
14651 _Inout_ PLIST_ENTRY ListHead,
14652 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry,
14653 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14654
14655 NTKERNELAPI
14656 PSINGLE_LIST_ENTRY
14657 FASTCALL
14658 ExInterlockedPopEntryList(
14659 _Inout_ PSINGLE_LIST_ENTRY ListHead,
14660 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14661
14662 NTKERNELAPI
14663 PSINGLE_LIST_ENTRY
14664 FASTCALL
14665 ExInterlockedPushEntryList(
14666 _Inout_ PSINGLE_LIST_ENTRY ListHead,
14667 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry,
14668 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14669
14670 NTKERNELAPI
14671 PLIST_ENTRY
14672 FASTCALL
14673 ExInterlockedRemoveHeadList(
14674 _Inout_ PLIST_ENTRY ListHead,
14675 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14676
14677 _IRQL_requires_max_(PASSIVE_LEVEL)
14678 NTKERNELAPI
14679 BOOLEAN
14680 NTAPI
14681 ExIsProcessorFeaturePresent(
14682 _In_ ULONG ProcessorFeature);
14683
14684 _IRQL_requires_max_(DISPATCH_LEVEL)
14685 NTKERNELAPI
14686 BOOLEAN
14687 NTAPI
14688 ExIsResourceAcquiredExclusiveLite(
14689 _In_ PERESOURCE Resource);
14690
14691 _IRQL_requires_max_(DISPATCH_LEVEL)
14692 NTKERNELAPI
14693 ULONG
14694 NTAPI
14695 ExIsResourceAcquiredSharedLite(
14696 _In_ PERESOURCE Resource);
14697
14698 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
14699
14700 NTKERNELAPI
14701 VOID
14702 NTAPI
14703 ExLocalTimeToSystemTime(
14704 _In_ PLARGE_INTEGER LocalTime,
14705 _Out_ PLARGE_INTEGER SystemTime);
14706
14707 _IRQL_requires_max_(DISPATCH_LEVEL)
14708 NTKERNELAPI
14709 VOID
14710 NTAPI
14711 ExNotifyCallback(
14712 _In_ PCALLBACK_OBJECT CallbackObject,
14713 _In_opt_ PVOID Argument1,
14714 _In_opt_ PVOID Argument2);
14715
14716 _IRQL_requires_max_(DISPATCH_LEVEL)
14717 NTKERNELAPI
14718 VOID
14719 NTAPI
14720 ExQueueWorkItem(
14721 _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
14722 __drv_strictTypeMatch(__drv_typeExpr) _In_ WORK_QUEUE_TYPE QueueType);
14723
14724 _IRQL_requires_max_(APC_LEVEL)
14725 NTKERNELAPI
14726 DECLSPEC_NORETURN
14727 VOID
14728 NTAPI
14729 ExRaiseStatus(
14730 _In_ NTSTATUS Status);
14731
14732 _IRQL_requires_max_(APC_LEVEL)
14733 NTKERNELAPI
14734 PVOID
14735 NTAPI
14736 ExRegisterCallback(
14737 _Inout_ PCALLBACK_OBJECT CallbackObject,
14738 _In_ PCALLBACK_FUNCTION CallbackFunction,
14739 _In_opt_ PVOID CallbackContext);
14740
14741 _IRQL_requires_max_(DISPATCH_LEVEL)
14742 NTKERNELAPI
14743 NTSTATUS
14744 NTAPI
14745 ExReinitializeResourceLite(
14746 _Inout_ PERESOURCE Resource);
14747
14748 _IRQL_requires_max_(DISPATCH_LEVEL)
14749 _Requires_lock_held_(_Global_critical_region_)
14750 NTKERNELAPI
14751 VOID
14752 NTAPI
14753 ExReleaseResourceForThreadLite(
14754 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14755 PERESOURCE Resource,
14756 _In_ ERESOURCE_THREAD ResourceThreadId);
14757
14758 _Requires_lock_held_(_Global_critical_region_)
14759 _Requires_lock_held_(*Resource)
14760 _Releases_lock_(*Resource)
14761 _IRQL_requires_max_(DISPATCH_LEVEL)
14762 NTKERNELAPI
14763 VOID
14764 FASTCALL
14765 ExReleaseResourceLite(
14766 _Inout_ PERESOURCE Resource);
14767
14768 _IRQL_requires_max_(DISPATCH_LEVEL)
14769 NTKERNELAPI
14770 VOID
14771 NTAPI
14772 ExSetResourceOwnerPointer(
14773 _Inout_ PERESOURCE Resource,
14774 _In_ PVOID OwnerPointer);
14775
14776 _IRQL_requires_max_(APC_LEVEL)
14777 NTKERNELAPI
14778 ULONG
14779 NTAPI
14780 ExSetTimerResolution(
14781 _In_ ULONG DesiredTime,
14782 _In_ BOOLEAN SetResolution);
14783
14784 NTKERNELAPI
14785 VOID
14786 NTAPI
14787 ExSystemTimeToLocalTime(
14788 _In_ PLARGE_INTEGER SystemTime,
14789 _Out_ PLARGE_INTEGER LocalTime);
14790
14791 _IRQL_requires_max_(APC_LEVEL)
14792 NTKERNELAPI
14793 VOID
14794 NTAPI
14795 ExUnregisterCallback(
14796 _Inout_ PVOID CbRegistration);
14797
14798 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14799
14800 #if (NTDDI_VERSION >= NTDDI_WINXP)
14801
14802 _Must_inspect_result_
14803 _Post_satisfies_(return == 0 || return == 1)
14804 NTKERNELAPI
14805 BOOLEAN
14806 FASTCALL
14807 ExAcquireRundownProtection(
14808 _Inout_ PEX_RUNDOWN_REF RunRef);
14809
14810 NTKERNELAPI
14811 VOID
14812 FASTCALL
14813 ExInitializeRundownProtection(
14814 _Out_ PEX_RUNDOWN_REF RunRef);
14815
14816 NTKERNELAPI
14817 VOID
14818 FASTCALL
14819 ExReInitializeRundownProtection(
14820 _Inout_ PEX_RUNDOWN_REF RunRef);
14821
14822 NTKERNELAPI
14823 VOID
14824 FASTCALL
14825 ExReleaseRundownProtection(
14826 _Inout_ PEX_RUNDOWN_REF RunRef);
14827
14828 NTKERNELAPI
14829 VOID
14830 FASTCALL
14831 ExRundownCompleted(
14832 _Out_ PEX_RUNDOWN_REF RunRef);
14833
14834 NTKERNELAPI
14835 BOOLEAN
14836 NTAPI
14837 ExVerifySuite(
14838 __drv_strictTypeMatch(__drv_typeExpr) _In_ SUITE_TYPE SuiteType);
14839
14840 NTKERNELAPI
14841 VOID
14842 FASTCALL
14843 ExWaitForRundownProtectionRelease(
14844 _Inout_ PEX_RUNDOWN_REF RunRef);
14845 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14846
14847 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
14848
14849 _Must_inspect_result_
14850 _Post_satisfies_(return == 0 || return == 1)
14851 NTKERNELAPI
14852 BOOLEAN
14853 FASTCALL
14854 ExAcquireRundownProtectionEx(
14855 _Inout_ PEX_RUNDOWN_REF RunRef,
14856 _In_ ULONG Count);
14857
14858 NTKERNELAPI
14859 VOID
14860 FASTCALL
14861 ExReleaseRundownProtectionEx(
14862 _Inout_ PEX_RUNDOWN_REF RunRef,
14863 _In_ ULONG Count);
14864
14865 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
14866
14867 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
14868
14869 _Must_inspect_result_
14870 _IRQL_requires_max_(APC_LEVEL)
14871 NTKERNELAPI
14872 PEX_RUNDOWN_REF_CACHE_AWARE
14873 NTAPI
14874 ExAllocateCacheAwareRundownProtection(
14875 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
14876 _In_ ULONG PoolTag);
14877
14878 _IRQL_requires_max_(APC_LEVEL)
14879 NTKERNELAPI
14880 SIZE_T
14881 NTAPI
14882 ExSizeOfRundownProtectionCacheAware(VOID);
14883
14884 _IRQL_requires_max_(APC_LEVEL)
14885 _Acquires_lock_(_Global_critical_region_)
14886 NTKERNELAPI
14887 PVOID
14888 NTAPI
14889 ExEnterCriticalRegionAndAcquireResourceShared(
14890 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_shared_lock_(*_Curr_)
14891 PERESOURCE Resource);
14892
14893 _IRQL_requires_max_(APC_LEVEL)
14894 _Acquires_lock_(_Global_critical_region_)
14895 NTKERNELAPI
14896 PVOID
14897 NTAPI
14898 ExEnterCriticalRegionAndAcquireResourceExclusive(
14899 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)
14900 PERESOURCE Resource);
14901
14902 _IRQL_requires_max_(APC_LEVEL)
14903 _Acquires_lock_(_Global_critical_region_)
14904 NTKERNELAPI
14905 PVOID
14906 NTAPI
14907 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
14908 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14909 PERESOURCE Resource);
14910
14911 _IRQL_requires_max_(DISPATCH_LEVEL)
14912 _Releases_lock_(_Global_critical_region_)
14913 NTKERNELAPI
14914 VOID
14915 FASTCALL
14916 ExReleaseResourceAndLeaveCriticalRegion(
14917 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14918 PERESOURCE Resource);
14919
14920 _IRQL_requires_max_(APC_LEVEL)
14921 NTKERNELAPI
14922 VOID
14923 NTAPI
14924 ExInitializeRundownProtectionCacheAware(
14925 _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
14926 _In_ SIZE_T RunRefSize);
14927
14928 _IRQL_requires_max_(APC_LEVEL)
14929 NTKERNELAPI
14930 VOID
14931 NTAPI
14932 ExFreeCacheAwareRundownProtection(
14933 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14934
14935 _Must_inspect_result_
14936 _Post_satisfies_(return == 0 || return == 1)
14937 NTKERNELAPI
14938 BOOLEAN
14939 FASTCALL
14940 ExAcquireRundownProtectionCacheAware(
14941 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14942
14943 NTKERNELAPI
14944 VOID
14945 FASTCALL
14946 ExReleaseRundownProtectionCacheAware(
14947 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14948
14949 _Must_inspect_result_
14950 _Post_satisfies_(return == 0 || return == 1)
14951 NTKERNELAPI
14952 BOOLEAN
14953 FASTCALL
14954 ExAcquireRundownProtectionCacheAwareEx(
14955 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
14956 _In_ ULONG Count);
14957
14958 NTKERNELAPI
14959 VOID
14960 FASTCALL
14961 ExReleaseRundownProtectionCacheAwareEx(
14962 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
14963 _In_ ULONG Count);
14964
14965 NTKERNELAPI
14966 VOID
14967 FASTCALL
14968 ExWaitForRundownProtectionReleaseCacheAware(
14969 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
14970
14971 NTKERNELAPI
14972 VOID
14973 FASTCALL
14974 ExReInitializeRundownProtectionCacheAware(
14975 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14976
14977 NTKERNELAPI
14978 VOID
14979 FASTCALL
14980 ExRundownCompletedCacheAware(
14981 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14982
14983 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
14984
14985 #if (NTDDI_VERSION >= NTDDI_VISTA)
14986
14987 _IRQL_requires_max_(DISPATCH_LEVEL)
14988 NTKERNELAPI
14989 NTSTATUS
14990 NTAPI
14991 ExInitializeLookasideListEx(
14992 _Out_ PLOOKASIDE_LIST_EX Lookaside,
14993 _In_opt_ PALLOCATE_FUNCTION_EX Allocate,
14994 _In_opt_ PFREE_FUNCTION_EX Free,
14995 _In_ POOL_TYPE PoolType,
14996 _In_ ULONG Flags,
14997 _In_ SIZE_T Size,
14998 _In_ ULONG Tag,
14999 _In_ USHORT Depth);
15000
15001 _IRQL_requires_max_(DISPATCH_LEVEL)
15002 NTKERNELAPI
15003 VOID
15004 NTAPI
15005 ExDeleteLookasideListEx(
15006 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
15007
15008 _IRQL_requires_max_(DISPATCH_LEVEL)
15009 NTKERNELAPI
15010 VOID
15011 NTAPI
15012 ExFlushLookasideListEx(
15013 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
15014
15015 _Must_inspect_result_
15016 _IRQL_requires_max_(DISPATCH_LEVEL)
15017 FORCEINLINE
15018 PVOID
15019 ExAllocateFromLookasideListEx(
15020 _Inout_ PLOOKASIDE_LIST_EX Lookaside)
15021 {
15022 PVOID Entry;
15023
15024 Lookaside->L.TotalAllocates += 1;
15025 #ifdef NONAMELESSUNION
15026 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
15027 if (Entry == NULL) {
15028 Lookaside->L.u2.AllocateMisses += 1;
15029 Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
15030 Lookaside->L.Size,
15031 Lookaside->L.Tag,
15032 Lookaside);
15033 }
15034 #else /* NONAMELESSUNION */
15035 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
15036 if (Entry == NULL) {
15037 Lookaside->L.AllocateMisses += 1;
15038 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
15039 Lookaside->L.Size,
15040 Lookaside->L.Tag,
15041 Lookaside);
15042 }
15043 #endif /* NONAMELESSUNION */
15044 return Entry;
15045 }
15046
15047 _IRQL_requires_max_(DISPATCH_LEVEL)
15048 FORCEINLINE
15049 VOID
15050 ExFreeToLookasideListEx(
15051 _Inout_ PLOOKASIDE_LIST_EX Lookaside,
15052 _In_ PVOID Entry)
15053 {
15054 Lookaside->L.TotalFrees += 1;
15055 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
15056 Lookaside->L.FreeMisses += 1;
15057 (Lookaside->L.FreeEx)(Entry, Lookaside);
15058 } else {
15059 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
15060 }
15061 return;
15062 }
15063
15064 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15065
15066 #if (NTDDI_VERSION >= NTDDI_WIN7)
15067
15068 _IRQL_requires_max_(DISPATCH_LEVEL)
15069 NTKERNELAPI
15070 VOID
15071 NTAPI
15072 ExSetResourceOwnerPointerEx(
15073 _Inout_ PERESOURCE Resource,
15074 _In_ PVOID OwnerPointer,
15075 _In_ ULONG Flags);
15076
15077 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
15078
15079 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15080
15081 _IRQL_requires_max_(DISPATCH_LEVEL)
15082 static __inline PVOID
15083 ExAllocateFromNPagedLookasideList(
15084 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside)
15085 {
15086 PVOID Entry;
15087
15088 Lookaside->L.TotalAllocates++;
15089 #ifdef NONAMELESSUNION
15090 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15091 Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
15092 &Lookaside->Lock__ObsoleteButDoNotDelete);
15093 #else
15094 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
15095 #endif
15096 if (Entry == NULL) {
15097 Lookaside->L.u2.AllocateMisses++;
15098 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
15099 Lookaside->L.Size,
15100 Lookaside->L.Tag);
15101 }
15102 #else /* NONAMELESSUNION */
15103 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15104 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
15105 &Lookaside->Lock__ObsoleteButDoNotDelete);
15106 #else
15107 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
15108 #endif
15109 if (Entry == NULL) {
15110 Lookaside->L.AllocateMisses++;
15111 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
15112 Lookaside->L.Size,
15113 Lookaside->L.Tag);
15114 }
15115 #endif /* NONAMELESSUNION */
15116 return Entry;
15117 }
15118
15119 _IRQL_requires_max_(DISPATCH_LEVEL)
15120 static __inline VOID
15121 ExFreeToNPagedLookasideList(
15122 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside,
15123 _In_ PVOID Entry)
15124 {
15125 Lookaside->L.TotalFrees++;
15126 #ifdef NONAMELESSUNION
15127 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
15128 Lookaside->L.u3.FreeMisses++;
15129 (Lookaside->L.u5.Free)(Entry);
15130 } else {
15131 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15132 ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
15133 (PSLIST_ENTRY)Entry,
15134 &Lookaside->Lock__ObsoleteButDoNotDelete);
15135 #else
15136 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
15137 #endif
15138 }
15139 #else /* NONAMELESSUNION */
15140 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
15141 Lookaside->L.FreeMisses++;
15142 (Lookaside->L.Free)(Entry);
15143 } else {
15144 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15145 ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
15146 (PSLIST_ENTRY)Entry,
15147 &Lookaside->Lock__ObsoleteButDoNotDelete);
15148 #else
15149 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
15150 #endif
15151 }
15152 #endif /* NONAMELESSUNION */
15153 }
15154
15155 /******************************************************************************
15156 * Object Manager Functions *
15157 ******************************************************************************/
15158
15159 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15160 _IRQL_requires_max_(DISPATCH_LEVEL)
15161 NTKERNELAPI
15162 LONG_PTR
15163 FASTCALL
15164 ObfDereferenceObject(
15165 _In_ PVOID Object);
15166 #define ObDereferenceObject ObfDereferenceObject
15167
15168 _IRQL_requires_max_(APC_LEVEL)
15169 NTKERNELAPI
15170 NTSTATUS
15171 NTAPI
15172 ObGetObjectSecurity(
15173 _In_ PVOID Object,
15174 _Out_ PSECURITY_DESCRIPTOR *SecurityDescriptor,
15175 _Out_ PBOOLEAN MemoryAllocated);
15176
15177 _IRQL_requires_max_(DISPATCH_LEVEL)
15178 NTKERNELAPI
15179 LONG_PTR
15180 FASTCALL
15181 ObfReferenceObject(
15182 _In_ PVOID Object);
15183 #define ObReferenceObject ObfReferenceObject
15184
15185 _IRQL_requires_max_(APC_LEVEL)
15186 NTKERNELAPI
15187 NTSTATUS
15188 NTAPI
15189 ObReferenceObjectByHandle(
15190 _In_ HANDLE Handle,
15191 _In_ ACCESS_MASK DesiredAccess,
15192 _In_opt_ POBJECT_TYPE ObjectType,
15193 _In_ KPROCESSOR_MODE AccessMode,
15194 _Out_ PVOID *Object,
15195 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation);
15196
15197 _IRQL_requires_max_(DISPATCH_LEVEL)
15198 NTKERNELAPI
15199 NTSTATUS
15200 NTAPI
15201 ObReferenceObjectByPointer(
15202 _In_ PVOID Object,
15203 _In_ ACCESS_MASK DesiredAccess,
15204 _In_opt_ POBJECT_TYPE ObjectType,
15205 _In_ KPROCESSOR_MODE AccessMode);
15206
15207 _IRQL_requires_max_(APC_LEVEL)
15208 NTKERNELAPI
15209 VOID
15210 NTAPI
15211 ObReleaseObjectSecurity(
15212 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
15213 _In_ BOOLEAN MemoryAllocated);
15214 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15215
15216 #if (NTDDI_VERSION >= NTDDI_VISTA)
15217 NTKERNELAPI
15218 VOID
15219 NTAPI
15220 ObDereferenceObjectDeferDelete(
15221 _In_ PVOID Object);
15222 #endif
15223
15224 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
15225 NTKERNELAPI
15226 NTSTATUS
15227 NTAPI
15228 ObRegisterCallbacks(
15229 _In_ POB_CALLBACK_REGISTRATION CallbackRegistration,
15230 _Outptr_ PVOID *RegistrationHandle);
15231
15232 NTKERNELAPI
15233 VOID
15234 NTAPI
15235 ObUnRegisterCallbacks(
15236 _In_ PVOID RegistrationHandle);
15237
15238 NTKERNELAPI
15239 USHORT
15240 NTAPI
15241 ObGetFilterVersion(VOID);
15242
15243 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
15244
15245 #if (NTDDI_VERSION >= NTDDI_WIN7)
15246 _IRQL_requires_max_(APC_LEVEL)
15247 NTKERNELAPI
15248 NTSTATUS
15249 NTAPI
15250 ObReferenceObjectByHandleWithTag(
15251 _In_ HANDLE Handle,
15252 _In_ ACCESS_MASK DesiredAccess,
15253 _In_opt_ POBJECT_TYPE ObjectType,
15254 _In_ KPROCESSOR_MODE AccessMode,
15255 _In_ ULONG Tag,
15256 _Out_ PVOID *Object,
15257 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation);
15258
15259 _IRQL_requires_max_(DISPATCH_LEVEL)
15260 NTKERNELAPI
15261 LONG_PTR
15262 FASTCALL
15263 ObfReferenceObjectWithTag(
15264 _In_ PVOID Object,
15265 _In_ ULONG Tag);
15266
15267 _IRQL_requires_max_(DISPATCH_LEVEL)
15268 NTKERNELAPI
15269 NTSTATUS
15270 NTAPI
15271 ObReferenceObjectByPointerWithTag(
15272 _In_ PVOID Object,
15273 _In_ ACCESS_MASK DesiredAccess,
15274 _In_opt_ POBJECT_TYPE ObjectType,
15275 _In_ KPROCESSOR_MODE AccessMode,
15276 _In_ ULONG Tag);
15277
15278 _IRQL_requires_max_(DISPATCH_LEVEL)
15279 NTKERNELAPI
15280 LONG_PTR
15281 FASTCALL
15282 ObfDereferenceObjectWithTag(
15283 _In_ PVOID Object,
15284 _In_ ULONG Tag);
15285
15286 NTKERNELAPI
15287 VOID
15288 NTAPI
15289 ObDereferenceObjectDeferDeleteWithTag(
15290 _In_ PVOID Object,
15291 _In_ ULONG Tag);
15292
15293 #define ObDereferenceObject ObfDereferenceObject
15294 #define ObReferenceObject ObfReferenceObject
15295 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
15296 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
15297 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15298
15299 /******************************************************************************
15300 * Process Manager Functions *
15301 ******************************************************************************/
15302
15303 NTKERNELAPI
15304 NTSTATUS
15305 NTAPI
15306 PsWrapApcWow64Thread(
15307 _Inout_ PVOID *ApcContext,
15308 _Inout_ PVOID *ApcRoutine);
15309
15310 /*
15311 * PEPROCESS
15312 * PsGetCurrentProcess(VOID)
15313 */
15314 #define PsGetCurrentProcess IoGetCurrentProcess
15315
15316 #if !defined(_PSGETCURRENTTHREAD_)
15317 #define _PSGETCURRENTTHREAD_
15318 _IRQL_requires_max_(DISPATCH_LEVEL)
15319 FORCEINLINE
15320 PETHREAD
15321 NTAPI
15322 PsGetCurrentThread(VOID)
15323 {
15324 return (PETHREAD)KeGetCurrentThread();
15325 }
15326 #endif /* !_PSGETCURRENTTHREAD_ */
15327
15328
15329 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15330
15331 _IRQL_requires_max_(APC_LEVEL)
15332 _Post_satisfies_(return <= 0)
15333 _Must_inspect_result_
15334 NTKERNELAPI
15335 NTSTATUS
15336 NTAPI
15337 PsCreateSystemThread(
15338 _Out_ PHANDLE ThreadHandle,
15339 _In_ ULONG DesiredAccess,
15340 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
15341 _In_opt_ HANDLE ProcessHandle,
15342 _Out_opt_ PCLIENT_ID ClientId,
15343 _In_ PKSTART_ROUTINE StartRoutine,
15344 _In_opt_ _When_(return==0, __drv_aliasesMem) PVOID StartContext);
15345
15346 _IRQL_requires_max_(PASSIVE_LEVEL)
15347 NTKERNELAPI
15348 NTSTATUS
15349 NTAPI
15350 PsTerminateSystemThread(
15351 _In_ NTSTATUS ExitStatus);
15352
15353 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15354
15355
15356 /******************************************************************************
15357 * WMI Library Support Functions *
15358 ******************************************************************************/
15359
15360 #ifdef RUN_WPP
15361 #if (NTDDI_VERSION >= NTDDI_WINXP)
15362 _IRQL_requires_max_(HIGH_LEVEL)
15363 NTKERNELAPI
15364 NTSTATUS
15365 __cdecl
15366 WmiTraceMessage(
15367 _In_ TRACEHANDLE LoggerHandle,
15368 _In_ ULONG MessageFlags,
15369 _In_ LPGUID MessageGuid,
15370 _In_ USHORT MessageNumber,
15371 ...);
15372 #endif
15373 #endif /* RUN_WPP */
15374
15375 #if (NTDDI_VERSION >= NTDDI_WINXP)
15376
15377 _IRQL_requires_max_(APC_LEVEL)
15378 NTKERNELAPI
15379 NTSTATUS
15380 NTAPI
15381 WmiQueryTraceInformation(
15382 _In_ TRACE_INFORMATION_CLASS TraceInformationClass,
15383 _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation,
15384 _In_ ULONG TraceInformationLength,
15385 _Out_opt_ PULONG RequiredLength,
15386 _In_opt_ PVOID Buffer);
15387
15388 #if 0
15389 /* FIXME: Get va_list from where? */
15390 _IRQL_requires_max_(HIGH_LEVEL)
15391 NTKERNELAPI
15392 NTSTATUS
15393 NTAPI
15394 WmiTraceMessageVa(
15395 _In_ TRACEHANDLE LoggerHandle,
15396 _In_ ULONG MessageFlags,
15397 _In_ LPGUID MessageGuid,
15398 _In_ USHORT MessageNumber,
15399 _In_ va_list MessageArgList);
15400 #endif
15401
15402 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15403
15404 #ifndef TRACE_INFORMATION_CLASS_DEFINE
15405
15406 #if (NTDDI_VERSION >= NTDDI_WINXP)
15407 _IRQL_requires_max_(APC_LEVEL)
15408 NTKERNELAPI
15409 NTSTATUS
15410 NTAPI
15411 WmiQueryTraceInformation(
15412 _In_ TRACE_INFORMATION_CLASS TraceInformationClass,
15413 _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation,
15414 _In_ ULONG TraceInformationLength,
15415 _Out_opt_ PULONG RequiredLength,
15416 _In_opt_ PVOID Buffer);
15417 #endif
15418
15419 #define TRACE_INFORMATION_CLASS_DEFINE
15420
15421 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
15422
15423 #if (NTDDI_VERSION >= NTDDI_VISTA)
15424
15425 _IRQL_requires_max_(PASSIVE_LEVEL)
15426 NTSTATUS
15427 NTKERNELAPI
15428 NTAPI
15429 EtwRegister(
15430 _In_ LPCGUID ProviderId,
15431 _In_opt_ PETWENABLECALLBACK EnableCallback,
15432 _In_opt_ PVOID CallbackContext,
15433 _Out_ PREGHANDLE RegHandle);
15434
15435 _IRQL_requires_max_(PASSIVE_LEVEL)
15436 NTSTATUS
15437 NTKERNELAPI
15438 NTAPI
15439 EtwUnregister(
15440 _In_ REGHANDLE RegHandle);
15441
15442 _IRQL_requires_max_(HIGH_LEVEL)
15443 BOOLEAN
15444 NTKERNELAPI
15445 NTAPI
15446 EtwEventEnabled(
15447 _In_ REGHANDLE RegHandle,
15448 _In_ PCEVENT_DESCRIPTOR EventDescriptor);
15449
15450 _IRQL_requires_max_(HIGH_LEVEL)
15451 BOOLEAN
15452 NTKERNELAPI
15453 NTAPI
15454 EtwProviderEnabled(
15455 _In_ REGHANDLE RegHandle,
15456 _In_ UCHAR Level,
15457 _In_ ULONGLONG Keyword);
15458
15459 _When_(ControlCode==EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(HIGH_LEVEL))
15460 _When_(ControlCode!=EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(APC_LEVEL))
15461 NTSTATUS
15462 NTKERNELAPI
15463 NTAPI
15464 EtwActivityIdControl(
15465 _In_ ULONG ControlCode,
15466 _Inout_updates_bytes_(sizeof(GUID)) LPGUID ActivityId);
15467
15468 _IRQL_requires_max_(HIGH_LEVEL)
15469 NTSTATUS
15470 NTKERNELAPI
15471 NTAPI
15472 EtwWrite(
15473 _In_ REGHANDLE RegHandle,
15474 _In_ PCEVENT_DESCRIPTOR EventDescriptor,
15475 _In_opt_ LPCGUID ActivityId,
15476 _In_ ULONG UserDataCount,
15477 _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
15478
15479 _IRQL_requires_max_(HIGH_LEVEL)
15480 NTSTATUS
15481 NTKERNELAPI
15482 NTAPI
15483 EtwWriteTransfer(
15484 _In_ REGHANDLE RegHandle,
15485 _In_ PCEVENT_DESCRIPTOR EventDescriptor,
15486 _In_opt_ LPCGUID ActivityId,
15487 _In_opt_ LPCGUID RelatedActivityId,
15488 _In_ ULONG UserDataCount,
15489 _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
15490
15491 _IRQL_requires_max_(HIGH_LEVEL)
15492 NTSTATUS
15493 NTKERNELAPI
15494 NTAPI
15495 EtwWriteString(
15496 _In_ REGHANDLE RegHandle,
15497 _In_ UCHAR Level,
15498 _In_ ULONGLONG Keyword,
15499 _In_opt_ LPCGUID ActivityId,
15500 _In_ PCWSTR String);
15501
15502 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15503
15504 #if (NTDDI_VERSION >= NTDDI_WIN7)
15505 _IRQL_requires_max_(HIGH_LEVEL)
15506 NTSTATUS
15507 NTKERNELAPI
15508 NTAPI
15509 EtwWriteEx(
15510 _In_ REGHANDLE RegHandle,
15511 _In_ PCEVENT_DESCRIPTOR EventDescriptor,
15512 _In_ ULONG64 Filter,
15513 _In_ ULONG Flags,
15514 _In_opt_ LPCGUID ActivityId,
15515 _In_opt_ LPCGUID RelatedActivityId,
15516 _In_ ULONG UserDataCount,
15517 _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
15518 #endif
15519
15520
15521
15522 /******************************************************************************
15523 * Kernel Debugger Functions *
15524 ******************************************************************************/
15525
15526 #ifndef _DBGNT_
15527
15528 ULONG
15529 __cdecl
15530 DbgPrint(
15531 _In_z_ _Printf_format_string_ PCSTR Format,
15532 ...);
15533
15534 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15535 NTSYSAPI
15536 ULONG
15537 __cdecl
15538 DbgPrintReturnControlC(
15539 _In_z_ _Printf_format_string_ PCCH Format,
15540 ...);
15541 #endif
15542
15543 #if (NTDDI_VERSION >= NTDDI_WINXP)
15544
15545 NTSYSAPI
15546 ULONG
15547 __cdecl
15548 DbgPrintEx(
15549 _In_ ULONG ComponentId,
15550 _In_ ULONG Level,
15551 _In_z_ _Printf_format_string_ PCSTR Format,
15552 ...);
15553
15554 #ifdef _VA_LIST_DEFINED
15555
15556 NTSYSAPI
15557 ULONG
15558 NTAPI
15559 vDbgPrintEx(
15560 _In_ ULONG ComponentId,
15561 _In_ ULONG Level,
15562 _In_z_ PCCH Format,
15563 _In_ va_list ap);
15564
15565 NTSYSAPI
15566 ULONG
15567 NTAPI
15568 vDbgPrintExWithPrefix(
15569 _In_z_ PCCH Prefix,
15570 _In_ ULONG ComponentId,
15571 _In_ ULONG Level,
15572 _In_z_ PCCH Format,
15573 _In_ va_list ap);
15574
15575 #endif /* _VA_LIST_DEFINED */
15576
15577 NTSYSAPI
15578 NTSTATUS
15579 NTAPI
15580 DbgQueryDebugFilterState(
15581 _In_ ULONG ComponentId,
15582 _In_ ULONG Level);
15583
15584 NTSYSAPI
15585 NTSTATUS
15586 NTAPI
15587 DbgSetDebugFilterState(
15588 _In_ ULONG ComponentId,
15589 _In_ ULONG Level,
15590 _In_ BOOLEAN State);
15591
15592 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15593
15594 #if (NTDDI_VERSION >= NTDDI_VISTA)
15595
15596 typedef VOID
15597 (*PDEBUG_PRINT_CALLBACK)(
15598 _In_ PSTRING Output,
15599 _In_ ULONG ComponentId,
15600 _In_ ULONG Level);
15601
15602 NTSYSAPI
15603 NTSTATUS
15604 NTAPI
15605 DbgSetDebugPrintCallback(
15606 _In_ PDEBUG_PRINT_CALLBACK DebugPrintCallback,
15607 _In_ BOOLEAN Enable);
15608
15609 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15610
15611 #endif /* _DBGNT_ */
15612
15613 #if DBG
15614
15615 #define KdPrint(_x_) DbgPrint _x_
15616 #define KdPrintEx(_x_) DbgPrintEx _x_
15617 #define vKdPrintEx(_x_) vDbgPrintEx _x_
15618 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
15619 #define KdBreakPoint() DbgBreakPoint()
15620 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
15621
15622 #else /* !DBG */
15623
15624 #define KdPrint(_x_)
15625 #define KdPrintEx(_x_)
15626 #define vKdPrintEx(_x_)
15627 #define vKdPrintExWithPrefix(_x_)
15628 #define KdBreakPoint()
15629 #define KdBreakPointWithStatus(s)
15630
15631 #endif /* !DBG */
15632
15633 #if defined(__GNUC__)
15634
15635 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
15636 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
15637 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
15638 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
15639
15640 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
15641
15642 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
15643 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
15644 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
15645 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
15646
15647 #else
15648
15649 extern BOOLEAN KdDebuggerNotPresent;
15650 extern BOOLEAN KdDebuggerEnabled;
15651 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
15652 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
15653
15654 #endif
15655
15656 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15657
15658 NTKERNELAPI
15659 NTSTATUS
15660 NTAPI
15661 KdDisableDebugger(VOID);
15662
15663 NTKERNELAPI
15664 NTSTATUS
15665 NTAPI
15666 KdEnableDebugger(VOID);
15667
15668 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
15669 #define DbgBreakPoint __debugbreak
15670 #else
15671 __analysis_noreturn
15672 VOID
15673 NTAPI
15674 DbgBreakPoint(VOID);
15675 #endif
15676
15677 __analysis_noreturn
15678 NTSYSAPI
15679 VOID
15680 NTAPI
15681 DbgBreakPointWithStatus(
15682 IN ULONG Status);
15683
15684 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15685
15686 #if (NTDDI_VERSION >= NTDDI_WS03)
15687 NTKERNELAPI
15688 BOOLEAN
15689 NTAPI
15690 KdRefreshDebuggerNotPresent(VOID);
15691 #endif
15692
15693 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
15694 NTKERNELAPI
15695 NTSTATUS
15696 NTAPI
15697 KdChangeOption(
15698 _In_ KD_OPTION Option,
15699 _In_opt_ ULONG InBufferBytes,
15700 _In_ PVOID InBuffer,
15701 _In_opt_ ULONG OutBufferBytes,
15702 _Out_ PVOID OutBuffer,
15703 _Out_opt_ PULONG OutBufferNeeded);
15704 #endif
15705 /* Hardware Abstraction Layer Functions */
15706
15707 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15708
15709 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
15710
15711 __drv_preferredFunction("AllocateCommonBuffer","Obsolete")
15712 FORCEINLINE
15713 PVOID
15714 NTAPI
15715 HalAllocateCommonBuffer(
15716 _In_ PDMA_ADAPTER DmaAdapter,
15717 _In_ ULONG Length,
15718 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
15719 _In_ BOOLEAN CacheEnabled)
15720 {
15721 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
15722 PVOID commonBuffer;
15723
15724 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
15725 ASSERT( allocateCommonBuffer != NULL );
15726 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
15727 return commonBuffer;
15728 }
15729
15730 __drv_preferredFunction("FreeCommonBuffer","Obsolete")
15731 FORCEINLINE
15732 VOID
15733 NTAPI
15734 HalFreeCommonBuffer(
15735 _In_ PDMA_ADAPTER DmaAdapter,
15736 _In_ ULONG Length,
15737 _In_ PHYSICAL_ADDRESS LogicalAddress,
15738 _In_ PVOID VirtualAddress,
15739 _In_ BOOLEAN CacheEnabled)
15740 {
15741 PFREE_COMMON_BUFFER freeCommonBuffer;
15742
15743 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
15744 ASSERT( freeCommonBuffer != NULL );
15745 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
15746 }
15747
15748 __drv_preferredFunction("ReadDmaCounter","Obsolete")
15749 FORCEINLINE
15750 ULONG
15751 NTAPI
15752 HalReadDmaCounter(
15753 _In_ PDMA_ADAPTER DmaAdapter)
15754 {
15755 PREAD_DMA_COUNTER readDmaCounter;
15756 ULONG counter;
15757
15758 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
15759 ASSERT( readDmaCounter != NULL );
15760 counter = readDmaCounter( DmaAdapter );
15761 return counter;
15762 }
15763
15764 FORCEINLINE
15765 ULONG
15766 HalGetDmaAlignment(
15767 _In_ PDMA_ADAPTER DmaAdapter)
15768 {
15769 PGET_DMA_ALIGNMENT getDmaAlignment;
15770 ULONG alignment;
15771
15772 getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
15773 ASSERT( getDmaAlignment != NULL );
15774 alignment = getDmaAlignment( DmaAdapter );
15775 return alignment;
15776 }
15777
15778 #endif /* USE_DMA_MACROS ... */
15779
15780 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15781
15782 #ifndef _NTTMAPI_
15783 #define _NTTMAPI_
15784
15785 #include <ktmtypes.h>
15786
15787 #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
15788 #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
15789 #define TRANSACTIONMANAGER_RECOVER (0x0004)
15790 #define TRANSACTIONMANAGER_RENAME (0x0008)
15791 #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
15792 #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
15793
15794 #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
15795 TRANSACTIONMANAGER_QUERY_INFORMATION)
15796
15797 #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15798 TRANSACTIONMANAGER_SET_INFORMATION |\
15799 TRANSACTIONMANAGER_RECOVER |\
15800 TRANSACTIONMANAGER_RENAME |\
15801 TRANSACTIONMANAGER_CREATE_RM)
15802
15803 #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
15804
15805 #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15806 TRANSACTIONMANAGER_GENERIC_READ |\
15807 TRANSACTIONMANAGER_GENERIC_WRITE |\
15808 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
15809 TRANSACTIONMANAGER_BIND_TRANSACTION)
15810
15811 #define TRANSACTION_QUERY_INFORMATION (0x0001)
15812 #define TRANSACTION_SET_INFORMATION (0x0002)
15813 #define TRANSACTION_ENLIST (0x0004)
15814 #define TRANSACTION_COMMIT (0x0008)
15815 #define TRANSACTION_ROLLBACK (0x0010)
15816 #define TRANSACTION_PROPAGATE (0x0020)
15817 #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
15818
15819 #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
15820 TRANSACTION_QUERY_INFORMATION |\
15821 SYNCHRONIZE)
15822
15823 #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15824 TRANSACTION_SET_INFORMATION |\
15825 TRANSACTION_COMMIT |\
15826 TRANSACTION_ENLIST |\
15827 TRANSACTION_ROLLBACK |\
15828 TRANSACTION_PROPAGATE |\
15829 SYNCHRONIZE)
15830
15831 #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
15832 TRANSACTION_COMMIT |\
15833 TRANSACTION_ROLLBACK |\
15834 SYNCHRONIZE)
15835
15836 #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15837 TRANSACTION_GENERIC_READ |\
15838 TRANSACTION_GENERIC_WRITE |\
15839 TRANSACTION_GENERIC_EXECUTE)
15840
15841 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
15842 STANDARD_RIGHTS_WRITE |\
15843 TRANSACTION_SET_INFORMATION |\
15844 TRANSACTION_ENLIST |\
15845 TRANSACTION_ROLLBACK |\
15846 TRANSACTION_PROPAGATE |\
15847 SYNCHRONIZE)
15848
15849 #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
15850 #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
15851 #define RESOURCEMANAGER_RECOVER (0x0004)
15852 #define RESOURCEMANAGER_ENLIST (0x0008)
15853 #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
15854 #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
15855 #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
15856
15857 #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
15858 RESOURCEMANAGER_QUERY_INFORMATION |\
15859 SYNCHRONIZE)
15860
15861 #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15862 RESOURCEMANAGER_SET_INFORMATION |\
15863 RESOURCEMANAGER_RECOVER |\
15864 RESOURCEMANAGER_ENLIST |\
15865 RESOURCEMANAGER_GET_NOTIFICATION |\
15866 RESOURCEMANAGER_REGISTER_PROTOCOL |\
15867 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
15868 SYNCHRONIZE)
15869
15870 #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
15871 RESOURCEMANAGER_RECOVER |\
15872 RESOURCEMANAGER_ENLIST |\
15873 RESOURCEMANAGER_GET_NOTIFICATION |\
15874 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
15875 SYNCHRONIZE)
15876
15877 #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15878 RESOURCEMANAGER_GENERIC_READ |\
15879 RESOURCEMANAGER_GENERIC_WRITE |\
15880 RESOURCEMANAGER_GENERIC_EXECUTE)
15881
15882 #define ENLISTMENT_QUERY_INFORMATION (0x0001)
15883 #define ENLISTMENT_SET_INFORMATION (0x0002)
15884 #define ENLISTMENT_RECOVER (0x0004)
15885 #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
15886 #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
15887
15888 #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
15889 ENLISTMENT_QUERY_INFORMATION)
15890
15891 #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15892 ENLISTMENT_SET_INFORMATION |\
15893 ENLISTMENT_RECOVER |\
15894 ENLISTMENT_SUBORDINATE_RIGHTS |\
15895 ENLISTMENT_SUPERIOR_RIGHTS)
15896
15897 #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
15898 ENLISTMENT_RECOVER |\
15899 ENLISTMENT_SUBORDINATE_RIGHTS |\
15900 ENLISTMENT_SUPERIOR_RIGHTS)
15901
15902 #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15903 ENLISTMENT_GENERIC_READ |\
15904 ENLISTMENT_GENERIC_WRITE |\
15905 ENLISTMENT_GENERIC_EXECUTE)
15906
15907 typedef enum _TRANSACTION_OUTCOME {
15908 TransactionOutcomeUndetermined = 1,
15909 TransactionOutcomeCommitted,
15910 TransactionOutcomeAborted,
15911 } TRANSACTION_OUTCOME;
15912
15913
15914 typedef enum _TRANSACTION_STATE {
15915 TransactionStateNormal = 1,
15916 TransactionStateIndoubt,
15917 TransactionStateCommittedNotify,
15918 } TRANSACTION_STATE;
15919
15920
15921 typedef struct _TRANSACTION_BASIC_INFORMATION {
15922 GUID TransactionId;
15923 ULONG State;
15924 ULONG Outcome;
15925 } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
15926
15927 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
15928 GUID TmIdentity;
15929 LARGE_INTEGER VirtualClock;
15930 } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
15931
15932 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
15933 GUID LogIdentity;
15934 } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
15935
15936 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
15937 ULONG LogPathLength;
15938 _Field_size_(LogPathLength) WCHAR LogPath[1];
15939 } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
15940
15941 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
15942 ULONGLONG LastRecoveredLsn;
15943 } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
15944
15945 typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
15946 ULONG IsolationLevel;
15947 ULONG IsolationFlags;
15948 LARGE_INTEGER Timeout;
15949 ULONG Outcome;
15950 ULONG DescriptionLength;
15951 WCHAR Description[1];
15952 } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
15953
15954 typedef struct _TRANSACTION_BIND_INFORMATION {
15955 HANDLE TmHandle;
15956 } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
15957
15958 typedef struct _TRANSACTION_ENLISTMENT_PAIR {
15959 GUID EnlistmentId;
15960 GUID ResourceManagerId;
15961 } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
15962
15963 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
15964 ULONG NumberOfEnlistments;
15965 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
15966 } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
15967
15968 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
15969 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
15970 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
15971
15972 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
15973 GUID ResourceManagerId;
15974 ULONG DescriptionLength;
15975 WCHAR Description[1];
15976 } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
15977
15978 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
15979 HANDLE IoCompletionPortHandle;
15980 ULONG_PTR CompletionKey;
15981 } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
15982
15983 typedef enum _KTMOBJECT_TYPE {
15984 KTMOBJECT_TRANSACTION,
15985 KTMOBJECT_TRANSACTION_MANAGER,
15986 KTMOBJECT_RESOURCE_MANAGER,
15987 KTMOBJECT_ENLISTMENT,
15988 KTMOBJECT_INVALID
15989 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
15990
15991 typedef struct _KTMOBJECT_CURSOR {
15992 GUID LastQuery;
15993 ULONG ObjectIdCount;
15994 GUID ObjectIds[1];
15995 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
15996
15997 typedef enum _TRANSACTION_INFORMATION_CLASS {
15998 TransactionBasicInformation,
15999 TransactionPropertiesInformation,
16000 TransactionEnlistmentInformation,
16001 TransactionSuperiorEnlistmentInformation
16002 } TRANSACTION_INFORMATION_CLASS;
16003
16004 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
16005 TransactionManagerBasicInformation,
16006 TransactionManagerLogInformation,
16007 TransactionManagerLogPathInformation,
16008 TransactionManagerRecoveryInformation = 4
16009 } TRANSACTIONMANAGER_INFORMATION_CLASS;
16010
16011 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
16012 ResourceManagerBasicInformation,
16013 ResourceManagerCompletionInformation,
16014 } RESOURCEMANAGER_INFORMATION_CLASS;
16015
16016 typedef struct _ENLISTMENT_BASIC_INFORMATION {
16017 GUID EnlistmentId;
16018 GUID TransactionId;
16019 GUID ResourceManagerId;
16020 } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
16021
16022 typedef struct _ENLISTMENT_CRM_INFORMATION {
16023 GUID CrmTransactionManagerId;
16024 GUID CrmResourceManagerId;
16025 GUID CrmEnlistmentId;
16026 } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
16027
16028 typedef enum _ENLISTMENT_INFORMATION_CLASS {
16029 EnlistmentBasicInformation,
16030 EnlistmentRecoveryInformation,
16031 EnlistmentCrmInformation
16032 } ENLISTMENT_INFORMATION_CLASS;
16033
16034 typedef struct _TRANSACTION_LIST_ENTRY {
16035 #if defined(__cplusplus)
16036 ::UOW UOW;
16037 #else
16038 UOW UOW;
16039 #endif
16040 } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
16041
16042 typedef struct _TRANSACTION_LIST_INFORMATION {
16043 ULONG NumberOfTransactions;
16044 TRANSACTION_LIST_ENTRY TransactionInformation[1];
16045 } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
16046
16047 typedef NTSTATUS
16048 (NTAPI *PFN_NT_CREATE_TRANSACTION)(
16049 _Out_ PHANDLE TransactionHandle,
16050 _In_ ACCESS_MASK DesiredAccess,
16051 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16052 _In_opt_ LPGUID Uow,
16053 _In_opt_ HANDLE TmHandle,
16054 _In_opt_ ULONG CreateOptions,
16055 _In_opt_ ULONG IsolationLevel,
16056 _In_opt_ ULONG IsolationFlags,
16057 _In_opt_ PLARGE_INTEGER Timeout,
16058 _In_opt_ PUNICODE_STRING Description);
16059
16060 typedef NTSTATUS
16061 (NTAPI *PFN_NT_OPEN_TRANSACTION)(
16062 _Out_ PHANDLE TransactionHandle,
16063 _In_ ACCESS_MASK DesiredAccess,
16064 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16065 _In_opt_ LPGUID Uow,
16066 _In_opt_ HANDLE TmHandle);
16067
16068 typedef NTSTATUS
16069 (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
16070 _In_ HANDLE TransactionHandle,
16071 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16072 _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16073 _In_ ULONG TransactionInformationLength,
16074 _Out_opt_ PULONG ReturnLength);
16075
16076 typedef NTSTATUS
16077 (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
16078 _In_ HANDLE TransactionHandle,
16079 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16080 _In_ PVOID TransactionInformation,
16081 _In_ ULONG TransactionInformationLength);
16082
16083 typedef NTSTATUS
16084 (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
16085 _In_ HANDLE TransactionHandle,
16086 _In_ BOOLEAN Wait);
16087
16088 typedef NTSTATUS
16089 (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
16090 _In_ HANDLE TransactionHandle,
16091 _In_ BOOLEAN Wait);
16092
16093 #if (NTDDI_VERSION >= NTDDI_VISTA)
16094
16095 _Must_inspect_result_
16096 _IRQL_requires_max_ (APC_LEVEL)
16097 __kernel_entry
16098 NTSYSCALLAPI
16099 NTSTATUS
16100 NTAPI
16101 NtCreateTransactionManager(
16102 _Out_ PHANDLE TmHandle,
16103 _In_ ACCESS_MASK DesiredAccess,
16104 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16105 _In_opt_ PUNICODE_STRING LogFileName,
16106 _In_opt_ ULONG CreateOptions,
16107 _In_opt_ ULONG CommitStrength);
16108
16109 _Must_inspect_result_
16110 _IRQL_requires_max_ (APC_LEVEL)
16111 __kernel_entry
16112 NTSYSCALLAPI
16113 NTSTATUS
16114 NTAPI
16115 NtOpenTransactionManager(
16116 _Out_ PHANDLE TmHandle,
16117 _In_ ACCESS_MASK DesiredAccess,
16118 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16119 _In_opt_ PUNICODE_STRING LogFileName,
16120 _In_opt_ LPGUID TmIdentity,
16121 _In_opt_ ULONG OpenOptions);
16122
16123 _Must_inspect_result_
16124 _IRQL_requires_max_ (APC_LEVEL)
16125 __kernel_entry
16126 NTSYSCALLAPI
16127 NTSTATUS
16128 NTAPI
16129 NtRenameTransactionManager(
16130 _In_ PUNICODE_STRING LogFileName,
16131 _In_ LPGUID ExistingTransactionManagerGuid);
16132
16133 _Must_inspect_result_
16134 _IRQL_requires_max_ (APC_LEVEL)
16135 __kernel_entry
16136 NTSYSCALLAPI
16137 NTSTATUS
16138 NTAPI
16139 NtRollforwardTransactionManager(
16140 _In_ HANDLE TransactionManagerHandle,
16141 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16142
16143 _Must_inspect_result_
16144 _IRQL_requires_max_ (APC_LEVEL)
16145 __kernel_entry
16146 NTSYSCALLAPI
16147 NTSTATUS
16148 NTAPI
16149 NtRecoverTransactionManager(
16150 _In_ HANDLE TransactionManagerHandle);
16151
16152 _Must_inspect_result_
16153 _IRQL_requires_max_ (APC_LEVEL)
16154 __kernel_entry
16155 NTSYSCALLAPI
16156 NTSTATUS
16157 NTAPI
16158 NtQueryInformationTransactionManager(
16159 _In_ HANDLE TransactionManagerHandle,
16160 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16161 _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
16162 _In_ ULONG TransactionManagerInformationLength,
16163 _Out_ PULONG ReturnLength);
16164
16165 _Must_inspect_result_
16166 _IRQL_requires_max_ (APC_LEVEL)
16167 __kernel_entry
16168 NTSYSCALLAPI
16169 NTSTATUS
16170 NTAPI
16171 NtSetInformationTransactionManager(
16172 _In_opt_ HANDLE TmHandle,
16173 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16174 _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
16175 _In_ ULONG TransactionManagerInformationLength);
16176
16177 _Must_inspect_result_
16178 _IRQL_requires_max_ (APC_LEVEL)
16179 __kernel_entry
16180 NTSYSCALLAPI
16181 NTSTATUS
16182 NTAPI
16183 NtEnumerateTransactionObject(
16184 _In_opt_ HANDLE RootObjectHandle,
16185 _In_ KTMOBJECT_TYPE QueryType,
16186 _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,
16187 _In_ ULONG ObjectCursorLength,
16188 _Out_ PULONG ReturnLength);
16189
16190 _Must_inspect_result_
16191 _IRQL_requires_max_ (APC_LEVEL)
16192 __kernel_entry
16193 NTSYSCALLAPI
16194 NTSTATUS
16195 NTAPI
16196 NtCreateTransaction(
16197 _Out_ PHANDLE TransactionHandle,
16198 _In_ ACCESS_MASK DesiredAccess,
16199 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16200 _In_opt_ LPGUID Uow,
16201 _In_opt_ HANDLE TmHandle,
16202 _In_opt_ ULONG CreateOptions,
16203 _In_opt_ ULONG IsolationLevel,
16204 _In_opt_ ULONG IsolationFlags,
16205 _In_opt_ PLARGE_INTEGER Timeout,
16206 _In_opt_ PUNICODE_STRING Description);
16207
16208 _Must_inspect_result_
16209 _IRQL_requires_max_ (APC_LEVEL)
16210 __kernel_entry
16211 NTSYSCALLAPI
16212 NTSTATUS
16213 NTAPI
16214 NtOpenTransaction(
16215 _Out_ PHANDLE TransactionHandle,
16216 _In_ ACCESS_MASK DesiredAccess,
16217 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16218 _In_ LPGUID Uow,
16219 _In_opt_ HANDLE TmHandle);
16220
16221 _Must_inspect_result_
16222 _IRQL_requires_max_ (APC_LEVEL)
16223 __kernel_entry
16224 NTSYSCALLAPI
16225 NTSTATUS
16226 NTAPI
16227 NtQueryInformationTransaction(
16228 _In_ HANDLE TransactionHandle,
16229 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16230 _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16231 _In_ ULONG TransactionInformationLength,
16232 _Out_opt_ PULONG ReturnLength);
16233
16234 _Must_inspect_result_
16235 _IRQL_requires_max_ (APC_LEVEL)
16236 __kernel_entry
16237 NTSYSCALLAPI
16238 NTSTATUS
16239 NTAPI
16240 NtSetInformationTransaction(
16241 _In_ HANDLE TransactionHandle,
16242 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16243 _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16244 _In_ ULONG TransactionInformationLength);
16245
16246 _IRQL_requires_max_ (APC_LEVEL)
16247 __kernel_entry
16248 NTSYSCALLAPI
16249 NTSTATUS
16250 NTAPI
16251 NtCommitTransaction(
16252 _In_ HANDLE TransactionHandle,
16253 _In_ BOOLEAN Wait);
16254
16255 _IRQL_requires_max_ (APC_LEVEL)
16256 __kernel_entry
16257 NTSYSCALLAPI
16258 NTSTATUS
16259 NTAPI
16260 NtRollbackTransaction(
16261 _In_ HANDLE TransactionHandle,
16262 _In_ BOOLEAN Wait);
16263
16264 _Must_inspect_result_
16265 _IRQL_requires_max_ (APC_LEVEL)
16266 __kernel_entry
16267 NTSYSCALLAPI
16268 NTSTATUS
16269 NTAPI
16270 NtCreateEnlistment(
16271 _Out_ PHANDLE EnlistmentHandle,
16272 _In_ ACCESS_MASK DesiredAccess,
16273 _In_ HANDLE ResourceManagerHandle,
16274 _In_ HANDLE TransactionHandle,
16275 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16276 _In_opt_ ULONG CreateOptions,
16277 _In_ NOTIFICATION_MASK NotificationMask,
16278 _In_opt_ PVOID EnlistmentKey);
16279
16280 _Must_inspect_result_
16281 _IRQL_requires_max_ (APC_LEVEL)
16282 __kernel_entry
16283 NTSYSCALLAPI
16284 NTSTATUS
16285 NTAPI
16286 NtOpenEnlistment(
16287 _Out_ PHANDLE EnlistmentHandle,
16288 _In_ ACCESS_MASK DesiredAccess,
16289 _In_ HANDLE ResourceManagerHandle,
16290 _In_ LPGUID EnlistmentGuid,
16291 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
16292
16293 _Must_inspect_result_
16294 _IRQL_requires_max_ (APC_LEVEL)
16295 __kernel_entry
16296 NTSYSCALLAPI
16297 NTSTATUS
16298 NTAPI
16299 NtQueryInformationEnlistment(
16300 _In_ HANDLE EnlistmentHandle,
16301 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
16302 _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
16303 _In_ ULONG EnlistmentInformationLength,
16304 _Out_ PULONG ReturnLength);
16305
16306 _Must_inspect_result_
16307 _IRQL_requires_max_ (APC_LEVEL)
16308 __kernel_entry
16309 NTSYSCALLAPI
16310 NTSTATUS
16311 NTAPI
16312 NtSetInformationEnlistment(
16313 _In_opt_ HANDLE EnlistmentHandle,
16314 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
16315 _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
16316 _In_ ULONG EnlistmentInformationLength);
16317
16318 _Must_inspect_result_
16319 _IRQL_requires_max_ (APC_LEVEL)
16320 __kernel_entry
16321 NTSYSCALLAPI
16322 NTSTATUS
16323 NTAPI
16324 NtRecoverEnlistment(
16325 _In_ HANDLE EnlistmentHandle,
16326 _In_opt_ PVOID EnlistmentKey);
16327
16328 _Must_inspect_result_
16329 _IRQL_requires_max_ (APC_LEVEL)
16330 __kernel_entry
16331 NTSYSCALLAPI
16332 NTSTATUS
16333 NTAPI
16334 NtPrePrepareEnlistment(
16335 _In_ HANDLE EnlistmentHandle,
16336 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16337
16338 _Must_inspect_result_
16339 _IRQL_requires_max_ (APC_LEVEL)
16340 __kernel_entry
16341 NTSYSCALLAPI
16342 NTSTATUS
16343 NTAPI
16344 NtPrepareEnlistment(
16345 _In_ HANDLE EnlistmentHandle,
16346 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16347
16348 _Must_inspect_result_
16349 _IRQL_requires_max_ (APC_LEVEL)
16350 __kernel_entry
16351 NTSYSCALLAPI
16352 NTSTATUS
16353 NTAPI
16354 NtCommitEnlistment(
16355 _In_ HANDLE EnlistmentHandle,
16356 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16357
16358 _IRQL_requires_max_ (APC_LEVEL)
16359 __kernel_entry
16360 NTSYSCALLAPI
16361 NTSTATUS
16362 NTAPI
16363 NtRollbackEnlistment(
16364 _In_ HANDLE EnlistmentHandle,
16365 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16366
16367 _IRQL_requires_max_ (APC_LEVEL)
16368 __kernel_entry
16369 NTSYSCALLAPI
16370 NTSTATUS
16371 NTAPI
16372 NtPrePrepareComplete(
16373 _In_ HANDLE EnlistmentHandle,
16374 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16375
16376 _IRQL_requires_max_ (APC_LEVEL)
16377 __kernel_entry
16378 NTSYSCALLAPI
16379 NTSTATUS
16380 NTAPI
16381 NtPrepareComplete(
16382 _In_ HANDLE EnlistmentHandle,
16383 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16384
16385 _IRQL_requires_max_ (APC_LEVEL)
16386 __kernel_entry
16387 NTSYSCALLAPI
16388 NTSTATUS
16389 NTAPI
16390 NtCommitComplete(
16391 _In_ HANDLE EnlistmentHandle,
16392 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16393
16394 _IRQL_requires_max_ (APC_LEVEL)
16395 __kernel_entry
16396 NTSYSCALLAPI
16397 NTSTATUS
16398 NTAPI
16399 NtReadOnlyEnlistment(
16400 _In_ HANDLE EnlistmentHandle,
16401 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16402
16403 _IRQL_requires_max_ (APC_LEVEL)
16404 __kernel_entry
16405 NTSYSCALLAPI
16406 NTSTATUS
16407 NTAPI
16408 NtRollbackComplete(
16409 _In_ HANDLE EnlistmentHandle,
16410 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16411
16412 _IRQL_requires_max_ (APC_LEVEL)
16413 __kernel_entry
16414 NTSYSCALLAPI
16415 NTSTATUS
16416 NTAPI
16417 NtSinglePhaseReject(
16418 _In_ HANDLE EnlistmentHandle,
16419 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16420
16421 _Must_inspect_result_
16422 _IRQL_requires_max_ (APC_LEVEL)
16423 __kernel_entry
16424 NTSYSCALLAPI
16425 NTSTATUS
16426 NTAPI
16427 NtCreateResourceManager(
16428 _Out_ PHANDLE ResourceManagerHandle,
16429 _In_ ACCESS_MASK DesiredAccess,
16430 _In_ HANDLE TmHandle,
16431 _In_ LPGUID RmGuid,
16432 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16433 _In_opt_ ULONG CreateOptions,
16434 _In_opt_ PUNICODE_STRING Description);
16435
16436 _Must_inspect_result_
16437 _IRQL_requires_max_ (APC_LEVEL)
16438 __kernel_entry
16439 NTSYSCALLAPI
16440 NTSTATUS
16441 NTAPI
16442 NtOpenResourceManager(
16443 _Out_ PHANDLE ResourceManagerHandle,
16444 _In_ ACCESS_MASK DesiredAccess,
16445 _In_ HANDLE TmHandle,
16446 _In_opt_ LPGUID ResourceManagerGuid,
16447 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
16448
16449 _Must_inspect_result_
16450 _IRQL_requires_max_ (APC_LEVEL)
16451 __kernel_entry
16452 NTSYSCALLAPI
16453 NTSTATUS
16454 NTAPI
16455 NtRecoverResourceManager(
16456 _In_ HANDLE ResourceManagerHandle);
16457
16458 _Must_inspect_result_
16459 _IRQL_requires_max_ (APC_LEVEL)
16460 __kernel_entry
16461 NTSYSCALLAPI
16462 NTSTATUS
16463 NTAPI
16464 NtGetNotificationResourceManager(
16465 _In_ HANDLE ResourceManagerHandle,
16466 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,
16467 _In_ ULONG NotificationLength,
16468 _In_opt_ PLARGE_INTEGER Timeout,
16469 _Out_opt_ PULONG ReturnLength,
16470 _In_ ULONG Asynchronous,
16471 _In_opt_ ULONG_PTR AsynchronousContext);
16472
16473 _Must_inspect_result_
16474 _IRQL_requires_max_ (APC_LEVEL)
16475 __kernel_entry
16476 NTSYSCALLAPI
16477 NTSTATUS
16478 NTAPI
16479 NtQueryInformationResourceManager(
16480 _In_ HANDLE ResourceManagerHandle,
16481 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
16482 _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
16483 _In_ ULONG ResourceManagerInformationLength,
16484 _Out_opt_ PULONG ReturnLength);
16485
16486 _Must_inspect_result_
16487 _IRQL_requires_max_ (APC_LEVEL)
16488 __kernel_entry
16489 NTSYSCALLAPI
16490 NTSTATUS
16491 NTAPI
16492 NtSetInformationResourceManager(
16493 _In_ HANDLE ResourceManagerHandle,
16494 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
16495 _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
16496 _In_ ULONG ResourceManagerInformationLength);
16497
16498 _Must_inspect_result_
16499 _IRQL_requires_max_ (APC_LEVEL)
16500 __kernel_entry
16501 NTSYSCALLAPI
16502 NTSTATUS
16503 NTAPI
16504 NtRegisterProtocolAddressInformation(
16505 _In_ HANDLE ResourceManager,
16506 _In_ PCRM_PROTOCOL_ID ProtocolId,
16507 _In_ ULONG ProtocolInformationSize,
16508 _In_ PVOID ProtocolInformation,
16509 _In_opt_ ULONG CreateOptions);
16510
16511 _IRQL_requires_max_ (APC_LEVEL)
16512 __kernel_entry
16513 NTSYSCALLAPI
16514 NTSTATUS
16515 NTAPI
16516 NtPropagationComplete(
16517 _In_ HANDLE ResourceManagerHandle,
16518 _In_ ULONG RequestCookie,
16519 _In_ ULONG BufferLength,
16520 _In_ PVOID Buffer);
16521
16522 _IRQL_requires_max_ (APC_LEVEL)
16523 __kernel_entry
16524 NTSYSCALLAPI
16525 NTSTATUS
16526 NTAPI
16527 NtPropagationFailed(
16528 _In_ HANDLE ResourceManagerHandle,
16529 _In_ ULONG RequestCookie,
16530 _In_ NTSTATUS PropStatus);
16531
16532 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
16533
16534 #endif /* !_NTTMAPI_ */
16535 /******************************************************************************
16536 * ZwXxx Functions *
16537 ******************************************************************************/
16538
16539
16540 /* Constants */
16541 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
16542 #define ZwCurrentProcess() NtCurrentProcess()
16543 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
16544 #define ZwCurrentThread() NtCurrentThread()
16545
16546
16547 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16548
16549 _IRQL_requires_max_(PASSIVE_LEVEL)
16550 NTSYSAPI
16551 NTSTATUS
16552 NTAPI
16553 ZwClose(
16554 _In_ HANDLE Handle);
16555
16556 _IRQL_requires_max_(PASSIVE_LEVEL)
16557 NTSYSAPI
16558 NTSTATUS
16559 NTAPI
16560 ZwCreateDirectoryObject(
16561 _Out_ PHANDLE DirectoryHandle,
16562 _In_ ACCESS_MASK DesiredAccess,
16563 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16564
16565 _IRQL_requires_max_(PASSIVE_LEVEL)
16566 NTSYSAPI
16567 NTSTATUS
16568 NTAPI
16569 ZwCreateFile(
16570 _Out_ PHANDLE FileHandle,
16571 _In_ ACCESS_MASK DesiredAccess,
16572 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16573 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16574 _In_opt_ PLARGE_INTEGER AllocationSize,
16575 _In_ ULONG FileAttributes,
16576 _In_ ULONG ShareAccess,
16577 _In_ ULONG CreateDisposition,
16578 _In_ ULONG CreateOptions,
16579 _In_reads_bytes_opt_(EaLength) PVOID EaBuffer,
16580 _In_ ULONG EaLength);
16581
16582 _IRQL_requires_max_(PASSIVE_LEVEL)
16583 NTSYSAPI
16584 NTSTATUS
16585 NTAPI
16586 ZwCreateKey(
16587 _Out_ PHANDLE KeyHandle,
16588 _In_ ACCESS_MASK DesiredAccess,
16589 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16590 _Reserved_ ULONG TitleIndex,
16591 _In_opt_ PUNICODE_STRING Class,
16592 _In_ ULONG CreateOptions,
16593 _Out_opt_ PULONG Disposition);
16594
16595 _IRQL_requires_max_(APC_LEVEL)
16596 NTSYSAPI
16597 NTSTATUS
16598 NTAPI
16599 ZwCreateSection(
16600 _Out_ PHANDLE SectionHandle,
16601 _In_ ACCESS_MASK DesiredAccess,
16602 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16603 _In_opt_ PLARGE_INTEGER MaximumSize,
16604 _In_ ULONG SectionPageProtection,
16605 _In_ ULONG AllocationAttributes,
16606 _In_opt_ HANDLE FileHandle);
16607
16608 _IRQL_requires_max_(PASSIVE_LEVEL)
16609 NTSYSAPI
16610 NTSTATUS
16611 NTAPI
16612 ZwDeleteKey(
16613 _In_ HANDLE KeyHandle);
16614
16615 _IRQL_requires_max_(PASSIVE_LEVEL)
16616 NTSYSAPI
16617 NTSTATUS
16618 NTAPI
16619 ZwDeleteValueKey(
16620 _In_ HANDLE KeyHandle,
16621 _In_ PUNICODE_STRING ValueName);
16622
16623 _IRQL_requires_max_(PASSIVE_LEVEL)
16624 _When_(Length == 0, _Post_satisfies_(return < 0))
16625 _When_(Length > 0, _Post_satisfies_(return <= 0))
16626 NTSYSAPI
16627 NTSTATUS
16628 NTAPI
16629 ZwEnumerateKey(
16630 _In_ HANDLE KeyHandle,
16631 _In_ ULONG Index,
16632 _In_ KEY_INFORMATION_CLASS KeyInformationClass,
16633 _Out_writes_bytes_opt_(Length) PVOID KeyInformation,
16634 _In_ ULONG Length,
16635 _Out_ PULONG ResultLength);
16636
16637 _IRQL_requires_max_(PASSIVE_LEVEL)
16638 _When_(Length == 0, _Post_satisfies_(return < 0))
16639 _When_(Length > 0, _Post_satisfies_(return <= 0))
16640 NTSYSAPI
16641 NTSTATUS
16642 NTAPI
16643 ZwEnumerateValueKey(
16644 _In_ HANDLE KeyHandle,
16645 _In_ ULONG Index,
16646 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
16647 _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation,
16648 _In_ ULONG Length,
16649 _Out_ PULONG ResultLength);
16650
16651 _IRQL_requires_max_(PASSIVE_LEVEL)
16652 NTSYSAPI
16653 NTSTATUS
16654 NTAPI
16655 ZwFlushKey(
16656 _In_ HANDLE KeyHandle);
16657
16658 _IRQL_requires_max_(PASSIVE_LEVEL)
16659 NTSYSAPI
16660 NTSTATUS
16661 NTAPI
16662 ZwLoadDriver(
16663 _In_ PUNICODE_STRING DriverServiceName);
16664
16665 _IRQL_requires_max_(PASSIVE_LEVEL)
16666 NTSYSAPI
16667 NTSTATUS
16668 NTAPI
16669 ZwMakeTemporaryObject(
16670 _In_ HANDLE Handle);
16671
16672 _IRQL_requires_max_(PASSIVE_LEVEL)
16673 NTSYSAPI
16674 NTSTATUS
16675 NTAPI
16676 ZwMapViewOfSection(
16677 _In_ HANDLE SectionHandle,
16678 _In_ HANDLE ProcessHandle,
16679 _Outptr_result_bytebuffer_(*ViewSize) PVOID *BaseAddress,
16680 _In_ ULONG_PTR ZeroBits,
16681 _In_ SIZE_T CommitSize,
16682 _Inout_opt_ PLARGE_INTEGER SectionOffset,
16683 _Inout_ PSIZE_T ViewSize,
16684 _In_ SECTION_INHERIT InheritDisposition,
16685 _In_ ULONG AllocationType,
16686 _In_ ULONG Protect);
16687
16688 _IRQL_requires_max_(PASSIVE_LEVEL)
16689 NTSYSAPI
16690 NTSTATUS
16691 NTAPI
16692 ZwOpenFile(
16693 _Out_ PHANDLE FileHandle,
16694 _In_ ACCESS_MASK DesiredAccess,
16695 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16696 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16697 _In_ ULONG ShareAccess,
16698 _In_ ULONG OpenOptions);
16699
16700 _IRQL_requires_max_(PASSIVE_LEVEL)
16701 NTSYSAPI
16702 NTSTATUS
16703 NTAPI
16704 ZwOpenKey(
16705 _Out_ PHANDLE KeyHandle,
16706 _In_ ACCESS_MASK DesiredAccess,
16707 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16708
16709 _IRQL_requires_max_(PASSIVE_LEVEL)
16710 NTSYSAPI
16711 NTSTATUS
16712 NTAPI
16713 ZwOpenSection(
16714 _Out_ PHANDLE SectionHandle,
16715 _In_ ACCESS_MASK DesiredAccess,
16716 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16717
16718 _IRQL_requires_max_(PASSIVE_LEVEL)
16719 NTSYSAPI
16720 NTSTATUS
16721 NTAPI
16722 ZwOpenSymbolicLinkObject(
16723 _Out_ PHANDLE LinkHandle,
16724 _In_ ACCESS_MASK DesiredAccess,
16725 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16726
16727 _IRQL_requires_max_(PASSIVE_LEVEL)
16728 NTSYSAPI
16729 NTSTATUS
16730 NTAPI
16731 ZwQueryInformationFile(
16732 _In_ HANDLE FileHandle,
16733 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16734 _Out_writes_bytes_(Length) PVOID FileInformation,
16735 _In_ ULONG Length,
16736 _In_ FILE_INFORMATION_CLASS FileInformationClass);
16737
16738 _IRQL_requires_max_(PASSIVE_LEVEL)
16739 _When_(Length == 0, _Post_satisfies_(return < 0))
16740 _When_(Length > 0, _Post_satisfies_(return <= 0))
16741 NTSYSAPI
16742 NTSTATUS
16743 NTAPI
16744 ZwQueryKey(
16745 _In_ HANDLE KeyHandle,
16746 _In_ KEY_INFORMATION_CLASS KeyInformationClass,
16747 _Out_writes_bytes_opt_(Length) PVOID KeyInformation,
16748 _In_ ULONG Length,
16749 _Out_ PULONG ResultLength);
16750
16751 _IRQL_requires_max_(PASSIVE_LEVEL)
16752 NTSYSAPI
16753 NTSTATUS
16754 NTAPI
16755 ZwQuerySymbolicLinkObject(
16756 _In_ HANDLE LinkHandle,
16757 _Inout_ PUNICODE_STRING LinkTarget,
16758 _Out_opt_ PULONG ReturnedLength);
16759
16760 _IRQL_requires_max_(PASSIVE_LEVEL)
16761 _When_(Length == 0, _Post_satisfies_(return < 0))
16762 _When_(Length > 0, _Post_satisfies_(return <= 0))
16763 NTSYSAPI
16764 NTSTATUS
16765 NTAPI
16766 ZwQueryValueKey(
16767 _In_ HANDLE KeyHandle,
16768 _In_ PUNICODE_STRING ValueName,
16769 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
16770 _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation,
16771 _In_ ULONG Length,
16772 _Out_ PULONG ResultLength);
16773
16774 _IRQL_requires_max_(PASSIVE_LEVEL)
16775 NTSYSAPI
16776 NTSTATUS
16777 NTAPI
16778 ZwReadFile(
16779 _In_ HANDLE FileHandle,
16780 _In_opt_ HANDLE Event,
16781 _In_opt_ PIO_APC_ROUTINE ApcRoutine,
16782 _In_opt_ PVOID ApcContext,
16783 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16784 _Out_writes_bytes_(Length) PVOID Buffer,
16785 _In_ ULONG Length,
16786 _In_opt_ PLARGE_INTEGER ByteOffset,
16787 _In_opt_ PULONG Key);
16788
16789 _IRQL_requires_max_(PASSIVE_LEVEL)
16790 NTSYSAPI
16791 NTSTATUS
16792 NTAPI
16793 ZwSetInformationFile(
16794 _In_ HANDLE FileHandle,
16795 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16796 _In_reads_bytes_(Length) PVOID FileInformation,
16797 _In_ ULONG Length,
16798 _In_ FILE_INFORMATION_CLASS FileInformationClass);
16799
16800 _IRQL_requires_max_(PASSIVE_LEVEL)
16801 NTSYSAPI
16802 NTSTATUS
16803 NTAPI
16804 ZwSetValueKey(
16805 _In_ HANDLE KeyHandle,
16806 _In_ PUNICODE_STRING ValueName,
16807 _In_opt_ ULONG TitleIndex,
16808 _In_ ULONG Type,
16809 _In_reads_bytes_opt_(DataSize) PVOID Data,
16810 _In_ ULONG DataSize);
16811
16812 _IRQL_requires_max_(PASSIVE_LEVEL)
16813 NTSYSAPI
16814 NTSTATUS
16815 NTAPI
16816 ZwUnloadDriver(
16817 _In_ PUNICODE_STRING DriverServiceName);
16818
16819 _IRQL_requires_max_(PASSIVE_LEVEL)
16820 NTSYSAPI
16821 NTSTATUS
16822 NTAPI
16823 ZwUnmapViewOfSection(
16824 _In_ HANDLE ProcessHandle,
16825 _In_opt_ PVOID BaseAddress);
16826
16827 _IRQL_requires_max_(PASSIVE_LEVEL)
16828 NTSYSAPI
16829 NTSTATUS
16830 NTAPI
16831 ZwWriteFile(
16832 _In_ HANDLE FileHandle,
16833 _In_opt_ HANDLE Event,
16834 _In_opt_ PIO_APC_ROUTINE ApcRoutine,
16835 _In_opt_ PVOID ApcContext,
16836 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16837 _In_reads_bytes_(Length) PVOID Buffer,
16838 _In_ ULONG Length,
16839 _In_opt_ PLARGE_INTEGER ByteOffset,
16840 _In_opt_ PULONG Key);
16841
16842 _IRQL_requires_max_(PASSIVE_LEVEL)
16843 NTSYSAPI
16844 NTSTATUS
16845 NTAPI
16846 ZwQueryFullAttributesFile(
16847 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16848 _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation);
16849
16850 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
16851
16852
16853 #if (NTDDI_VERSION >= NTDDI_WS03)
16854 _IRQL_requires_max_(PASSIVE_LEVEL)
16855 NTSYSCALLAPI
16856 NTSTATUS
16857 NTAPI
16858 ZwOpenEvent(
16859 _Out_ PHANDLE EventHandle,
16860 _In_ ACCESS_MASK DesiredAccess,
16861 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16862 #endif
16863
16864 #if (NTDDI_VERSION >= NTDDI_VISTA)
16865
16866 _IRQL_requires_max_(PASSIVE_LEVEL)
16867 NTSYSAPI
16868 NTSTATUS
16869 ZwCreateKeyTransacted(
16870 _Out_ PHANDLE KeyHandle,
16871 _In_ ACCESS_MASK DesiredAccess,
16872 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16873 _Reserved_ ULONG TitleIndex,
16874 _In_opt_ PUNICODE_STRING Class,
16875 _In_ ULONG CreateOptions,
16876 _In_ HANDLE TransactionHandle,
16877 _Out_opt_ PULONG Disposition);
16878
16879 _IRQL_requires_max_(PASSIVE_LEVEL)
16880 NTSYSAPI
16881 NTSTATUS
16882 NTAPI
16883 ZwOpenKeyTransacted(
16884 _Out_ PHANDLE KeyHandle,
16885 _In_ ACCESS_MASK DesiredAccess,
16886 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16887 _In_ HANDLE TransactionHandle);
16888
16889 _IRQL_requires_max_(PASSIVE_LEVEL)
16890 NTSYSCALLAPI
16891 NTSTATUS
16892 NTAPI
16893 ZwCreateTransactionManager(
16894 _Out_ PHANDLE TmHandle,
16895 _In_ ACCESS_MASK DesiredAccess,
16896 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16897 _In_opt_ PUNICODE_STRING LogFileName,
16898 _In_opt_ ULONG CreateOptions,
16899 _In_opt_ ULONG CommitStrength);
16900
16901 _IRQL_requires_max_(PASSIVE_LEVEL)
16902 NTSYSCALLAPI
16903 NTSTATUS
16904 NTAPI
16905 ZwOpenTransactionManager(
16906 _Out_ PHANDLE TmHandle,
16907 _In_ ACCESS_MASK DesiredAccess,
16908 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16909 _In_opt_ PUNICODE_STRING LogFileName,
16910 _In_opt_ LPGUID TmIdentity,
16911 _In_opt_ ULONG OpenOptions);
16912
16913 _IRQL_requires_max_(PASSIVE_LEVEL)
16914 NTSYSCALLAPI
16915 NTSTATUS
16916 NTAPI
16917 ZwRollforwardTransactionManager(
16918 _In_ HANDLE TransactionManagerHandle,
16919 _In_opt_ PLARGE_INTEGER TmVirtualClock);
16920
16921 _IRQL_requires_max_(PASSIVE_LEVEL)
16922 NTSYSCALLAPI
16923 NTSTATUS
16924 NTAPI
16925 ZwRecoverTransactionManager(
16926 _In_ HANDLE TransactionManagerHandle);
16927
16928 _IRQL_requires_max_(PASSIVE_LEVEL)
16929 NTSYSCALLAPI
16930 NTSTATUS
16931 NTAPI
16932 ZwQueryInformationTransactionManager(
16933 _In_ HANDLE TransactionManagerHandle,
16934 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16935 _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
16936 _In_ ULONG TransactionManagerInformationLength,
16937 _Out_opt_ PULONG ReturnLength);
16938
16939 _IRQL_requires_max_(PASSIVE_LEVEL)
16940 NTSYSCALLAPI
16941 NTSTATUS
16942 NTAPI
16943 ZwSetInformationTransactionManager(
16944 _In_ HANDLE TmHandle,
16945 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16946 _In_ PVOID TransactionManagerInformation,
16947 _In_ ULONG TransactionManagerInformationLength);
16948
16949 _IRQL_requires_max_(PASSIVE_LEVEL)
16950 NTSYSCALLAPI
16951 NTSTATUS
16952 NTAPI
16953 ZwEnumerateTransactionObject(
16954 _In_opt_ HANDLE RootObjectHandle,
16955 _In_ KTMOBJECT_TYPE QueryType,
16956 _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,
16957 _In_ ULONG ObjectCursorLength,
16958 _Out_ PULONG ReturnLength);
16959
16960 _IRQL_requires_max_(PASSIVE_LEVEL)
16961 NTSYSCALLAPI
16962 NTSTATUS
16963 NTAPI
16964 ZwCreateTransaction(
16965 _Out_ PHANDLE TransactionHandle,
16966 _In_ ACCESS_MASK DesiredAccess,
16967 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16968 _In_opt_ LPGUID Uow,
16969 _In_opt_ HANDLE TmHandle,
16970 _In_opt_ ULONG CreateOptions,
16971 _In_opt_ ULONG IsolationLevel,
16972 _In_opt_ ULONG IsolationFlags,
16973 _In_opt_ PLARGE_INTEGER Timeout,
16974 _In_opt_ PUNICODE_STRING Description);
16975
16976 _IRQL_requires_max_(PASSIVE_LEVEL)
16977 NTSYSCALLAPI
16978 NTSTATUS
16979 NTAPI
16980 ZwOpenTransaction(
16981 _Out_ PHANDLE TransactionHandle,
16982 _In_ ACCESS_MASK DesiredAccess,
16983 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16984 _In_ LPGUID Uow,
16985 _In_opt_ HANDLE TmHandle);
16986
16987 _IRQL_requires_max_(PASSIVE_LEVEL)
16988 NTSYSCALLAPI
16989 NTSTATUS
16990 NTAPI
16991 ZwQueryInformationTransaction(
16992 _In_ HANDLE TransactionHandle,
16993 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16994 _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16995 _In_ ULONG TransactionInformationLength,
16996 _Out_opt_ PULONG ReturnLength);
16997
16998 _IRQL_requires_max_(PASSIVE_LEVEL)
16999 NTSYSCALLAPI
17000 NTSTATUS
17001 NTAPI
17002 ZwSetInformationTransaction(
17003 _In_ HANDLE TransactionHandle,
17004 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
17005 _In_ PVOID TransactionInformation,
17006 _In_ ULONG TransactionInformationLength);
17007
17008 _IRQL_requires_max_(PASSIVE_LEVEL)
17009 NTSYSCALLAPI
17010 NTSTATUS
17011 NTAPI
17012 ZwCommitTransaction(
17013 _In_ HANDLE TransactionHandle,
17014 _In_ BOOLEAN Wait);
17015
17016 _IRQL_requires_max_(PASSIVE_LEVEL)
17017 NTSYSCALLAPI
17018 NTSTATUS
17019 NTAPI
17020 ZwRollbackTransaction(
17021 _In_ HANDLE TransactionHandle,
17022 _In_ BOOLEAN Wait);
17023
17024 _IRQL_requires_max_(PASSIVE_LEVEL)
17025 NTSYSCALLAPI
17026 NTSTATUS
17027 NTAPI
17028 ZwCreateResourceManager(
17029 _Out_ PHANDLE ResourceManagerHandle,
17030 _In_ ACCESS_MASK DesiredAccess,
17031 _In_ HANDLE TmHandle,
17032 _In_opt_ LPGUID ResourceManagerGuid,
17033 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17034 _In_opt_ ULONG CreateOptions,
17035 _In_opt_ PUNICODE_STRING Description);
17036
17037 _IRQL_requires_max_(PASSIVE_LEVEL)
17038 NTSYSCALLAPI
17039 NTSTATUS
17040 NTAPI
17041 ZwOpenResourceManager(
17042 _Out_ PHANDLE ResourceManagerHandle,
17043 _In_ ACCESS_MASK DesiredAccess,
17044 _In_ HANDLE TmHandle,
17045 _In_ LPGUID ResourceManagerGuid,
17046 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
17047
17048 _IRQL_requires_max_(PASSIVE_LEVEL)
17049 NTSYSCALLAPI
17050 NTSTATUS
17051 NTAPI
17052 ZwRecoverResourceManager(
17053 _In_ HANDLE ResourceManagerHandle);
17054
17055 _IRQL_requires_max_(PASSIVE_LEVEL)
17056 NTSYSCALLAPI
17057 NTSTATUS
17058 NTAPI
17059 ZwGetNotificationResourceManager(
17060 _In_ HANDLE ResourceManagerHandle,
17061 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,
17062 _In_ ULONG NotificationLength,
17063 _In_ PLARGE_INTEGER Timeout,
17064 _Out_opt_ PULONG ReturnLength,
17065 _In_ ULONG Asynchronous,
17066 _In_opt_ ULONG_PTR AsynchronousContext);
17067
17068 _IRQL_requires_max_(PASSIVE_LEVEL)
17069 NTSYSCALLAPI
17070 NTSTATUS
17071 NTAPI
17072 ZwQueryInformationResourceManager(
17073 _In_ HANDLE ResourceManagerHandle,
17074 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
17075 _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
17076 _In_ ULONG ResourceManagerInformationLength,
17077 _Out_opt_ PULONG ReturnLength);
17078
17079 _IRQL_requires_max_(PASSIVE_LEVEL)
17080 NTSYSCALLAPI
17081 NTSTATUS
17082 NTAPI
17083 ZwSetInformationResourceManager(
17084 _In_ HANDLE ResourceManagerHandle,
17085 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
17086 _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
17087 _In_ ULONG ResourceManagerInformationLength);
17088
17089 _IRQL_requires_max_(PASSIVE_LEVEL)
17090 NTSYSCALLAPI
17091 NTSTATUS
17092 NTAPI
17093 ZwCreateEnlistment(
17094 _Out_ PHANDLE EnlistmentHandle,
17095 _In_ ACCESS_MASK DesiredAccess,
17096 _In_ HANDLE ResourceManagerHandle,
17097 _In_ HANDLE TransactionHandle,
17098 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17099 _In_opt_ ULONG CreateOptions,
17100 _In_ NOTIFICATION_MASK NotificationMask,
17101 _In_opt_ PVOID EnlistmentKey);
17102
17103 _IRQL_requires_max_(PASSIVE_LEVEL)
17104 NTSYSCALLAPI
17105 NTSTATUS
17106 NTAPI
17107 ZwOpenEnlistment(
17108 _Out_ PHANDLE EnlistmentHandle,
17109 _In_ ACCESS_MASK DesiredAccess,
17110 _In_ HANDLE RmHandle,
17111 _In_ LPGUID EnlistmentGuid,
17112 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
17113
17114 _IRQL_requires_max_(PASSIVE_LEVEL)
17115 NTSYSCALLAPI
17116 NTSTATUS
17117 NTAPI
17118 ZwQueryInformationEnlistment(
17119 _In_ HANDLE EnlistmentHandle,
17120 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
17121 _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
17122 _In_ ULONG EnlistmentInformationLength,
17123 _Out_opt_ PULONG ReturnLength);
17124
17125 _IRQL_requires_max_(PASSIVE_LEVEL)
17126 NTSYSCALLAPI
17127 NTSTATUS
17128 NTAPI
17129 ZwSetInformationEnlistment(
17130 _In_ HANDLE EnlistmentHandle,
17131 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
17132 _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
17133 _In_ ULONG EnlistmentInformationLength);
17134
17135 _IRQL_requires_max_(PASSIVE_LEVEL)
17136 NTSYSCALLAPI
17137 NTSTATUS
17138 NTAPI
17139 ZwRecoverEnlistment(
17140 _In_ HANDLE EnlistmentHandle,
17141 _In_opt_ PVOID EnlistmentKey);
17142
17143 _IRQL_requires_max_(PASSIVE_LEVEL)
17144 NTSYSCALLAPI
17145 NTSTATUS
17146 NTAPI
17147 ZwPrePrepareEnlistment(
17148 _In_ HANDLE EnlistmentHandle,
17149 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17150
17151 _IRQL_requires_max_(PASSIVE_LEVEL)
17152 NTSYSCALLAPI
17153 NTSTATUS
17154 NTAPI
17155 ZwPrepareEnlistment(
17156 _In_ HANDLE EnlistmentHandle,
17157 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17158
17159 _IRQL_requires_max_(PASSIVE_LEVEL)
17160 NTSYSCALLAPI
17161 NTSTATUS
17162 NTAPI
17163 ZwCommitEnlistment(
17164 _In_ HANDLE EnlistmentHandle,
17165 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17166
17167 _IRQL_requires_max_(PASSIVE_LEVEL)
17168 NTSYSCALLAPI
17169 NTSTATUS
17170 NTAPI
17171 ZwRollbackEnlistment(
17172 _In_ HANDLE EnlistmentHandle,
17173 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17174
17175 _IRQL_requires_max_(PASSIVE_LEVEL)
17176 NTSYSCALLAPI
17177 NTSTATUS
17178 NTAPI
17179 ZwPrePrepareComplete(
17180 _In_ HANDLE EnlistmentHandle,
17181 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17182
17183 _IRQL_requires_max_(PASSIVE_LEVEL)
17184 NTSYSCALLAPI
17185 NTSTATUS
17186 NTAPI
17187 ZwPrepareComplete(
17188 _In_ HANDLE EnlistmentHandle,
17189 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17190
17191 _IRQL_requires_max_(PASSIVE_LEVEL)
17192 NTSYSCALLAPI
17193 NTSTATUS
17194 NTAPI
17195 ZwCommitComplete(
17196 _In_ HANDLE EnlistmentHandle,
17197 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17198
17199 _IRQL_requires_max_(PASSIVE_LEVEL)
17200 NTSYSCALLAPI
17201 NTSTATUS
17202 NTAPI
17203 ZwReadOnlyEnlistment(
17204 _In_ HANDLE EnlistmentHandle,
17205 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17206
17207 NTSYSCALLAPI
17208 NTSTATUS
17209 NTAPI
17210 ZwRollbackComplete(
17211 IN HANDLE EnlistmentHandle,
17212 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
17213
17214 NTSYSCALLAPI
17215 NTSTATUS
17216 NTAPI
17217 ZwSinglePhaseReject(
17218 _In_ HANDLE EnlistmentHandle,
17219 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17220 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
17221 #if (NTDDI_VERSION >= NTDDI_WIN7)
17222
17223 _IRQL_requires_max_(PASSIVE_LEVEL)
17224 NTSYSAPI
17225 NTSTATUS
17226 NTAPI
17227 ZwOpenKeyEx(
17228 _Out_ PHANDLE KeyHandle,
17229 _In_ ACCESS_MASK DesiredAccess,
17230 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17231 _In_ ULONG OpenOptions);
17232
17233 _IRQL_requires_max_(PASSIVE_LEVEL)
17234 NTSYSAPI
17235 NTSTATUS
17236 NTAPI
17237 ZwOpenKeyTransactedEx(
17238 _Out_ PHANDLE KeyHandle,
17239 _In_ ACCESS_MASK DesiredAccess,
17240 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17241 _In_ ULONG OpenOptions,
17242 _In_ HANDLE TransactionHandle);
17243
17244 NTSYSAPI
17245 NTSTATUS
17246 NTAPI
17247 ZwNotifyChangeMultipleKeys(
17248 IN HANDLE MasterKeyHandle,
17249 IN ULONG Count OPTIONAL,
17250 IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
17251 IN HANDLE Event OPTIONAL,
17252 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
17253 IN PVOID ApcContext OPTIONAL,
17254 OUT PIO_STATUS_BLOCK IoStatusBlock,
17255 IN ULONG CompletionFilter,
17256 IN BOOLEAN WatchTree,
17257 OUT PVOID Buffer OPTIONAL,
17258 IN ULONG BufferSize,
17259 IN BOOLEAN Asynchronous);
17260
17261 NTSYSAPI
17262 NTSTATUS
17263 NTAPI
17264 ZwQueryMultipleValueKey(
17265 IN HANDLE KeyHandle,
17266 IN OUT PKEY_VALUE_ENTRY ValueEntries,
17267 IN ULONG EntryCount,
17268 OUT PVOID ValueBuffer,
17269 IN OUT PULONG BufferLength,
17270 OUT PULONG RequiredBufferLength OPTIONAL);
17271
17272 _IRQL_requires_max_(PASSIVE_LEVEL)
17273 NTSYSAPI
17274 NTSTATUS
17275 NTAPI
17276 ZwRenameKey(
17277 _In_ HANDLE KeyHandle,
17278 _In_ PUNICODE_STRING NewName);
17279
17280 _IRQL_requires_max_(PASSIVE_LEVEL)
17281 NTSYSAPI
17282 NTSTATUS
17283 NTAPI
17284 ZwSetInformationKey(
17285 _In_ HANDLE KeyHandle,
17286 _In_ __drv_strictTypeMatch(__drv_typeConst) KEY_SET_INFORMATION_CLASS KeySetInformationClass,
17287 _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation,
17288 _In_ ULONG KeySetInformationLength);
17289
17290 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
17291
17292
17293 #ifdef __cplusplus
17294 }
17295 #endif
17296
17297 #endif /* !_WDMDDK_ */