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