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