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