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