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