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