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