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