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