[MMEBUDDY]
[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 #define IRP_RETRY_IO_COMPLETION 0x00004000
5460 #define IRP_CLASS_CACHE_OPERATION 0x00008000
5461
5462 #define IRP_QUOTA_CHARGED 0x01
5463 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
5464 #define IRP_ALLOCATED_FIXED_SIZE 0x04
5465 #define IRP_LOOKASIDE_ALLOCATION 0x08
5466
5467 /*
5468 ** IRP function codes
5469 */
5470
5471 #define IRP_MJ_CREATE 0x00
5472 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
5473 #define IRP_MJ_CLOSE 0x02
5474 #define IRP_MJ_READ 0x03
5475 #define IRP_MJ_WRITE 0x04
5476 #define IRP_MJ_QUERY_INFORMATION 0x05
5477 #define IRP_MJ_SET_INFORMATION 0x06
5478 #define IRP_MJ_QUERY_EA 0x07
5479 #define IRP_MJ_SET_EA 0x08
5480 #define IRP_MJ_FLUSH_BUFFERS 0x09
5481 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
5482 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
5483 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
5484 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
5485 #define IRP_MJ_DEVICE_CONTROL 0x0e
5486 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
5487 #define IRP_MJ_SCSI 0x0f
5488 #define IRP_MJ_SHUTDOWN 0x10
5489 #define IRP_MJ_LOCK_CONTROL 0x11
5490 #define IRP_MJ_CLEANUP 0x12
5491 #define IRP_MJ_CREATE_MAILSLOT 0x13
5492 #define IRP_MJ_QUERY_SECURITY 0x14
5493 #define IRP_MJ_SET_SECURITY 0x15
5494 #define IRP_MJ_POWER 0x16
5495 #define IRP_MJ_SYSTEM_CONTROL 0x17
5496 #define IRP_MJ_DEVICE_CHANGE 0x18
5497 #define IRP_MJ_QUERY_QUOTA 0x19
5498 #define IRP_MJ_SET_QUOTA 0x1a
5499 #define IRP_MJ_PNP 0x1b
5500 #define IRP_MJ_PNP_POWER 0x1b
5501 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
5502
5503 #define IRP_MN_SCSI_CLASS 0x01
5504
5505 #define IRP_MN_START_DEVICE 0x00
5506 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
5507 #define IRP_MN_REMOVE_DEVICE 0x02
5508 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
5509 #define IRP_MN_STOP_DEVICE 0x04
5510 #define IRP_MN_QUERY_STOP_DEVICE 0x05
5511 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
5512
5513 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
5514 #define IRP_MN_QUERY_INTERFACE 0x08
5515 #define IRP_MN_QUERY_CAPABILITIES 0x09
5516 #define IRP_MN_QUERY_RESOURCES 0x0A
5517 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
5518 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
5519 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
5520
5521 #define IRP_MN_READ_CONFIG 0x0F
5522 #define IRP_MN_WRITE_CONFIG 0x10
5523 #define IRP_MN_EJECT 0x11
5524 #define IRP_MN_SET_LOCK 0x12
5525 #define IRP_MN_QUERY_ID 0x13
5526 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
5527 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
5528 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
5529 #define IRP_MN_SURPRISE_REMOVAL 0x17
5530 #if (NTDDI_VERSION >= NTDDI_WIN7)
5531 #define IRP_MN_DEVICE_ENUMERATED 0x19
5532 #endif
5533
5534 #define IRP_MN_WAIT_WAKE 0x00
5535 #define IRP_MN_POWER_SEQUENCE 0x01
5536 #define IRP_MN_SET_POWER 0x02
5537 #define IRP_MN_QUERY_POWER 0x03
5538
5539 #define IRP_MN_QUERY_ALL_DATA 0x00
5540 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
5541 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
5542 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
5543 #define IRP_MN_ENABLE_EVENTS 0x04
5544 #define IRP_MN_DISABLE_EVENTS 0x05
5545 #define IRP_MN_ENABLE_COLLECTION 0x06
5546 #define IRP_MN_DISABLE_COLLECTION 0x07
5547 #define IRP_MN_REGINFO 0x08
5548 #define IRP_MN_EXECUTE_METHOD 0x09
5549
5550 #define IRP_MN_REGINFO_EX 0x0b
5551
5552 typedef struct _FILE_OBJECT {
5553 CSHORT Type;
5554 CSHORT Size;
5555 PDEVICE_OBJECT DeviceObject;
5556 PVPB Vpb;
5557 PVOID FsContext;
5558 PVOID FsContext2;
5559 PSECTION_OBJECT_POINTERS SectionObjectPointer;
5560 PVOID PrivateCacheMap;
5561 NTSTATUS FinalStatus;
5562 struct _FILE_OBJECT *RelatedFileObject;
5563 BOOLEAN LockOperation;
5564 BOOLEAN DeletePending;
5565 BOOLEAN ReadAccess;
5566 BOOLEAN WriteAccess;
5567 BOOLEAN DeleteAccess;
5568 BOOLEAN SharedRead;
5569 BOOLEAN SharedWrite;
5570 BOOLEAN SharedDelete;
5571 ULONG Flags;
5572 UNICODE_STRING FileName;
5573 LARGE_INTEGER CurrentByteOffset;
5574 volatile ULONG Waiters;
5575 volatile ULONG Busy;
5576 PVOID LastLock;
5577 KEVENT Lock;
5578 KEVENT Event;
5579 volatile PIO_COMPLETION_CONTEXT CompletionContext;
5580 KSPIN_LOCK IrpListLock;
5581 LIST_ENTRY IrpList;
5582 volatile PVOID FileObjectExtension;
5583 } FILE_OBJECT, *PFILE_OBJECT;
5584
5585 typedef struct _IO_ERROR_LOG_PACKET {
5586 UCHAR MajorFunctionCode;
5587 UCHAR RetryCount;
5588 USHORT DumpDataSize;
5589 USHORT NumberOfStrings;
5590 USHORT StringOffset;
5591 USHORT EventCategory;
5592 NTSTATUS ErrorCode;
5593 ULONG UniqueErrorValue;
5594 NTSTATUS FinalStatus;
5595 ULONG SequenceNumber;
5596 ULONG IoControlCode;
5597 LARGE_INTEGER DeviceOffset;
5598 ULONG DumpData[1];
5599 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
5600
5601 typedef struct _IO_ERROR_LOG_MESSAGE {
5602 USHORT Type;
5603 USHORT Size;
5604 USHORT DriverNameLength;
5605 LARGE_INTEGER TimeStamp;
5606 ULONG DriverNameOffset;
5607 IO_ERROR_LOG_PACKET EntryData;
5608 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
5609
5610 #define ERROR_LOG_LIMIT_SIZE 240
5611 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
5612 sizeof(IO_ERROR_LOG_PACKET) + \
5613 (sizeof(WCHAR) * 40))
5614 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
5615 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5616 #define IO_ERROR_LOG_MESSAGE_LENGTH \
5617 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
5618 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
5619 PORT_MAXIMUM_MESSAGE_LENGTH)
5620 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
5621 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5622
5623 #ifdef _WIN64
5624 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
5625 #else
5626 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
5627 #endif
5628
5629 typedef enum _DMA_WIDTH {
5630 Width8Bits,
5631 Width16Bits,
5632 Width32Bits,
5633 MaximumDmaWidth
5634 } DMA_WIDTH, *PDMA_WIDTH;
5635
5636 typedef enum _DMA_SPEED {
5637 Compatible,
5638 TypeA,
5639 TypeB,
5640 TypeC,
5641 TypeF,
5642 MaximumDmaSpeed
5643 } DMA_SPEED, *PDMA_SPEED;
5644
5645 /* DEVICE_DESCRIPTION.Version */
5646
5647 #define DEVICE_DESCRIPTION_VERSION 0x0000
5648 #define DEVICE_DESCRIPTION_VERSION1 0x0001
5649 #define DEVICE_DESCRIPTION_VERSION2 0x0002
5650
5651 typedef struct _DEVICE_DESCRIPTION {
5652 ULONG Version;
5653 BOOLEAN Master;
5654 BOOLEAN ScatterGather;
5655 BOOLEAN DemandMode;
5656 BOOLEAN AutoInitialize;
5657 BOOLEAN Dma32BitAddresses;
5658 BOOLEAN IgnoreCount;
5659 BOOLEAN Reserved1;
5660 BOOLEAN Dma64BitAddresses;
5661 ULONG BusNumber;
5662 ULONG DmaChannel;
5663 INTERFACE_TYPE InterfaceType;
5664 DMA_WIDTH DmaWidth;
5665 DMA_SPEED DmaSpeed;
5666 ULONG MaximumLength;
5667 ULONG DmaPort;
5668 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
5669
5670 typedef enum _DEVICE_RELATION_TYPE {
5671 BusRelations,
5672 EjectionRelations,
5673 PowerRelations,
5674 RemovalRelations,
5675 TargetDeviceRelation,
5676 SingleBusRelations,
5677 TransportRelations
5678 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
5679
5680 typedef struct _DEVICE_RELATIONS {
5681 ULONG Count;
5682 PDEVICE_OBJECT Objects[1];
5683 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
5684
5685 typedef struct _DEVOBJ_EXTENSION {
5686 CSHORT Type;
5687 USHORT Size;
5688 PDEVICE_OBJECT DeviceObject;
5689 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
5690
5691 typedef struct _SCATTER_GATHER_ELEMENT {
5692 PHYSICAL_ADDRESS Address;
5693 ULONG Length;
5694 ULONG_PTR Reserved;
5695 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
5696
5697 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
5698
5699 #if defined(_MSC_VER)
5700 #if _MSC_VER >= 1200
5701 #pragma warning(push)
5702 #endif
5703 #pragma warning(disable:4200)
5704 #endif /* _MSC_VER */
5705
5706 typedef struct _SCATTER_GATHER_LIST {
5707 ULONG NumberOfElements;
5708 ULONG_PTR Reserved;
5709 SCATTER_GATHER_ELEMENT Elements[1];
5710 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
5711
5712 #if defined(_MSC_VER)
5713 #if _MSC_VER >= 1200
5714 #pragma warning(pop)
5715 #else
5716 #pragma warning(default:4200)
5717 #endif
5718 #endif /* _MSC_VER */
5719
5720 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5721
5722 struct _SCATTER_GATHER_LIST;
5723 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
5724
5725 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5726
5727 typedef NTSTATUS
5728 (NTAPI DRIVER_ADD_DEVICE)(
5729 IN struct _DRIVER_OBJECT *DriverObject,
5730 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
5731 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
5732
5733 typedef struct _DRIVER_EXTENSION {
5734 struct _DRIVER_OBJECT *DriverObject;
5735 PDRIVER_ADD_DEVICE AddDevice;
5736 ULONG Count;
5737 UNICODE_STRING ServiceKeyName;
5738 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
5739
5740 #define DRVO_UNLOAD_INVOKED 0x00000001
5741 #define DRVO_LEGACY_DRIVER 0x00000002
5742 #define DRVO_BUILTIN_DRIVER 0x00000004
5743
5744 typedef NTSTATUS
5745 (NTAPI DRIVER_INITIALIZE)(
5746 IN struct _DRIVER_OBJECT *DriverObject,
5747 IN PUNICODE_STRING RegistryPath);
5748 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
5749
5750 typedef VOID
5751 (NTAPI DRIVER_STARTIO)(
5752 IN struct _DEVICE_OBJECT *DeviceObject,
5753 IN struct _IRP *Irp);
5754 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
5755
5756 typedef VOID
5757 (NTAPI DRIVER_UNLOAD)(
5758 IN struct _DRIVER_OBJECT *DriverObject);
5759 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
5760
5761 typedef NTSTATUS
5762 (NTAPI DRIVER_DISPATCH)(
5763 IN struct _DEVICE_OBJECT *DeviceObject,
5764 IN struct _IRP *Irp);
5765 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
5766
5767 typedef struct _DRIVER_OBJECT {
5768 CSHORT Type;
5769 CSHORT Size;
5770 PDEVICE_OBJECT DeviceObject;
5771 ULONG Flags;
5772 PVOID DriverStart;
5773 ULONG DriverSize;
5774 PVOID DriverSection;
5775 PDRIVER_EXTENSION DriverExtension;
5776 UNICODE_STRING DriverName;
5777 PUNICODE_STRING HardwareDatabase;
5778 struct _FAST_IO_DISPATCH *FastIoDispatch;
5779 PDRIVER_INITIALIZE DriverInit;
5780 PDRIVER_STARTIO DriverStartIo;
5781 PDRIVER_UNLOAD DriverUnload;
5782 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
5783 } DRIVER_OBJECT, *PDRIVER_OBJECT;
5784
5785 typedef struct _DMA_ADAPTER {
5786 USHORT Version;
5787 USHORT Size;
5788 struct _DMA_OPERATIONS* DmaOperations;
5789 } DMA_ADAPTER, *PDMA_ADAPTER;
5790
5791 typedef VOID
5792 (NTAPI *PPUT_DMA_ADAPTER)(
5793 IN PDMA_ADAPTER DmaAdapter);
5794
5795 typedef PVOID
5796 (NTAPI *PALLOCATE_COMMON_BUFFER)(
5797 IN PDMA_ADAPTER DmaAdapter,
5798 IN ULONG Length,
5799 OUT PPHYSICAL_ADDRESS LogicalAddress,
5800 IN BOOLEAN CacheEnabled);
5801
5802 typedef VOID
5803 (NTAPI *PFREE_COMMON_BUFFER)(
5804 IN PDMA_ADAPTER DmaAdapter,
5805 IN ULONG Length,
5806 IN PHYSICAL_ADDRESS LogicalAddress,
5807 IN PVOID VirtualAddress,
5808 IN BOOLEAN CacheEnabled);
5809
5810 typedef NTSTATUS
5811 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
5812 IN PDMA_ADAPTER DmaAdapter,
5813 IN PDEVICE_OBJECT DeviceObject,
5814 IN ULONG NumberOfMapRegisters,
5815 IN PDRIVER_CONTROL ExecutionRoutine,
5816 IN PVOID Context);
5817
5818 typedef BOOLEAN
5819 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
5820 IN PDMA_ADAPTER DmaAdapter,
5821 IN PMDL Mdl,
5822 IN PVOID MapRegisterBase,
5823 IN PVOID CurrentVa,
5824 IN ULONG Length,
5825 IN BOOLEAN WriteToDevice);
5826
5827 typedef VOID
5828 (NTAPI *PFREE_ADAPTER_CHANNEL)(
5829 IN PDMA_ADAPTER DmaAdapter);
5830
5831 typedef VOID
5832 (NTAPI *PFREE_MAP_REGISTERS)(
5833 IN PDMA_ADAPTER DmaAdapter,
5834 PVOID MapRegisterBase,
5835 ULONG NumberOfMapRegisters);
5836
5837 typedef PHYSICAL_ADDRESS
5838 (NTAPI *PMAP_TRANSFER)(
5839 IN PDMA_ADAPTER DmaAdapter,
5840 IN PMDL Mdl,
5841 IN PVOID MapRegisterBase,
5842 IN PVOID CurrentVa,
5843 IN OUT PULONG Length,
5844 IN BOOLEAN WriteToDevice);
5845
5846 typedef ULONG
5847 (NTAPI *PGET_DMA_ALIGNMENT)(
5848 IN PDMA_ADAPTER DmaAdapter);
5849
5850 typedef ULONG
5851 (NTAPI *PREAD_DMA_COUNTER)(
5852 IN PDMA_ADAPTER DmaAdapter);
5853
5854 typedef VOID
5855 (NTAPI DRIVER_LIST_CONTROL)(
5856 IN struct _DEVICE_OBJECT *DeviceObject,
5857 IN struct _IRP *Irp,
5858 IN struct _SCATTER_GATHER_LIST *ScatterGather,
5859 IN PVOID Context);
5860 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
5861
5862 typedef NTSTATUS
5863 (NTAPI *PGET_SCATTER_GATHER_LIST)(
5864 IN PDMA_ADAPTER DmaAdapter,
5865 IN PDEVICE_OBJECT DeviceObject,
5866 IN PMDL Mdl,
5867 IN PVOID CurrentVa,
5868 IN ULONG Length,
5869 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
5870 IN PVOID Context,
5871 IN BOOLEAN WriteToDevice);
5872
5873 typedef VOID
5874 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
5875 IN PDMA_ADAPTER DmaAdapter,
5876 IN PSCATTER_GATHER_LIST ScatterGather,
5877 IN BOOLEAN WriteToDevice);
5878
5879 typedef NTSTATUS
5880 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
5881 IN PDMA_ADAPTER DmaAdapter,
5882 IN PMDL Mdl OPTIONAL,
5883 IN PVOID CurrentVa,
5884 IN ULONG Length,
5885 OUT PULONG ScatterGatherListSize,
5886 OUT PULONG pNumberOfMapRegisters OPTIONAL);
5887
5888 typedef NTSTATUS
5889 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
5890 IN PDMA_ADAPTER DmaAdapter,
5891 IN PDEVICE_OBJECT DeviceObject,
5892 IN PMDL Mdl,
5893 IN PVOID CurrentVa,
5894 IN ULONG Length,
5895 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
5896 IN PVOID Context,
5897 IN BOOLEAN WriteToDevice,
5898 IN PVOID ScatterGatherBuffer,
5899 IN ULONG ScatterGatherLength);
5900
5901 typedef NTSTATUS
5902 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
5903 IN PDMA_ADAPTER DmaAdapter,
5904 IN PSCATTER_GATHER_LIST ScatterGather,
5905 IN PMDL OriginalMdl,
5906 OUT PMDL *TargetMdl);
5907
5908 typedef struct _DMA_OPERATIONS {
5909 ULONG Size;
5910 PPUT_DMA_ADAPTER PutDmaAdapter;
5911 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
5912 PFREE_COMMON_BUFFER FreeCommonBuffer;
5913 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
5914 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
5915 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
5916 PFREE_MAP_REGISTERS FreeMapRegisters;
5917 PMAP_TRANSFER MapTransfer;
5918 PGET_DMA_ALIGNMENT GetDmaAlignment;
5919 PREAD_DMA_COUNTER ReadDmaCounter;
5920 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
5921 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
5922 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
5923 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
5924 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
5925 } DMA_OPERATIONS, *PDMA_OPERATIONS;
5926
5927 typedef struct _IO_RESOURCE_DESCRIPTOR {
5928 UCHAR Option;
5929 UCHAR Type;
5930 UCHAR ShareDisposition;
5931 UCHAR Spare1;
5932 USHORT Flags;
5933 USHORT Spare2;
5934 union {
5935 struct {
5936 ULONG Length;
5937 ULONG Alignment;
5938 PHYSICAL_ADDRESS MinimumAddress;
5939 PHYSICAL_ADDRESS MaximumAddress;
5940 } Port;
5941 struct {
5942 ULONG Length;
5943 ULONG Alignment;
5944 PHYSICAL_ADDRESS MinimumAddress;
5945 PHYSICAL_ADDRESS MaximumAddress;
5946 } Memory;
5947 struct {
5948 ULONG MinimumVector;
5949 ULONG MaximumVector;
5950 } Interrupt;
5951 struct {
5952 ULONG MinimumChannel;
5953 ULONG MaximumChannel;
5954 } Dma;
5955 struct {
5956 ULONG Length;
5957 ULONG Alignment;
5958 PHYSICAL_ADDRESS MinimumAddress;
5959 PHYSICAL_ADDRESS MaximumAddress;
5960 } Generic;
5961 struct {
5962 ULONG Data[3];
5963 } DevicePrivate;
5964 struct {
5965 ULONG Length;
5966 ULONG MinBusNumber;
5967 ULONG MaxBusNumber;
5968 ULONG Reserved;
5969 } BusNumber;
5970 struct {
5971 ULONG Priority;
5972 ULONG Reserved1;
5973 ULONG Reserved2;
5974 } ConfigData;
5975 } u;
5976 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
5977
5978 typedef struct _IO_RESOURCE_LIST {
5979 USHORT Version;
5980 USHORT Revision;
5981 ULONG Count;
5982 IO_RESOURCE_DESCRIPTOR Descriptors[1];
5983 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
5984
5985 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
5986 ULONG ListSize;
5987 INTERFACE_TYPE InterfaceType;
5988 ULONG BusNumber;
5989 ULONG SlotNumber;
5990 ULONG Reserved[3];
5991 ULONG AlternativeLists;
5992 IO_RESOURCE_LIST List[1];
5993 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
5994
5995 typedef VOID
5996 (NTAPI DRIVER_CANCEL)(
5997 IN struct _DEVICE_OBJECT *DeviceObject,
5998 IN struct _IRP *Irp);
5999 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
6000
6001 typedef struct _IRP {
6002 CSHORT Type;
6003 USHORT Size;
6004 struct _MDL *MdlAddress;
6005 ULONG Flags;
6006 union {
6007 struct _IRP *MasterIrp;
6008 volatile LONG IrpCount;
6009 PVOID SystemBuffer;
6010 } AssociatedIrp;
6011 LIST_ENTRY ThreadListEntry;
6012 IO_STATUS_BLOCK IoStatus;
6013 KPROCESSOR_MODE RequestorMode;
6014 BOOLEAN PendingReturned;
6015 CHAR StackCount;
6016 CHAR CurrentLocation;
6017 BOOLEAN Cancel;
6018 KIRQL CancelIrql;
6019 CCHAR ApcEnvironment;
6020 UCHAR AllocationFlags;
6021 PIO_STATUS_BLOCK UserIosb;
6022 PKEVENT UserEvent;
6023 union {
6024 struct {
6025 _ANONYMOUS_UNION union {
6026 PIO_APC_ROUTINE UserApcRoutine;
6027 PVOID IssuingProcess;
6028 } DUMMYUNIONNAME;
6029 PVOID UserApcContext;
6030 } AsynchronousParameters;
6031 LARGE_INTEGER AllocationSize;
6032 } Overlay;
6033 volatile PDRIVER_CANCEL CancelRoutine;
6034 PVOID UserBuffer;
6035 union {
6036 struct {
6037 _ANONYMOUS_UNION union {
6038 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
6039 _ANONYMOUS_STRUCT struct {
6040 PVOID DriverContext[4];
6041 } DUMMYSTRUCTNAME;
6042 } DUMMYUNIONNAME;
6043 PETHREAD Thread;
6044 PCHAR AuxiliaryBuffer;
6045 _ANONYMOUS_STRUCT struct {
6046 LIST_ENTRY ListEntry;
6047 _ANONYMOUS_UNION union {
6048 struct _IO_STACK_LOCATION *CurrentStackLocation;
6049 ULONG PacketType;
6050 } DUMMYUNIONNAME;
6051 } DUMMYSTRUCTNAME;
6052 struct _FILE_OBJECT *OriginalFileObject;
6053 } Overlay;
6054 KAPC Apc;
6055 PVOID CompletionKey;
6056 } Tail;
6057 } IRP, *PIRP;
6058
6059 typedef enum _IO_PAGING_PRIORITY {
6060 IoPagingPriorityInvalid,
6061 IoPagingPriorityNormal,
6062 IoPagingPriorityHigh,
6063 IoPagingPriorityReserved1,
6064 IoPagingPriorityReserved2
6065 } IO_PAGING_PRIORITY;
6066
6067 typedef NTSTATUS
6068 (NTAPI IO_COMPLETION_ROUTINE)(
6069 IN struct _DEVICE_OBJECT *DeviceObject,
6070 IN struct _IRP *Irp,
6071 IN PVOID Context);
6072 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
6073
6074 typedef VOID
6075 (NTAPI IO_DPC_ROUTINE)(
6076 IN struct _KDPC *Dpc,
6077 IN struct _DEVICE_OBJECT *DeviceObject,
6078 IN struct _IRP *Irp,
6079 IN PVOID Context);
6080 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
6081
6082 typedef NTSTATUS
6083 (NTAPI *PMM_DLL_INITIALIZE)(
6084 IN PUNICODE_STRING RegistryPath);
6085
6086 typedef NTSTATUS
6087 (NTAPI *PMM_DLL_UNLOAD)(
6088 VOID);
6089
6090 typedef VOID
6091 (NTAPI IO_TIMER_ROUTINE)(
6092 IN struct _DEVICE_OBJECT *DeviceObject,
6093 IN PVOID Context);
6094 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
6095
6096 typedef struct _IO_SECURITY_CONTEXT {
6097 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
6098 PACCESS_STATE AccessState;
6099 ACCESS_MASK DesiredAccess;
6100 ULONG FullCreateOptions;
6101 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
6102
6103 struct _IO_CSQ;
6104
6105 typedef struct _IO_CSQ_IRP_CONTEXT {
6106 ULONG Type;
6107 struct _IRP *Irp;
6108 struct _IO_CSQ *Csq;
6109 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
6110
6111 typedef VOID
6112 (NTAPI *PIO_CSQ_INSERT_IRP)(
6113 IN struct _IO_CSQ *Csq,
6114 IN PIRP Irp);
6115
6116 typedef NTSTATUS
6117 (NTAPI IO_CSQ_INSERT_IRP_EX)(
6118 IN struct _IO_CSQ *Csq,
6119 IN PIRP Irp,
6120 IN PVOID InsertContext);
6121 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
6122
6123 typedef VOID
6124 (NTAPI *PIO_CSQ_REMOVE_IRP)(
6125 IN struct _IO_CSQ *Csq,
6126 IN PIRP Irp);
6127
6128 typedef PIRP
6129 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
6130 IN struct _IO_CSQ *Csq,
6131 IN PIRP Irp,
6132 IN PVOID PeekContext);
6133
6134 typedef VOID
6135 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
6136 IN struct _IO_CSQ *Csq,
6137 OUT PKIRQL Irql);
6138
6139 typedef VOID
6140 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
6141 IN struct _IO_CSQ *Csq,
6142 IN KIRQL Irql);
6143
6144 typedef VOID
6145 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
6146 IN struct _IO_CSQ *Csq,
6147 IN PIRP Irp);
6148
6149 typedef struct _IO_CSQ {
6150 ULONG Type;
6151 PIO_CSQ_INSERT_IRP CsqInsertIrp;
6152 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
6153 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
6154 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
6155 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
6156 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
6157 PVOID ReservePointer;
6158 } IO_CSQ, *PIO_CSQ;
6159
6160 typedef enum _BUS_QUERY_ID_TYPE {
6161 BusQueryDeviceID,
6162 BusQueryHardwareIDs,
6163 BusQueryCompatibleIDs,
6164 BusQueryInstanceID,
6165 BusQueryDeviceSerialNumber
6166 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
6167
6168 typedef enum _DEVICE_TEXT_TYPE {
6169 DeviceTextDescription,
6170 DeviceTextLocationInformation
6171 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
6172
6173 typedef BOOLEAN
6174 (NTAPI *PGPE_SERVICE_ROUTINE)(
6175 PVOID,
6176 PVOID);
6177
6178 typedef NTSTATUS
6179 (NTAPI *PGPE_CONNECT_VECTOR)(
6180 PDEVICE_OBJECT,
6181 ULONG,
6182 KINTERRUPT_MODE,
6183 BOOLEAN,
6184 PGPE_SERVICE_ROUTINE,
6185 PVOID,
6186 PVOID);
6187
6188 typedef NTSTATUS
6189 (NTAPI *PGPE_DISCONNECT_VECTOR)(
6190 PVOID);
6191
6192 typedef NTSTATUS
6193 (NTAPI *PGPE_ENABLE_EVENT)(
6194 PDEVICE_OBJECT,
6195 PVOID);
6196
6197 typedef NTSTATUS
6198 (NTAPI *PGPE_DISABLE_EVENT)(
6199 PDEVICE_OBJECT,
6200 PVOID);
6201
6202 typedef NTSTATUS
6203 (NTAPI *PGPE_CLEAR_STATUS)(
6204 PDEVICE_OBJECT,
6205 PVOID);
6206
6207 typedef VOID
6208 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
6209 PVOID,
6210 ULONG);
6211
6212 typedef NTSTATUS
6213 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6214 PDEVICE_OBJECT,
6215 PDEVICE_NOTIFY_CALLBACK,
6216 PVOID);
6217
6218 typedef VOID
6219 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6220 PDEVICE_OBJECT,
6221 PDEVICE_NOTIFY_CALLBACK);
6222
6223 typedef struct _ACPI_INTERFACE_STANDARD {
6224 USHORT Size;
6225 USHORT Version;
6226 PVOID Context;
6227 PINTERFACE_REFERENCE InterfaceReference;
6228 PINTERFACE_DEREFERENCE InterfaceDereference;
6229 PGPE_CONNECT_VECTOR GpeConnectVector;
6230 PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
6231 PGPE_ENABLE_EVENT GpeEnableEvent;
6232 PGPE_DISABLE_EVENT GpeDisableEvent;
6233 PGPE_CLEAR_STATUS GpeClearStatus;
6234 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
6235 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
6236 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
6237
6238 typedef BOOLEAN
6239 (NTAPI *PGPE_SERVICE_ROUTINE2)(
6240 PVOID ObjectContext,
6241 PVOID ServiceContext);
6242
6243 typedef NTSTATUS
6244 (NTAPI *PGPE_CONNECT_VECTOR2)(
6245 PVOID Context,
6246 ULONG GpeNumber,
6247 KINTERRUPT_MODE Mode,
6248 BOOLEAN Shareable,
6249 PGPE_SERVICE_ROUTINE ServiceRoutine,
6250 PVOID ServiceContext,
6251 PVOID *ObjectContext);
6252
6253 typedef NTSTATUS
6254 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
6255 PVOID Context,
6256 PVOID ObjectContext);
6257
6258 typedef NTSTATUS
6259 (NTAPI *PGPE_ENABLE_EVENT2)(
6260 PVOID Context,
6261 PVOID ObjectContext);
6262
6263 typedef NTSTATUS
6264 (NTAPI *PGPE_DISABLE_EVENT2)(
6265 PVOID Context,
6266 PVOID ObjectContext);
6267
6268 typedef NTSTATUS
6269 (NTAPI *PGPE_CLEAR_STATUS2)(
6270 PVOID Context,
6271 PVOID ObjectContext);
6272
6273 typedef VOID
6274 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
6275 PVOID NotificationContext,
6276 ULONG NotifyCode);
6277
6278 typedef NTSTATUS
6279 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6280 PVOID Context,
6281 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
6282 PVOID NotificationContext);
6283
6284 typedef VOID
6285 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6286 PVOID Context);
6287
6288 typedef struct _ACPI_INTERFACE_STANDARD2 {
6289 USHORT Size;
6290 USHORT Version;
6291 PVOID Context;
6292 PINTERFACE_REFERENCE InterfaceReference;
6293 PINTERFACE_DEREFERENCE InterfaceDereference;
6294 PGPE_CONNECT_VECTOR2 GpeConnectVector;
6295 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
6296 PGPE_ENABLE_EVENT2 GpeEnableEvent;
6297 PGPE_DISABLE_EVENT2 GpeDisableEvent;
6298 PGPE_CLEAR_STATUS2 GpeClearStatus;
6299 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
6300 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
6301 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
6302
6303 #if !defined(_AMD64_) && !defined(_IA64_)
6304 #include <pshpack4.h>
6305 #endif
6306 typedef struct _IO_STACK_LOCATION {
6307 UCHAR MajorFunction;
6308 UCHAR MinorFunction;
6309 UCHAR Flags;
6310 UCHAR Control;
6311 union {
6312 struct {
6313 PIO_SECURITY_CONTEXT SecurityContext;
6314 ULONG Options;
6315 USHORT POINTER_ALIGNMENT FileAttributes;
6316 USHORT ShareAccess;
6317 ULONG POINTER_ALIGNMENT EaLength;
6318 } Create;
6319 struct {
6320 ULONG Length;
6321 ULONG POINTER_ALIGNMENT Key;
6322 LARGE_INTEGER ByteOffset;
6323 } Read;
6324 struct {
6325 ULONG Length;
6326 ULONG POINTER_ALIGNMENT Key;
6327 LARGE_INTEGER ByteOffset;
6328 } Write;
6329 struct {
6330 ULONG Length;
6331 PUNICODE_STRING FileName;
6332 FILE_INFORMATION_CLASS FileInformationClass;
6333 ULONG FileIndex;
6334 } QueryDirectory;
6335 struct {
6336 ULONG Length;
6337 ULONG CompletionFilter;
6338 } NotifyDirectory;
6339 struct {
6340 ULONG Length;
6341 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
6342 } QueryFile;
6343 struct {
6344 ULONG Length;
6345 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
6346 PFILE_OBJECT FileObject;
6347 _ANONYMOUS_UNION union {
6348 _ANONYMOUS_STRUCT struct {
6349 BOOLEAN ReplaceIfExists;
6350 BOOLEAN AdvanceOnly;
6351 } DUMMYSTRUCTNAME;
6352 ULONG ClusterCount;
6353 HANDLE DeleteHandle;
6354 } DUMMYUNIONNAME;
6355 } SetFile;
6356 struct {
6357 ULONG Length;
6358 PVOID EaList;
6359 ULONG EaListLength;
6360 ULONG EaIndex;
6361 } QueryEa;
6362 struct {
6363 ULONG Length;
6364 } SetEa;
6365 struct {
6366 ULONG Length;
6367 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
6368 } QueryVolume;
6369 struct {
6370 ULONG Length;
6371 FS_INFORMATION_CLASS FsInformationClass;
6372 } SetVolume;
6373 struct {
6374 ULONG OutputBufferLength;
6375 ULONG InputBufferLength;
6376 ULONG FsControlCode;
6377 PVOID Type3InputBuffer;
6378 } FileSystemControl;
6379 struct {
6380 PLARGE_INTEGER Length;
6381 ULONG Key;
6382 LARGE_INTEGER ByteOffset;
6383 } LockControl;
6384 struct {
6385 ULONG OutputBufferLength;
6386 ULONG POINTER_ALIGNMENT InputBufferLength;
6387 ULONG POINTER_ALIGNMENT IoControlCode;
6388 PVOID Type3InputBuffer;
6389 } DeviceIoControl;
6390 struct {
6391 SECURITY_INFORMATION SecurityInformation;
6392 ULONG POINTER_ALIGNMENT Length;
6393 } QuerySecurity;
6394 struct {
6395 SECURITY_INFORMATION SecurityInformation;
6396 PSECURITY_DESCRIPTOR SecurityDescriptor;
6397 } SetSecurity;
6398 struct {
6399 PVPB Vpb;
6400 PDEVICE_OBJECT DeviceObject;
6401 } MountVolume;
6402 struct {
6403 PVPB Vpb;
6404 PDEVICE_OBJECT DeviceObject;
6405 } VerifyVolume;
6406 struct {
6407 struct _SCSI_REQUEST_BLOCK *Srb;
6408 } Scsi;
6409 struct {
6410 ULONG Length;
6411 PSID StartSid;
6412 struct _FILE_GET_QUOTA_INFORMATION *SidList;
6413 ULONG SidListLength;
6414 } QueryQuota;
6415 struct {
6416 ULONG Length;
6417 } SetQuota;
6418 struct {
6419 DEVICE_RELATION_TYPE Type;
6420 } QueryDeviceRelations;
6421 struct {
6422 CONST GUID *InterfaceType;
6423 USHORT Size;
6424 USHORT Version;
6425 PINTERFACE Interface;
6426 PVOID InterfaceSpecificData;
6427 } QueryInterface;
6428 struct {
6429 PDEVICE_CAPABILITIES Capabilities;
6430 } DeviceCapabilities;
6431 struct {
6432 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
6433 } FilterResourceRequirements;
6434 struct {
6435 ULONG WhichSpace;
6436 PVOID Buffer;
6437 ULONG Offset;
6438 ULONG POINTER_ALIGNMENT Length;
6439 } ReadWriteConfig;
6440 struct {
6441 BOOLEAN Lock;
6442 } SetLock;
6443 struct {
6444 BUS_QUERY_ID_TYPE IdType;
6445 } QueryId;
6446 struct {
6447 DEVICE_TEXT_TYPE DeviceTextType;
6448 LCID POINTER_ALIGNMENT LocaleId;
6449 } QueryDeviceText;
6450 struct {
6451 BOOLEAN InPath;
6452 BOOLEAN Reserved[3];
6453 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
6454 } UsageNotification;
6455 struct {
6456 SYSTEM_POWER_STATE PowerState;
6457 } WaitWake;
6458 struct {
6459 PPOWER_SEQUENCE PowerSequence;
6460 } PowerSequence;
6461 struct {
6462 ULONG SystemContext;
6463 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
6464 POWER_STATE POINTER_ALIGNMENT State;
6465 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
6466 } Power;
6467 struct {
6468 PCM_RESOURCE_LIST AllocatedResources;
6469 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
6470 } StartDevice;
6471 struct {
6472 ULONG_PTR ProviderId;
6473 PVOID DataPath;
6474 ULONG BufferSize;
6475 PVOID Buffer;
6476 } WMI;
6477 struct {
6478 PVOID Argument1;
6479 PVOID Argument2;
6480 PVOID Argument3;
6481 PVOID Argument4;
6482 } Others;
6483 } Parameters;
6484 PDEVICE_OBJECT DeviceObject;
6485 PFILE_OBJECT FileObject;
6486 PIO_COMPLETION_ROUTINE CompletionRoutine;
6487 PVOID Context;
6488 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
6489 #if !defined(_AMD64_) && !defined(_IA64_)
6490 #include <poppack.h>
6491 #endif
6492
6493 /* IO_STACK_LOCATION.Control */
6494
6495 #define SL_PENDING_RETURNED 0x01
6496 #define SL_ERROR_RETURNED 0x02
6497 #define SL_INVOKE_ON_CANCEL 0x20
6498 #define SL_INVOKE_ON_SUCCESS 0x40
6499 #define SL_INVOKE_ON_ERROR 0x80
6500
6501 #define METHOD_BUFFERED 0
6502 #define METHOD_IN_DIRECT 1
6503 #define METHOD_OUT_DIRECT 2
6504 #define METHOD_NEITHER 3
6505
6506 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
6507 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
6508
6509 #define FILE_SUPERSEDED 0x00000000
6510 #define FILE_OPENED 0x00000001
6511 #define FILE_CREATED 0x00000002
6512 #define FILE_OVERWRITTEN 0x00000003
6513 #define FILE_EXISTS 0x00000004
6514 #define FILE_DOES_NOT_EXIST 0x00000005
6515
6516 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
6517 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
6518
6519 /* also in winnt.h */
6520 #define FILE_LIST_DIRECTORY 0x00000001
6521 #define FILE_READ_DATA 0x00000001
6522 #define FILE_ADD_FILE 0x00000002
6523 #define FILE_WRITE_DATA 0x00000002
6524 #define FILE_ADD_SUBDIRECTORY 0x00000004
6525 #define FILE_APPEND_DATA 0x00000004
6526 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
6527 #define FILE_READ_EA 0x00000008
6528 #define FILE_WRITE_EA 0x00000010
6529 #define FILE_EXECUTE 0x00000020
6530 #define FILE_TRAVERSE 0x00000020
6531 #define FILE_DELETE_CHILD 0x00000040
6532 #define FILE_READ_ATTRIBUTES 0x00000080
6533 #define FILE_WRITE_ATTRIBUTES 0x00000100
6534
6535 #define FILE_SHARE_READ 0x00000001
6536 #define FILE_SHARE_WRITE 0x00000002
6537 #define FILE_SHARE_DELETE 0x00000004
6538 #define FILE_SHARE_VALID_FLAGS 0x00000007
6539
6540 #define FILE_ATTRIBUTE_READONLY 0x00000001
6541 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
6542 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
6543 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
6544 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
6545 #define FILE_ATTRIBUTE_DEVICE 0x00000040
6546 #define FILE_ATTRIBUTE_NORMAL 0x00000080
6547 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
6548 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
6549 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
6550 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
6551 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
6552 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
6553 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
6554 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
6555
6556 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
6557 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
6558
6559 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
6560 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
6561 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
6562 #define FILE_VALID_SET_FLAGS 0x00000036
6563
6564 #define FILE_SUPERSEDE 0x00000000
6565 #define FILE_OPEN 0x00000001
6566 #define FILE_CREATE 0x00000002
6567 #define FILE_OPEN_IF 0x00000003
6568 #define FILE_OVERWRITE 0x00000004
6569 #define FILE_OVERWRITE_IF 0x00000005
6570 #define FILE_MAXIMUM_DISPOSITION 0x00000005
6571
6572 #define FILE_DIRECTORY_FILE 0x00000001
6573 #define FILE_WRITE_THROUGH 0x00000002
6574 #define FILE_SEQUENTIAL_ONLY 0x00000004
6575 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
6576 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
6577 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
6578 #define FILE_NON_DIRECTORY_FILE 0x00000040
6579 #define FILE_CREATE_TREE_CONNECTION 0x00000080
6580 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
6581 #define FILE_NO_EA_KNOWLEDGE 0x00000200
6582 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
6583 #define FILE_RANDOM_ACCESS 0x00000800
6584 #define FILE_DELETE_ON_CLOSE 0x00001000
6585 #define FILE_OPEN_BY_FILE_ID 0x00002000
6586 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
6587 #define FILE_NO_COMPRESSION 0x00008000
6588 #if (NTDDI_VERSION >= NTDDI_WIN7)
6589 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
6590 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
6591 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
6592 #define FILE_RESERVE_OPFILTER 0x00100000
6593 #define FILE_OPEN_REPARSE_POINT 0x00200000
6594 #define FILE_OPEN_NO_RECALL 0x00400000
6595 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
6596
6597 #define FILE_ANY_ACCESS 0x00000000
6598 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
6599 #define FILE_READ_ACCESS 0x00000001
6600 #define FILE_WRITE_ACCESS 0x00000002
6601
6602 #define FILE_ALL_ACCESS \
6603 (STANDARD_RIGHTS_REQUIRED | \
6604 SYNCHRONIZE | \
6605 0x1FF)
6606
6607 #define FILE_GENERIC_EXECUTE \
6608 (STANDARD_RIGHTS_EXECUTE | \
6609 FILE_READ_ATTRIBUTES | \
6610 FILE_EXECUTE | \
6611 SYNCHRONIZE)
6612
6613 #define FILE_GENERIC_READ \
6614 (STANDARD_RIGHTS_READ | \
6615 FILE_READ_DATA | \
6616 FILE_READ_ATTRIBUTES | \
6617 FILE_READ_EA | \
6618 SYNCHRONIZE)
6619
6620 #define FILE_GENERIC_WRITE \
6621 (STANDARD_RIGHTS_WRITE | \
6622 FILE_WRITE_DATA | \
6623 FILE_WRITE_ATTRIBUTES | \
6624 FILE_WRITE_EA | \
6625 FILE_APPEND_DATA | \
6626 SYNCHRONIZE)
6627
6628 /* end winnt.h */
6629
6630 #define WMIREG_ACTION_REGISTER 1
6631 #define WMIREG_ACTION_DEREGISTER 2
6632 #define WMIREG_ACTION_REREGISTER 3
6633 #define WMIREG_ACTION_UPDATE_GUIDS 4
6634 #define WMIREG_ACTION_BLOCK_IRPS 5
6635
6636 #define WMIREGISTER 0
6637 #define WMIUPDATE 1
6638
6639 typedef VOID
6640 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
6641 PVOID Wnode,
6642 PVOID Context);
6643 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
6644
6645 #ifndef _PCI_X_
6646 #define _PCI_X_
6647
6648 typedef struct _PCI_SLOT_NUMBER {
6649 union {
6650 struct {
6651 ULONG DeviceNumber:5;
6652 ULONG FunctionNumber:3;
6653 ULONG Reserved:24;
6654 } bits;
6655 ULONG AsULONG;
6656 } u;
6657 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
6658
6659 #define PCI_TYPE0_ADDRESSES 6
6660 #define PCI_TYPE1_ADDRESSES 2
6661 #define PCI_TYPE2_ADDRESSES 5
6662
6663 typedef struct _PCI_COMMON_HEADER {
6664 PCI_COMMON_HEADER_LAYOUT
6665 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
6666
6667 #ifdef __cplusplus
6668 typedef struct _PCI_COMMON_CONFIG {
6669 PCI_COMMON_HEADER_LAYOUT
6670 UCHAR DeviceSpecific[192];
6671 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
6672 #else
6673 typedef struct _PCI_COMMON_CONFIG {
6674 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
6675 UCHAR DeviceSpecific[192];
6676 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
6677 #endif
6678
6679 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
6680
6681 #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
6682
6683 #define PCI_MAX_DEVICES 32
6684 #define PCI_MAX_FUNCTION 8
6685 #define PCI_MAX_BRIDGE_NUMBER 0xFF
6686 #define PCI_INVALID_VENDORID 0xFFFF
6687
6688 /* PCI_COMMON_CONFIG.HeaderType */
6689 #define PCI_MULTIFUNCTION 0x80
6690 #define PCI_DEVICE_TYPE 0x00
6691 #define PCI_BRIDGE_TYPE 0x01
6692 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
6693
6694 #define PCI_CONFIGURATION_TYPE(PciData) \
6695 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
6696
6697 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
6698 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
6699
6700 /* PCI_COMMON_CONFIG.Command */
6701 #define PCI_ENABLE_IO_SPACE 0x0001
6702 #define PCI_ENABLE_MEMORY_SPACE 0x0002
6703 #define PCI_ENABLE_BUS_MASTER 0x0004
6704 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
6705 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
6706 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
6707 #define PCI_ENABLE_PARITY 0x0040
6708 #define PCI_ENABLE_WAIT_CYCLE 0x0080
6709 #define PCI_ENABLE_SERR 0x0100
6710 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
6711 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
6712
6713 /* PCI_COMMON_CONFIG.Status */
6714 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
6715 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
6716 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
6717 #define PCI_STATUS_UDF_SUPPORTED 0x0040
6718 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
6719 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
6720 #define PCI_STATUS_DEVSEL 0x0600
6721 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
6722 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
6723 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
6724 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
6725 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
6726
6727 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
6728
6729 #define PCI_WHICHSPACE_CONFIG 0x0
6730 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
6731
6732 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
6733 #define PCI_CAPABILITY_ID_AGP 0x02
6734 #define PCI_CAPABILITY_ID_VPD 0x03
6735 #define PCI_CAPABILITY_ID_SLOT_ID 0x04
6736 #define PCI_CAPABILITY_ID_MSI 0x05
6737 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
6738 #define PCI_CAPABILITY_ID_PCIX 0x07
6739 #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
6740 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
6741 #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
6742 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
6743 #define PCI_CAPABILITY_ID_SHPC 0x0C
6744 #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
6745 #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
6746 #define PCI_CAPABILITY_ID_SECURE 0x0F
6747 #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
6748 #define PCI_CAPABILITY_ID_MSIX 0x11
6749
6750 typedef struct _PCI_CAPABILITIES_HEADER {
6751 UCHAR CapabilityID;
6752 UCHAR Next;
6753 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
6754
6755 typedef struct _PCI_PMC {
6756 UCHAR Version:3;
6757 UCHAR PMEClock:1;
6758 UCHAR Rsvd1:1;
6759 UCHAR DeviceSpecificInitialization:1;
6760 UCHAR Rsvd2:2;
6761 struct _PM_SUPPORT {
6762 UCHAR Rsvd2:1;
6763 UCHAR D1:1;
6764 UCHAR D2:1;
6765 UCHAR PMED0:1;
6766 UCHAR PMED1:1;
6767 UCHAR PMED2:1;
6768 UCHAR PMED3Hot:1;
6769 UCHAR PMED3Cold:1;
6770 } Support;
6771 } PCI_PMC, *PPCI_PMC;
6772
6773 typedef struct _PCI_PMCSR {
6774 USHORT PowerState:2;
6775 USHORT Rsvd1:6;
6776 USHORT PMEEnable:1;
6777 USHORT DataSelect:4;
6778 USHORT DataScale:2;
6779 USHORT PMEStatus:1;
6780 } PCI_PMCSR, *PPCI_PMCSR;
6781
6782 typedef struct _PCI_PMCSR_BSE {
6783 UCHAR Rsvd1:6;
6784 UCHAR D3HotSupportsStopClock:1;
6785 UCHAR BusPowerClockControlEnabled:1;
6786 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
6787
6788 typedef struct _PCI_PM_CAPABILITY {
6789 PCI_CAPABILITIES_HEADER Header;
6790 union {
6791 PCI_PMC Capabilities;
6792 USHORT AsUSHORT;
6793 } PMC;
6794 union {
6795 PCI_PMCSR ControlStatus;
6796 USHORT AsUSHORT;
6797 } PMCSR;
6798 union {
6799 PCI_PMCSR_BSE BridgeSupport;
6800 UCHAR AsUCHAR;
6801 } PMCSR_BSE;
6802 UCHAR Data;
6803 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
6804
6805 typedef struct {
6806 PCI_CAPABILITIES_HEADER Header;
6807 union {
6808 struct {
6809 USHORT DataParityErrorRecoveryEnable:1;
6810 USHORT EnableRelaxedOrdering:1;
6811 USHORT MaxMemoryReadByteCount:2;
6812 USHORT MaxOutstandingSplitTransactions:3;
6813 USHORT Reserved:9;
6814 } bits;
6815 USHORT AsUSHORT;
6816 } Command;
6817 union {
6818 struct {
6819 ULONG FunctionNumber:3;
6820 ULONG DeviceNumber:5;
6821 ULONG BusNumber:8;
6822 ULONG Device64Bit:1;
6823 ULONG Capable133MHz:1;
6824 ULONG SplitCompletionDiscarded:1;
6825 ULONG UnexpectedSplitCompletion:1;
6826 ULONG DeviceComplexity:1;
6827 ULONG DesignedMaxMemoryReadByteCount:2;
6828 ULONG DesignedMaxOutstandingSplitTransactions:3;
6829 ULONG DesignedMaxCumulativeReadSize:3;
6830 ULONG ReceivedSplitCompletionErrorMessage:1;
6831 ULONG CapablePCIX266:1;
6832 ULONG CapablePCIX533:1;
6833 } bits;
6834 ULONG AsULONG;
6835 } Status;
6836 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
6837
6838 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
6839 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
6840 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
6841 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
6842 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
6843 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
6844 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
6845 #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
6846 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
6847 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
6848 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
6849
6850 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
6851 USHORT CapabilityID;
6852 USHORT Version:4;
6853 USHORT Next:12;
6854 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
6855
6856 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
6857 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
6858 ULONG LowSerialNumber;
6859 ULONG HighSerialNumber;
6860 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
6861
6862 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
6863 _ANONYMOUS_STRUCT struct {
6864 ULONG Undefined:1;
6865 ULONG Reserved1:3;
6866 ULONG DataLinkProtocolError:1;
6867 ULONG SurpriseDownError:1;
6868 ULONG Reserved2:6;
6869 ULONG PoisonedTLP:1;
6870 ULONG FlowControlProtocolError:1;
6871 ULONG CompletionTimeout:1;
6872 ULONG CompleterAbort:1;
6873 ULONG UnexpectedCompletion:1;
6874 ULONG ReceiverOverflow:1;
6875 ULONG MalformedTLP:1;
6876 ULONG ECRCError:1;
6877 ULONG UnsupportedRequestError:1;
6878 ULONG Reserved3:11;
6879 } DUMMYSTRUCTNAME;
6880 ULONG AsULONG;
6881 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
6882
6883 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
6884 _ANONYMOUS_STRUCT struct {
6885 ULONG Undefined:1;
6886 ULONG Reserved1:3;
6887 ULONG DataLinkProtocolError:1;
6888 ULONG SurpriseDownError:1;
6889 ULONG Reserved2:6;
6890 ULONG PoisonedTLP:1;
6891 ULONG FlowControlProtocolError:1;
6892 ULONG CompletionTimeout:1;
6893 ULONG CompleterAbort:1;
6894 ULONG UnexpectedCompletion:1;
6895 ULONG ReceiverOverflow:1;
6896 ULONG MalformedTLP:1;
6897 ULONG ECRCError:1;
6898 ULONG UnsupportedRequestError:1;
6899 ULONG Reserved3:11;
6900 } DUMMYSTRUCTNAME;
6901 ULONG AsULONG;
6902 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
6903
6904 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
6905 _ANONYMOUS_STRUCT struct {
6906 ULONG Undefined:1;
6907 ULONG Reserved1:3;
6908 ULONG DataLinkProtocolError:1;
6909 ULONG SurpriseDownError:1;
6910 ULONG Reserved2:6;
6911 ULONG PoisonedTLP:1;
6912 ULONG FlowControlProtocolError:1;
6913 ULONG CompletionTimeout:1;
6914 ULONG CompleterAbort:1;
6915 ULONG UnexpectedCompletion:1;
6916 ULONG ReceiverOverflow:1;
6917 ULONG MalformedTLP:1;
6918 ULONG ECRCError:1;
6919 ULONG UnsupportedRequestError:1;
6920 ULONG Reserved3:11;
6921 } DUMMYSTRUCTNAME;
6922 ULONG AsULONG;
6923 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
6924
6925 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
6926 _ANONYMOUS_STRUCT struct {
6927 ULONG ReceiverError:1;
6928 ULONG Reserved1:5;
6929 ULONG BadTLP:1;
6930 ULONG BadDLLP:1;
6931 ULONG ReplayNumRollover:1;
6932 ULONG Reserved2:3;
6933 ULONG ReplayTimerTimeout:1;
6934 ULONG AdvisoryNonFatalError:1;
6935 ULONG Reserved3:18;
6936 } DUMMYSTRUCTNAME;
6937 ULONG AsULONG;
6938 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
6939
6940 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
6941 _ANONYMOUS_STRUCT struct {
6942 ULONG ReceiverError:1;
6943 ULONG Reserved1:5;
6944 ULONG BadTLP:1;
6945 ULONG BadDLLP:1;
6946 ULONG ReplayNumRollover:1;
6947 ULONG Reserved2:3;
6948 ULONG ReplayTimerTimeout:1;
6949 ULONG AdvisoryNonFatalError:1;
6950 ULONG Reserved3:18;
6951 } DUMMYSTRUCTNAME;
6952 ULONG AsULONG;
6953 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
6954
6955 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
6956 _ANONYMOUS_STRUCT struct {
6957 ULONG FirstErrorPointer:5;
6958 ULONG ECRCGenerationCapable:1;
6959 ULONG ECRCGenerationEnable:1;
6960 ULONG ECRCCheckCapable:1;
6961 ULONG ECRCCheckEnable:1;
6962 ULONG Reserved:23;
6963 } DUMMYSTRUCTNAME;
6964 ULONG AsULONG;
6965 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
6966
6967 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
6968 _ANONYMOUS_STRUCT struct {
6969 ULONG CorrectableErrorReportingEnable:1;
6970 ULONG NonFatalErrorReportingEnable:1;
6971 ULONG FatalErrorReportingEnable:1;
6972 ULONG Reserved:29;
6973 } DUMMYSTRUCTNAME;
6974 ULONG AsULONG;
6975 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
6976
6977 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
6978 _ANONYMOUS_STRUCT struct {
6979 ULONG CorrectableErrorReceived:1;
6980 ULONG MultipleCorrectableErrorsReceived:1;
6981 ULONG UncorrectableErrorReceived:1;
6982 ULONG MultipleUncorrectableErrorsReceived:1;
6983 ULONG FirstUncorrectableFatal:1;
6984 ULONG NonFatalErrorMessagesReceived:1;
6985 ULONG FatalErrorMessagesReceived:1;
6986 ULONG Reserved:20;
6987 ULONG AdvancedErrorInterruptMessageNumber:5;
6988 } DUMMYSTRUCTNAME;
6989 ULONG AsULONG;
6990 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
6991
6992 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
6993 _ANONYMOUS_STRUCT struct {
6994 USHORT CorrectableSourceIdFun:3;
6995 USHORT CorrectableSourceIdDev:5;
6996 USHORT CorrectableSourceIdBus:8;
6997 USHORT UncorrectableSourceIdFun:3;
6998 USHORT UncorrectableSourceIdDev:5;
6999 USHORT UncorrectableSourceIdBus:8;
7000 } DUMMYSTRUCTNAME;
7001 ULONG AsULONG;
7002 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
7003
7004 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
7005 _ANONYMOUS_STRUCT struct {
7006 ULONG TargetAbortOnSplitCompletion:1;
7007 ULONG MasterAbortOnSplitCompletion:1;
7008 ULONG ReceivedTargetAbort:1;
7009 ULONG ReceivedMasterAbort:1;
7010 ULONG RsvdZ:1;
7011 ULONG UnexpectedSplitCompletionError:1;
7012 ULONG UncorrectableSplitCompletion:1;
7013 ULONG UncorrectableDataError:1;
7014 ULONG UncorrectableAttributeError:1;
7015 ULONG UncorrectableAddressError:1;
7016 ULONG DelayedTransactionDiscardTimerExpired:1;
7017 ULONG PERRAsserted:1;
7018 ULONG SERRAsserted:1;
7019 ULONG InternalBridgeError:1;
7020 ULONG Reserved:18;
7021 } DUMMYSTRUCTNAME;
7022 ULONG AsULONG;
7023 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
7024
7025 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
7026 _ANONYMOUS_STRUCT struct {
7027 ULONG TargetAbortOnSplitCompletion:1;
7028 ULONG MasterAbortOnSplitCompletion:1;
7029 ULONG ReceivedTargetAbort:1;
7030 ULONG ReceivedMasterAbort:1;
7031 ULONG RsvdZ:1;
7032 ULONG UnexpectedSplitCompletionError:1;
7033 ULONG UncorrectableSplitCompletion:1;
7034 ULONG UncorrectableDataError:1;
7035 ULONG UncorrectableAttributeError:1;
7036 ULONG UncorrectableAddressError:1;
7037 ULONG DelayedTransactionDiscardTimerExpired:1;
7038 ULONG PERRAsserted:1;
7039 ULONG SERRAsserted:1;
7040 ULONG InternalBridgeError:1;
7041 ULONG Reserved:18;
7042 } DUMMYSTRUCTNAME;
7043 ULONG AsULONG;
7044 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
7045
7046 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
7047 _ANONYMOUS_STRUCT struct {
7048 ULONG TargetAbortOnSplitCompletion:1;
7049 ULONG MasterAbortOnSplitCompletion:1;
7050 ULONG ReceivedTargetAbort:1;
7051 ULONG ReceivedMasterAbort:1;
7052 ULONG RsvdZ:1;
7053 ULONG UnexpectedSplitCompletionError:1;
7054 ULONG UncorrectableSplitCompletion:1;
7055 ULONG UncorrectableDataError:1;
7056 ULONG UncorrectableAttributeError:1;
7057 ULONG UncorrectableAddressError:1;
7058 ULONG DelayedTransactionDiscardTimerExpired:1;
7059 ULONG PERRAsserted:1;
7060 ULONG SERRAsserted:1;
7061 ULONG InternalBridgeError:1;
7062 ULONG Reserved:18;
7063 } DUMMYSTRUCTNAME;
7064 ULONG AsULONG;
7065 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
7066
7067 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
7068 _ANONYMOUS_STRUCT struct {
7069 ULONG SecondaryUncorrectableFirstErrorPtr:5;
7070 ULONG Reserved:27;
7071 } DUMMYSTRUCTNAME;
7072 ULONG AsULONG;
7073 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
7074
7075 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
7076 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
7077 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
7078
7079 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
7080 (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
7081 ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
7082 ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
7083
7084 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
7085 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7086 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7087 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7088 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7089 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7090 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7091 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7092 ULONG HeaderLog[4];
7093 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7094 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7095 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7096 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7097 ULONG SecHeaderLog[4];
7098 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
7099
7100 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
7101 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7102 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7103 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7104 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7105 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7106 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7107 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7108 ULONG HeaderLog[4];
7109 PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
7110 PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
7111 PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
7112 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
7113
7114 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
7115 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7116 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7117 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7118 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7119 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7120 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7121 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7122 ULONG HeaderLog[4];
7123 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7124 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7125 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7126 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7127 ULONG SecHeaderLog[4];
7128 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
7129
7130 typedef union _PCI_EXPRESS_SRIOV_CAPS {
7131 _ANONYMOUS_STRUCT struct {
7132 ULONG VFMigrationCapable:1;
7133 ULONG Reserved1:20;
7134 ULONG VFMigrationInterruptNumber:11;
7135 } DUMMYSTRUCTNAME;
7136 ULONG AsULONG;
7137 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
7138
7139 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
7140 _ANONYMOUS_STRUCT struct {
7141 USHORT VFEnable:1;
7142 USHORT VFMigrationEnable:1;
7143 USHORT VFMigrationInterruptEnable:1;
7144 USHORT VFMemorySpaceEnable:1;
7145 USHORT ARICapableHierarchy:1;
7146 USHORT Reserved1:11;
7147 } DUMMYSTRUCTNAME;
7148 USHORT AsUSHORT;
7149 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
7150
7151 typedef union _PCI_EXPRESS_SRIOV_STATUS {
7152 _ANONYMOUS_STRUCT struct {
7153 USHORT VFMigrationStatus:1;
7154 USHORT Reserved1:15;
7155 } DUMMYSTRUCTNAME;
7156 USHORT AsUSHORT;
7157 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
7158
7159 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
7160 _ANONYMOUS_STRUCT struct {
7161 ULONG VFMigrationStateBIR:3;
7162 ULONG VFMigrationStateOffset:29;
7163 } DUMMYSTRUCTNAME;
7164 ULONG AsULONG;
7165 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
7166
7167 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
7168 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7169 PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
7170 PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
7171 PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
7172 USHORT InitialVFs;
7173 USHORT TotalVFs;
7174 USHORT NumVFs;
7175 UCHAR FunctionDependencyLink;
7176 UCHAR RsvdP1;
7177 USHORT FirstVFOffset;
7178 USHORT VFStride;
7179 USHORT RsvdP2;
7180 USHORT VFDeviceId;
7181 ULONG SupportedPageSizes;
7182 ULONG SystemPageSize;
7183 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
7184 PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
7185 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
7186
7187 /* PCI device classes */
7188 #define PCI_CLASS_PRE_20 0x00
7189 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
7190 #define PCI_CLASS_NETWORK_CTLR 0x02
7191 #define PCI_CLASS_DISPLAY_CTLR 0x03
7192 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
7193 #define PCI_CLASS_MEMORY_CTLR 0x05
7194 #define PCI_CLASS_BRIDGE_DEV 0x06
7195 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
7196 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
7197 #define PCI_CLASS_INPUT_DEV 0x09
7198 #define PCI_CLASS_DOCKING_STATION 0x0a
7199 #define PCI_CLASS_PROCESSOR 0x0b
7200 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
7201 #define PCI_CLASS_WIRELESS_CTLR 0x0d
7202 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
7203 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
7204 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
7205 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
7206 #define PCI_CLASS_NOT_DEFINED 0xff
7207
7208 /* PCI device subclasses for class 0 */
7209 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
7210 #define PCI_SUBCLASS_PRE_20_VGA 0x01
7211
7212 /* PCI device subclasses for class 1 (mass storage controllers)*/
7213 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
7214 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
7215 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
7216 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
7217 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
7218 #define PCI_SUBCLASS_MSC_OTHER 0x80
7219
7220 /* PCI device subclasses for class 2 (network controllers)*/
7221 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
7222 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
7223 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
7224 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
7225 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
7226 #define PCI_SUBCLASS_NET_OTHER 0x80
7227
7228 /* PCI device subclasses for class 3 (display controllers)*/
7229 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
7230 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
7231 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
7232 #define PCI_SUBCLASS_VID_OTHER 0x80
7233
7234 /* PCI device subclasses for class 4 (multimedia device)*/
7235 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
7236 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
7237 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
7238 #define PCI_SUBCLASS_MM_OTHER 0x80
7239
7240 /* PCI device subclasses for class 5 (memory controller)*/
7241 #define PCI_SUBCLASS_MEM_RAM 0x00
7242 #define PCI_SUBCLASS_MEM_FLASH 0x01
7243 #define PCI_SUBCLASS_MEM_OTHER 0x80
7244
7245 /* PCI device subclasses for class 6 (bridge device)*/
7246 #define PCI_SUBCLASS_BR_HOST 0x00
7247 #define PCI_SUBCLASS_BR_ISA 0x01
7248 #define PCI_SUBCLASS_BR_EISA 0x02
7249 #define PCI_SUBCLASS_BR_MCA 0x03
7250 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
7251 #define PCI_SUBCLASS_BR_PCMCIA 0x05
7252 #define PCI_SUBCLASS_BR_NUBUS 0x06
7253 #define PCI_SUBCLASS_BR_CARDBUS 0x07
7254 #define PCI_SUBCLASS_BR_RACEWAY 0x08
7255 #define PCI_SUBCLASS_BR_OTHER 0x80
7256
7257 #define PCI_SUBCLASS_COM_SERIAL 0x00
7258 #define PCI_SUBCLASS_COM_PARALLEL 0x01
7259 #define PCI_SUBCLASS_COM_MULTIPORT 0x02
7260 #define PCI_SUBCLASS_COM_MODEM 0x03
7261 #define PCI_SUBCLASS_COM_OTHER 0x80
7262
7263 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
7264 #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
7265 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
7266 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
7267 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
7268 #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
7269 #define PCI_SUBCLASS_SYS_OTHER 0x80
7270
7271 #define PCI_SUBCLASS_INP_KEYBOARD 0x00
7272 #define PCI_SUBCLASS_INP_DIGITIZER 0x01
7273 #define PCI_SUBCLASS_INP_MOUSE 0x02
7274 #define PCI_SUBCLASS_INP_SCANNER 0x03
7275 #define PCI_SUBCLASS_INP_GAMEPORT 0x04
7276 #define PCI_SUBCLASS_INP_OTHER 0x80
7277
7278 #define PCI_SUBCLASS_DOC_GENERIC 0x00
7279 #define PCI_SUBCLASS_DOC_OTHER 0x80
7280
7281 #define PCI_SUBCLASS_PROC_386 0x00
7282 #define PCI_SUBCLASS_PROC_486 0x01
7283 #define PCI_SUBCLASS_PROC_PENTIUM 0x02
7284 #define PCI_SUBCLASS_PROC_ALPHA 0x10
7285 #define PCI_SUBCLASS_PROC_POWERPC 0x20
7286 #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
7287
7288 /* PCI device subclasses for class C (serial bus controller)*/
7289 #define PCI_SUBCLASS_SB_IEEE1394 0x00
7290 #define PCI_SUBCLASS_SB_ACCESS 0x01
7291 #define PCI_SUBCLASS_SB_SSA 0x02
7292 #define PCI_SUBCLASS_SB_USB 0x03
7293 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
7294 #define PCI_SUBCLASS_SB_SMBUS 0x05
7295
7296 #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
7297 #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
7298 #define PCI_SUBCLASS_WIRELESS_RF 0x10
7299 #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
7300
7301 #define PCI_SUBCLASS_INTIO_I2O 0x00
7302
7303 #define PCI_SUBCLASS_SAT_TV 0x01
7304 #define PCI_SUBCLASS_SAT_AUDIO 0x02
7305 #define PCI_SUBCLASS_SAT_VOICE 0x03
7306 #define PCI_SUBCLASS_SAT_DATA 0x04
7307
7308 #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
7309 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
7310 #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
7311
7312 #define PCI_SUBCLASS_DASP_DPIO 0x00
7313 #define PCI_SUBCLASS_DASP_OTHER 0x80
7314
7315 #define PCI_ADDRESS_IO_SPACE 0x00000001
7316 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
7317 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
7318 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
7319 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
7320 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
7321
7322 #define PCI_TYPE_32BIT 0
7323 #define PCI_TYPE_20BIT 2
7324 #define PCI_TYPE_64BIT 4
7325
7326 #define PCI_ROMADDRESS_ENABLED 0x00000001
7327
7328 #endif /* _PCI_X_ */
7329
7330 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
7331
7332 typedef NTSTATUS
7333 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
7334 IN OUT PVOID Context);
7335 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
7336
7337 typedef NTSTATUS
7338 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
7339 IN OUT PVOID Context);
7340 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
7341
7342 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
7343 USHORT Size;
7344 USHORT Version;
7345 PVOID Context;
7346 PINTERFACE_REFERENCE InterfaceReference;
7347 PINTERFACE_DEREFERENCE InterfaceDereference;
7348 PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
7349 PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
7350 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
7351
7352 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
7353
7354 typedef ULONG
7355 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
7356 IN PVOID Context,
7357 OUT PVOID Buffer,
7358 IN ULONG Offset,
7359 IN ULONG Length);
7360
7361 typedef ULONG
7362 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
7363 IN PVOID Context,
7364 IN PVOID Buffer,
7365 IN ULONG Offset,
7366 IN ULONG Length);
7367
7368 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
7369 USHORT Size;
7370 USHORT Version;
7371 PVOID Context;
7372 PINTERFACE_REFERENCE InterfaceReference;
7373 PINTERFACE_DEREFERENCE InterfaceDereference;
7374 PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
7375 PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
7376 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
7377
7378 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
7379
7380 typedef NTSTATUS
7381 (NTAPI PCI_MSIX_SET_ENTRY)(
7382 IN PVOID Context,
7383 IN ULONG TableEntry,
7384 IN ULONG MessageNumber);
7385 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
7386
7387 typedef NTSTATUS
7388 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
7389 IN PVOID Context,
7390 IN ULONG TableEntry);
7391 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
7392
7393 typedef NTSTATUS
7394 (NTAPI PCI_MSIX_GET_ENTRY)(
7395 IN PVOID Context,
7396 IN ULONG TableEntry,
7397 OUT PULONG MessageNumber,
7398 OUT PBOOLEAN Masked);
7399 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
7400
7401 typedef NTSTATUS
7402 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
7403 IN PVOID Context,
7404 OUT PULONG TableSize);
7405 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
7406
7407 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
7408 USHORT Size;
7409 USHORT Version;
7410 PVOID Context;
7411 PINTERFACE_REFERENCE InterfaceReference;
7412 PINTERFACE_DEREFERENCE InterfaceDereference;
7413 PPCI_MSIX_SET_ENTRY SetTableEntry;
7414 PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
7415 PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
7416 PPCI_MSIX_GET_ENTRY GetTableEntry;
7417 PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
7418 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
7419
7420 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
7421 RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
7422
7423 /******************************************************************************
7424 * Object Manager Types *
7425 ******************************************************************************/
7426
7427 #define MAXIMUM_FILENAME_LENGTH 256
7428 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
7429
7430 #define OBJECT_TYPE_CREATE 0x0001
7431 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
7432
7433 #define DIRECTORY_QUERY 0x0001
7434 #define DIRECTORY_TRAVERSE 0x0002
7435 #define DIRECTORY_CREATE_OBJECT 0x0004
7436 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
7437 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
7438
7439 #define SYMBOLIC_LINK_QUERY 0x0001
7440 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
7441
7442 #define DUPLICATE_CLOSE_SOURCE 0x00000001
7443 #define DUPLICATE_SAME_ACCESS 0x00000002
7444 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
7445
7446 #define OB_FLT_REGISTRATION_VERSION_0100 0x0100
7447 #define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
7448
7449 typedef ULONG OB_OPERATION;
7450
7451 #define OB_OPERATION_HANDLE_CREATE 0x00000001
7452 #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
7453
7454 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
7455 IN OUT ACCESS_MASK DesiredAccess;
7456 IN ACCESS_MASK OriginalDesiredAccess;
7457 } OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;
7458
7459 typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION {
7460 IN OUT ACCESS_MASK DesiredAccess;
7461 IN ACCESS_MASK OriginalDesiredAccess;
7462 IN PVOID SourceProcess;
7463 IN PVOID TargetProcess;
7464 } OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION;
7465
7466 typedef union _OB_PRE_OPERATION_PARAMETERS {
7467 IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation;
7468 IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
7469 } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;
7470
7471 typedef struct _OB_PRE_OPERATION_INFORMATION {
7472 IN OB_OPERATION Operation;
7473 _ANONYMOUS_UNION union {
7474 IN ULONG Flags;
7475 _ANONYMOUS_STRUCT struct {
7476 IN ULONG KernelHandle:1;
7477 IN ULONG Reserved:31;
7478 } DUMMYSTRUCTNAME;
7479 } DUMMYUNIONNAME;
7480 IN PVOID Object;
7481 IN POBJECT_TYPE ObjectType;
7482 OUT PVOID CallContext;
7483 IN POB_PRE_OPERATION_PARAMETERS Parameters;
7484 } OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;
7485
7486 typedef struct _OB_POST_CREATE_HANDLE_INFORMATION {
7487 IN ACCESS_MASK GrantedAccess;
7488 } OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION;
7489
7490 typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION {
7491 IN ACCESS_MASK GrantedAccess;
7492 } OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION;
7493
7494 typedef union _OB_POST_OPERATION_PARAMETERS {
7495 IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation;
7496 IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
7497 } OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS;
7498
7499 typedef struct _OB_POST_OPERATION_INFORMATION {
7500 IN OB_OPERATION Operation;
7501 _ANONYMOUS_UNION union {
7502 IN ULONG Flags;
7503 _ANONYMOUS_STRUCT struct {
7504 IN ULONG KernelHandle:1;
7505 IN ULONG Reserved:31;
7506 } DUMMYSTRUCTNAME;
7507 } DUMMYUNIONNAME;
7508 IN PVOID Object;
7509 IN POBJECT_TYPE ObjectType;
7510 IN PVOID CallContext;
7511 IN NTSTATUS ReturnStatus;
7512 IN POB_POST_OPERATION_PARAMETERS Parameters;
7513 } OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION;
7514
7515 typedef enum _OB_PREOP_CALLBACK_STATUS {
7516 OB_PREOP_SUCCESS
7517 } OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS;
7518
7519 typedef OB_PREOP_CALLBACK_STATUS
7520 (NTAPI *POB_PRE_OPERATION_CALLBACK)(
7521 IN PVOID RegistrationContext,
7522 IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation);
7523
7524 typedef VOID
7525 (NTAPI *POB_POST_OPERATION_CALLBACK)(
7526 IN PVOID RegistrationContext,
7527 IN POB_POST_OPERATION_INFORMATION OperationInformation);
7528
7529 typedef struct _OB_OPERATION_REGISTRATION {
7530 IN POBJECT_TYPE *ObjectType;
7531 IN OB_OPERATION Operations;
7532 IN POB_PRE_OPERATION_CALLBACK PreOperation;
7533 IN POB_POST_OPERATION_CALLBACK PostOperation;
7534 } OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
7535
7536 typedef struct _OB_CALLBACK_REGISTRATION {
7537 IN USHORT Version;
7538 IN USHORT OperationRegistrationCount;
7539 IN UNICODE_STRING Altitude;
7540 IN PVOID RegistrationContext;
7541 IN OB_OPERATION_REGISTRATION *OperationRegistration;
7542 } OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
7543
7544 typedef struct _OBJECT_NAME_INFORMATION {
7545 UNICODE_STRING Name;
7546 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
7547
7548 /* Exported object types */
7549 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType;
7550 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
7551 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
7552 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
7553 extern POBJECT_TYPE NTSYSAPI PsThreadType;
7554 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
7555 extern POBJECT_TYPE NTSYSAPI PsProcessType;
7556
7557 /******************************************************************************
7558 * Process Manager Types *
7559 ******************************************************************************/
7560
7561 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
7562 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
7563 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
7564 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
7565 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
7566
7567 /* Thread Access Rights */
7568 #define THREAD_TERMINATE 0x0001
7569 #define THREAD_SUSPEND_RESUME 0x0002
7570 #define THREAD_ALERT 0x0004
7571 #define THREAD_GET_CONTEXT 0x0008
7572 #define THREAD_SET_CONTEXT 0x0010
7573 #define THREAD_SET_INFORMATION 0x0020
7574 #define THREAD_SET_LIMITED_INFORMATION 0x0400
7575 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
7576
7577 #define PROCESS_DUP_HANDLE (0x0040)
7578
7579 #if (NTDDI_VERSION >= NTDDI_VISTA)
7580 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7581 #else
7582 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
7583 #endif
7584
7585 #if (NTDDI_VERSION >= NTDDI_VISTA)
7586 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7587 #else
7588 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
7589 #endif
7590
7591 #define LOW_PRIORITY 0
7592 #define LOW_REALTIME_PRIORITY 16
7593 #define HIGH_PRIORITY 31
7594 #define MAXIMUM_PRIORITY 32
7595
7596
7597 /******************************************************************************
7598 * WMI Library Support Types *
7599 ******************************************************************************/
7600
7601 #ifdef RUN_WPP
7602 #include <evntrace.h>
7603 #include <stdarg.h>
7604 #endif
7605
7606 #ifndef _TRACEHANDLE_DEFINED
7607 #define _TRACEHANDLE_DEFINED
7608 typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
7609 #endif
7610
7611 #ifndef TRACE_INFORMATION_CLASS_DEFINE
7612
7613 typedef struct _ETW_TRACE_SESSION_SETTINGS {
7614 ULONG Version;
7615 ULONG BufferSize;
7616 ULONG MinimumBuffers;
7617 ULONG MaximumBuffers;
7618 ULONG LoggerMode;
7619 ULONG FlushTimer;
7620 ULONG FlushThreshold;
7621 ULONG ClockType;
7622 } ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS;
7623
7624 typedef enum _TRACE_INFORMATION_CLASS {
7625 TraceIdClass,
7626 TraceHandleClass,
7627 TraceEnableFlagsClass,
7628 TraceEnableLevelClass,
7629 GlobalLoggerHandleClass,
7630 EventLoggerHandleClass,
7631 AllLoggerHandlesClass,
7632 TraceHandleByNameClass,
7633 LoggerEventsLostClass,
7634 TraceSessionSettingsClass,
7635 LoggerEventsLoggedClass,
7636 MaxTraceInformationClass
7637 } TRACE_INFORMATION_CLASS;
7638
7639 #endif /* TRACE_INFORMATION_CLASS_DEFINE */
7640
7641 #ifndef _ETW_KM_
7642 #define _ETW_KM_
7643 #endif
7644
7645 #include <evntprov.h>
7646
7647 typedef VOID
7648 (NTAPI *PETWENABLECALLBACK)(
7649 IN LPCGUID SourceId,
7650 IN ULONG ControlCode,
7651 IN UCHAR Level,
7652 IN ULONGLONG MatchAnyKeyword,
7653 IN ULONGLONG MatchAllKeyword,
7654 IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL,
7655 IN OUT PVOID CallbackContext OPTIONAL);
7656
7657 #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001
7658
7659
7660 #if defined(_M_IX86)
7661 /** Kernel definitions for x86 **/
7662
7663 /* Interrupt request levels */
7664 #define PASSIVE_LEVEL 0
7665 #define LOW_LEVEL 0
7666 #define APC_LEVEL 1
7667 #define DISPATCH_LEVEL 2
7668 #define CMCI_LEVEL 5
7669 #define PROFILE_LEVEL 27
7670 #define CLOCK1_LEVEL 28
7671 #define CLOCK2_LEVEL 28
7672 #define IPI_LEVEL 29
7673 #define POWER_LEVEL 30
7674 #define HIGH_LEVEL 31
7675 #define CLOCK_LEVEL CLOCK2_LEVEL
7676
7677 #define KIP0PCRADDRESS 0xffdff000
7678 #define KI_USER_SHARED_DATA 0xffdf0000
7679 #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
7680
7681 #define PAGE_SIZE 0x1000
7682 #define PAGE_SHIFT 12L
7683 #define KeGetDcacheFillSize() 1L
7684
7685 #define EFLAG_SIGN 0x8000
7686 #define EFLAG_ZERO 0x4000
7687 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
7688
7689 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
7690 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
7691 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
7692
7693
7694 typedef struct _KFLOATING_SAVE {
7695 ULONG ControlWord;
7696 ULONG StatusWord;
7697 ULONG ErrorOffset;
7698 ULONG ErrorSelector;
7699 ULONG DataOffset;
7700 ULONG DataSelector;
7701 ULONG Cr0NpxState;
7702 ULONG Spare1;
7703 } KFLOATING_SAVE, *PKFLOATING_SAVE;
7704
7705 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
7706
7707 #define YieldProcessor _mm_pause
7708
7709 FORCEINLINE
7710 VOID
7711 KeMemoryBarrier(VOID)
7712 {
7713 volatile LONG Barrier;
7714 #if defined(__GNUC__)
7715 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
7716 #elif defined(_MSC_VER)
7717 __asm xchg [Barrier], eax
7718 #endif
7719 }
7720
7721 NTHALAPI
7722 KIRQL
7723 NTAPI
7724 KeGetCurrentIrql(VOID);
7725
7726 NTHALAPI
7727 VOID
7728 FASTCALL
7729 KfLowerIrql(
7730 IN KIRQL NewIrql);
7731 #define KeLowerIrql(a) KfLowerIrql(a)
7732
7733 NTHALAPI
7734 KIRQL
7735 FASTCALL
7736 KfRaiseIrql(
7737 IN KIRQL NewIrql);
7738 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7739
7740 NTHALAPI
7741 KIRQL
7742 NTAPI
7743 KeRaiseIrqlToDpcLevel(VOID);
7744
7745 NTHALAPI
7746 KIRQL
7747 NTAPI
7748 KeRaiseIrqlToSynchLevel(VOID);
7749
7750 NTHALAPI
7751 KIRQL
7752 FASTCALL
7753 KfAcquireSpinLock(
7754 IN OUT PKSPIN_LOCK SpinLock);
7755 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
7756
7757 NTHALAPI
7758 VOID
7759 FASTCALL
7760 KfReleaseSpinLock(
7761 IN OUT PKSPIN_LOCK SpinLock,
7762 IN KIRQL NewIrql);
7763 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
7764
7765 NTKERNELAPI
7766 VOID
7767 FASTCALL
7768 KefAcquireSpinLockAtDpcLevel(
7769 IN OUT PKSPIN_LOCK SpinLock);
7770 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
7771
7772 NTKERNELAPI
7773 VOID
7774 FASTCALL
7775 KefReleaseSpinLockFromDpcLevel(
7776 IN OUT PKSPIN_LOCK SpinLock);
7777 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
7778
7779 NTSYSAPI
7780 PKTHREAD
7781 NTAPI
7782 KeGetCurrentThread(VOID);
7783
7784 NTKERNELAPI
7785 NTSTATUS
7786 NTAPI
7787 KeSaveFloatingPointState(
7788 OUT PKFLOATING_SAVE FloatSave);
7789
7790 NTKERNELAPI
7791 NTSTATUS
7792 NTAPI
7793 KeRestoreFloatingPointState(
7794 IN PKFLOATING_SAVE FloatSave);
7795
7796 /* VOID
7797 * KeFlushIoBuffers(
7798 * IN PMDL Mdl,
7799 * IN BOOLEAN ReadOperation,
7800 * IN BOOLEAN DmaOperation)
7801 */
7802 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7803
7804 /* x86 and x64 performs a 0x2C interrupt */
7805 #define DbgRaiseAssertionFailure __int2c
7806
7807 FORCEINLINE
7808 VOID
7809 _KeQueryTickCount(
7810 OUT PLARGE_INTEGER CurrentCount)
7811 {
7812 for (;;) {
7813 #ifdef NONAMELESSUNION
7814 CurrentCount->s.HighPart = KeTickCount.High1Time;
7815 CurrentCount->s.LowPart = KeTickCount.LowPart;
7816 if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
7817 #else
7818 CurrentCount->HighPart = KeTickCount.High1Time;
7819 CurrentCount->LowPart = KeTickCount.LowPart;
7820 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
7821 #endif
7822 YieldProcessor();
7823 }
7824 }
7825 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
7826
7827
7828
7829
7830
7831 #elif defined(_M_AMD64)
7832 /** Kernel definitions for AMD64 **/
7833
7834 /* Interrupt request levels */
7835 #define PASSIVE_LEVEL 0
7836 #define LOW_LEVEL 0
7837 #define APC_LEVEL 1
7838 #define DISPATCH_LEVEL 2
7839 #define CMCI_LEVEL 5
7840 #define CLOCK_LEVEL 13
7841 #define IPI_LEVEL 14
7842 #define DRS_LEVEL 14
7843 #define POWER_LEVEL 14
7844 #define PROFILE_LEVEL 15
7845 #define HIGH_LEVEL 15
7846
7847 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
7848 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
7849 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
7850 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
7851 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
7852
7853 #define PAGE_SIZE 0x1000
7854 #define PAGE_SHIFT 12L
7855
7856 #define EFLAG_SIGN 0x8000
7857 #define EFLAG_ZERO 0x4000
7858 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
7859
7860 typedef struct _KFLOATING_SAVE {
7861 ULONG Dummy;
7862 } KFLOATING_SAVE, *PKFLOATING_SAVE;
7863
7864 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
7865
7866 #define KeQueryInterruptTime() \
7867 (*(volatile ULONG64*)SharedInterruptTime)
7868
7869 #define KeQuerySystemTime(CurrentCount) \
7870 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
7871
7872 #define KeQueryTickCount(CurrentCount) \
7873 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
7874
7875 #define KeGetDcacheFillSize() 1L
7876
7877 #define YieldProcessor _mm_pause
7878
7879 FORCEINLINE
7880 KIRQL
7881 KeGetCurrentIrql(VOID)
7882 {
7883 return (KIRQL)__readcr8();
7884 }
7885
7886 FORCEINLINE
7887 VOID
7888 KeLowerIrql(IN KIRQL NewIrql)
7889 {
7890 //ASSERT(KeGetCurrentIrql() >= NewIrql);
7891 __writecr8(NewIrql);
7892 }
7893
7894 FORCEINLINE
7895 KIRQL
7896 KfRaiseIrql(IN KIRQL NewIrql)
7897 {
7898 KIRQL OldIrql;
7899
7900 OldIrql = __readcr8();
7901 //ASSERT(OldIrql <= NewIrql);
7902 __writecr8(NewIrql);
7903 return OldIrql;
7904 }
7905 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7906
7907 FORCEINLINE
7908 KIRQL
7909 KeRaiseIrqlToDpcLevel(VOID)
7910 {
7911 return KfRaiseIrql(DISPATCH_LEVEL);
7912 }
7913
7914 FORCEINLINE
7915 KIRQL
7916 KeRaiseIrqlToSynchLevel(VOID)
7917 {
7918 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
7919 }
7920
7921 FORCEINLINE
7922 PKTHREAD
7923 KeGetCurrentThread(VOID)
7924 {
7925 return (struct _KTHREAD *)__readgsqword(0x188);
7926 }
7927
7928 /* VOID
7929 * KeFlushIoBuffers(
7930 * IN PMDL Mdl,
7931 * IN BOOLEAN ReadOperation,
7932 * IN BOOLEAN DmaOperation)
7933 */
7934 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7935
7936 /* x86 and x64 performs a 0x2C interrupt */
7937 #define DbgRaiseAssertionFailure __int2c
7938
7939 #elif defined(_M_IA64)
7940 /** Kernel definitions for IA64 **/
7941
7942 /* Interrupt request levels */
7943 #define PASSIVE_LEVEL 0
7944 #define LOW_LEVEL 0
7945 #define APC_LEVEL 1
7946 #define DISPATCH_LEVEL 2
7947 #define CMC_LEVEL 3
7948 #define DEVICE_LEVEL_BASE 4
7949 #define PC_LEVEL 12
7950 #define IPI_LEVEL 14
7951 #define DRS_LEVEL 14
7952 #define CLOCK_LEVEL 13
7953 #define POWER_LEVEL 15
7954 #define PROFILE_LEVEL 15
7955 #define HIGH_LEVEL 15
7956
7957 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
7958 extern volatile LARGE_INTEGER KeTickCount;
7959
7960 #define PAUSE_PROCESSOR __yield();
7961
7962 FORCEINLINE
7963 VOID
7964 KeFlushWriteBuffer(VOID)
7965 {
7966 __mf ();
7967 return;
7968 }
7969
7970 NTSYSAPI
7971 PKTHREAD
7972 NTAPI
7973 KeGetCurrentThread(VOID);
7974
7975
7976 #elif defined(_M_PPC)
7977
7978 /* Interrupt request levels */
7979 #define PASSIVE_LEVEL 0
7980 #define LOW_LEVEL 0
7981 #define APC_LEVEL 1
7982 #define DISPATCH_LEVEL 2
7983 #define PROFILE_LEVEL 27
7984 #define CLOCK1_LEVEL 28
7985 #define CLOCK2_LEVEL 28
7986 #define IPI_LEVEL 29
7987 #define POWER_LEVEL 30
7988 #define HIGH_LEVEL 31
7989
7990 //
7991 // Used to contain PFNs and PFN counts
7992 //
7993 typedef ULONG PFN_COUNT;
7994 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
7995 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
7996
7997
7998 typedef struct _KFLOATING_SAVE {
7999 ULONG Dummy;
8000 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8001
8002 typedef struct _KPCR_TIB {
8003 PVOID ExceptionList; /* 00 */
8004 PVOID StackBase; /* 04 */
8005 PVOID StackLimit; /* 08 */
8006 PVOID SubSystemTib; /* 0C */
8007 _ANONYMOUS_UNION union {
8008 PVOID FiberData; /* 10 */
8009 ULONG Version; /* 10 */
8010 } DUMMYUNIONNAME;
8011 PVOID ArbitraryUserPointer; /* 14 */
8012 struct _KPCR_TIB *Self; /* 18 */
8013 } KPCR_TIB, *PKPCR_TIB; /* 1C */
8014
8015 #define PCR_MINOR_VERSION 1
8016 #define PCR_MAJOR_VERSION 1
8017
8018 typedef struct _KPCR {
8019 KPCR_TIB Tib; /* 00 */
8020 struct _KPCR *Self; /* 1C */
8021 struct _KPRCB *Prcb; /* 20 */
8022 KIRQL Irql; /* 24 */
8023 ULONG IRR; /* 28 */
8024 ULONG IrrActive; /* 2C */
8025 ULONG IDR; /* 30 */
8026 PVOID KdVersionBlock; /* 34 */
8027 PUSHORT IDT; /* 38 */
8028 PUSHORT GDT; /* 3C */
8029 struct _KTSS *TSS; /* 40 */
8030 USHORT MajorVersion; /* 44 */
8031 USHORT MinorVersion; /* 46 */
8032 KAFFINITY SetMember; /* 48 */
8033 ULONG StallScaleFactor; /* 4C */
8034 UCHAR SpareUnused; /* 50 */
8035 UCHAR Number; /* 51 */
8036 } KPCR, *PKPCR; /* 54 */
8037
8038 #define KeGetPcr() PCR
8039
8040 #define YieldProcessor() __asm__ __volatile__("nop");
8041
8042 FORCEINLINE
8043 ULONG
8044 NTAPI
8045 KeGetCurrentProcessorNumber(VOID)
8046 {
8047 ULONG Number;
8048 __asm__ __volatile__ (
8049 "lwz %0, %c1(12)\n"
8050 : "=r" (Number)
8051 : "i" (FIELD_OFFSET(KPCR, Number))
8052 );
8053 return Number;
8054 }
8055
8056 NTHALAPI
8057 VOID
8058 FASTCALL
8059 KfLowerIrql(
8060 IN KIRQL NewIrql);
8061 #define KeLowerIrql(a) KfLowerIrql(a)
8062
8063 NTHALAPI
8064 KIRQL
8065 FASTCALL
8066 KfRaiseIrql(
8067 IN KIRQL NewIrql);
8068 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8069
8070 NTHALAPI
8071 KIRQL
8072 NTAPI
8073 KeRaiseIrqlToDpcLevel(VOID);
8074
8075 NTHALAPI
8076 KIRQL
8077 NTAPI
8078 KeRaiseIrqlToSynchLevel(VOID);
8079
8080
8081
8082 #elif defined(_M_MIPS)
8083 #error MIPS Headers are totally incorrect
8084
8085 //
8086 // Used to contain PFNs and PFN counts
8087 //
8088 typedef ULONG PFN_COUNT;
8089 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
8090 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
8091
8092 #define PASSIVE_LEVEL 0
8093 #define APC_LEVEL 1
8094 #define DISPATCH_LEVEL 2
8095 #define PROFILE_LEVEL 27
8096 #define IPI_LEVEL 29
8097 #define HIGH_LEVEL 31
8098
8099 typedef struct _KPCR {
8100 struct _KPRCB *Prcb; /* 20 */
8101 KIRQL Irql; /* 24 */
8102 ULONG IRR; /* 28 */
8103 ULONG IDR; /* 30 */
8104 } KPCR, *PKPCR;
8105
8106 #define KeGetPcr() PCR
8107
8108 typedef struct _KFLOATING_SAVE {
8109 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8110
8111 static __inline
8112 ULONG
8113 NTAPI
8114 KeGetCurrentProcessorNumber(VOID)
8115 {
8116 return 0;
8117 }
8118
8119 #define YieldProcessor() __asm__ __volatile__("nop");
8120
8121 #define KeLowerIrql(a) KfLowerIrql(a)
8122 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8123
8124 NTKERNELAPI
8125 VOID
8126 NTAPI
8127 KfLowerIrql(
8128 IN KIRQL NewIrql);
8129
8130 NTKERNELAPI
8131 KIRQL
8132 NTAPI
8133 KfRaiseIrql(
8134 IN KIRQL NewIrql);
8135
8136 NTKERNELAPI
8137 KIRQL
8138 NTAPI
8139 KeRaiseIrqlToDpcLevel(VOID);
8140
8141 NTKERNELAPI
8142 KIRQL
8143 NTAPI
8144 KeRaiseIrqlToSynchLevel(VOID);
8145
8146
8147 #elif defined(_M_ARM)
8148 #include <armddk.h>
8149 #else
8150 #error Unknown Architecture
8151 #endif
8152
8153 /******************************************************************************
8154 * Runtime Library Functions *
8155 ******************************************************************************/
8156
8157
8158 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
8159
8160 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
8161
8162 FORCEINLINE
8163 VOID
8164 InitializeListHead(
8165 OUT PLIST_ENTRY ListHead)
8166 {
8167 ListHead->Flink = ListHead->Blink = ListHead;
8168 }
8169
8170 FORCEINLINE
8171 BOOLEAN
8172 IsListEmpty(
8173 IN CONST LIST_ENTRY * ListHead)
8174 {
8175 return (BOOLEAN)(ListHead->Flink == ListHead);
8176 }
8177
8178 FORCEINLINE
8179 BOOLEAN
8180 RemoveEntryList(
8181 IN PLIST_ENTRY Entry)
8182 {
8183 PLIST_ENTRY OldFlink;
8184 PLIST_ENTRY OldBlink;
8185
8186 OldFlink = Entry->Flink;
8187 OldBlink = Entry->Blink;
8188 OldFlink->Blink = OldBlink;
8189 OldBlink->Flink = OldFlink;
8190 return (BOOLEAN)(OldFlink == OldBlink);
8191 }
8192
8193 FORCEINLINE
8194 PLIST_ENTRY
8195 RemoveHeadList(
8196 IN OUT PLIST_ENTRY ListHead)
8197 {
8198 PLIST_ENTRY Flink;
8199 PLIST_ENTRY Entry;
8200
8201 Entry = ListHead->Flink;
8202 Flink = Entry->Flink;
8203 ListHead->Flink = Flink;
8204 Flink->Blink = ListHead;
8205 return Entry;
8206 }
8207
8208 FORCEINLINE
8209 PLIST_ENTRY
8210 RemoveTailList(
8211 IN OUT PLIST_ENTRY ListHead)
8212 {
8213 PLIST_ENTRY Blink;
8214 PLIST_ENTRY Entry;
8215
8216 Entry = ListHead->Blink;
8217 Blink = Entry->Blink;
8218 ListHead->Blink = Blink;
8219 Blink->Flink = ListHead;
8220 return Entry;
8221 }
8222
8223 FORCEINLINE
8224 VOID
8225 InsertTailList(
8226 IN OUT PLIST_ENTRY ListHead,
8227 IN OUT PLIST_ENTRY Entry)
8228 {
8229 PLIST_ENTRY OldBlink;
8230 OldBlink = ListHead->Blink;
8231 Entry->Flink = ListHead;
8232 Entry->Blink = OldBlink;
8233 OldBlink->Flink = Entry;
8234 ListHead->Blink = Entry;
8235 }
8236
8237 FORCEINLINE
8238 VOID
8239 InsertHeadList(
8240 IN OUT PLIST_ENTRY ListHead,
8241 IN OUT PLIST_ENTRY Entry)
8242 {
8243 PLIST_ENTRY OldFlink;
8244 OldFlink = ListHead->Flink;
8245 Entry->Flink = OldFlink;
8246 Entry->Blink = ListHead;
8247 OldFlink->Blink = Entry;
8248 ListHead->Flink = Entry;
8249 }
8250
8251 FORCEINLINE
8252 VOID
8253 AppendTailList(
8254 IN OUT PLIST_ENTRY ListHead,
8255 IN OUT PLIST_ENTRY ListToAppend)
8256 {
8257 PLIST_ENTRY ListEnd = ListHead->Blink;
8258
8259 ListHead->Blink->Flink = ListToAppend;
8260 ListHead->Blink = ListToAppend->Blink;
8261 ListToAppend->Blink->Flink = ListHead;
8262 ListToAppend->Blink = ListEnd;
8263 }
8264
8265 FORCEINLINE
8266 PSINGLE_LIST_ENTRY
8267 PopEntryList(
8268 IN OUT PSINGLE_LIST_ENTRY ListHead)
8269 {
8270 PSINGLE_LIST_ENTRY FirstEntry;
8271 FirstEntry = ListHead->Next;
8272 if (FirstEntry != NULL) {
8273 ListHead->Next = FirstEntry->Next;
8274 }
8275 return FirstEntry;
8276 }
8277
8278 FORCEINLINE
8279 VOID
8280 PushEntryList(
8281 IN OUT PSINGLE_LIST_ENTRY ListHead,
8282 IN OUT PSINGLE_LIST_ENTRY Entry)
8283 {
8284 Entry->Next = ListHead->Next;
8285 ListHead->Next = Entry;
8286 }
8287
8288 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
8289
8290 NTSYSAPI
8291 VOID
8292 NTAPI
8293 RtlAssert(
8294 IN PVOID FailedAssertion,
8295 IN PVOID FileName,
8296 IN ULONG LineNumber,
8297 IN PSTR Message);
8298
8299 /* VOID
8300 * RtlCopyMemory(
8301 * IN VOID UNALIGNED *Destination,
8302 * IN CONST VOID UNALIGNED *Source,
8303 * IN SIZE_T Length)
8304 */
8305 #define RtlCopyMemory(Destination, Source, Length) \
8306 memcpy(Destination, Source, Length)
8307
8308 #define RtlCopyBytes RtlCopyMemory
8309
8310 #if defined(_M_AMD64)
8311 NTSYSAPI
8312 VOID
8313 NTAPI
8314 RtlCopyMemoryNonTemporal(
8315 VOID UNALIGNED *Destination,
8316 CONST VOID UNALIGNED *Source,
8317 SIZE_T Length);
8318 #else
8319 #define RtlCopyMemoryNonTemporal RtlCopyMemory
8320 #endif
8321
8322 /* BOOLEAN
8323 * RtlEqualLuid(
8324 * IN PLUID Luid1,
8325 * IN PLUID Luid2)
8326 */
8327 #define RtlEqualLuid(Luid1, Luid2) \
8328 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
8329
8330 /* ULONG
8331 * RtlEqualMemory(
8332 * IN VOID UNALIGNED *Destination,
8333 * IN CONST VOID UNALIGNED *Source,
8334 * IN SIZE_T Length)
8335 */
8336 #define RtlEqualMemory(Destination, Source, Length) \
8337 (!memcmp(Destination, Source, Length))
8338
8339 /* VOID
8340 * RtlFillMemory(
8341 * IN VOID UNALIGNED *Destination,
8342 * IN SIZE_T Length,
8343 * IN UCHAR Fill)
8344 */
8345 #define RtlFillMemory(Destination, Length, Fill) \
8346 memset(Destination, Fill, Length)
8347
8348 #define RtlFillBytes RtlFillMemory
8349
8350 NTSYSAPI
8351 VOID
8352 NTAPI
8353 RtlFreeUnicodeString(
8354 IN OUT PUNICODE_STRING UnicodeString);
8355
8356 NTSYSAPI
8357 NTSTATUS
8358 NTAPI
8359 RtlGUIDFromString(
8360 IN PUNICODE_STRING GuidString,
8361 OUT GUID *Guid);
8362
8363 NTSYSAPI
8364 VOID
8365 NTAPI
8366 RtlInitUnicodeString(
8367 IN OUT PUNICODE_STRING DestinationString,
8368 IN PCWSTR SourceString OPTIONAL);
8369
8370 /* VOID
8371 * RtlMoveMemory(
8372 * IN VOID UNALIGNED *Destination,
8373 * IN CONST VOID UNALIGNED *Source,
8374 * IN SIZE_T Length)
8375 */
8376 #define RtlMoveMemory(Destination, Source, Length) \
8377 memmove(Destination, Source, Length)
8378
8379 NTSYSAPI
8380 NTSTATUS
8381 NTAPI
8382 RtlStringFromGUID(
8383 IN REFGUID Guid,
8384 OUT PUNICODE_STRING GuidString);
8385
8386 /* VOID
8387 * RtlZeroMemory(
8388 * IN VOID UNALIGNED *Destination,
8389 * IN SIZE_T Length)
8390 */
8391 #define RtlZeroMemory(Destination, Length) \
8392 memset(Destination, 0, Length)
8393
8394 #define RtlZeroBytes RtlZeroMemory
8395
8396 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8397
8398 NTSYSAPI
8399 BOOLEAN
8400 NTAPI
8401 RtlAreBitsClear(
8402 IN PRTL_BITMAP BitMapHeader,
8403 IN ULONG StartingIndex,
8404 IN ULONG Length);
8405
8406 NTSYSAPI
8407 BOOLEAN
8408 NTAPI
8409 RtlAreBitsSet(
8410 IN PRTL_BITMAP BitMapHeader,
8411 IN ULONG StartingIndex,
8412 IN ULONG Length);
8413
8414 NTSYSAPI
8415 NTSTATUS
8416 NTAPI
8417 RtlAnsiStringToUnicodeString(
8418 IN OUT PUNICODE_STRING DestinationString,
8419 IN PANSI_STRING SourceString,
8420 IN BOOLEAN AllocateDestinationString);
8421
8422 NTSYSAPI
8423 ULONG
8424 NTAPI
8425 RtlxAnsiStringToUnicodeSize(
8426 IN PCANSI_STRING AnsiString);
8427
8428 #define RtlAnsiStringToUnicodeSize(String) ( \
8429 NLS_MB_CODE_PAGE_TAG ? \
8430 RtlxAnsiStringToUnicodeSize(String) : \
8431 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
8432 )
8433
8434 NTSYSAPI
8435 NTSTATUS
8436 NTAPI
8437 RtlAppendUnicodeStringToString(
8438 IN OUT PUNICODE_STRING Destination,
8439 IN PCUNICODE_STRING Source);
8440
8441 NTSYSAPI
8442 NTSTATUS
8443 NTAPI
8444 RtlAppendUnicodeToString(
8445 IN OUT PUNICODE_STRING Destination,
8446 IN PCWSTR Source);
8447
8448 NTSYSAPI
8449 NTSTATUS
8450 NTAPI
8451 RtlCheckRegistryKey(
8452 IN ULONG RelativeTo,
8453 IN PWSTR Path);
8454
8455 NTSYSAPI
8456 VOID
8457 NTAPI
8458 RtlClearAllBits(
8459 IN PRTL_BITMAP BitMapHeader);
8460
8461 NTSYSAPI
8462 VOID
8463 NTAPI
8464 RtlClearBits(
8465 IN PRTL_BITMAP BitMapHeader,
8466 IN ULONG StartingIndex,
8467 IN ULONG NumberToClear);
8468
8469 NTSYSAPI
8470 SIZE_T
8471 NTAPI
8472 RtlCompareMemory(
8473 IN CONST VOID *Source1,
8474 IN CONST VOID *Source2,
8475 IN SIZE_T Length);
8476
8477 NTSYSAPI
8478 LONG
8479 NTAPI
8480 RtlCompareUnicodeString(
8481 IN PCUNICODE_STRING String1,
8482 IN PCUNICODE_STRING String2,
8483 IN BOOLEAN CaseInSensitive);
8484
8485 NTSYSAPI
8486 LONG
8487 NTAPI
8488 RtlCompareUnicodeStrings(
8489 IN PCWCH String1,
8490 IN SIZE_T String1Length,
8491 IN PCWCH String2,
8492 IN SIZE_T String2Length,
8493 IN BOOLEAN CaseInSensitive);
8494
8495 NTSYSAPI
8496 VOID
8497 NTAPI
8498 RtlCopyUnicodeString(
8499 IN OUT PUNICODE_STRING DestinationString,
8500 IN PCUNICODE_STRING SourceString OPTIONAL);
8501
8502 NTSYSAPI
8503 NTSTATUS
8504 NTAPI
8505 RtlCreateRegistryKey(
8506 IN ULONG RelativeTo,
8507 IN PWSTR Path);
8508
8509 NTSYSAPI
8510 NTSTATUS
8511 NTAPI
8512 RtlCreateSecurityDescriptor(
8513 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
8514 IN ULONG Revision);
8515
8516 NTSYSAPI
8517 NTSTATUS
8518 NTAPI
8519 RtlDeleteRegistryValue(
8520 IN ULONG RelativeTo,
8521 IN PCWSTR Path,
8522 IN PCWSTR ValueName);
8523
8524 NTSYSAPI
8525 BOOLEAN
8526 NTAPI
8527 RtlEqualUnicodeString(
8528 IN CONST UNICODE_STRING *String1,
8529 IN CONST UNICODE_STRING *String2,
8530 IN BOOLEAN CaseInSensitive);
8531
8532 #if !defined(_AMD64_) && !defined(_IA64_)
8533 NTSYSAPI
8534 LARGE_INTEGER
8535 NTAPI
8536 RtlExtendedIntegerMultiply(
8537 IN LARGE_INTEGER Multiplicand,
8538 IN LONG Multiplier);
8539
8540 NTSYSAPI
8541 LARGE_INTEGER
8542 NTAPI
8543 RtlExtendedLargeIntegerDivide(
8544 IN LARGE_INTEGER Dividend,
8545 IN ULONG Divisor,
8546 OUT PULONG Remainder OPTIONAL);
8547 #endif
8548
8549 #if defined(_X86_) || defined(_IA64_)
8550 NTSYSAPI
8551 LARGE_INTEGER
8552 NTAPI
8553 RtlExtendedMagicDivide(
8554 IN LARGE_INTEGER Dividend,
8555 IN LARGE_INTEGER MagicDivisor,
8556 IN CCHAR ShiftCount);
8557 #endif
8558
8559 NTSYSAPI
8560 VOID
8561 NTAPI
8562 RtlFreeAnsiString(
8563 IN PANSI_STRING AnsiString);
8564
8565 NTSYSAPI
8566 ULONG
8567 NTAPI
8568 RtlFindClearBits(
8569 IN PRTL_BITMAP BitMapHeader,
8570 IN ULONG NumberToFind,
8571 IN ULONG HintIndex);
8572
8573 NTSYSAPI
8574 ULONG
8575 NTAPI
8576 RtlFindClearBitsAndSet(
8577 IN PRTL_BITMAP BitMapHeader,
8578 IN ULONG NumberToFind,
8579 IN ULONG HintIndex);
8580
8581 NTSYSAPI
8582 ULONG
8583 NTAPI
8584 RtlFindFirstRunClear(
8585 IN PRTL_BITMAP BitMapHeader,
8586 OUT PULONG StartingIndex);
8587
8588 NTSYSAPI
8589 ULONG
8590 NTAPI
8591 RtlFindClearRuns(
8592 IN PRTL_BITMAP BitMapHeader,
8593 OUT PRTL_BITMAP_RUN RunArray,
8594 IN ULONG SizeOfRunArray,
8595 IN BOOLEAN LocateLongestRuns);
8596
8597 NTSYSAPI
8598 ULONG
8599 NTAPI
8600 RtlFindLastBackwardRunClear(
8601 IN PRTL_BITMAP BitMapHeader,
8602 IN ULONG FromIndex,
8603 OUT PULONG StartingRunIndex);
8604
8605 NTSYSAPI
8606 CCHAR
8607 NTAPI
8608 RtlFindLeastSignificantBit(
8609 IN ULONGLONG Set);
8610
8611 NTSYSAPI
8612 ULONG
8613 NTAPI
8614 RtlFindLongestRunClear(
8615 IN PRTL_BITMAP BitMapHeader,
8616 OUT PULONG StartingIndex);
8617
8618 NTSYSAPI
8619 CCHAR
8620 NTAPI
8621 RtlFindMostSignificantBit(
8622 IN ULONGLONG Set);
8623
8624 NTSYSAPI
8625 ULONG
8626 NTAPI
8627 RtlFindNextForwardRunClear(
8628 IN PRTL_BITMAP BitMapHeader,
8629 IN ULONG FromIndex,
8630 OUT PULONG StartingRunIndex);
8631
8632 NTSYSAPI
8633 ULONG
8634 NTAPI
8635 RtlFindSetBits(
8636 IN PRTL_BITMAP BitMapHeader,
8637 IN ULONG NumberToFind,
8638 IN ULONG HintIndex);
8639
8640 NTSYSAPI
8641 ULONG
8642 NTAPI
8643 RtlFindSetBitsAndClear(
8644 IN PRTL_BITMAP BitMapHeader,
8645 IN ULONG NumberToFind,
8646 IN ULONG HintIndex);
8647
8648 NTSYSAPI
8649 VOID
8650 NTAPI
8651 RtlInitAnsiString(
8652 IN OUT PANSI_STRING DestinationString,
8653 IN PCSZ SourceString);
8654
8655 NTSYSAPI
8656 VOID
8657 NTAPI
8658 RtlInitializeBitMap(
8659 IN PRTL_BITMAP BitMapHeader,
8660 IN PULONG BitMapBuffer,
8661 IN ULONG SizeOfBitMap);
8662
8663 NTSYSAPI
8664 VOID
8665 NTAPI
8666 RtlInitString(
8667 IN OUT PSTRING DestinationString,
8668 IN PCSZ SourceString);
8669
8670 NTSYSAPI
8671 NTSTATUS
8672 NTAPI
8673 RtlIntegerToUnicodeString(
8674 IN ULONG Value,
8675 IN ULONG Base OPTIONAL,
8676 IN OUT PUNICODE_STRING String);
8677
8678 NTSYSAPI
8679 NTSTATUS
8680 NTAPI
8681 RtlInt64ToUnicodeString(
8682 IN ULONGLONG Value,
8683 IN ULONG Base OPTIONAL,
8684 IN OUT PUNICODE_STRING String);
8685
8686 #ifdef _WIN64
8687 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8688 RtlInt64ToUnicodeString(Value, Base, String)
8689 #else
8690 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8691 RtlIntegerToUnicodeString(Value, Base, String)
8692 #endif
8693
8694 /* BOOLEAN
8695 * RtlIsZeroLuid(
8696 * IN PLUID L1);
8697 */
8698 #define RtlIsZeroLuid(_L1) \
8699 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
8700
8701 NTSYSAPI
8702 ULONG
8703 NTAPI
8704 RtlLengthSecurityDescriptor(
8705 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8706
8707 NTSYSAPI
8708 ULONG
8709 NTAPI
8710 RtlNumberOfClearBits(
8711 IN PRTL_BITMAP BitMapHeader);
8712
8713 NTSYSAPI
8714 ULONG
8715 NTAPI
8716 RtlNumberOfSetBits(
8717 IN PRTL_BITMAP BitMapHeader);
8718
8719 NTSYSAPI
8720 NTSTATUS
8721 NTAPI
8722 RtlQueryRegistryValues(
8723 IN ULONG RelativeTo,
8724 IN PCWSTR Path,
8725 IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable,
8726 IN PVOID Context OPTIONAL,
8727 IN PVOID Environment OPTIONAL);
8728
8729 #define SHORT_SIZE (sizeof(USHORT))
8730 #define SHORT_MASK (SHORT_SIZE - 1)
8731 #define LONG_SIZE (sizeof(LONG))
8732 #define LONGLONG_SIZE (sizeof(LONGLONG))
8733 #define LONG_MASK (LONG_SIZE - 1)
8734 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
8735 #define LOWBYTE_MASK 0x00FF
8736
8737 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
8738 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
8739 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
8740 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
8741
8742 NTSYSAPI
8743 VOID
8744 NTAPI
8745 RtlSetAllBits(
8746 IN PRTL_BITMAP BitMapHeader);
8747
8748 NTSYSAPI
8749 VOID
8750 NTAPI
8751 RtlSetBits(
8752 IN PRTL_BITMAP BitMapHeader,
8753 IN ULONG StartingIndex,
8754 IN ULONG NumberToSet);
8755
8756 NTSYSAPI
8757 NTSTATUS
8758 NTAPI
8759 RtlSetDaclSecurityDescriptor(
8760 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
8761 IN BOOLEAN DaclPresent,
8762 IN PACL Dacl OPTIONAL,
8763 IN BOOLEAN DaclDefaulted OPTIONAL);
8764
8765 #if defined(_AMD64_)
8766
8767 /* VOID
8768 * RtlStoreUlong(
8769 * IN PULONG Address,
8770 * IN ULONG Value);
8771 */
8772 #define RtlStoreUlong(Address,Value) \
8773 *(ULONG UNALIGNED *)(Address) = (Value)
8774
8775 /* VOID
8776 * RtlStoreUlonglong(
8777 * IN OUT PULONGLONG Address,
8778 * ULONGLONG Value);
8779 */
8780 #define RtlStoreUlonglong(Address,Value) \
8781 *(ULONGLONG UNALIGNED *)(Address) = (Value)
8782
8783 /* VOID
8784 * RtlStoreUshort(
8785 * IN PUSHORT Address,
8786 * IN USHORT Value);
8787 */
8788 #define RtlStoreUshort(Address,Value) \
8789 *(USHORT UNALIGNED *)(Address) = (Value)
8790
8791 /* VOID
8792 * RtlRetrieveUshort(
8793 * PUSHORT DestinationAddress,
8794 * PUSHORT SourceAddress);
8795 */
8796 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8797 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
8798
8799 /* VOID
8800 * RtlRetrieveUlong(
8801 * PULONG DestinationAddress,
8802 * PULONG SourceAddress);
8803 */
8804 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8805 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
8806
8807 #else
8808
8809 #define RtlStoreUlong(Address,Value) \
8810 if ((ULONG_PTR)(Address) & LONG_MASK) { \
8811 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
8812 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
8813 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
8814 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
8815 } \
8816 else { \
8817 *((PULONG)(Address)) = (ULONG) (Value); \
8818 }
8819
8820 #define RtlStoreUlonglong(Address,Value) \
8821 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
8822 RtlStoreUlong((ULONG_PTR)(Address), \
8823 (ULONGLONG)(Value) & 0xFFFFFFFF); \
8824 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
8825 (ULONGLONG)(Value) >> 32); \
8826 } else { \
8827 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
8828 }
8829
8830 #define RtlStoreUshort(Address,Value) \
8831 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
8832 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
8833 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
8834 } \
8835 else { \
8836 *((PUSHORT) (Address)) = (USHORT)Value; \
8837 }
8838
8839 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8840 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8841 { \
8842 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8843 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8844 } \
8845 else \
8846 { \
8847 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
8848 }
8849
8850 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8851 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8852 { \
8853 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8854 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8855 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
8856 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
8857 } \
8858 else \
8859 { \
8860 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
8861 }
8862
8863 #endif /* defined(_AMD64_) */
8864
8865 #ifdef _WIN64
8866 /* VOID
8867 * RtlStoreUlongPtr(
8868 * IN OUT PULONG_PTR Address,
8869 * IN ULONG_PTR Value);
8870 */
8871 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
8872 #else
8873 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
8874 #endif /* _WIN64 */
8875
8876 NTSYSAPI
8877 BOOLEAN
8878 NTAPI
8879 RtlTimeFieldsToTime(
8880 IN PTIME_FIELDS TimeFields,
8881 IN PLARGE_INTEGER Time);
8882
8883 NTSYSAPI
8884 VOID
8885 NTAPI
8886 RtlTimeToTimeFields(
8887 IN PLARGE_INTEGER Time,
8888 IN PTIME_FIELDS TimeFields);
8889
8890 NTSYSAPI
8891 ULONG
8892 FASTCALL
8893 RtlUlongByteSwap(
8894 IN ULONG Source);
8895
8896 NTSYSAPI
8897 ULONGLONG
8898 FASTCALL
8899 RtlUlonglongByteSwap(
8900 IN ULONGLONG Source);
8901
8902 NTSYSAPI
8903 NTSTATUS
8904 NTAPI
8905 RtlUnicodeStringToAnsiString(
8906 IN OUT PANSI_STRING DestinationString,
8907 IN PCUNICODE_STRING SourceString,
8908 IN BOOLEAN AllocateDestinationString);
8909
8910 NTSYSAPI
8911 ULONG
8912 NTAPI
8913 RtlxUnicodeStringToAnsiSize(
8914 IN PCUNICODE_STRING UnicodeString);
8915
8916 #define RtlUnicodeStringToAnsiSize(String) ( \
8917 NLS_MB_CODE_PAGE_TAG ? \
8918 RtlxUnicodeStringToAnsiSize(String) : \
8919 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
8920 )
8921
8922 NTSYSAPI
8923 NTSTATUS
8924 NTAPI
8925 RtlUnicodeStringToInteger(
8926 IN PCUNICODE_STRING String,
8927 IN ULONG Base OPTIONAL,
8928 OUT PULONG Value);
8929
8930 NTSYSAPI
8931 WCHAR
8932 NTAPI
8933 RtlUpcaseUnicodeChar(
8934 IN WCHAR SourceCharacter);
8935
8936 NTSYSAPI
8937 USHORT
8938 FASTCALL
8939 RtlUshortByteSwap(
8940 IN USHORT Source);
8941
8942 NTSYSAPI
8943 BOOLEAN
8944 NTAPI
8945 RtlValidRelativeSecurityDescriptor(
8946 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
8947 IN ULONG SecurityDescriptorLength,
8948 IN SECURITY_INFORMATION RequiredInformation);
8949
8950 NTSYSAPI
8951 BOOLEAN
8952 NTAPI
8953 RtlValidSecurityDescriptor(
8954 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8955
8956 NTSYSAPI
8957 NTSTATUS
8958 NTAPI
8959 RtlWriteRegistryValue(
8960 IN ULONG RelativeTo,
8961 IN PCWSTR Path,
8962 IN PCWSTR ValueName,
8963 IN ULONG ValueType,
8964 IN PVOID ValueData,
8965 IN ULONG ValueLength);
8966
8967
8968 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8969
8970
8971 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
8972 NTSYSAPI
8973 VOID
8974 FASTCALL
8975 RtlPrefetchMemoryNonTemporal(
8976 IN PVOID Source,
8977 IN SIZE_T Length);
8978 #endif
8979
8980
8981 #if (NTDDI_VERSION >= NTDDI_WINXP)
8982
8983
8984 NTSYSAPI
8985 VOID
8986 NTAPI
8987 RtlClearBit(
8988 PRTL_BITMAP BitMapHeader,
8989 ULONG BitNumber);
8990
8991 NTSYSAPI
8992 WCHAR
8993 NTAPI
8994 RtlDowncaseUnicodeChar(
8995 IN WCHAR SourceCharacter);
8996
8997 NTSYSAPI
8998 VOID
8999 NTAPI
9000 RtlSetBit(
9001 PRTL_BITMAP BitMapHeader,
9002 ULONG BitNumber);
9003
9004 NTSYSAPI
9005 BOOLEAN
9006 NTAPI
9007 RtlTestBit(
9008 IN PRTL_BITMAP BitMapHeader,
9009 IN ULONG BitNumber);
9010
9011 NTSYSAPI
9012 NTSTATUS
9013 NTAPI
9014 RtlHashUnicodeString(
9015 IN CONST UNICODE_STRING *String,
9016 IN BOOLEAN CaseInSensitive,
9017 IN ULONG HashAlgorithm,
9018 OUT PULONG HashValue);
9019
9020
9021
9022 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
9023
9024
9025 #if (NTDDI_VERSION >= NTDDI_VISTA)
9026
9027 NTSYSAPI
9028 ULONG
9029 NTAPI
9030 RtlNumberOfSetBitsUlongPtr(
9031 IN ULONG_PTR Target);
9032
9033 NTSYSAPI
9034 ULONGLONG
9035 NTAPI
9036 RtlIoDecodeMemIoResource(
9037 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
9038 OUT PULONGLONG Alignment OPTIONAL,
9039 OUT PULONGLONG MinimumAddress OPTIONAL,
9040 OUT PULONGLONG MaximumAddress OPTIONAL);
9041
9042 NTSYSAPI
9043 NTSTATUS
9044 NTAPI
9045 RtlIoEncodeMemIoResource(
9046 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
9047 IN UCHAR Type,
9048 IN ULONGLONG Length,
9049 IN ULONGLONG Alignment,
9050 IN ULONGLONG MinimumAddress,
9051 IN ULONGLONG MaximumAddress);
9052
9053 NTSYSAPI
9054 ULONGLONG
9055 NTAPI
9056 RtlCmDecodeMemIoResource(
9057 IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
9058 OUT PULONGLONG Start OPTIONAL);
9059
9060 NTSYSAPI
9061 NTSTATUS
9062 NTAPI
9063 RtlFindClosestEncodableLength(
9064 IN ULONGLONG SourceLength,
9065 OUT PULONGLONG TargetLength);
9066
9067 NTSYSAPI
9068 NTSTATUS
9069 NTAPI
9070 RtlCmEncodeMemIoResource(
9071 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
9072 IN UCHAR Type,
9073 IN ULONGLONG Length,
9074 IN ULONGLONG Start);
9075
9076
9077 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
9078
9079 #if (NTDDI_VERSION >= NTDDI_WIN7)
9080
9081 NTSYSAPI
9082 NTSTATUS
9083 NTAPI
9084 RtlUnicodeToUTF8N(
9085 OUT PCHAR UTF8StringDestination,
9086 IN ULONG UTF8StringMaxByteCount,
9087 OUT PULONG UTF8StringActualByteCount,
9088 IN PCWCH UnicodeStringSource,
9089 IN ULONG UnicodeStringByteCount);
9090
9091 NTSYSAPI
9092 NTSTATUS
9093 NTAPI
9094 RtlUTF8ToUnicodeN(
9095 OUT PWSTR UnicodeStringDestination,
9096 IN ULONG UnicodeStringMaxByteCount,
9097 OUT PULONG UnicodeStringActualByteCount,
9098 IN PCCH UTF8StringSource,
9099 IN ULONG UTF8StringByteCount);
9100
9101 NTSYSAPI
9102 ULONG64
9103 NTAPI
9104 RtlGetEnabledExtendedFeatures(
9105 IN ULONG64 FeatureMask);
9106
9107
9108 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
9109
9110
9111 #if !defined(MIDL_PASS)
9112 /* inline funftions */
9113 //DECLSPEC_DEPRECATED_DDK_WINXP
9114 static __inline
9115 LARGE_INTEGER
9116 NTAPI_INLINE
9117 RtlConvertLongToLargeInteger(
9118 IN LONG SignedInteger)
9119 {
9120 LARGE_INTEGER ret;
9121 ret.QuadPart = SignedInteger;
9122 return ret;
9123 }
9124
9125 //DECLSPEC_DEPRECATED_DDK_WINXP
9126 static __inline
9127 LARGE_INTEGER
9128 NTAPI_INLINE
9129 RtlConvertUlongToLargeInteger(
9130 IN ULONG UnsignedInteger)
9131 {
9132 LARGE_INTEGER ret;
9133 ret.QuadPart = UnsignedInteger;
9134 return ret;
9135 }
9136
9137 //DECLSPEC_DEPRECATED_DDK_WINXP
9138 static __inline
9139 LARGE_INTEGER
9140 NTAPI_INLINE
9141 RtlLargeIntegerShiftLeft(
9142 IN LARGE_INTEGER LargeInteger,
9143 IN CCHAR ShiftCount)
9144 {
9145 LARGE_INTEGER Result;
9146
9147 Result.QuadPart = LargeInteger.QuadPart << ShiftCount;
9148 return Result;
9149 }
9150
9151 //DECLSPEC_DEPRECATED_DDK_WINXP
9152 static __inline
9153 LARGE_INTEGER
9154 NTAPI_INLINE
9155 RtlLargeIntegerShiftRight(
9156 IN LARGE_INTEGER LargeInteger,
9157 IN CCHAR ShiftCount)
9158 {
9159 LARGE_INTEGER Result;
9160
9161 Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount;
9162 return Result;
9163 }
9164
9165 //DECLSPEC_DEPRECATED_DDK
9166 static __inline
9167 ULONG
9168 NTAPI_INLINE
9169 RtlEnlargedUnsignedDivide(
9170 IN ULARGE_INTEGER Dividend,
9171 IN ULONG Divisor,
9172 IN OUT PULONG Remainder)
9173 {
9174 if (Remainder)
9175 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9176 return (ULONG)(Dividend.QuadPart / Divisor);
9177 }
9178
9179 //DECLSPEC_DEPRECATED_DDK
9180 static __inline
9181 LARGE_INTEGER
9182 NTAPI_INLINE
9183 RtlLargeIntegerNegate(
9184 IN LARGE_INTEGER Subtrahend)
9185 {
9186 LARGE_INTEGER Difference;
9187
9188 Difference.QuadPart = -Subtrahend.QuadPart;
9189 return Difference;
9190 }
9191
9192 //DECLSPEC_DEPRECATED_DDK
9193 static __inline
9194 LARGE_INTEGER
9195 NTAPI_INLINE
9196 RtlLargeIntegerSubtract(
9197 IN LARGE_INTEGER Minuend,
9198 IN LARGE_INTEGER Subtrahend)
9199 {
9200 LARGE_INTEGER Difference;
9201
9202 Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
9203 return Difference;
9204 }
9205
9206 //DECLSPEC_DEPRECATED_DDK
9207 static __inline
9208 LARGE_INTEGER
9209 NTAPI_INLINE
9210 RtlEnlargedUnsignedMultiply(
9211 IN ULONG Multiplicand,
9212 IN ULONG Multiplier)
9213 {
9214 LARGE_INTEGER ret;
9215 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9216 return ret;
9217 }
9218
9219 //DECLSPEC_DEPRECATED_DDK
9220 static __inline
9221 LARGE_INTEGER
9222 NTAPI_INLINE
9223 RtlEnlargedIntegerMultiply(
9224 IN LONG Multiplicand,
9225 IN LONG Multiplier)
9226 {
9227 LARGE_INTEGER ret;
9228 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9229 return ret;
9230 }
9231
9232 FORCEINLINE
9233 VOID
9234 RtlInitEmptyAnsiString(
9235 OUT PANSI_STRING AnsiString,
9236 IN PCHAR Buffer,
9237 IN USHORT BufferSize)
9238 {
9239 AnsiString->Length = 0;
9240 AnsiString->MaximumLength = BufferSize;
9241 AnsiString->Buffer = Buffer;
9242 }
9243
9244 FORCEINLINE
9245 VOID
9246 RtlInitEmptyUnicodeString(
9247 OUT PUNICODE_STRING UnicodeString,
9248 IN PWSTR Buffer,
9249 IN USHORT BufferSize)
9250 {
9251 UnicodeString->Length = 0;
9252 UnicodeString->MaximumLength = BufferSize;
9253 UnicodeString->Buffer = Buffer;
9254 }
9255
9256 #if defined(_AMD64_) || defined(_IA64_)
9257
9258
9259 static __inline
9260 LARGE_INTEGER
9261 NTAPI_INLINE
9262 RtlExtendedIntegerMultiply(
9263 IN LARGE_INTEGER Multiplicand,
9264 IN LONG Multiplier)
9265 {
9266 LARGE_INTEGER ret;
9267 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
9268 return ret;
9269 }
9270
9271 static __inline
9272 LARGE_INTEGER
9273 NTAPI_INLINE
9274 RtlExtendedLargeIntegerDivide(
9275 IN LARGE_INTEGER Dividend,
9276 IN ULONG Divisor,
9277 OUT PULONG Remainder OPTIONAL)
9278 {
9279 LARGE_INTEGER ret;
9280 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
9281 if (Remainder)
9282 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9283 return ret;
9284 }
9285
9286
9287
9288 #endif /* defined(_AMD64_) || defined(_IA64_) */
9289
9290
9291 #if defined(_AMD64_)
9292
9293 #define MultiplyHigh __mulh
9294 #define UnsignedMultiplyHigh __umulh
9295
9296 //DECLSPEC_DEPRECATED_DDK
9297 static __inline
9298 LARGE_INTEGER
9299 NTAPI_INLINE
9300 RtlExtendedMagicDivide(
9301 IN LARGE_INTEGER Dividend,
9302 IN LARGE_INTEGER MagicDivisor,
9303 IN CCHAR ShiftCount)
9304 {
9305 LARGE_INTEGER ret;
9306 ULONG64 ret64;
9307 BOOLEAN Pos;
9308 Pos = (Dividend.QuadPart >= 0);
9309 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
9310 MagicDivisor.QuadPart);
9311 ret64 >>= ShiftCount;
9312 ret.QuadPart = Pos ? ret64 : -ret64;
9313 return ret;
9314 }
9315 #endif
9316
9317 //DECLSPEC_DEPRECATED_DDK
9318 static __inline
9319 LARGE_INTEGER
9320 NTAPI_INLINE
9321 RtlLargeIntegerAdd(
9322 IN LARGE_INTEGER Addend1,
9323 IN LARGE_INTEGER Addend2)
9324 {
9325 LARGE_INTEGER ret;
9326 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
9327 return ret;
9328 }
9329
9330 /* VOID
9331 * RtlLargeIntegerAnd(
9332 * IN OUT LARGE_INTEGER Result,
9333 * IN LARGE_INTEGER Source,
9334 * IN LARGE_INTEGER Mask);
9335 */
9336 #define RtlLargeIntegerAnd(Result, Source, Mask) \
9337 Result.QuadPart = Source.QuadPart & Mask.QuadPart
9338
9339 //DECLSPEC_DEPRECATED_DDK
9340 static __inline
9341 LARGE_INTEGER
9342 NTAPI_INLINE
9343 RtlLargeIntegerArithmeticShift(
9344 IN LARGE_INTEGER LargeInteger,
9345 IN CCHAR ShiftCount)
9346 {
9347 LARGE_INTEGER ret;
9348 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
9349 return ret;
9350 }
9351
9352 /* BOOLEAN
9353 * RtlLargeIntegerEqualTo(
9354 * IN LARGE_INTEGER Operand1,
9355 * IN LARGE_INTEGER Operand2);
9356 */
9357 #define RtlLargeIntegerEqualTo(X,Y) \
9358 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
9359
9360 FORCEINLINE
9361 PVOID
9362 RtlSecureZeroMemory(
9363 OUT PVOID Pointer,
9364 IN SIZE_T Size)
9365 {
9366 volatile char* vptr = (volatile char*)Pointer;
9367 #if defined(_M_AMD64)
9368 __stosb((PUCHAR)vptr, 0, Size);
9369 #else
9370 char * endptr = (char *)vptr + Size;
9371 while (vptr < endptr) {
9372 *vptr = 0; vptr++;
9373 }
9374 #endif
9375 return Pointer;
9376 }
9377
9378 #if defined(_M_AMD64)
9379 FORCEINLINE
9380 BOOLEAN
9381 RtlCheckBit(
9382 IN PRTL_BITMAP BitMapHeader,
9383 IN ULONG BitPosition)
9384 {
9385 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
9386 }
9387 #else
9388 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
9389 #endif /* defined(_M_AMD64) */
9390
9391 #define RtlLargeIntegerGreaterThan(X,Y) ( \
9392 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
9393 ((X).HighPart > (Y).HighPart) \
9394 )
9395
9396 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
9397 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
9398 ((X).HighPart > (Y).HighPart) \
9399 )
9400
9401 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
9402 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
9403 )
9404
9405 #define RtlLargeIntegerLessThan(X,Y) ( \
9406 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
9407 ((X).HighPart < (Y).HighPart) \
9408 )
9409
9410 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
9411 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
9412 ((X).HighPart < (Y).HighPart) \
9413 )
9414
9415 #define RtlLargeIntegerGreaterThanZero(X) ( \
9416 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
9417 ((X).HighPart > 0 ) \
9418 )
9419
9420 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
9421
9422 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
9423
9424 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
9425
9426 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
9427
9428 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
9429
9430 #endif /* !defined(MIDL_PASS) */
9431
9432 /* Byte Swap Functions */
9433 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
9434 ((defined(_M_AMD64) || defined(_M_IA64)) \
9435 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
9436
9437 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
9438 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
9439 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
9440
9441 #endif
9442
9443 #if DBG
9444
9445 #define ASSERT(exp) \
9446 (VOID)((!(exp)) ? \
9447 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
9448
9449 #define ASSERTMSG(msg, exp) \
9450 (VOID)((!(exp)) ? \
9451 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
9452
9453 #define RTL_SOFT_ASSERT(exp) \
9454 (VOID)((!(exp)) ? \
9455 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
9456
9457 #define RTL_SOFT_ASSERTMSG(msg, exp) \
9458 (VOID)((!(exp)) ? \
9459 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
9460
9461 #define RTL_VERIFY(exp) ASSERT(exp)
9462 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
9463
9464 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
9465 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
9466
9467 #if defined(_MSC_VER)
9468
9469 #define NT_ASSERT(exp) \
9470 ((!(exp)) ? \
9471 (__annotation(L"Debug", L"AssertFail", L#exp), \
9472 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9473
9474 #define NT_ASSERTMSG(msg, exp) \
9475 ((!(exp)) ? \
9476 (__annotation(L"Debug", L"AssertFail", L##msg), \
9477 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9478
9479 #define NT_ASSERTMSGW(msg, exp) \
9480 ((!(exp)) ? \
9481 (__annotation(L"Debug", L"AssertFail", msg), \
9482 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9483
9484 #define NT_VERIFY NT_ASSERT
9485 #define NT_VERIFYMSG NT_ASSERTMSG
9486 #define NT_VERIFYMSGW NT_ASSERTMSGW
9487
9488 #else
9489
9490 /* GCC doesn't support __annotation (nor PDB) */
9491 #define NT_ASSERT(exp) \
9492 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
9493
9494 #define NT_ASSERTMSG NT_ASSERT
9495 #define NT_ASSERTMSGW NT_ASSERT
9496
9497 #endif
9498
9499 #else /* !DBG */
9500
9501 #define ASSERT(exp) ((VOID) 0)
9502 #define ASSERTMSG(msg, exp) ((VOID) 0)
9503
9504 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
9505 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
9506
9507 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
9508 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9509
9510 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
9511 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9512
9513 #define NT_ASSERT(exp) ((VOID)0)
9514 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
9515 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
9516
9517 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
9518 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
9519 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
9520
9521 #endif /* DBG */
9522
9523 #define InitializeListHead32(ListHead) (\
9524 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
9525
9526 #if !defined(_WINBASE_)
9527
9528 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
9529
9530 NTKERNELAPI
9531 VOID
9532 InitializeSListHead(
9533 OUT PSLIST_HEADER SListHead);
9534
9535 #else
9536
9537 FORCEINLINE
9538 VOID
9539 InitializeSListHead(
9540 OUT PSLIST_HEADER SListHead)
9541 {
9542 #if defined(_IA64_)
9543 ULONG64 FeatureBits;
9544 #endif
9545
9546 #if defined(_WIN64)
9547 if (((ULONG_PTR)SListHead & 0xf) != 0) {
9548 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
9549 }
9550 #endif
9551 RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
9552 #if defined(_IA64_)
9553 FeatureBits = __getReg(CV_IA64_CPUID4);
9554 if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
9555 SListHead->Header16.HeaderType = 1;
9556 SListHead->Header16.Init = 1;
9557 }
9558 #endif
9559 }
9560
9561 #endif
9562
9563 #if defined(_WIN64)
9564
9565 #define InterlockedPopEntrySList(Head) \
9566 ExpInterlockedPopEntrySList(Head)
9567
9568 #define InterlockedPushEntrySList(Head, Entry) \
9569 ExpInterlockedPushEntrySList(Head, Entry)
9570
9571 #define InterlockedFlushSList(Head) \
9572 ExpInterlockedFlushSList(Head)
9573
9574 #define QueryDepthSList(Head) \
9575 ExQueryDepthSList(Head)
9576
9577 #else /* !defined(_WIN64) */
9578
9579 NTKERNELAPI
9580 PSLIST_ENTRY
9581 FASTCALL
9582 InterlockedPopEntrySList(
9583 IN PSLIST_HEADER ListHead);
9584
9585 NTKERNELAPI
9586 PSLIST_ENTRY
9587 FASTCALL
9588 InterlockedPushEntrySList(
9589 IN PSLIST_HEADER ListHead,
9590 IN PSLIST_ENTRY ListEntry);
9591
9592 #define InterlockedFlushSList(ListHead) \
9593 ExInterlockedFlushSList(ListHead)
9594
9595 #define QueryDepthSList(Head) \
9596 ExQueryDepthSList(Head)
9597
9598 #endif /* !defined(_WIN64) */
9599
9600 #endif /* !defined(_WINBASE_) */
9601
9602 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
9603 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
9604 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
9605 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
9606 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
9607 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
9608 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
9609 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
9610 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
9611 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
9612 (PCONTEXT_EX)(Context + 1), \
9613 Chunk)
9614
9615 BOOLEAN
9616 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)(
9617 IN ULONG Version);
9618
9619 BOOLEAN
9620 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
9621 IN ULONG Version);
9622
9623 #ifndef RtlIsNtDdiVersionAvailable
9624 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
9625 #endif
9626
9627 #ifndef RtlIsServicePackVersionInstalled
9628 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
9629 #endif
9630
9631 #define RtlInterlockedSetBits(Flags, Flag) \
9632 InterlockedOr((PLONG)(Flags), Flag)
9633
9634 #define RtlInterlockedAndBits(Flags, Flag) \
9635 InterlockedAnd((PLONG)(Flags), Flag)
9636
9637 #define RtlInterlockedClearBits(Flags, Flag) \
9638 RtlInterlockedAndBits(Flags, ~(Flag))
9639
9640 #define RtlInterlockedXorBits(Flags, Flag) \
9641 InterlockedXor(Flags, Flag)
9642
9643 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
9644 (VOID) RtlInterlockedSetBits(Flags, Flag)
9645
9646 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
9647 (VOID) RtlInterlockedAndBits(Flags, Flag)
9648
9649 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
9650 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
9651
9652
9653 /******************************************************************************
9654 * Kernel Functions *
9655 ******************************************************************************/
9656 NTKERNELAPI
9657 VOID
9658 NTAPI
9659 KeInitializeEvent(
9660 OUT PRKEVENT Event,
9661 IN EVENT_TYPE Type,
9662 IN BOOLEAN State);
9663
9664 NTKERNELAPI
9665 VOID
9666 NTAPI
9667 KeClearEvent(
9668 IN OUT PRKEVENT Event);
9669
9670 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9671
9672 #if defined(_NTDDK_) || defined(_NTIFS_)
9673 NTKERNELAPI
9674 VOID
9675 NTAPI
9676 ProbeForRead(
9677 IN CONST VOID *Address, /* CONST is added */
9678 IN SIZE_T Length,
9679 IN ULONG Alignment);
9680 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
9681
9682 NTKERNELAPI
9683 VOID
9684 NTAPI
9685 ProbeForWrite(
9686 IN PVOID Address,
9687 IN SIZE_T Length,
9688 IN ULONG Alignment);
9689
9690 #if defined(SINGLE_GROUP_LEGACY_API)
9691
9692 NTKERNELAPI
9693 VOID
9694 NTAPI
9695 KeRevertToUserAffinityThread(VOID);
9696
9697 NTKERNELAPI
9698 VOID
9699 NTAPI
9700 KeSetSystemAffinityThread(
9701 IN KAFFINITY Affinity);
9702
9703 NTKERNELAPI
9704 VOID
9705 NTAPI
9706 KeSetTargetProcessorDpc(
9707 IN OUT PRKDPC Dpc,
9708 IN CCHAR Number);
9709
9710 NTKERNELAPI
9711 KAFFINITY
9712 NTAPI
9713 KeQueryActiveProcessors(VOID);
9714 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
9715
9716 #if !defined(_M_AMD64)
9717 NTKERNELAPI
9718 ULONGLONG
9719 NTAPI
9720 KeQueryInterruptTime(VOID);
9721
9722 NTKERNELAPI
9723 VOID
9724 NTAPI
9725 KeQuerySystemTime(
9726 OUT PLARGE_INTEGER CurrentTime);
9727 #endif /* !_M_AMD64 */
9728
9729 #if !defined(_X86_) && !defined(_M_ARM)
9730 NTKERNELAPI
9731 KIRQL
9732 NTAPI
9733 KeAcquireSpinLockRaiseToDpc(
9734 IN OUT PKSPIN_LOCK SpinLock);
9735
9736 #define KeAcquireSpinLock(SpinLock, OldIrql) \
9737 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
9738
9739 NTKERNELAPI
9740 VOID
9741 NTAPI
9742 KeAcquireSpinLockAtDpcLevel(
9743 IN OUT PKSPIN_LOCK SpinLock);
9744
9745 NTKERNELAPI
9746 VOID
9747 NTAPI
9748 KeReleaseSpinLock(
9749 IN OUT PKSPIN_LOCK SpinLock,
9750 IN KIRQL NewIrql);
9751
9752 NTKERNELAPI
9753 VOID
9754 NTAPI
9755 KeReleaseSpinLockFromDpcLevel(
9756 IN OUT PKSPIN_LOCK SpinLock);
9757 #endif /* !_X86_ */
9758
9759 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
9760 NTKERNELAPI
9761 VOID
9762 NTAPI
9763 KeInitializeSpinLock(
9764 IN PKSPIN_LOCK SpinLock);
9765 #else
9766 FORCEINLINE
9767 VOID
9768 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
9769 {
9770 /* Clear the lock */
9771 *SpinLock = 0;
9772 }
9773 #endif
9774
9775 NTKERNELAPI
9776 //DECLSPEC_NORETURN
9777 VOID
9778 NTAPI
9779 KeBugCheckEx(
9780 IN ULONG BugCheckCode,
9781 IN ULONG_PTR BugCheckParameter1,
9782 IN ULONG_PTR BugCheckParameter2,
9783 IN ULONG_PTR BugCheckParameter3,
9784 IN ULONG_PTR BugCheckParameter4);
9785
9786 NTKERNELAPI
9787 BOOLEAN
9788 NTAPI
9789 KeCancelTimer(
9790 IN OUT PKTIMER);
9791
9792 NTKERNELAPI
9793 NTSTATUS
9794 NTAPI
9795 KeDelayExecutionThread(
9796 IN KPROCESSOR_MODE WaitMode,
9797 IN BOOLEAN Alertable,
9798 IN PLARGE_INTEGER Interval);
9799
9800 NTKERNELAPI
9801 BOOLEAN
9802 NTAPI
9803 KeDeregisterBugCheckCallback(
9804 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
9805
9806 NTKERNELAPI
9807 VOID
9808 NTAPI
9809 KeEnterCriticalRegion(VOID);
9810
9811 NTKERNELAPI
9812 VOID
9813 NTAPI
9814 KeInitializeDeviceQueue(
9815 OUT PKDEVICE_QUEUE DeviceQueue);
9816
9817 NTKERNELAPI
9818 VOID
9819 NTAPI
9820 KeInitializeDpc(
9821 OUT PRKDPC Dpc,
9822 IN PKDEFERRED_ROUTINE DeferredRoutine,
9823 IN PVOID DeferredContext OPTIONAL);
9824
9825 NTKERNELAPI
9826 VOID
9827 NTAPI
9828 KeInitializeMutex(
9829 OUT PRKMUTEX Mutex,
9830 IN ULONG Level);
9831
9832 NTKERNELAPI
9833 VOID
9834 NTAPI
9835 KeInitializeSemaphore(
9836 OUT PRKSEMAPHORE Semaphore,
9837 IN LONG Count,
9838 IN LONG Limit);
9839
9840 NTKERNELAPI
9841 VOID
9842 NTAPI
9843 KeInitializeTimer(
9844 OUT PKTIMER Timer);
9845
9846 NTKERNELAPI
9847 VOID
9848 NTAPI
9849 KeInitializeTimerEx(
9850 OUT PKTIMER Timer,
9851 IN TIMER_TYPE Type);
9852
9853 NTKERNELAPI
9854 BOOLEAN
9855 NTAPI
9856 KeInsertByKeyDeviceQueue(
9857 IN OUT PKDEVICE_QUEUE DeviceQueue,
9858 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
9859 IN ULONG SortKey);
9860
9861 NTKERNELAPI
9862 BOOLEAN
9863 NTAPI
9864 KeInsertDeviceQueue(
9865 IN OUT PKDEVICE_QUEUE DeviceQueue,
9866 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9867
9868 NTKERNELAPI
9869 BOOLEAN
9870 NTAPI
9871 KeInsertQueueDpc(
9872 IN OUT PRKDPC Dpc,
9873 IN PVOID SystemArgument1 OPTIONAL,
9874 IN PVOID SystemArgument2 OPTIONAL);
9875
9876 NTKERNELAPI
9877 VOID
9878 NTAPI
9879 KeLeaveCriticalRegion(VOID);
9880
9881 NTHALAPI
9882 LARGE_INTEGER
9883 NTAPI
9884 KeQueryPerformanceCounter(
9885 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
9886
9887 NTKERNELAPI
9888 KPRIORITY
9889 NTAPI
9890 KeQueryPriorityThread(
9891 IN PRKTHREAD Thread);
9892
9893 NTKERNELAPI
9894 ULONG
9895 NTAPI
9896 KeQueryTimeIncrement(VOID);
9897
9898 NTKERNELAPI
9899 LONG
9900 NTAPI
9901 KeReadStateEvent(
9902 IN PRKEVENT Event);
9903
9904 NTKERNELAPI
9905 LONG
9906 NTAPI
9907 KeReadStateMutex(
9908 IN PRKMUTEX Mutex);
9909
9910 NTKERNELAPI
9911 LONG
9912 NTAPI
9913 KeReadStateSemaphore(
9914 IN PRKSEMAPHORE Semaphore);
9915
9916 NTKERNELAPI
9917 BOOLEAN
9918 NTAPI
9919 KeReadStateTimer(
9920 IN PKTIMER Timer);
9921
9922 NTKERNELAPI
9923 BOOLEAN
9924 NTAPI
9925 KeRegisterBugCheckCallback(
9926 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
9927 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
9928 IN PVOID Buffer,
9929 IN ULONG Length,
9930 IN PUCHAR Component);
9931
9932 NTKERNELAPI
9933 LONG
9934 NTAPI
9935 KeReleaseMutex(
9936 IN OUT PRKMUTEX Mutex,
9937 IN BOOLEAN Wait);
9938
9939 NTKERNELAPI
9940 LONG
9941 NTAPI
9942 KeReleaseSemaphore(
9943 IN OUT PRKSEMAPHORE Semaphore,
9944 IN KPRIORITY Increment,
9945 IN LONG Adjustment,
9946 IN BOOLEAN Wait);
9947
9948 NTKERNELAPI
9949 PKDEVICE_QUEUE_ENTRY
9950 NTAPI
9951 KeRemoveByKeyDeviceQueue(
9952 IN OUT PKDEVICE_QUEUE DeviceQueue,
9953 IN ULONG SortKey);
9954
9955 NTKERNELAPI
9956 PKDEVICE_QUEUE_ENTRY
9957 NTAPI
9958 KeRemoveDeviceQueue(
9959 IN OUT PKDEVICE_QUEUE DeviceQueue);
9960
9961 NTKERNELAPI
9962 BOOLEAN
9963 NTAPI
9964 KeRemoveEntryDeviceQueue(
9965 IN OUT PKDEVICE_QUEUE DeviceQueue,
9966 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9967
9968 NTKERNELAPI
9969 BOOLEAN
9970 NTAPI
9971 KeRemoveQueueDpc(
9972 IN OUT PRKDPC Dpc);
9973
9974 NTKERNELAPI
9975 LONG
9976 NTAPI
9977 KeResetEvent(
9978 IN OUT PRKEVENT Event);
9979
9980 NTKERNELAPI
9981 LONG
9982 NTAPI
9983 KeSetEvent(
9984 IN OUT PRKEVENT Event,
9985 IN KPRIORITY Increment,
9986 IN BOOLEAN Wait);
9987
9988 NTKERNELAPI
9989 VOID
9990 NTAPI
9991 KeSetImportanceDpc(
9992 IN OUT PRKDPC Dpc,
9993 IN KDPC_IMPORTANCE Importance);
9994
9995 NTKERNELAPI
9996 KPRIORITY
9997 NTAPI
9998 KeSetPriorityThread(
9999 IN OUT PKTHREAD Thread,
10000 IN KPRIORITY Priority);
10001
10002 NTKERNELAPI
10003 BOOLEAN
10004 NTAPI
10005 KeSetTimer(
10006 IN OUT PKTIMER Timer,
10007 IN LARGE_INTEGER DueTime,
10008 IN PKDPC Dpc OPTIONAL);
10009
10010 NTKERNELAPI
10011 BOOLEAN
10012 NTAPI
10013 KeSetTimerEx(
10014 IN OUT PKTIMER Timer,
10015 IN LARGE_INTEGER DueTime,
10016 IN LONG Period OPTIONAL,
10017 IN PKDPC Dpc OPTIONAL);
10018
10019 NTHALAPI
10020 VOID
10021 NTAPI
10022 KeStallExecutionProcessor(
10023 IN ULONG MicroSeconds);
10024
10025 NTKERNELAPI
10026 BOOLEAN
10027 NTAPI
10028 KeSynchronizeExecution(
10029 IN OUT PKINTERRUPT Interrupt,
10030 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
10031 IN PVOID SynchronizeContext OPTIONAL);
10032
10033 NTKERNELAPI
10034 NTSTATUS
10035 NTAPI
10036 KeWaitForMultipleObjects(
10037 IN ULONG Count,
10038 IN PVOID Object[],
10039 IN WAIT_TYPE WaitType,
10040 IN KWAIT_REASON WaitReason,
10041 IN KPROCESSOR_MODE WaitMode,
10042 IN BOOLEAN Alertable,
10043 IN PLARGE_INTEGER Timeout OPTIONAL,
10044 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
10045
10046 #define KeWaitForMutexObject KeWaitForSingleObject
10047
10048 NTKERNELAPI
10049 NTSTATUS
10050 NTAPI
10051 KeWaitForSingleObject(
10052 IN PVOID Object,
10053 IN KWAIT_REASON WaitReason,
10054 IN KPROCESSOR_MODE WaitMode,
10055 IN BOOLEAN Alertable,
10056 IN PLARGE_INTEGER Timeout OPTIONAL);
10057
10058 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10059
10060 #if (NTDDI_VERSION >= NTDDI_WINXP)
10061
10062 _DECL_HAL_KE_IMPORT
10063 VOID
10064 FASTCALL
10065 KeAcquireInStackQueuedSpinLock(
10066 IN OUT PKSPIN_LOCK SpinLock,
10067 OUT PKLOCK_QUEUE_HANDLE LockHandle);
10068
10069 NTKERNELAPI
10070 VOID
10071 FASTCALL
10072 KeAcquireInStackQueuedSpinLockAtDpcLevel(
10073 IN OUT PKSPIN_LOCK SpinLock,
10074 OUT PKLOCK_QUEUE_HANDLE LockHandle);
10075
10076 NTKERNELAPI
10077 KIRQL
10078 NTAPI
10079 KeAcquireInterruptSpinLock(
10080 IN OUT PKINTERRUPT Interrupt);
10081
10082 NTKERNELAPI
10083 BOOLEAN
10084 NTAPI
10085 KeAreApcsDisabled(VOID);
10086
10087 NTKERNELAPI
10088 ULONG
10089 NTAPI
10090 KeGetRecommendedSharedDataAlignment(VOID);
10091
10092 NTKERNELAPI
10093 ULONG
10094 NTAPI
10095 KeQueryRuntimeThread(
10096 IN PKTHREAD Thread,
10097 OUT PULONG UserTime);
10098
10099 NTKERNELAPI
10100 VOID
10101 FASTCALL
10102 KeReleaseInStackQueuedSpinLockFromDpcLevel(
10103 IN PKLOCK_QUEUE_HANDLE LockHandle);
10104
10105 NTKERNELAPI
10106 VOID
10107 NTAPI
10108 KeReleaseInterruptSpinLock(
10109 IN OUT PKINTERRUPT Interrupt,
10110 IN KIRQL OldIrql);
10111
10112 NTKERNELAPI
10113 PKDEVICE_QUEUE_ENTRY
10114 NTAPI
10115 KeRemoveByKeyDeviceQueueIfBusy(
10116 IN OUT PKDEVICE_QUEUE DeviceQueue,
10117 IN ULONG SortKey);
10118
10119 _DECL_HAL_KE_IMPORT
10120 VOID
10121 FASTCALL
10122 KeReleaseInStackQueuedSpinLock(
10123 IN PKLOCK_QUEUE_HANDLE LockHandle);
10124
10125 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10126
10127 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
10128
10129 NTKERNELAPI
10130 BOOLEAN
10131 NTAPI
10132 KeDeregisterBugCheckReasonCallback(
10133 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
10134
10135 NTKERNELAPI
10136 BOOLEAN
10137 NTAPI
10138 KeRegisterBugCheckReasonCallback(
10139 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
10140 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
10141 IN KBUGCHECK_CALLBACK_REASON Reason,
10142 IN PUCHAR Component);
10143
10144 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
10145
10146 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10147 NTKERNELAPI
10148 VOID
10149 NTAPI
10150 KeFlushQueuedDpcs(VOID);
10151 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
10152 #if (NTDDI_VERSION >= NTDDI_WS03)
10153
10154 NTKERNELAPI
10155 PVOID
10156 NTAPI
10157 KeRegisterNmiCallback(
10158 IN PNMI_CALLBACK CallbackRoutine,
10159 IN PVOID Context OPTIONAL);
10160
10161 NTKERNELAPI
10162 NTSTATUS
10163 NTAPI
10164 KeDeregisterNmiCallback(
10165 IN PVOID Handle);
10166
10167 NTKERNELAPI
10168 VOID
10169 NTAPI
10170 KeInitializeThreadedDpc(
10171 OUT PRKDPC Dpc,
10172 IN PKDEFERRED_ROUTINE DeferredRoutine,
10173 IN PVOID DeferredContext OPTIONAL);
10174
10175 NTKERNELAPI
10176 ULONG_PTR
10177 NTAPI
10178 KeIpiGenericCall(
10179 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
10180 IN ULONG_PTR Context);
10181
10182 NTKERNELAPI
10183 KIRQL
10184 FASTCALL
10185 KeAcquireSpinLockForDpc(
10186 IN OUT PKSPIN_LOCK SpinLock);
10187
10188 NTKERNELAPI
10189 VOID
10190 FASTCALL
10191 KeReleaseSpinLockForDpc(
10192 IN OUT PKSPIN_LOCK SpinLock,
10193 IN KIRQL OldIrql);
10194
10195 NTKERNELAPI
10196 BOOLEAN
10197 FASTCALL
10198 KeTestSpinLock(
10199 IN PKSPIN_LOCK SpinLock);
10200
10201 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10202 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10203
10204 NTKERNELAPI
10205 BOOLEAN
10206 FASTCALL
10207 KeTryToAcquireSpinLockAtDpcLevel(
10208 IN OUT PKSPIN_LOCK SpinLock);
10209
10210 NTKERNELAPI
10211 BOOLEAN
10212 NTAPI
10213 KeAreAllApcsDisabled(VOID);
10214
10215 NTKERNELAPI
10216 VOID
10217 FASTCALL
10218 KeAcquireGuardedMutex(
10219 IN OUT PKGUARDED_MUTEX GuardedMutex);
10220
10221 NTKERNELAPI
10222 VOID
10223 FASTCALL
10224 KeAcquireGuardedMutexUnsafe(
10225 IN OUT PKGUARDED_MUTEX GuardedMutex);
10226
10227 NTKERNELAPI
10228 VOID
10229 NTAPI
10230 KeEnterGuardedRegion(VOID);
10231
10232 NTKERNELAPI
10233 VOID
10234 NTAPI
10235 KeLeaveGuardedRegion(VOID);
10236
10237 NTKERNELAPI
10238 VOID
10239 FASTCALL
10240 KeInitializeGuardedMutex(
10241 OUT PKGUARDED_MUTEX GuardedMutex);
10242
10243 NTKERNELAPI
10244 VOID
10245 FASTCALL
10246 KeReleaseGuardedMutexUnsafe(
10247 IN OUT PKGUARDED_MUTEX GuardedMutex);
10248
10249 NTKERNELAPI
10250 VOID
10251 FASTCALL
10252 KeReleaseGuardedMutex(
10253 IN OUT PKGUARDED_MUTEX GuardedMutex);
10254
10255 NTKERNELAPI
10256 BOOLEAN
10257 FASTCALL
10258 KeTryToAcquireGuardedMutex(
10259 IN OUT PKGUARDED_MUTEX GuardedMutex);
10260 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
10261
10262 #if (NTDDI_VERSION >= NTDDI_VISTA)
10263 NTKERNELAPI
10264 VOID
10265 FASTCALL
10266 KeAcquireInStackQueuedSpinLockForDpc(
10267 IN OUT PKSPIN_LOCK SpinLock,
10268 OUT PKLOCK_QUEUE_HANDLE LockHandle);
10269
10270 NTKERNELAPI
10271 VOID
10272 FASTCALL
10273 KeReleaseInStackQueuedSpinLockForDpc(
10274 IN PKLOCK_QUEUE_HANDLE LockHandle);
10275
10276 NTKERNELAPI
10277 NTSTATUS
10278 NTAPI
10279 KeQueryDpcWatchdogInformation(
10280 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
10281 #if defined(SINGLE_GROUP_LEGACY_API)
10282
10283 NTKERNELAPI
10284 KAFFINITY
10285 NTAPI
10286 KeSetSystemAffinityThreadEx(
10287 IN KAFFINITY Affinity);
10288
10289 NTKERNELAPI
10290 VOID
10291 NTAPI
10292 KeRevertToUserAffinityThreadEx(
10293 IN KAFFINITY Affinity);
10294
10295 NTKERNELAPI
10296 ULONG
10297 NTAPI
10298 KeQueryActiveProcessorCount(
10299 OUT PKAFFINITY ActiveProcessors OPTIONAL);
10300
10301 NTKERNELAPI
10302 ULONG
10303 NTAPI
10304 KeQueryMaximumProcessorCount(VOID);
10305 #endif /* SINGLE_GROUP_LEGACY_API */
10306
10307 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10308
10309 #if (NTDDI_VERSION >= NTDDI_WS08)
10310
10311 PVOID
10312 KeRegisterProcessorChangeCallback(
10313 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
10314 IN PVOID CallbackContext OPTIONAL,
10315 IN ULONG Flags);
10316
10317 VOID
10318 KeDeregisterProcessorChangeCallback(
10319 IN PVOID CallbackHandle);
10320
10321 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
10322 #if (NTDDI_VERSION >= NTDDI_WIN7)
10323
10324 ULONG64
10325 NTAPI
10326 KeQueryTotalCycleTimeProcess(
10327 IN OUT PKPROCESS Process,
10328 OUT PULONG64 CycleTimeStamp);
10329
10330 ULONG64
10331 NTAPI
10332 KeQueryTotalCycleTimeThread(
10333 IN OUT PKTHREAD Thread,
10334 OUT PULONG64 CycleTimeStamp);
10335
10336 NTKERNELAPI
10337 NTSTATUS
10338 NTAPI
10339 KeSetTargetProcessorDpcEx(
10340 IN OUT PKDPC Dpc,
10341 IN PPROCESSOR_NUMBER ProcNumber);
10342
10343 NTKERNELAPI
10344 VOID
10345 NTAPI
10346 KeSetSystemGroupAffinityThread(
10347 IN PGROUP_AFFINITY Affinity,
10348 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
10349
10350 NTKERNELAPI
10351 VOID
10352 NTAPI
10353 KeRevertToUserGroupAffinityThread(
10354 IN PGROUP_AFFINITY PreviousAffinity);
10355
10356 NTKERNELAPI
10357 BOOLEAN
10358 NTAPI
10359 KeSetCoalescableTimer(
10360 IN OUT PKTIMER Timer,
10361 IN LARGE_INTEGER DueTime,
10362 IN ULONG Period,
10363 IN ULONG TolerableDelay,
10364 IN PKDPC Dpc OPTIONAL);
10365
10366 NTKERNELAPI
10367 ULONGLONG
10368 NTAPI
10369 KeQueryUnbiasedInterruptTime(VOID);
10370
10371 NTKERNELAPI
10372 ULONG
10373 NTAPI
10374 KeQueryActiveProcessorCountEx(
10375 IN USHORT GroupNumber);
10376
10377 NTKERNELAPI
10378 ULONG
10379 NTAPI
10380 KeQueryMaximumProcessorCountEx(
10381 IN USHORT GroupNumber);
10382
10383 NTKERNELAPI
10384 USHORT
10385 NTAPI
10386 KeQueryActiveGroupCount(VOID);
10387
10388 NTKERNELAPI
10389 USHORT
10390 NTAPI
10391 KeQueryMaximumGroupCount(VOID);
10392
10393 NTKERNELAPI
10394 KAFFINITY
10395 NTAPI
10396 KeQueryGroupAffinity(
10397 IN USHORT GroupNumber);
10398
10399 NTKERNELAPI
10400 ULONG
10401 NTAPI
10402 KeGetCurrentProcessorNumberEx(
10403 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
10404
10405 NTKERNELAPI
10406 VOID
10407 NTAPI
10408 KeQueryNodeActiveAffinity(
10409 IN USHORT NodeNumber,
10410 OUT PGROUP_AFFINITY Affinity OPTIONAL,
10411 OUT PUSHORT Count OPTIONAL);
10412
10413 NTKERNELAPI
10414 USHORT
10415 NTAPI
10416 KeQueryNodeMaximumProcessorCount(
10417 IN USHORT NodeNumber);
10418
10419 NTKERNELAPI
10420 USHORT
10421 NTAPI
10422 KeQueryHighestNodeNumber(VOID);
10423
10424 NTKERNELAPI
10425 USHORT
10426 NTAPI
10427 KeGetCurrentNodeNumber(VOID);
10428
10429 NTKERNELAPI
10430 NTSTATUS
10431 NTAPI
10432 KeQueryLogicalProcessorRelationship(
10433 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
10434 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
10435 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
10436 IN OUT PULONG Length);
10437
10438 NTKERNELAPI
10439 NTSTATUS
10440 NTAPI
10441 KeSaveExtendedProcessorState(
10442 IN ULONG64 Mask,
10443 OUT PXSTATE_SAVE XStateSave);
10444
10445 NTKERNELAPI
10446 VOID
10447 NTAPI
10448 KeRestoreExtendedProcessorState(
10449 IN PXSTATE_SAVE XStateSave);
10450
10451 NTSTATUS
10452 NTAPI
10453 KeGetProcessorNumberFromIndex(
10454 IN ULONG ProcIndex,
10455 OUT PPROCESSOR_NUMBER ProcNumber);
10456
10457 ULONG
10458 NTAPI
10459 KeGetProcessorIndexFromNumber(
10460 IN PPROCESSOR_NUMBER ProcNumber);
10461 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10462 #if !defined(_IA64_)
10463 NTHALAPI
10464 VOID
10465 NTAPI
10466 KeFlushWriteBuffer(VOID);
10467 #endif
10468
10469 /* VOID
10470 * KeInitializeCallbackRecord(
10471 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
10472 */
10473 #define KeInitializeCallbackRecord(CallbackRecord) \
10474 CallbackRecord->State = BufferEmpty;
10475
10476 #if DBG
10477
10478 #if (NTDDI_VERSION >= NTDDI_VISTA)
10479 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
10480 #else
10481 #define PAGED_ASSERT( exp ) ASSERT( exp )
10482 #endif
10483
10484 #define PAGED_CODE() { \
10485 if (KeGetCurrentIrql() > APC_LEVEL) { \
10486 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
10487 PAGED_ASSERT(FALSE); \
10488 } \
10489 }
10490
10491 #else
10492
10493 #define PAGED_CODE()
10494
10495 #endif /* DBG */
10496
10497 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
10498
10499 /******************************************************************************
10500 * Memory manager Functions *
10501 ******************************************************************************/
10502 /* Alignment Macros */
10503 #define ALIGN_DOWN_BY(size, align) \
10504 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
10505
10506 #define ALIGN_UP_BY(size, align) \
10507 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
10508
10509 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
10510 ((PVOID)ALIGN_DOWN_BY(ptr, align))
10511
10512 #define ALIGN_UP_POINTER_BY(ptr, align) \
10513 ((PVOID)ALIGN_UP_BY(ptr, align))
10514
10515 #define ALIGN_DOWN(size, type) \
10516 ALIGN_DOWN_BY(size, sizeof(type))
10517
10518 #define ALIGN_UP(size, type) \
10519 ALIGN_UP_BY(size, sizeof(type))
10520
10521 #define ALIGN_DOWN_POINTER(ptr, type) \
10522 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
10523
10524 #define ALIGN_UP_POINTER(ptr, type) \
10525 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
10526
10527 #ifndef FIELD_OFFSET
10528 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
10529 #endif
10530
10531 #ifndef FIELD_SIZE
10532 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
10533 #endif
10534
10535 #define POOL_TAGGING 1
10536
10537 #if DBG
10538 #define IF_DEBUG if (TRUE)
10539 #else
10540 #define IF_DEBUG if (FALSE)
10541 #endif /* DBG */
10542
10543 /* ULONG
10544 * BYTE_OFFSET(
10545 * IN PVOID Va)
10546 */
10547 #define BYTE_OFFSET(Va) \
10548 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
10549
10550 /* ULONG
10551 * BYTES_TO_PAGES(
10552 * IN ULONG Size)
10553 */
10554 #define BYTES_TO_PAGES(Size) \
10555 (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT)
10556
10557 /* PVOID
10558 * PAGE_ALIGN(
10559 * IN PVOID Va)
10560 */
10561 #define PAGE_ALIGN(Va) \
10562 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
10563
10564 /* ULONG_PTR
10565 * ROUND_TO_PAGES(
10566 * IN ULONG_PTR Size)
10567 */
10568 #define ROUND_TO_PAGES(Size) \
10569 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
10570
10571 /* ULONG
10572 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
10573 * IN PVOID Va,
10574 * IN ULONG Size)
10575 */
10576 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
10577 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
10578 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
10579
10580 #define COMPUTE_PAGES_SPANNED(Va, Size) \
10581 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
10582
10583 /*
10584 * ULONG
10585 * MmGetMdlByteCount(
10586 * IN PMDL Mdl)
10587 */
10588 #define MmGetMdlByteCount(_Mdl) \
10589 ((_Mdl)->ByteCount)
10590
10591 /*
10592 * ULONG
10593 * MmGetMdlByteOffset(
10594 * IN PMDL Mdl)
10595 */
10596 #define MmGetMdlByteOffset(_Mdl) \
10597 ((_Mdl)->ByteOffset)
10598
10599 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
10600
10601 /*
10602 * PPFN_NUMBER
10603 * MmGetMdlPfnArray(
10604 * IN PMDL Mdl)
10605 */
10606 #define MmGetMdlPfnArray(_Mdl) \
10607 ((PPFN_NUMBER) ((_Mdl) + 1))
10608
10609 /*
10610 * PVOID
10611 * MmGetMdlVirtualAddress(
10612 * IN PMDL Mdl)
10613 */
10614 #define MmGetMdlVirtualAddress(_Mdl) \
10615 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
10616
10617 #define MmGetProcedureAddress(Address) (Address)
10618 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
10619
10620 /* PVOID MmGetSystemAddressForMdl(
10621 * IN PMDL Mdl);
10622 */
10623 #define MmGetSystemAddressForMdl(Mdl) \
10624 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
10625 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10626 ((Mdl)->MappedSystemVa) : \
10627 (MmMapLockedPages((Mdl), KernelMode)))
10628
10629 /* PVOID
10630 * MmGetSystemAddressForMdlSafe(
10631 * IN PMDL Mdl,
10632 * IN MM_PAGE_PRIORITY Priority)
10633 */
10634 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
10635 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
10636 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10637 (_Mdl)->MappedSystemVa : \
10638 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
10639 KernelMode, MmCached, NULL, FALSE, (_Priority)))
10640
10641 /*
10642 * VOID
10643 * MmInitializeMdl(
10644 * IN PMDL MemoryDescriptorList,
10645 * IN PVOID BaseVa,
10646 * IN SIZE_T Length)
10647 */
10648 #define MmInitializeMdl(_MemoryDescriptorList, \
10649 _BaseVa, \
10650 _Length) \
10651 { \
10652 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
10653 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
10654 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
10655 (_MemoryDescriptorList)->MdlFlags = 0; \
10656 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
10657 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
10658 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
10659 }
10660
10661 /*
10662 * VOID
10663 * MmPrepareMdlForReuse(
10664 * IN PMDL Mdl)
10665 */
10666 #define MmPrepareMdlForReuse(_Mdl) \
10667 { \
10668 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
10669 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
10670 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
10671 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
10672 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
10673 } \
10674 }
10675
10676 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10677 NTKERNELAPI
10678 PVOID
10679 NTAPI
10680 MmAllocateContiguousMemory(
10681 IN SIZE_T NumberOfBytes,
10682 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
10683
10684 NTKERNELAPI
10685 PVOID
10686 NTAPI
10687 MmAllocateContiguousMemorySpecifyCache(
10688 IN SIZE_T NumberOfBytes,
10689 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10690 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10691 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10692 IN MEMORY_CACHING_TYPE CacheType);
10693
10694 NTKERNELAPI
10695 PMDL
10696 NTAPI
10697 MmAllocatePagesForMdl(
10698 IN PHYSICAL_ADDRESS LowAddress,
10699 IN PHYSICAL_ADDRESS HighAddress,
10700 IN PHYSICAL_ADDRESS SkipBytes,
10701 IN SIZE_T TotalBytes);
10702
10703 NTKERNELAPI
10704 VOID
10705 NTAPI
10706 MmBuildMdlForNonPagedPool(
10707 IN OUT PMDLX MemoryDescriptorList);
10708
10709 //DECLSPEC_DEPRECATED_DDK
10710 NTKERNELAPI
10711 PMDL
10712 NTAPI
10713 MmCreateMdl(
10714 IN PMDL MemoryDescriptorList OPTIONAL,
10715 IN PVOID Base,
10716 IN SIZE_T Length);
10717
10718 NTKERNELAPI
10719 VOID
10720 NTAPI
10721 MmFreeContiguousMemory(
10722 IN PVOID BaseAddress);
10723
10724 NTKERNELAPI
10725 VOID
10726 NTAPI
10727 MmFreeContiguousMemorySpecifyCache(
10728 IN PVOID BaseAddress,
10729 IN SIZE_T NumberOfBytes,
10730 IN MEMORY_CACHING_TYPE CacheType);
10731
10732 NTKERNELAPI
10733 VOID
10734 NTAPI
10735 MmFreePagesFromMdl(
10736 IN PMDLX MemoryDescriptorList);
10737
10738 NTKERNELAPI
10739 PVOID
10740 NTAPI
10741 MmGetSystemRoutineAddress(
10742 IN PUNICODE_STRING SystemRoutineName);
10743
10744 NTKERNELAPI
10745 LOGICAL
10746 NTAPI
10747 MmIsDriverVerifying(
10748 IN struct _DRIVER_OBJECT *DriverObject);
10749
10750 NTKERNELAPI
10751 PVOID
10752 NTAPI
10753 MmLockPagableDataSection(
10754 IN PVOID AddressWithinSection);
10755
10756 NTKERNELAPI
10757 PVOID
10758 NTAPI
10759 MmMapIoSpace(
10760 IN PHYSICAL_ADDRESS PhysicalAddress,
10761 IN SIZE_T NumberOfBytes,
10762 IN MEMORY_CACHING_TYPE CacheEnable);
10763
10764 NTKERNELAPI
10765 PVOID
10766 NTAPI
10767 MmMapLockedPages(
10768 IN PMDL MemoryDescriptorList,
10769 IN KPROCESSOR_MODE AccessMode);
10770
10771 NTKERNELAPI
10772 PVOID
10773 NTAPI
10774 MmMapLockedPagesSpecifyCache(
10775 IN PMDLX MemoryDescriptorList,
10776 IN KPROCESSOR_MODE AccessMode,
10777 IN MEMORY_CACHING_TYPE CacheType,
10778 IN PVOID BaseAddress OPTIONAL,
10779 IN ULONG BugCheckOnFailure,
10780 IN MM_PAGE_PRIORITY Priority);
10781
10782 NTKERNELAPI
10783 PVOID
10784 NTAPI
10785 MmPageEntireDriver(
10786 IN PVOID AddressWithinSection);
10787
10788 NTKERNELAPI
10789 VOID
10790 NTAPI
10791 MmProbeAndLockPages(
10792 IN OUT PMDL MemoryDescriptorList,
10793 IN KPROCESSOR_MODE AccessMode,
10794 IN LOCK_OPERATION Operation);
10795
10796 NTKERNELAPI
10797 MM_SYSTEMSIZE
10798 NTAPI
10799 MmQuerySystemSize(VOID);
10800
10801 NTKERNELAPI
10802 VOID
10803 NTAPI
10804 MmResetDriverPaging(
10805 IN PVOID AddressWithinSection);
10806
10807 NTKERNELAPI
10808 SIZE_T
10809 NTAPI
10810 MmSizeOfMdl(
10811 IN PVOID Base,
10812 IN SIZE_T Length);
10813
10814 NTKERNELAPI
10815 VOID
10816 NTAPI
10817 MmUnlockPagableImageSection(
10818 IN PVOID ImageSectionHandle);
10819
10820 NTKERNELAPI
10821 VOID
10822 NTAPI
10823 MmUnlockPages(
10824 IN OUT PMDL MemoryDescriptorList);
10825
10826 NTKERNELAPI
10827 VOID
10828 NTAPI
10829 MmUnmapIoSpace(
10830 IN PVOID BaseAddress,
10831 IN SIZE_T NumberOfBytes);
10832
10833 NTKERNELAPI
10834 VOID
10835 NTAPI
10836 MmProbeAndLockProcessPages(
10837 IN OUT PMDL MemoryDescriptorList,
10838 IN PEPROCESS Process,
10839 IN KPROCESSOR_MODE AccessMode,
10840 IN LOCK_OPERATION Operation);
10841
10842 NTKERNELAPI
10843 VOID
10844 NTAPI
10845 MmUnmapLockedPages(
10846 IN PVOID BaseAddress,
10847 IN PMDL MemoryDescriptorList);
10848
10849 NTKERNELAPI
10850 PVOID
10851 NTAPI
10852 MmAllocateContiguousMemorySpecifyCacheNode(
10853 IN SIZE_T NumberOfBytes,
10854 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10855 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10856 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10857 IN MEMORY_CACHING_TYPE CacheType,
10858 IN NODE_REQUIREMENT PreferredNode);
10859
10860 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10861
10862 #if (NTDDI_VERSION >= NTDDI_WINXP)
10863
10864 NTKERNELAPI
10865 NTSTATUS
10866 NTAPI
10867 MmAdvanceMdl(
10868 IN OUT PMDL Mdl,
10869 IN ULONG NumberOfBytes);
10870
10871 NTKERNELAPI
10872 PVOID
10873 NTAPI
10874 MmAllocateMappingAddress(
10875 IN SIZE_T NumberOfBytes,
10876 IN ULONG PoolTag);
10877
10878 NTKERNELAPI
10879 VOID
10880 NTAPI
10881 MmFreeMappingAddress(
10882 IN PVOID BaseAddress,
10883 IN ULONG PoolTag);
10884
10885 NTKERNELAPI
10886 NTSTATUS
10887 NTAPI
10888 MmIsVerifierEnabled(
10889 OUT PULONG VerifierFlags);
10890
10891 NTKERNELAPI
10892 PVOID
10893 NTAPI
10894 MmMapLockedPagesWithReservedMapping(
10895 IN PVOID MappingAddress,
10896 IN ULONG PoolTag,
10897 IN PMDL MemoryDescriptorList,
10898 IN MEMORY_CACHING_TYPE CacheType);
10899
10900 NTKERNELAPI
10901 NTSTATUS
10902 NTAPI
10903 MmProtectMdlSystemAddress(
10904 IN PMDL MemoryDescriptorList,
10905 IN ULONG NewProtect);
10906
10907 NTKERNELAPI
10908 VOID
10909 NTAPI
10910 MmUnmapReservedMapping(
10911 IN PVOID BaseAddress,
10912 IN ULONG PoolTag,
10913 IN PMDL MemoryDescriptorList);
10914
10915 NTKERNELAPI
10916 NTSTATUS
10917 NTAPI
10918 MmAddVerifierThunks(
10919 IN PVOID ThunkBuffer,
10920 IN ULONG ThunkBufferSize);
10921
10922 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10923 #if (NTDDI_VERSION >= NTDDI_WS03)
10924 NTKERNELAPI
10925 LOGICAL
10926 NTAPI
10927 MmIsIoSpaceActive(
10928 IN PHYSICAL_ADDRESS StartAddress,
10929 IN SIZE_T NumberOfBytes);
10930
10931 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10932 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10933 NTKERNELAPI
10934 PMDL
10935 NTAPI
10936 MmAllocatePagesForMdlEx(
10937 IN PHYSICAL_ADDRESS LowAddress,
10938 IN PHYSICAL_ADDRESS HighAddress,
10939 IN PHYSICAL_ADDRESS SkipBytes,
10940 IN SIZE_T TotalBytes,
10941 IN MEMORY_CACHING_TYPE CacheType,
10942 IN ULONG Flags);
10943 #endif
10944
10945 #if (NTDDI_VERSION >= NTDDI_VISTA)
10946 NTKERNELAPI
10947 LOGICAL
10948 NTAPI
10949 MmIsDriverVerifyingByAddress(
10950 IN PVOID AddressWithinSection);
10951 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10952
10953 /******************************************************************************
10954 * Security Manager Functions *
10955 ******************************************************************************/
10956
10957 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10958 NTKERNELAPI
10959 BOOLEAN
10960 NTAPI
10961 SeAccessCheck(
10962 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10963 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
10964 IN BOOLEAN SubjectContextLocked,
10965 IN ACCESS_MASK DesiredAccess,
10966 IN ACCESS_MASK PreviouslyGrantedAccess,
10967 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
10968 IN PGENERIC_MAPPING GenericMapping,
10969 IN KPROCESSOR_MODE AccessMode,
10970 OUT PACCESS_MASK GrantedAccess,
10971 OUT PNTSTATUS AccessStatus);
10972
10973 NTKERNELAPI
10974 NTSTATUS
10975 NTAPI
10976 SeAssignSecurity(
10977 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10978 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10979 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10980 IN BOOLEAN IsDirectoryObject,
10981 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10982 IN PGENERIC_MAPPING GenericMapping,
10983 IN POOL_TYPE PoolType);
10984
10985 NTKERNELAPI
10986 NTSTATUS
10987 NTAPI
10988 SeAssignSecurityEx(
10989 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10990 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10991 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10992 IN GUID *ObjectType OPTIONAL,
10993 IN BOOLEAN IsDirectoryObject,
10994 IN ULONG AutoInheritFlags,
10995 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10996 IN PGENERIC_MAPPING GenericMapping,
10997 IN POOL_TYPE PoolType);
10998
10999 NTKERNELAPI
11000 NTSTATUS
11001 NTAPI
11002 SeDeassignSecurity(
11003 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
11004
11005 NTKERNELAPI
11006 BOOLEAN
11007 NTAPI
11008 SeValidSecurityDescriptor(
11009 IN ULONG Length,
11010 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11011
11012 NTKERNELAPI
11013 ULONG
11014 NTAPI
11015 SeObjectCreateSaclAccessBits(
11016 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11017
11018 NTKERNELAPI
11019 VOID
11020 NTAPI
11021 SeReleaseSubjectContext(
11022 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11023
11024 NTKERNELAPI
11025 VOID
11026 NTAPI
11027 SeUnlockSubjectContext(
11028 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11029
11030 NTKERNELAPI
11031 VOID
11032 NTAPI
11033 SeCaptureSubjectContext(
11034 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11035
11036 NTKERNELAPI
11037 VOID
11038 NTAPI
11039 SeLockSubjectContext(
11040 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11041
11042
11043 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11044
11045 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11046
11047 NTSTATUS
11048 NTAPI
11049 SeSetAuditParameter(
11050 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
11051 IN SE_ADT_PARAMETER_TYPE Type,
11052 IN ULONG Index,
11053 IN PVOID Data);
11054
11055 NTSTATUS
11056 NTAPI
11057 SeReportSecurityEvent(
11058 IN ULONG Flags,
11059 IN PUNICODE_STRING SourceName,
11060 IN PSID UserSid OPTIONAL,
11061 IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
11062
11063 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11064
11065 #if (NTDDI_VERSION >= NTDDI_VISTA)
11066 NTKERNELAPI
11067 ULONG
11068 NTAPI
11069 SeComputeAutoInheritByObjectType(
11070 IN PVOID ObjectType,
11071 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
11072 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
11073
11074 #ifdef SE_NTFS_WORLD_CACHE
11075 VOID
11076 NTAPI
11077 SeGetWorldRights(
11078 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
11079 IN PGENERIC_MAPPING GenericMapping,
11080 OUT PACCESS_MASK GrantedAccess);
11081 #endif /* SE_NTFS_WORLD_CACHE */
11082 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11083 /******************************************************************************
11084 * Configuration Manager Functions *
11085 ******************************************************************************/
11086
11087 #if (NTDDI_VERSION >= NTDDI_WINXP)
11088 NTKERNELAPI
11089 NTSTATUS
11090 NTAPI
11091 CmRegisterCallback(
11092 IN PEX_CALLBACK_FUNCTION Function,
11093 IN PVOID Context OPTIONAL,
11094 OUT PLARGE_INTEGER Cookie);
11095
11096 NTKERNELAPI
11097 NTSTATUS
11098 NTAPI
11099 CmUnRegisterCallback(
11100 IN LARGE_INTEGER Cookie);
11101 #endif
11102
11103 #if (NTDDI_VERSION >= NTDDI_VISTA)
11104
11105 NTKERNELAPI
11106 NTSTATUS
11107 NTAPI
11108 CmRegisterCallbackEx(
11109 PEX_CALLBACK_FUNCTION Function,
11110 PCUNICODE_STRING Altitude,
11111 PVOID Driver,
11112 PVOID Context,
11113 PLARGE_INTEGER Cookie,
11114 PVOID Reserved);
11115
11116 NTKERNELAPI
11117 VOID
11118 NTAPI
11119 CmGetCallbackVersion(
11120 OUT PULONG Major OPTIONAL,
11121 OUT PULONG Minor OPTIONAL);
11122
11123 NTKERNELAPI
11124 NTSTATUS
11125 NTAPI
11126 CmSetCallbackObjectContext(
11127 IN OUT PVOID Object,
11128 IN PLARGE_INTEGER Cookie,
11129 IN PVOID NewContext,
11130 OUT PVOID *OldContext OPTIONAL);
11131
11132 NTKERNELAPI
11133 NTSTATUS
11134 NTAPI
11135 CmCallbackGetKeyObjectID(
11136 IN PLARGE_INTEGER Cookie,
11137 IN PVOID Object,
11138 OUT PULONG_PTR ObjectID OPTIONAL,
11139 OUT PCUNICODE_STRING *ObjectName OPTIONAL);
11140
11141 NTKERNELAPI
11142 PVOID
11143 NTAPI
11144 CmGetBoundTransaction(
11145 IN PLARGE_INTEGER Cookie,
11146 IN PVOID Object);
11147
11148 #endif // NTDDI_VERSION >= NTDDI_VISTA
11149
11150
11151 /******************************************************************************
11152 * I/O Manager Functions *
11153 ******************************************************************************/
11154
11155 /*
11156 * NTSTATUS
11157 * IoAcquireRemoveLock(
11158 * IN PIO_REMOVE_LOCK RemoveLock,
11159 * IN OPTIONAL PVOID Tag)
11160 */
11161 #if DBG
11162 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11163 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11164 #else
11165 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11166 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
11167 #endif
11168
11169 /*
11170 * VOID
11171 * IoAdjustPagingPathCount(
11172 * IN PLONG Count,
11173 * IN BOOLEAN Increment)
11174 */
11175 #define IoAdjustPagingPathCount(_Count, \
11176 _Increment) \
11177 { \
11178 if (_Increment) \
11179 { \
11180 InterlockedIncrement(_Count); \
11181 } \
11182 else \
11183 { \
11184 InterlockedDecrement(_Count); \
11185 } \
11186 }
11187
11188 #if !defined(_M_AMD64)
11189 NTHALAPI
11190 VOID
11191 NTAPI
11192 READ_PORT_BUFFER_UCHAR(
11193 IN PUCHAR Port,
11194 IN PUCHAR Buffer,
11195 IN ULONG Count);
11196
11197 NTHALAPI
11198 VOID
11199 NTAPI
11200 READ_PORT_BUFFER_ULONG(
11201 IN PULONG Port,
11202 IN PULONG Buffer,
11203 IN ULONG Count);
11204
11205 NTHALAPI
11206 VOID
11207 NTAPI
11208 READ_PORT_BUFFER_USHORT(
11209 IN PUSHORT Port,
11210 IN PUSHORT Buffer,
11211 IN ULONG Count);
11212
11213 NTHALAPI
11214 UCHAR
11215 NTAPI
11216 READ_PORT_UCHAR(
11217 IN PUCHAR Port);
11218
11219 NTHALAPI
11220 ULONG
11221 NTAPI
11222 READ_PORT_ULONG(
11223 IN PULONG Port);
11224
11225 NTHALAPI
11226 USHORT
11227 NTAPI
11228 READ_PORT_USHORT(
11229 IN PUSHORT Port);
11230
11231 NTKERNELAPI
11232 VOID
11233 NTAPI
11234 READ_REGISTER_BUFFER_UCHAR(
11235 IN PUCHAR Register,
11236 IN PUCHAR Buffer,
11237 IN ULONG Count);
11238
11239 NTKERNELAPI
11240 VOID
11241 NTAPI
11242 READ_REGISTER_BUFFER_ULONG(
11243 IN PULONG Register,
11244 IN PULONG Buffer,
11245 IN ULONG Count);
11246
11247 NTKERNELAPI
11248 VOID
11249 NTAPI
11250 READ_REGISTER_BUFFER_USHORT(
11251 IN PUSHORT Register,
11252 IN PUSHORT Buffer,
11253 IN ULONG Count);
11254
11255 NTKERNELAPI
11256 UCHAR
11257 NTAPI
11258 READ_REGISTER_UCHAR(
11259 IN PUCHAR Register);
11260
11261 NTKERNELAPI
11262 ULONG
11263 NTAPI
11264 READ_REGISTER_ULONG(
11265 IN PULONG Register);
11266
11267 NTKERNELAPI
11268 USHORT
11269 NTAPI
11270 READ_REGISTER_USHORT(
11271 IN PUSHORT Register);
11272
11273 NTHALAPI
11274 VOID
11275 NTAPI
11276 WRITE_PORT_BUFFER_UCHAR(
11277 IN PUCHAR Port,
11278 IN PUCHAR Buffer,
11279 IN ULONG Count);
11280
11281 NTHALAPI
11282 VOID
11283 NTAPI
11284 WRITE_PORT_BUFFER_ULONG(
11285 IN PULONG Port,
11286 IN PULONG Buffer,
11287 IN ULONG Count);
11288
11289 NTHALAPI
11290 VOID
11291 NTAPI
11292 WRITE_PORT_BUFFER_USHORT(
11293 IN PUSHORT Port,
11294 IN PUSHORT Buffer,
11295 IN ULONG Count);
11296
11297 NTHALAPI
11298 VOID
11299 NTAPI
11300 WRITE_PORT_UCHAR(
11301 IN PUCHAR Port,
11302 IN UCHAR Value);
11303
11304 NTHALAPI
11305 VOID
11306 NTAPI
11307 WRITE_PORT_ULONG(
11308 IN PULONG Port,
11309 IN ULONG Value);
11310
11311 NTHALAPI
11312 VOID
11313 NTAPI
11314 WRITE_PORT_USHORT(
11315 IN PUSHORT Port,
11316 IN USHORT Value);
11317
11318 NTKERNELAPI
11319 VOID
11320 NTAPI
11321 WRITE_REGISTER_BUFFER_UCHAR(
11322 IN PUCHAR Register,
11323 IN PUCHAR Buffer,
11324 IN ULONG Count);
11325
11326 NTKERNELAPI
11327 VOID
11328 NTAPI
11329 WRITE_REGISTER_BUFFER_ULONG(
11330 IN PULONG Register,
11331 IN PULONG Buffer,
11332 IN ULONG Count);
11333
11334 NTKERNELAPI
11335 VOID
11336 NTAPI
11337 WRITE_REGISTER_BUFFER_USHORT(
11338 IN PUSHORT Register,
11339 IN PUSHORT Buffer,
11340 IN ULONG Count);
11341
11342 NTKERNELAPI
11343 VOID
11344 NTAPI
11345 WRITE_REGISTER_UCHAR(
11346 IN PUCHAR Register,
11347 IN UCHAR Value);
11348
11349 NTKERNELAPI
11350 VOID
11351 NTAPI
11352 WRITE_REGISTER_ULONG(
11353 IN PULONG Register,
11354 IN ULONG Value);
11355
11356 NTKERNELAPI
11357 VOID
11358 NTAPI
11359 WRITE_REGISTER_USHORT(
11360 IN PUSHORT Register,
11361 IN USHORT Value);
11362
11363 #else
11364
11365 FORCEINLINE
11366 VOID
11367 READ_PORT_BUFFER_UCHAR(
11368 IN PUCHAR Port,
11369 IN PUCHAR Buffer,
11370 IN ULONG Count)
11371 {
11372 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11373 }
11374
11375 FORCEINLINE
11376 VOID
11377 READ_PORT_BUFFER_ULONG(
11378 IN PULONG Port,
11379 IN PULONG Buffer,
11380 IN ULONG Count)
11381 {
11382 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11383 }
11384
11385 FORCEINLINE
11386 VOID
11387 READ_PORT_BUFFER_USHORT(
11388 IN PUSHORT Port,
11389 IN PUSHORT Buffer,
11390 IN ULONG Count)
11391 {
11392 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11393 }
11394
11395 FORCEINLINE
11396 UCHAR
11397 READ_PORT_UCHAR(
11398 IN PUCHAR Port)
11399 {
11400 return __inbyte((USHORT)(ULONG_PTR)Port);
11401 }
11402
11403 FORCEINLINE
11404 ULONG
11405 READ_PORT_ULONG(
11406 IN PULONG Port)
11407 {
11408 return __indword((USHORT)(ULONG_PTR)Port);
11409 }
11410
11411 FORCEINLINE
11412 USHORT
11413 READ_PORT_USHORT(
11414 IN PUSHORT Port)
11415 {
11416 return __inword((USHORT)(ULONG_PTR)Port);
11417 }
11418
11419 FORCEINLINE
11420 VOID
11421 READ_REGISTER_BUFFER_UCHAR(
11422 IN PUCHAR Register,
11423 IN PUCHAR Buffer,
11424 IN ULONG Count)
11425 {
11426 __movsb(Register, Buffer, Count);
11427 }
11428
11429 FORCEINLINE
11430 VOID
11431 READ_REGISTER_BUFFER_ULONG(
11432 IN PULONG Register,
11433 IN PULONG Buffer,
11434 IN ULONG Count)
11435 {
11436 __movsd(Register, Buffer, Count);
11437 }
11438
11439 FORCEINLINE
11440 VOID
11441 READ_REGISTER_BUFFER_USHORT(
11442 IN PUSHORT Register,
11443 IN PUSHORT Buffer,
11444 IN ULONG Count)
11445 {
11446 __movsw(Register, Buffer, Count);
11447 }
11448
11449 FORCEINLINE
11450 UCHAR
11451 READ_REGISTER_UCHAR(
11452 IN volatile UCHAR *Register)
11453 {
11454 return *Register;
11455 }
11456
11457 FORCEINLINE
11458 ULONG
11459 READ_REGISTER_ULONG(
11460 IN volatile ULONG *Register)
11461 {
11462 return *Register;
11463 }
11464
11465 FORCEINLINE
11466 USHORT
11467 READ_REGISTER_USHORT(
11468 IN volatile USHORT *Register)
11469 {
11470 return *Register;
11471 }
11472
11473 FORCEINLINE
11474 VOID
11475 WRITE_PORT_BUFFER_UCHAR(
11476 IN PUCHAR Port,
11477 IN PUCHAR Buffer,
11478 IN ULONG Count)
11479 {
11480 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11481 }
11482
11483 FORCEINLINE
11484 VOID
11485 WRITE_PORT_BUFFER_ULONG(
11486 IN PULONG Port,
11487 IN PULONG Buffer,
11488 IN ULONG Count)
11489 {
11490 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11491 }
11492
11493 FORCEINLINE
11494 VOID
11495 WRITE_PORT_BUFFER_USHORT(
11496 IN PUSHORT Port,
11497 IN PUSHORT Buffer,
11498 IN ULONG Count)
11499 {
11500 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11501 }
11502
11503 FORCEINLINE
11504 VOID
11505 WRITE_PORT_UCHAR(
11506 IN PUCHAR Port,
11507 IN UCHAR Value)
11508 {
11509 __outbyte((USHORT)(ULONG_PTR)Port, Value);
11510 }
11511
11512 FORCEINLINE
11513 VOID
11514 WRITE_PORT_ULONG(
11515 IN PULONG Port,
11516 IN ULONG Value)
11517 {
11518 __outdword((USHORT)(ULONG_PTR)Port, Value);
11519 }
11520
11521 FORCEINLINE
11522 VOID
11523 WRITE_PORT_USHORT(
11524 IN PUSHORT Port,
11525 IN USHORT Value)
11526 {
11527 __outword((USHORT)(ULONG_PTR)Port, Value);
11528 }
11529
11530 FORCEINLINE
11531 VOID
11532 WRITE_REGISTER_BUFFER_UCHAR(
11533 IN PUCHAR Register,
11534 IN PUCHAR Buffer,
11535 IN ULONG Count)
11536 {
11537 LONG Synch;
11538 __movsb(Register, Buffer, Count);
11539 InterlockedOr(&Synch, 1);
11540 }
11541
11542 FORCEINLINE
11543 VOID
11544 WRITE_REGISTER_BUFFER_ULONG(
11545 IN PULONG Register,
11546 IN PULONG Buffer,
11547 IN ULONG Count)
11548 {
11549 LONG Synch;
11550 __movsd(Register, Buffer, Count);
11551 InterlockedOr(&Synch, 1);
11552 }
11553
11554 FORCEINLINE
11555 VOID
11556 WRITE_REGISTER_BUFFER_USHORT(
11557 IN PUSHORT Register,
11558 IN PUSHORT Buffer,
11559 IN ULONG Count)
11560 {
11561 LONG Synch;
11562 __movsw(Register, Buffer, Count);
11563 InterlockedOr(&Synch, 1);
11564 }
11565
11566 FORCEINLINE
11567 VOID
11568 WRITE_REGISTER_UCHAR(
11569 IN volatile UCHAR *Register,
11570 IN UCHAR Value)
11571 {
11572 LONG Synch;
11573 *Register = Value;
11574 InterlockedOr(&Synch, 1);
11575 }
11576
11577 FORCEINLINE
11578 VOID
11579 WRITE_REGISTER_ULONG(
11580 IN volatile ULONG *Register,
11581 IN ULONG Value)
11582 {
11583 LONG Synch;
11584 *Register = Value;
11585 InterlockedOr(&Synch, 1);
11586 }
11587
11588 FORCEINLINE
11589 VOID
11590 WRITE_REGISTER_USHORT(
11591 IN volatile USHORT *Register,
11592 IN USHORT Value)
11593 {
11594 LONG Sync;
11595 *Register = Value;
11596 InterlockedOr(&Sync, 1);
11597 }
11598 #endif
11599
11600 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
11601 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11602
11603 #define DMA_MACROS_DEFINED
11604
11605 FORCEINLINE
11606 NTSTATUS
11607 IoAllocateAdapterChannel(
11608 IN PDMA_ADAPTER DmaAdapter,
11609 IN PDEVICE_OBJECT DeviceObject,
11610 IN ULONG NumberOfMapRegisters,
11611 IN PDRIVER_CONTROL ExecutionRoutine,
11612 IN PVOID Context)
11613 {
11614 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
11615 AllocateAdapterChannel =
11616 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
11617 ASSERT(AllocateAdapterChannel);
11618 return AllocateAdapterChannel(DmaAdapter,
11619 DeviceObject,
11620 NumberOfMapRegisters,
11621 ExecutionRoutine,
11622 Context );
11623 }
11624
11625 FORCEINLINE
11626 BOOLEAN
11627 NTAPI
11628 IoFlushAdapterBuffers(
11629 IN PDMA_ADAPTER DmaAdapter,
11630 IN PMDL Mdl,
11631 IN PVOID MapRegisterBase,
11632 IN PVOID CurrentVa,
11633 IN ULONG Length,
11634 IN BOOLEAN WriteToDevice)
11635 {
11636 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
11637 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
11638 ASSERT(FlushAdapterBuffers);
11639 return FlushAdapterBuffers(DmaAdapter,
11640 Mdl,
11641 MapRegisterBase,
11642 CurrentVa,
11643 Length,
11644 WriteToDevice);
11645 }
11646
11647 FORCEINLINE
11648 VOID
11649 NTAPI
11650 IoFreeAdapterChannel(
11651 IN PDMA_ADAPTER DmaAdapter)
11652 {
11653 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
11654 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
11655 ASSERT(FreeAdapterChannel);
11656 FreeAdapterChannel(DmaAdapter);
11657 }
11658
11659 FORCEINLINE
11660 VOID
11661 NTAPI
11662 IoFreeMapRegisters(
11663 IN PDMA_ADAPTER DmaAdapter,
11664 IN PVOID MapRegisterBase,
11665 IN ULONG NumberOfMapRegisters)
11666 {
11667 PFREE_MAP_REGISTERS FreeMapRegisters;
11668 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
11669 ASSERT(FreeMapRegisters);
11670 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
11671 }
11672
11673 FORCEINLINE
11674 PHYSICAL_ADDRESS
11675 NTAPI
11676 IoMapTransfer(
11677 IN PDMA_ADAPTER DmaAdapter,
11678 IN PMDL Mdl,
11679 IN PVOID MapRegisterBase,
11680 IN PVOID CurrentVa,
11681 IN OUT PULONG Length,
11682 IN BOOLEAN WriteToDevice)
11683 {
11684 PMAP_TRANSFER MapTransfer;
11685
11686 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
11687 ASSERT(MapTransfer);
11688 return MapTransfer(DmaAdapter,
11689 Mdl,
11690 MapRegisterBase,
11691 CurrentVa,
11692 Length,
11693 WriteToDevice);
11694 }
11695 #endif
11696
11697 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11698
11699 NTKERNELAPI
11700 VOID
11701 NTAPI
11702 IoAcquireCancelSpinLock(
11703 OUT PKIRQL Irql);
11704
11705 NTKERNELAPI
11706 NTSTATUS
11707 NTAPI
11708 IoAcquireRemoveLockEx(
11709 IN PIO_REMOVE_LOCK RemoveLock,
11710 IN PVOID Tag OPTIONAL,
11711 IN PCSTR File,
11712 IN ULONG Line,
11713 IN ULONG RemlockSize);
11714 NTKERNELAPI
11715 NTSTATUS
11716 NTAPI
11717 IoAllocateDriverObjectExtension(
11718 IN PDRIVER_OBJECT DriverObject,
11719 IN PVOID ClientIdentificationAddress,
11720 IN ULONG DriverObjectExtensionSize,
11721 OUT PVOID *DriverObjectExtension);
11722
11723 NTKERNELAPI
11724 PVOID
11725 NTAPI
11726 IoAllocateErrorLogEntry(
11727 IN PVOID IoObject,
11728 IN UCHAR EntrySize);
11729
11730 NTKERNELAPI
11731 PIRP
11732 NTAPI
11733 IoAllocateIrp(
11734 IN CCHAR StackSize,
11735 IN BOOLEAN ChargeQuota);
11736
11737 NTKERNELAPI
11738 PMDL
11739 NTAPI
11740 IoAllocateMdl(
11741 IN PVOID VirtualAddress OPTIONAL,
11742 IN ULONG Length,
11743 IN BOOLEAN SecondaryBuffer,
11744 IN BOOLEAN ChargeQuota,
11745 IN OUT PIRP Irp OPTIONAL);
11746
11747 NTKERNELAPI
11748 PIO_WORKITEM
11749 NTAPI
11750 IoAllocateWorkItem(
11751 IN PDEVICE_OBJECT DeviceObject);
11752
11753 NTKERNELAPI
11754 NTSTATUS
11755 NTAPI
11756 IoAttachDevice(
11757 IN PDEVICE_OBJECT SourceDevice,
11758 IN PUNICODE_STRING TargetDevice,
11759 OUT PDEVICE_OBJECT *AttachedDevice);
11760
11761 NTKERNELAPI
11762 PDEVICE_OBJECT
11763 NTAPI
11764 IoAttachDeviceToDeviceStack(
11765 IN PDEVICE_OBJECT SourceDevice,
11766 IN PDEVICE_OBJECT TargetDevice);
11767
11768 NTKERNELAPI
11769 PIRP
11770 NTAPI
11771 IoBuildAsynchronousFsdRequest(
11772 IN ULONG MajorFunction,
11773 IN PDEVICE_OBJECT DeviceObject,
11774 IN OUT PVOID Buffer OPTIONAL,
11775 IN ULONG Length OPTIONAL,
11776 IN PLARGE_INTEGER StartingOffset OPTIONAL,
11777 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
11778
11779 NTKERNELAPI
11780 PIRP
11781 NTAPI
11782 IoBuildDeviceIoControlRequest(
11783 IN ULONG IoControlCode,
11784 IN PDEVICE_OBJECT DeviceObject,
11785 IN PVOID InputBuffer OPTIONAL,
11786 IN ULONG InputBufferLength,
11787 OUT PVOID OutputBuffer OPTIONAL,
11788 IN ULONG OutputBufferLength,
11789 IN BOOLEAN InternalDeviceIoControl,
11790 IN PKEVENT Event,
11791 OUT PIO_STATUS_BLOCK IoStatusBlock);
11792
11793 NTKERNELAPI
11794 VOID
11795 NTAPI
11796 IoBuildPartialMdl(
11797 IN PMDL SourceMdl,
11798 IN OUT PMDL TargetMdl,
11799 IN PVOID VirtualAddress,
11800 IN ULONG Length);
11801
11802 NTKERNELAPI
11803 PIRP
11804 NTAPI
11805 IoBuildSynchronousFsdRequest(
11806 IN ULONG MajorFunction,
11807 IN PDEVICE_OBJECT DeviceObject,
11808 IN OUT PVOID Buffer OPTIONAL,
11809 IN ULONG Length OPTIONAL,
11810 IN PLARGE_INTEGER StartingOffset OPTIONAL,
11811 IN PKEVENT Event,
11812 OUT PIO_STATUS_BLOCK IoStatusBlock);
11813
11814 NTKERNELAPI
11815 NTSTATUS
11816 FASTCALL
11817 IofCallDriver(
11818 IN PDEVICE_OBJECT DeviceObject,
11819 IN OUT PIRP Irp);
11820 #define IoCallDriver IofCallDriver
11821
11822 NTKERNELAPI
11823 VOID
11824 FASTCALL
11825 IofCompleteRequest(
11826 IN PIRP Irp,
11827 IN CCHAR PriorityBoost);
11828 #define IoCompleteRequest IofCompleteRequest
11829
11830 NTKERNELAPI
11831 BOOLEAN
11832 NTAPI
11833 IoCancelIrp(
11834 IN PIRP Irp);
11835
11836 NTKERNELAPI
11837 NTSTATUS
11838 NTAPI
11839 IoCheckShareAccess(
11840 IN ACCESS_MASK DesiredAccess,
11841 IN ULONG DesiredShareAccess,
11842 IN OUT PFILE_OBJECT FileObject,
11843 IN OUT PSHARE_ACCESS ShareAccess,
11844 IN BOOLEAN Update);
11845
11846 NTKERNELAPI
11847 VOID
11848 FASTCALL
11849 IofCompleteRequest(
11850 IN PIRP Irp,
11851 IN CCHAR PriorityBoost);
11852
11853 NTKERNELAPI
11854 NTSTATUS
11855 NTAPI
11856 IoConnectInterrupt(
11857 OUT PKINTERRUPT *InterruptObject,
11858 IN PKSERVICE_ROUTINE ServiceRoutine,
11859 IN PVOID ServiceContext OPTIONAL,
11860 IN PKSPIN_LOCK SpinLock OPTIONAL,
11861 IN ULONG Vector,
11862 IN KIRQL Irql,
11863 IN KIRQL SynchronizeIrql,
11864 IN KINTERRUPT_MODE InterruptMode,
11865 IN BOOLEAN ShareVector,
11866 IN KAFFINITY ProcessorEnableMask,
11867 IN BOOLEAN FloatingSave);
11868
11869 NTKERNELAPI
11870 NTSTATUS
11871 NTAPI
11872 IoCreateDevice(
11873 IN PDRIVER_OBJECT DriverObject,
11874 IN ULONG DeviceExtensionSize,
11875 IN PUNICODE_STRING DeviceName OPTIONAL,
11876 IN DEVICE_TYPE DeviceType,
11877 IN ULONG DeviceCharacteristics,
11878 IN BOOLEAN Exclusive,
11879 OUT PDEVICE_OBJECT *DeviceObject);
11880
11881 NTKERNELAPI
11882 NTSTATUS
11883 NTAPI
11884 IoCreateFile(
11885 OUT PHANDLE FileHandle,
11886 IN ACCESS_MASK DesiredAccess,
11887 IN POBJECT_ATTRIBUTES ObjectAttributes,
11888 OUT PIO_STATUS_BLOCK IoStatusBlock,
11889 IN PLARGE_INTEGER AllocationSize OPTIONAL,
11890 IN ULONG FileAttributes,
11891 IN ULONG ShareAccess,
11892 IN ULONG Disposition,
11893 IN ULONG CreateOptions,
11894 IN PVOID EaBuffer OPTIONAL,
11895 IN ULONG EaLength,
11896 IN CREATE_FILE_TYPE CreateFileType,
11897 IN PVOID InternalParameters OPTIONAL,
11898 IN ULONG Options);
11899
11900 NTKERNELAPI
11901 PKEVENT
11902 NTAPI
11903 IoCreateNotificationEvent(
11904 IN PUNICODE_STRING EventName,
11905 OUT PHANDLE EventHandle);
11906
11907 NTKERNELAPI
11908 NTSTATUS
11909 NTAPI
11910 IoCreateSymbolicLink(
11911 IN PUNICODE_STRING SymbolicLinkName,
11912 IN PUNICODE_STRING DeviceName);
11913
11914 NTKERNELAPI
11915 PKEVENT
11916 NTAPI
11917 IoCreateSynchronizationEvent(
11918 IN PUNICODE_STRING EventName,
11919 OUT PHANDLE EventHandle);
11920
11921 NTKERNELAPI
11922 NTSTATUS
11923 NTAPI
11924 IoCreateUnprotectedSymbolicLink(
11925 IN PUNICODE_STRING SymbolicLinkName,
11926 IN PUNICODE_STRING DeviceName);
11927
11928 NTKERNELAPI
11929 VOID
11930 NTAPI
11931 IoDeleteDevice(
11932 IN PDEVICE_OBJECT DeviceObject);
11933
11934 NTKERNELAPI
11935 NTSTATUS
11936 NTAPI
11937 IoDeleteSymbolicLink(
11938 IN PUNICODE_STRING SymbolicLinkName);
11939
11940 NTKERNELAPI
11941 VOID
11942 NTAPI
11943 IoDetachDevice(
11944 IN OUT PDEVICE_OBJECT TargetDevice);
11945
11946 NTKERNELAPI
11947 VOID
11948 NTAPI
11949 IoDisconnectInterrupt(
11950 IN PKINTERRUPT InterruptObject);
11951
11952 NTKERNELAPI
11953 VOID
11954 NTAPI
11955 IoFreeIrp(
11956 IN PIRP Irp);
11957
11958 NTKERNELAPI
11959 VOID
11960 NTAPI
11961 IoFreeMdl(
11962 IN PMDL Mdl);
11963
11964 NTKERNELAPI
11965 VOID
11966 NTAPI
11967 IoFreeWorkItem(
11968 IN PIO_WORKITEM IoWorkItem);
11969
11970 NTKERNELAPI
11971 PDEVICE_OBJECT
11972 NTAPI
11973 IoGetAttachedDevice(
11974 IN PDEVICE_OBJECT DeviceObject);
11975
11976 NTKERNELAPI
11977 PDEVICE_OBJECT
11978 NTAPI
11979 IoGetAttachedDeviceReference(
11980 IN PDEVICE_OBJECT DeviceObject);
11981
11982 NTKERNELAPI
11983 NTSTATUS
11984 NTAPI
11985 IoGetBootDiskInformation(
11986 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
11987 IN ULONG Size);
11988
11989 NTKERNELAPI
11990 NTSTATUS
11991 NTAPI
11992 IoGetDeviceInterfaceAlias(
11993 IN PUNICODE_STRING SymbolicLinkName,
11994 IN CONST GUID *AliasInterfaceClassGuid,
11995 OUT PUNICODE_STRING AliasSymbolicLinkName);
11996
11997 NTKERNELAPI
11998 PEPROCESS
11999 NTAPI
12000 IoGetCurrentProcess(VOID);
12001
12002 NTKERNELAPI
12003 NTSTATUS
12004 NTAPI
12005 IoGetDeviceInterfaces(
12006 IN CONST GUID *InterfaceClassGuid,
12007 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12008 IN ULONG Flags,
12009 OUT PWSTR *SymbolicLinkList);
12010
12011 NTKERNELAPI
12012 NTSTATUS
12013 NTAPI
12014 IoGetDeviceObjectPointer(
12015 IN PUNICODE_STRING ObjectName,
12016 IN ACCESS_MASK DesiredAccess,
12017 OUT PFILE_OBJECT *FileObject,
12018 OUT PDEVICE_OBJECT *DeviceObject);
12019
12020 NTKERNELAPI
12021 NTSTATUS
12022 NTAPI
12023 IoGetDeviceProperty(
12024 IN PDEVICE_OBJECT DeviceObject,
12025 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
12026 IN ULONG BufferLength,
12027 OUT PVOID PropertyBuffer,
12028 OUT PULONG ResultLength);
12029
12030 NTKERNELAPI
12031 PDMA_ADAPTER
12032 NTAPI
12033 IoGetDmaAdapter(
12034 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12035 IN PDEVICE_DESCRIPTION DeviceDescription,
12036 IN OUT PULONG NumberOfMapRegisters);
12037
12038 NTKERNELAPI
12039 PVOID
12040 NTAPI
12041 IoGetDriverObjectExtension(
12042 IN PDRIVER_OBJECT DriverObject,
12043 IN PVOID ClientIdentificationAddress);
12044
12045 NTKERNELAPI
12046 PVOID
12047 NTAPI
12048 IoGetInitialStack(VOID);
12049
12050 NTKERNELAPI
12051 PDEVICE_OBJECT
12052 NTAPI
12053 IoGetRelatedDeviceObject(
12054 IN PFILE_OBJECT FileObject);
12055
12056 NTKERNELAPI
12057 VOID
12058 NTAPI
12059 IoQueueWorkItem(
12060 IN PIO_WORKITEM IoWorkItem,
12061 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
12062 IN WORK_QUEUE_TYPE QueueType,
12063 IN PVOID Context OPTIONAL);
12064
12065 NTKERNELAPI
12066 VOID
12067 NTAPI
12068 IoInitializeIrp(
12069 IN OUT PIRP Irp,
12070 IN USHORT PacketSize,
12071 IN CCHAR StackSize);
12072
12073 NTKERNELAPI
12074 VOID
12075 NTAPI
12076 IoInitializeRemoveLockEx(
12077 IN PIO_REMOVE_LOCK Lock,
12078 IN ULONG AllocateTag,
12079 IN ULONG MaxLockedMinutes,
12080 IN ULONG HighWatermark,
12081 IN ULONG RemlockSize);
12082
12083 NTKERNELAPI
12084 NTSTATUS
12085 NTAPI
12086 IoInitializeTimer(
12087 IN PDEVICE_OBJECT DeviceObject,
12088 IN PIO_TIMER_ROUTINE TimerRoutine,
12089 IN PVOID Context OPTIONAL);
12090
12091 NTKERNELAPI
12092 VOID
12093 NTAPI
12094 IoInvalidateDeviceRelations(
12095 IN PDEVICE_OBJECT DeviceObject,
12096 IN DEVICE_RELATION_TYPE Type);
12097
12098 NTKERNELAPI
12099 VOID
12100 NTAPI
12101 IoInvalidateDeviceState(
12102 IN PDEVICE_OBJECT PhysicalDeviceObject);
12103
12104 NTKERNELAPI
12105 BOOLEAN
12106 NTAPI
12107 IoIsWdmVersionAvailable(
12108 IN UCHAR MajorVersion,
12109 IN UCHAR MinorVersion);
12110
12111 NTKERNELAPI
12112 NTSTATUS
12113 NTAPI
12114 IoOpenDeviceInterfaceRegistryKey(
12115 IN PUNICODE_STRING SymbolicLinkName,
12116 IN ACCESS_MASK DesiredAccess,
12117 OUT PHANDLE DeviceInterfaceKey);
12118
12119 NTKERNELAPI
12120 NTSTATUS
12121 NTAPI
12122 IoOpenDeviceRegistryKey(
12123 IN PDEVICE_OBJECT DeviceObject,
12124 IN ULONG DevInstKeyType,
12125 IN ACCESS_MASK DesiredAccess,
12126 OUT PHANDLE DevInstRegKey);
12127
12128 NTKERNELAPI
12129 NTSTATUS
12130 NTAPI
12131 IoRegisterDeviceInterface(
12132 IN PDEVICE_OBJECT PhysicalDeviceObject,
12133 IN CONST GUID *InterfaceClassGuid,
12134 IN PUNICODE_STRING ReferenceString OPTIONAL,
12135 OUT PUNICODE_STRING SymbolicLinkName);
12136
12137 NTKERNELAPI
12138 NTSTATUS
12139 NTAPI
12140 IoRegisterPlugPlayNotification(
12141 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
12142 IN ULONG EventCategoryFlags,
12143 IN PVOID EventCategoryData OPTIONAL,
12144 IN PDRIVER_OBJECT DriverObject,
12145 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
12146 IN OUT PVOID Context OPTIONAL,
12147 OUT PVOID *NotificationEntry);
12148
12149 NTKERNELAPI
12150 NTSTATUS
12151 NTAPI
12152 IoRegisterShutdownNotification(
12153 IN PDEVICE_OBJECT DeviceObject);
12154
12155 NTKERNELAPI
12156 VOID
12157 NTAPI
12158 IoReleaseCancelSpinLock(
12159 IN KIRQL Irql);
12160
12161 NTKERNELAPI
12162 VOID
12163 NTAPI
12164 IoReleaseRemoveLockAndWaitEx(
12165 IN PIO_REMOVE_LOCK RemoveLock,
12166 IN PVOID Tag OPTIONAL,
12167 IN ULONG RemlockSize);
12168
12169 NTKERNELAPI
12170 VOID
12171 NTAPI
12172 IoReleaseRemoveLockEx(
12173 IN PIO_REMOVE_LOCK RemoveLock,
12174 IN PVOID Tag OPTIONAL,
12175 IN ULONG RemlockSize);
12176
12177 NTKERNELAPI
12178 VOID
12179 NTAPI
12180 IoRemoveShareAccess(
12181 IN PFILE_OBJECT FileObject,
12182 IN OUT PSHARE_ACCESS ShareAccess);
12183
12184 NTKERNELAPI
12185 NTSTATUS
12186 NTAPI
12187 IoReportTargetDeviceChange(
12188 IN PDEVICE_OBJECT PhysicalDeviceObject,
12189 IN PVOID NotificationStructure);
12190
12191 NTKERNELAPI
12192 NTSTATUS
12193 NTAPI
12194 IoReportTargetDeviceChangeAsynchronous(
12195 IN PDEVICE_OBJECT PhysicalDeviceObject,
12196 IN PVOID NotificationStructure,
12197 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
12198 IN PVOID Context OPTIONAL);
12199
12200 NTKERNELAPI
12201 VOID
12202 NTAPI
12203 IoRequestDeviceEject(
12204 IN PDEVICE_OBJECT PhysicalDeviceObject);
12205
12206 NTKERNELAPI
12207 VOID
12208 NTAPI
12209 IoReuseIrp(
12210 IN OUT PIRP Irp,
12211 IN NTSTATUS Status);
12212
12213 NTKERNELAPI
12214 NTSTATUS
12215 NTAPI
12216 IoSetDeviceInterfaceState(
12217 IN PUNICODE_STRING SymbolicLinkName,
12218 IN BOOLEAN Enable);
12219
12220 NTKERNELAPI
12221 VOID
12222 NTAPI
12223 IoSetShareAccess(
12224 IN ACCESS_MASK DesiredAccess,
12225 IN ULONG DesiredShareAccess,
12226 IN OUT PFILE_OBJECT FileObject,
12227 OUT PSHARE_ACCESS ShareAccess);
12228
12229 NTKERNELAPI
12230 VOID
12231 NTAPI
12232 IoStartNextPacket(
12233 IN PDEVICE_OBJECT DeviceObject,
12234 IN BOOLEAN Cancelable);
12235
12236 NTKERNELAPI
12237 VOID
12238 NTAPI
12239 IoStartNextPacketByKey(
12240 IN PDEVICE_OBJECT DeviceObject,
12241 IN BOOLEAN Cancelable,
12242 IN ULONG Key);
12243
12244 NTKERNELAPI
12245 VOID
12246 NTAPI
12247 IoStartPacket(
12248 IN PDEVICE_OBJECT DeviceObject,
12249 IN PIRP Irp,
12250 IN PULONG Key OPTIONAL,
12251 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
12252
12253 NTKERNELAPI
12254 VOID
12255 NTAPI
12256 IoStartTimer(
12257 IN PDEVICE_OBJECT DeviceObject);
12258
12259 NTKERNELAPI
12260 VOID
12261 NTAPI
12262 IoStopTimer(
12263 IN PDEVICE_OBJECT DeviceObject);
12264
12265 NTKERNELAPI
12266 NTSTATUS
12267 NTAPI
12268 IoUnregisterPlugPlayNotification(
12269 IN PVOID NotificationEntry);
12270
12271 NTKERNELAPI
12272 VOID
12273 NTAPI
12274 IoUnregisterShutdownNotification(
12275 IN PDEVICE_OBJECT DeviceObject);
12276
12277 NTKERNELAPI
12278 VOID
12279 NTAPI
12280 IoUpdateShareAccess(
12281 IN PFILE_OBJECT FileObject,
12282 IN OUT PSHARE_ACCESS ShareAccess);
12283
12284 NTKERNELAPI
12285 NTSTATUS
12286 NTAPI
12287 IoWMIAllocateInstanceIds(
12288 IN GUID *Guid,
12289 IN ULONG InstanceCount,
12290 OUT ULONG *FirstInstanceId);
12291
12292 NTKERNELAPI
12293 NTSTATUS
12294 NTAPI
12295 IoWMIQuerySingleInstanceMultiple(
12296 IN PVOID *DataBlockObjectList,
12297 IN PUNICODE_STRING InstanceNames,
12298 IN ULONG ObjectCount,
12299 IN OUT ULONG *InOutBufferSize,
12300 OUT PVOID OutBuffer);
12301
12302 NTKERNELAPI
12303 NTSTATUS
12304 NTAPI
12305 IoWMIRegistrationControl(
12306 IN PDEVICE_OBJECT DeviceObject,
12307 IN ULONG Action);
12308
12309 NTKERNELAPI
12310 NTSTATUS
12311 NTAPI
12312 IoWMISuggestInstanceName(
12313 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12314 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
12315 IN BOOLEAN CombineNames,
12316 OUT PUNICODE_STRING SuggestedInstanceName);
12317
12318 NTKERNELAPI
12319 NTSTATUS
12320 NTAPI
12321 IoWMIWriteEvent(
12322 IN OUT PVOID WnodeEventItem);
12323
12324 NTKERNELAPI
12325 VOID
12326 NTAPI
12327 IoWriteErrorLogEntry(
12328 IN PVOID ElEntry);
12329
12330 NTKERNELAPI
12331 PIRP
12332 NTAPI
12333 IoGetTopLevelIrp(VOID);
12334
12335 NTKERNELAPI
12336 NTSTATUS
12337 NTAPI
12338 IoRegisterLastChanceShutdownNotification(
12339 IN PDEVICE_OBJECT DeviceObject);
12340
12341 NTKERNELAPI
12342 VOID
12343 NTAPI
12344 IoSetTopLevelIrp(
12345 IN PIRP Irp OPTIONAL);
12346
12347
12348 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12349
12350
12351 #if (NTDDI_VERSION >= NTDDI_WINXP)
12352
12353 NTKERNELAPI
12354 NTSTATUS
12355 NTAPI
12356 IoCsqInitialize(
12357 IN PIO_CSQ Csq,
12358 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
12359 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12360 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12361 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12362 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12363 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12364
12365 NTKERNELAPI
12366 VOID
12367 NTAPI
12368 IoCsqInsertIrp(
12369 IN PIO_CSQ Csq,
12370 IN PIRP Irp,
12371 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
12372
12373 NTKERNELAPI
12374 PIRP
12375 NTAPI
12376 IoCsqRemoveIrp(
12377 IN PIO_CSQ Csq,
12378 IN PIO_CSQ_IRP_CONTEXT Context);
12379
12380 NTKERNELAPI
12381 PIRP
12382 NTAPI
12383 IoCsqRemoveNextIrp(
12384 IN PIO_CSQ Csq,
12385 IN PVOID PeekContext OPTIONAL);
12386
12387 NTKERNELAPI
12388 BOOLEAN
12389 NTAPI
12390 IoForwardIrpSynchronously(
12391 IN PDEVICE_OBJECT DeviceObject,
12392 IN PIRP Irp);
12393
12394 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
12395
12396 NTKERNELAPI
12397 VOID
12398 NTAPI
12399 IoFreeErrorLogEntry(
12400 PVOID ElEntry);
12401
12402 NTKERNELAPI
12403 NTSTATUS
12404 NTAPI
12405 IoSetCompletionRoutineEx(
12406 IN PDEVICE_OBJECT DeviceObject,
12407 IN PIRP Irp,
12408 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
12409 IN PVOID Context,
12410 IN BOOLEAN InvokeOnSuccess,
12411 IN BOOLEAN InvokeOnError,
12412 IN BOOLEAN InvokeOnCancel);
12413
12414 VOID
12415 NTAPI
12416 IoSetStartIoAttributes(
12417 IN PDEVICE_OBJECT DeviceObject,
12418 IN BOOLEAN DeferredStartIo,
12419 IN BOOLEAN NonCancelable);
12420
12421 NTKERNELAPI
12422 NTSTATUS
12423 NTAPI
12424 IoWMIDeviceObjectToInstanceName(
12425 IN PVOID DataBlockObject,
12426 IN PDEVICE_OBJECT DeviceObject,
12427 OUT PUNICODE_STRING InstanceName);
12428
12429 NTKERNELAPI
12430 NTSTATUS
12431 NTAPI
12432 IoWMIExecuteMethod(
12433 IN PVOID DataBlockObject,
12434 IN PUNICODE_STRING InstanceName,
12435 IN ULONG MethodId,
12436 IN ULONG InBufferSize,
12437 IN OUT PULONG OutBufferSize,
12438 IN OUT PUCHAR InOutBuffer);
12439
12440 NTKERNELAPI
12441 NTSTATUS
12442 NTAPI
12443 IoWMIHandleToInstanceName(
12444 IN PVOID DataBlockObject,
12445 IN HANDLE FileHandle,
12446 OUT PUNICODE_STRING InstanceName);
12447
12448 NTKERNELAPI
12449 NTSTATUS
12450 NTAPI
12451 IoWMIOpenBlock(
12452 IN GUID *DataBlockGuid,
12453 IN ULONG DesiredAccess,
12454 OUT PVOID *DataBlockObject);
12455
12456 NTKERNELAPI
12457 NTSTATUS
12458 NTAPI
12459 IoWMIQueryAllData(
12460 IN PVOID DataBlockObject,
12461 IN OUT ULONG *InOutBufferSize,
12462 OUT PVOID OutBuffer);
12463
12464 NTKERNELAPI
12465 NTSTATUS
12466 NTAPI
12467 IoWMIQueryAllDataMultiple(
12468 IN PVOID *DataBlockObjectList,
12469 IN ULONG ObjectCount,
12470 IN OUT ULONG *InOutBufferSize,
12471 OUT PVOID OutBuffer);
12472
12473 NTKERNELAPI
12474 NTSTATUS
12475 NTAPI
12476 IoWMIQuerySingleInstance(
12477 IN PVOID DataBlockObject,
12478 IN PUNICODE_STRING InstanceName,
12479 IN OUT ULONG *InOutBufferSize,
12480 OUT PVOID OutBuffer);
12481
12482 NTKERNELAPI
12483 NTSTATUS
12484 NTAPI
12485 IoWMISetNotificationCallback(
12486 IN OUT PVOID Object,
12487 IN WMI_NOTIFICATION_CALLBACK Callback,
12488 IN PVOID Context OPTIONAL);
12489
12490 NTKERNELAPI
12491 NTSTATUS
12492 NTAPI
12493 IoWMISetSingleInstance(
12494 IN PVOID DataBlockObject,
12495 IN PUNICODE_STRING InstanceName,
12496 IN ULONG Version,
12497 IN ULONG ValueBufferSize,
12498 IN PVOID ValueBuffer);
12499
12500 NTKERNELAPI
12501 NTSTATUS
12502 NTAPI
12503 IoWMISetSingleItem(
12504 IN PVOID DataBlockObject,
12505 IN PUNICODE_STRING InstanceName,
12506 IN ULONG DataItemId,
12507 IN ULONG Version,
12508 IN ULONG ValueBufferSize,
12509 IN PVOID ValueBuffer);
12510
12511 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
12512
12513 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
12514 NTKERNELAPI
12515 NTSTATUS
12516 NTAPI
12517 IoValidateDeviceIoControlAccess(
12518 IN PIRP Irp,
12519 IN ULONG RequiredAccess);
12520 #endif
12521
12522 #if (NTDDI_VERSION >= NTDDI_WS03)
12523 NTKERNELAPI
12524 NTSTATUS
12525 NTAPI
12526 IoCsqInitializeEx(
12527 IN PIO_CSQ Csq,
12528 IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
12529 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12530 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12531 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12532 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12533 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12534
12535 NTKERNELAPI
12536 NTSTATUS
12537 NTAPI
12538 IoCsqInsertIrpEx(
12539 IN PIO_CSQ Csq,
12540 IN PIRP Irp,
12541 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL,
12542 IN PVOID InsertContext OPTIONAL);
12543 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
12544
12545
12546 #if (NTDDI_VERSION >= NTDDI_VISTA)
12547 NTKERNELAPI
12548 NTSTATUS
12549 NTAPI
12550 IoGetBootDiskInformationLite(
12551 OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
12552
12553 NTKERNELAPI
12554 NTSTATUS
12555 NTAPI
12556 IoCheckShareAccessEx(
12557 IN ACCESS_MASK DesiredAccess,
12558 IN ULONG DesiredShareAccess,
12559 IN OUT PFILE_OBJECT FileObject,
12560 IN OUT PSHARE_ACCESS ShareAccess,
12561 IN BOOLEAN Update,
12562 IN PBOOLEAN WritePermission);
12563
12564 NTKERNELAPI
12565 NTSTATUS
12566 NTAPI
12567 IoConnectInterruptEx(
12568 IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
12569
12570 NTKERNELAPI
12571 VOID
12572 NTAPI
12573 IoDisconnectInterruptEx(
12574 IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
12575
12576 LOGICAL
12577 NTAPI
12578 IoWithinStackLimits(
12579 IN ULONG_PTR RegionStart,
12580 IN SIZE_T RegionSize);
12581
12582 NTKERNELAPI
12583 VOID
12584 NTAPI
12585 IoSetShareAccessEx(
12586 IN ACCESS_MASK DesiredAccess,
12587 IN ULONG DesiredShareAccess,
12588 IN OUT PFILE_OBJECT FileObject,
12589 OUT PSHARE_ACCESS ShareAccess,
12590 IN PBOOLEAN WritePermission);
12591
12592 ULONG
12593 NTAPI
12594 IoSizeofWorkItem(VOID);
12595
12596 VOID
12597 NTAPI
12598 IoInitializeWorkItem(
12599 IN PVOID IoObject,
12600 IN PIO_WORKITEM IoWorkItem);
12601
12602 VOID
12603 NTAPI
12604 IoUninitializeWorkItem(
12605 IN PIO_WORKITEM IoWorkItem);
12606
12607 VOID
12608 NTAPI
12609 IoQueueWorkItemEx(
12610 IN PIO_WORKITEM IoWorkItem,
12611 IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
12612 IN WORK_QUEUE_TYPE QueueType,
12613 IN PVOID Context OPTIONAL);
12614
12615 IO_PRIORITY_HINT
12616 NTAPI
12617 IoGetIoPriorityHint(
12618 IN PIRP Irp);
12619
12620 NTSTATUS
12621 NTAPI
12622 IoSetIoPriorityHint(
12623 IN PIRP Irp,
12624 IN IO_PRIORITY_HINT PriorityHint);
12625
12626 NTSTATUS
12627 NTAPI
12628 IoAllocateSfioStreamIdentifier(
12629 IN PFILE_OBJECT FileObject,
12630 IN ULONG Length,
12631 IN PVOID Signature,
12632 OUT PVOID *StreamIdentifier);
12633
12634 PVOID
12635 NTAPI
12636 IoGetSfioStreamIdentifier(
12637 IN PFILE_OBJECT FileObject,
12638 IN PVOID Signature);
12639
12640 NTSTATUS
12641 NTAPI
12642 IoFreeSfioStreamIdentifier(
12643 IN PFILE_OBJECT FileObject,
12644 IN PVOID Signature);
12645
12646 NTKERNELAPI
12647 NTSTATUS
12648 NTAPI
12649 IoRequestDeviceEjectEx(
12650 IN PDEVICE_OBJECT PhysicalDeviceObject,
12651 IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL,
12652 IN PVOID Context OPTIONAL,
12653 IN PDRIVER_OBJECT DriverObject OPTIONAL);
12654
12655 NTKERNELAPI
12656 NTSTATUS
12657 NTAPI
12658 IoSetDevicePropertyData(
12659 IN PDEVICE_OBJECT Pdo,
12660 IN CONST DEVPROPKEY *PropertyKey,
12661 IN LCID Lcid,
12662 IN ULONG Flags,
12663 IN DEVPROPTYPE Type,
12664 IN ULONG Size,
12665 IN PVOID Data OPTIONAL);
12666
12667 NTKERNELAPI
12668 NTSTATUS
12669 NTAPI
12670 IoGetDevicePropertyData(
12671 PDEVICE_OBJECT Pdo,
12672 CONST DEVPROPKEY *PropertyKey,
12673 LCID Lcid,
12674 ULONG Flags,
12675 ULONG Size,
12676 PVOID Data,
12677 PULONG RequiredSize,
12678 PDEVPROPTYPE Type);
12679
12680 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12681
12682 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
12683
12684 #if (NTDDI_VERSION >= NTDDI_WS08)
12685 NTKERNELAPI
12686 NTSTATUS
12687 NTAPI
12688 IoReplacePartitionUnit(
12689 IN PDEVICE_OBJECT TargetPdo,
12690 IN PDEVICE_OBJECT SparePdo,
12691 IN ULONG Flags);
12692 #endif
12693
12694 #if (NTDDI_VERSION >= NTDDI_WIN7)
12695
12696 NTKERNELAPI
12697 NTSTATUS
12698 NTAPI
12699 IoGetAffinityInterrupt(
12700 IN PKINTERRUPT InterruptObject,
12701 OUT PGROUP_AFFINITY GroupAffinity);
12702
12703 NTSTATUS
12704 NTAPI
12705 IoGetContainerInformation(
12706 IN IO_CONTAINER_INFORMATION_CLASS InformationClass,
12707 IN PVOID ContainerObject OPTIONAL,
12708 IN OUT PVOID Buffer OPTIONAL,
12709 IN ULONG BufferLength);
12710
12711 NTSTATUS
12712 NTAPI
12713 IoRegisterContainerNotification(
12714 IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
12715 IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
12716 IN PVOID NotificationInformation OPTIONAL,
12717 IN ULONG NotificationInformationLength,
12718 OUT PVOID CallbackRegistration);
12719
12720 VOID
12721 NTAPI
12722 IoUnregisterContainerNotification(
12723 IN PVOID CallbackRegistration);
12724
12725 NTKERNELAPI
12726 NTSTATUS
12727 NTAPI
12728 IoUnregisterPlugPlayNotificationEx(
12729 IN PVOID NotificationEntry);
12730
12731 NTKERNELAPI
12732 NTSTATUS
12733 NTAPI
12734 IoGetDeviceNumaNode(
12735 IN PDEVICE_OBJECT Pdo,
12736 OUT PUSHORT NodeNumber);
12737
12738 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
12739
12740 #if defined(_WIN64)
12741 NTKERNELAPI
12742 ULONG
12743 NTAPI
12744 IoWMIDeviceObjectToProviderId(
12745 IN PDEVICE_OBJECT DeviceObject);
12746 #else
12747 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
12748 #endif
12749
12750 /*
12751 * USHORT
12752 * IoSizeOfIrp(
12753 * IN CCHAR StackSize)
12754 */
12755 #define IoSizeOfIrp(_StackSize) \
12756 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
12757
12758 FORCEINLINE
12759 VOID
12760 IoSkipCurrentIrpStackLocation(
12761 IN OUT PIRP Irp)
12762 {
12763 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
12764 Irp->CurrentLocation++;
12765 #ifdef NONAMELESSUNION
12766 Irp->Tail.Overlay.s.u.CurrentStackLocation++;
12767 #else
12768 Irp->Tail.Overlay.CurrentStackLocation++;
12769 #endif
12770 }
12771
12772 FORCEINLINE
12773 VOID
12774 IoSetNextIrpStackLocation(
12775 IN OUT PIRP Irp)
12776 {
12777 ASSERT(Irp->CurrentLocation > 0);
12778 Irp->CurrentLocation--;
12779 #ifdef NONAMELESSUNION
12780 Irp->Tail.Overlay.s.u.CurrentStackLocation--;
12781 #else
12782 Irp->Tail.Overlay.CurrentStackLocation--;
12783 #endif
12784 }
12785
12786 FORCEINLINE
12787 PIO_STACK_LOCATION
12788 IoGetNextIrpStackLocation(
12789 IN PIRP Irp)
12790 {
12791 ASSERT(Irp->CurrentLocation > 0);
12792 #ifdef NONAMELESSUNION
12793 return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
12794 #else
12795 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
12796 #endif
12797 }
12798
12799 FORCEINLINE
12800 VOID
12801 IoSetCompletionRoutine(
12802 IN PIRP Irp,
12803 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
12804 IN PVOID Context OPTIONAL,
12805 IN BOOLEAN InvokeOnSuccess,
12806 IN BOOLEAN InvokeOnError,
12807 IN BOOLEAN InvokeOnCancel)
12808 {
12809 PIO_STACK_LOCATION irpSp;
12810 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
12811 irpSp = IoGetNextIrpStackLocation(Irp);
12812 irpSp->CompletionRoutine = CompletionRoutine;
12813 irpSp->Context = Context;
12814 irpSp->Control = 0;
12815
12816 if (InvokeOnSuccess) {
12817 irpSp->Control = SL_INVOKE_ON_SUCCESS;
12818 }
12819
12820 if (InvokeOnError) {
12821 irpSp->Control |= SL_INVOKE_ON_ERROR;
12822 }
12823
12824 if (InvokeOnCancel) {
12825 irpSp->Control |= SL_INVOKE_ON_CANCEL;
12826 }
12827 }
12828
12829 /*
12830 * PDRIVER_CANCEL
12831 * IoSetCancelRoutine(
12832 * IN PIRP Irp,
12833 * IN PDRIVER_CANCEL CancelRoutine)
12834 */
12835 #define IoSetCancelRoutine(_Irp, \
12836 _CancelRoutine) \
12837 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
12838 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
12839
12840 /*
12841 * VOID
12842 * IoRequestDpc(
12843 * IN PDEVICE_OBJECT DeviceObject,
12844 * IN PIRP Irp,
12845 * IN PVOID Context);
12846 */
12847 #define IoRequestDpc(DeviceObject, Irp, Context)( \
12848 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
12849
12850 /*
12851 * VOID
12852 * IoReleaseRemoveLock(
12853 * IN PIO_REMOVE_LOCK RemoveLock,
12854 * IN PVOID Tag)
12855 */
12856 #define IoReleaseRemoveLock(_RemoveLock, \
12857 _Tag) \
12858 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12859
12860 /*
12861 * VOID
12862 * IoReleaseRemoveLockAndWait(
12863 * IN PIO_REMOVE_LOCK RemoveLock,
12864 * IN PVOID Tag)
12865 */
12866 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
12867 _Tag) \
12868 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12869
12870 #if defined(_WIN64)
12871 NTKERNELAPI
12872 BOOLEAN
12873 IoIs32bitProcess(
12874 IN PIRP Irp OPTIONAL);
12875 #endif
12876
12877 #define PLUGPLAY_REGKEY_DEVICE 1
12878 #define PLUGPLAY_REGKEY_DRIVER 2
12879 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
12880
12881 FORCEINLINE
12882 PIO_STACK_LOCATION
12883 IoGetCurrentIrpStackLocation(
12884 IN PIRP Irp)
12885 {
12886 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
12887 #ifdef NONAMELESSUNION
12888 return Irp->Tail.Overlay.s.u.CurrentStackLocation;
12889 #else
12890 return Irp->Tail.Overlay.CurrentStackLocation;
12891 #endif
12892 }
12893
12894 FORCEINLINE
12895 VOID
12896 IoMarkIrpPending(
12897 IN OUT PIRP Irp)
12898 {
12899 IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
12900 }
12901
12902 /*
12903 * BOOLEAN
12904 * IoIsErrorUserInduced(
12905 * IN NTSTATUS Status);
12906 */
12907 #define IoIsErrorUserInduced(Status) \
12908 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
12909 ((Status) == STATUS_IO_TIMEOUT) || \
12910 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
12911 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
12912 ((Status) == STATUS_VERIFY_REQUIRED) || \
12913 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
12914 ((Status) == STATUS_WRONG_VOLUME)))
12915
12916 /* VOID
12917 * IoInitializeRemoveLock(
12918 * IN PIO_REMOVE_LOCK Lock,
12919 * IN ULONG AllocateTag,
12920 * IN ULONG MaxLockedMinutes,
12921 * IN ULONG HighWatermark)
12922 */
12923 #define IoInitializeRemoveLock( \
12924 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
12925 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
12926 HighWatermark, sizeof(IO_REMOVE_LOCK))
12927
12928 FORCEINLINE
12929 VOID
12930 IoInitializeDpcRequest(
12931 IN PDEVICE_OBJECT DeviceObject,
12932 IN PIO_DPC_ROUTINE DpcRoutine)
12933 {
12934 KeInitializeDpc( &DeviceObject->Dpc,
12935 (PKDEFERRED_ROUTINE) DpcRoutine,
12936 DeviceObject );
12937 }
12938
12939 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
12940
12941 /*
12942 * ULONG
12943 * IoGetFunctionCodeFromCtlCode(
12944 * IN ULONG ControlCode)
12945 */
12946 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
12947 (((_ControlCode) >> 2) & 0x00000FFF)
12948
12949 FORCEINLINE
12950 VOID
12951 IoCopyCurrentIrpStackLocationToNext(
12952 IN OUT PIRP Irp)
12953 {
12954 PIO_STACK_LOCATION irpSp;
12955 PIO_STACK_LOCATION nextIrpSp;
12956 irpSp = IoGetCurrentIrpStackLocation(Irp);
12957 nextIrpSp = IoGetNextIrpStackLocation(Irp);
12958 RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
12959 nextIrpSp->Control = 0;
12960 }
12961
12962 NTKERNELAPI
12963 VOID
12964 NTAPI
12965 IoGetStackLimits(
12966 OUT PULONG_PTR LowLimit,
12967 OUT PULONG_PTR HighLimit);
12968
12969 FORCEINLINE
12970 ULONG_PTR
12971 IoGetRemainingStackSize(VOID)
12972 {
12973 ULONG_PTR End, Begin;
12974 ULONG_PTR Result;
12975
12976 IoGetStackLimits(&Begin, &End);
12977 Result = (ULONG_PTR)(&End) - Begin;
12978 return Result;
12979 }
12980
12981 #if (NTDDI_VERSION >= NTDDI_WS03)
12982 FORCEINLINE
12983 VOID
12984 IoInitializeThreadedDpcRequest(
12985 IN PDEVICE_OBJECT DeviceObject,
12986 IN PIO_DPC_ROUTINE DpcRoutine)
12987 {
12988 KeInitializeThreadedDpc(&DeviceObject->Dpc,
12989 (PKDEFERRED_ROUTINE) DpcRoutine,
12990 DeviceObject );
12991 }
12992 #endif
12993
12994 /******************************************************************************
12995 * Power Management Support Functions *
12996 ******************************************************************************/
12997
12998 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
12999
13000 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13001
13002 NTKERNELAPI
13003 NTSTATUS
13004 NTAPI
13005 PoCallDriver(
13006 IN struct _DEVICE_OBJECT *DeviceObject,
13007 IN OUT struct _IRP *Irp);
13008
13009 NTKERNELAPI
13010 PULONG
13011 NTAPI
13012 PoRegisterDeviceForIdleDetection(
13013 IN struct _DEVICE_OBJECT *DeviceObject,
13014 IN ULONG ConservationIdleTime,
13015 IN ULONG PerformanceIdleTime,
13016 IN DEVICE_POWER_STATE State);
13017
13018 NTKERNELAPI
13019 PVOID
13020 NTAPI
13021 PoRegisterSystemState(
13022 IN OUT PVOID StateHandle OPTIONAL,
13023 IN EXECUTION_STATE Flags);
13024
13025 NTKERNELAPI
13026 NTSTATUS
13027 NTAPI
13028 PoRequestPowerIrp(
13029 IN struct _DEVICE_OBJECT *DeviceObject,
13030 IN UCHAR MinorFunction,
13031 IN POWER_STATE PowerState,
13032 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
13033 IN PVOID Context OPTIONAL,
13034 OUT struct _IRP **Irp OPTIONAL);
13035
13036 NTKERNELAPI
13037 POWER_STATE
13038 NTAPI
13039 PoSetPowerState(
13040 IN struct _DEVICE_OBJECT *DeviceObject,
13041 IN POWER_STATE_TYPE Type,
13042 IN POWER_STATE State);
13043
13044 NTKERNELAPI
13045 VOID
13046 NTAPI
13047 PoSetSystemState(
13048 IN EXECUTION_STATE Flags);
13049
13050 NTKERNELAPI
13051 VOID
13052 NTAPI
13053 PoStartNextPowerIrp(
13054 IN OUT struct _IRP *Irp);
13055
13056 NTKERNELAPI
13057 VOID
13058 NTAPI
13059 PoUnregisterSystemState(
13060 IN OUT PVOID StateHandle);
13061
13062 NTKERNELAPI
13063 NTSTATUS
13064 NTAPI
13065 PoRequestShutdownEvent(
13066 OUT PVOID *Event);
13067
13068 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13069
13070 #if (NTDDI_VERSION >= NTDDI_VISTA)
13071
13072 NTKERNELAPI
13073 VOID
13074 NTAPI
13075 PoSetSystemWake(
13076 IN OUT struct _IRP *Irp);
13077
13078 NTKERNELAPI
13079 BOOLEAN
13080 NTAPI
13081 PoGetSystemWake(
13082 IN struct _IRP *Irp);
13083
13084 NTKERNELAPI
13085 NTSTATUS
13086 NTAPI
13087 PoRegisterPowerSettingCallback(
13088 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
13089 IN LPCGUID SettingGuid,
13090 IN PPOWER_SETTING_CALLBACK Callback,
13091 IN PVOID Context OPTIONAL,
13092 OUT PVOID *Handle OPTIONAL);
13093
13094 NTKERNELAPI
13095 NTSTATUS
13096 NTAPI
13097 PoUnregisterPowerSettingCallback(
13098 IN OUT PVOID Handle);
13099
13100 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13101
13102 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
13103 NTKERNELAPI
13104 VOID
13105 NTAPI
13106 PoSetDeviceBusyEx(
13107 IN OUT PULONG IdlePointer);
13108 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
13109
13110 #if (NTDDI_VERSION >= NTDDI_WIN7)
13111
13112 NTKERNELAPI
13113 VOID
13114 NTAPI
13115 PoStartDeviceBusy(
13116 IN OUT PULONG IdlePointer);
13117
13118 NTKERNELAPI
13119 VOID
13120 NTAPI
13121 PoEndDeviceBusy(
13122 IN OUT PULONG IdlePointer);
13123
13124 NTKERNELAPI
13125 BOOLEAN
13126 NTAPI
13127 PoQueryWatchdogTime(
13128 IN PDEVICE_OBJECT Pdo,
13129 OUT PULONG SecondsRemaining);
13130
13131 NTKERNELAPI
13132 VOID
13133 NTAPI
13134 PoDeletePowerRequest(
13135 IN OUT PVOID PowerRequest);
13136
13137 NTKERNELAPI
13138 NTSTATUS
13139 NTAPI
13140 PoSetPowerRequest(
13141 IN OUT PVOID PowerRequest,
13142 IN POWER_REQUEST_TYPE Type);
13143
13144 NTKERNELAPI
13145 NTSTATUS
13146 NTAPI
13147 PoClearPowerRequest(
13148 IN OUT PVOID PowerRequest,
13149 IN POWER_REQUEST_TYPE Type);
13150
13151 NTKERNELAPI
13152 NTSTATUS
13153 NTAPI
13154 PoCreatePowerRequest(
13155 OUT PVOID *PowerRequest,
13156 IN PDEVICE_OBJECT DeviceObject,
13157 IN PCOUNTED_REASON_CONTEXT Context);
13158
13159 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13160
13161 /******************************************************************************
13162 * Executive Functions *
13163 ******************************************************************************/
13164
13165 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
13166 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
13167 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
13168
13169 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
13170 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
13171 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
13172 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
13173
13174 #define ExInitializeSListHead InitializeSListHead
13175
13176 #if defined(_NTHAL_) && defined(_X86_)
13177
13178 NTKERNELAPI
13179 VOID
13180 FASTCALL
13181 ExiAcquireFastMutex(
13182 IN OUT PFAST_MUTEX FastMutex);
13183
13184 NTKERNELAPI
13185 VOID
13186 FASTCALL
13187 ExiReleaseFastMutex(
13188 IN OUT PFAST_MUTEX FastMutex);
13189
13190 NTKERNELAPI
13191 BOOLEAN
13192 FASTCALL
13193 ExiTryToAcquireFastMutex(
13194 IN OUT PFAST_MUTEX FastMutex);
13195
13196 #define ExAcquireFastMutex ExiAcquireFastMutex
13197 #define ExReleaseFastMutex ExiReleaseFastMutex
13198 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
13199
13200 #else
13201
13202 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13203
13204 NTKERNELAPI
13205 VOID
13206 FASTCALL
13207 ExAcquireFastMutex(
13208 IN OUT PFAST_MUTEX FastMutex);
13209
13210 NTKERNELAPI
13211 VOID
13212 FASTCALL
13213 ExReleaseFastMutex(
13214 IN OUT PFAST_MUTEX FastMutex);
13215
13216 NTKERNELAPI
13217 BOOLEAN
13218 FASTCALL
13219 ExTryToAcquireFastMutex(
13220 IN OUT PFAST_MUTEX FastMutex);
13221
13222 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13223
13224 #endif /* defined(_NTHAL_) && defined(_X86_) */
13225
13226 #if defined(_X86_)
13227 #define ExInterlockedAddUlong ExfInterlockedAddUlong
13228 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
13229 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
13230 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
13231 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
13232 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
13233 #endif /* defined(_X86_) */
13234
13235 #if defined(_WIN64)
13236
13237 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
13238 defined(_NTHAL_) || defined(_NTOSP_)
13239 NTKERNELAPI
13240 USHORT
13241 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
13242 #else
13243 FORCEINLINE
13244 USHORT
13245 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
13246 {
13247 return (USHORT)(ListHead->Alignment & 0xffff);
13248 }
13249 #endif
13250
13251 NTKERNELAPI
13252 PSLIST_ENTRY
13253 ExpInterlockedFlushSList(
13254 PSLIST_HEADER ListHead);
13255
13256 NTKERNELAPI
13257 PSLIST_ENTRY
13258 ExpInterlockedPopEntrySList(
13259 PSLIST_HEADER ListHead);
13260
13261 NTKERNELAPI
13262 PSLIST_ENTRY
13263 ExpInterlockedPushEntrySList(
13264 PSLIST_HEADER ListHead,
13265 PSLIST_ENTRY ListEntry);
13266
13267 #define ExInterlockedFlushSList(Head) \
13268 ExpInterlockedFlushSList(Head)
13269 #define ExInterlockedPopEntrySList(Head, Lock) \
13270 ExpInterlockedPopEntrySList(Head)
13271 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
13272 ExpInterlockedPushEntrySList(Head, Entry)
13273
13274 #else /* !defined(_WIN64) */
13275
13276 #ifdef NONAMELESSUNION
13277 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
13278 #else
13279 #define ExQueryDepthSList(listhead) (listhead)->Depth
13280 #endif
13281
13282 NTKERNELAPI
13283 PSINGLE_LIST_ENTRY
13284 FASTCALL
13285 ExInterlockedFlushSList(
13286 IN OUT PSLIST_HEADER ListHead);
13287
13288 #endif /* !defined(_WIN64) */
13289
13290 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
13291
13292 NTKERNELAPI
13293 PSINGLE_LIST_ENTRY
13294 FASTCALL
13295 ExInterlockedPopEntrySList(
13296 IN PSLIST_HEADER ListHead,
13297 IN PKSPIN_LOCK Lock);
13298
13299 NTKERNELAPI
13300 PSINGLE_LIST_ENTRY
13301 FASTCALL
13302 ExInterlockedPushEntrySList(
13303 IN PSLIST_HEADER ListHead,
13304 IN PSINGLE_LIST_ENTRY ListEntry,
13305 IN PKSPIN_LOCK Lock);
13306
13307 NTKERNELAPI
13308 PVOID
13309 NTAPI
13310 ExAllocateFromPagedLookasideList(
13311 IN OUT PPAGED_LOOKASIDE_LIST Lookaside);
13312
13313 NTKERNELAPI
13314 VOID
13315 NTAPI
13316 ExFreeToPagedLookasideList(
13317 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13318 IN PVOID Entry);
13319
13320 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
13321
13322 #if !defined(_WIN64)
13323 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
13324 InterlockedPopEntrySList(_ListHead)
13325 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
13326 InterlockedPushEntrySList(_ListHead, _ListEntry)
13327 #endif
13328
13329 static __inline
13330 PVOID
13331 ExAllocateFromPagedLookasideList(
13332 IN OUT PPAGED_LOOKASIDE_LIST Lookaside)
13333 {
13334 PVOID Entry;
13335
13336 Lookaside->L.TotalAllocates++;
13337 #ifdef NONAMELESSUNION
13338 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
13339 if (Entry == NULL) {
13340 Lookaside->L.u2.AllocateMisses++;
13341 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
13342 Lookaside->L.Size,
13343 Lookaside->L.Tag);
13344 }
13345 #else /* NONAMELESSUNION */
13346 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
13347 if (Entry == NULL) {
13348 Lookaside->L.AllocateMisses++;
13349 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
13350 Lookaside->L.Size,
13351 Lookaside->L.Tag);
13352 }
13353 #endif /* NONAMELESSUNION */
13354 return Entry;
13355 }
13356
13357 static __inline
13358 VOID
13359 ExFreeToPagedLookasideList(
13360 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13361 IN PVOID Entry)
13362 {
13363 Lookaside->L.TotalFrees++;
13364 #ifdef NONAMELESSUNION
13365 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
13366 Lookaside->L.u3.FreeMisses++;
13367 (Lookaside->L.u5.Free)(Entry);
13368 } else {
13369 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
13370 }
13371 #else /* NONAMELESSUNION */
13372 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
13373 Lookaside->L.FreeMisses++;
13374 (Lookaside->L.Free)(Entry);
13375 } else {
13376 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
13377 }
13378 #endif /* NONAMELESSUNION */
13379 }
13380
13381 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
13382
13383
13384 /* ERESOURCE_THREAD
13385 * ExGetCurrentResourceThread(
13386 * VOID);
13387 */
13388 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
13389
13390 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
13391
13392 /* VOID
13393 * ExInitializeWorkItem(
13394 * IN PWORK_QUEUE_ITEM Item,
13395 * IN PWORKER_THREAD_ROUTINE Routine,
13396 * IN PVOID Context)
13397 */
13398 #define ExInitializeWorkItem(Item, Routine, Context) \
13399 { \
13400 (Item)->WorkerRoutine = Routine; \
13401 (Item)->Parameter = Context; \
13402 (Item)->List.Flink = NULL; \
13403 }
13404
13405 FORCEINLINE
13406 VOID
13407 ExInitializeFastMutex(
13408 OUT PFAST_MUTEX FastMutex)
13409 {
13410 FastMutex->Count = FM_LOCK_BIT;
13411 FastMutex->Owner = NULL;
13412 FastMutex->Contention = 0;
13413 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
13414 return;
13415 }
13416
13417
13418 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13419 NTKERNELAPI
13420 VOID
13421 FASTCALL
13422 ExAcquireFastMutexUnsafe(
13423 IN OUT PFAST_MUTEX FastMutex);
13424
13425 NTKERNELAPI
13426 VOID
13427 FASTCALL
13428 ExReleaseFastMutexUnsafe(
13429 IN OUT PFAST_MUTEX FastMutex);
13430
13431 NTKERNELAPI
13432 BOOLEAN
13433 NTAPI
13434 ExAcquireResourceExclusiveLite(
13435 IN OUT PERESOURCE Resource,
13436 IN BOOLEAN Wait);
13437
13438 NTKERNELAPI
13439 BOOLEAN
13440 NTAPI
13441 ExAcquireResourceSharedLite(
13442 IN OUT PERESOURCE Resource,
13443 IN BOOLEAN Wait);
13444
13445 NTKERNELAPI
13446 BOOLEAN
13447 NTAPI
13448 ExAcquireSharedStarveExclusive(
13449 IN OUT PERESOURCE Resource,
13450 IN BOOLEAN Wait);
13451
13452 NTKERNELAPI
13453 BOOLEAN
13454 NTAPI
13455 ExAcquireSharedWaitForExclusive(
13456 IN OUT PERESOURCE Resource,
13457 IN BOOLEAN Wait);
13458
13459 NTKERNELAPI
13460 PVOID
13461 NTAPI
13462 ExAllocatePool(
13463 IN POOL_TYPE PoolType,
13464 IN SIZE_T NumberOfBytes);
13465
13466 NTKERNELAPI
13467 PVOID
13468 NTAPI
13469 ExAllocatePoolWithQuota(
13470 IN POOL_TYPE PoolType,
13471 IN SIZE_T NumberOfBytes);
13472
13473 NTKERNELAPI
13474 PVOID
13475 NTAPI
13476 ExAllocatePoolWithQuotaTag(
13477 IN POOL_TYPE PoolType,
13478 IN SIZE_T NumberOfBytes,
13479 IN ULONG Tag);
13480
13481 #ifndef POOL_TAGGING
13482 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
13483 #endif
13484
13485 NTKERNELAPI
13486 PVOID
13487 NTAPI
13488 ExAllocatePoolWithTag(
13489 IN POOL_TYPE PoolType,
13490 IN SIZE_T NumberOfBytes,
13491 IN ULONG Tag);
13492
13493 #ifndef POOL_TAGGING
13494 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
13495 #endif
13496
13497 NTKERNELAPI
13498 PVOID
13499 NTAPI
13500 ExAllocatePoolWithTagPriority(
13501 IN POOL_TYPE PoolType,
13502 IN SIZE_T NumberOfBytes,
13503 IN ULONG Tag,
13504 IN EX_POOL_PRIORITY Priority);
13505
13506 NTKERNELAPI
13507 VOID
13508 NTAPI
13509 ExConvertExclusiveToSharedLite(
13510 IN OUT PERESOURCE Resource);
13511
13512 NTKERNELAPI
13513 NTSTATUS
13514 NTAPI
13515 ExCreateCallback(
13516 OUT PCALLBACK_OBJECT *CallbackObject,
13517 IN POBJECT_ATTRIBUTES ObjectAttributes,
13518 IN BOOLEAN Create,
13519 IN BOOLEAN AllowMultipleCallbacks);
13520
13521 NTKERNELAPI
13522 VOID
13523 NTAPI
13524 ExDeleteNPagedLookasideList(
13525 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
13526
13527 NTKERNELAPI
13528 VOID
13529 NTAPI
13530 ExDeletePagedLookasideList(
13531 IN PPAGED_LOOKASIDE_LIST Lookaside);
13532
13533 NTKERNELAPI
13534 NTSTATUS
13535 NTAPI
13536 ExDeleteResourceLite(
13537 IN OUT PERESOURCE Resource);
13538
13539 NTKERNELAPI
13540 VOID
13541 NTAPI
13542 ExFreePool(
13543 IN PVOID P);
13544
13545 NTKERNELAPI
13546 VOID
13547 NTAPI
13548 ExFreePoolWithTag(
13549 IN PVOID P,
13550 IN ULONG Tag);
13551
13552 NTKERNELAPI
13553 ULONG
13554 NTAPI
13555 ExGetExclusiveWaiterCount(
13556 IN PERESOURCE Resource);
13557
13558 NTKERNELAPI
13559 KPROCESSOR_MODE
13560 NTAPI
13561 ExGetPreviousMode(VOID);
13562
13563 NTKERNELAPI
13564 ULONG
13565 NTAPI
13566 ExGetSharedWaiterCount(
13567 IN PERESOURCE Resource);
13568
13569 NTKERNELAPI
13570 VOID
13571 NTAPI
13572 ExInitializeNPagedLookasideList(
13573 IN PNPAGED_LOOKASIDE_LIST Lookaside,
13574 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13575 IN PFREE_FUNCTION Free OPTIONAL,
13576 IN ULONG Flags,
13577 IN SIZE_T Size,
13578 IN ULONG Tag,
13579 IN USHORT Depth);
13580
13581 NTKERNELAPI
13582 VOID
13583 NTAPI
13584 ExInitializePagedLookasideList(
13585 IN PPAGED_LOOKASIDE_LIST Lookaside,
13586 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13587 IN PFREE_FUNCTION Free OPTIONAL,
13588 IN ULONG Flags,
13589 IN SIZE_T Size,
13590 IN ULONG Tag,
13591 IN USHORT Depth);
13592
13593 NTKERNELAPI
13594 NTSTATUS
13595 NTAPI
13596 ExInitializeResourceLite(
13597 OUT PERESOURCE Resource);
13598
13599 NTKERNELAPI
13600 LARGE_INTEGER
13601 NTAPI
13602 ExInterlockedAddLargeInteger(
13603 IN PLARGE_INTEGER Addend,
13604 IN LARGE_INTEGER Increment,
13605 IN PKSPIN_LOCK Lock);
13606
13607 #if defined(_WIN64)
13608 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13609 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
13610 #else
13611 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13612 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
13613 #endif
13614
13615 NTKERNELAPI
13616 ULONG
13617 FASTCALL
13618 ExInterlockedAddUlong(
13619 IN PULONG Addend,
13620 IN ULONG Increment,
13621 IN OUT PKSPIN_LOCK Lock);
13622
13623 #if defined(_AMD64_) || defined(_IA64_)
13624
13625 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13626 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
13627
13628 #elif defined(_X86_)
13629
13630 NTKERNELAPI
13631 LONGLONG
13632 FASTCALL
13633 ExfInterlockedCompareExchange64(
13634 IN OUT LONGLONG volatile *Destination,
13635 IN PLONGLONG Exchange,
13636 IN PLONGLONG Comperand);
13637
13638 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13639 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
13640
13641 #else
13642
13643 NTKERNELAPI
13644 LONGLONG
13645 FASTCALL
13646 ExInterlockedCompareExchange64(
13647 IN OUT LONGLONG volatile *Destination,
13648 IN PLONGLONG Exchange,
13649 IN PLONGLONG Comparand,
13650 IN PKSPIN_LOCK Lock);
13651
13652 #endif /* defined(_AMD64_) || defined(_IA64_) */
13653
13654 NTKERNELAPI
13655 PLIST_ENTRY
13656 FASTCALL
13657 ExInterlockedInsertHeadList(
13658 IN OUT PLIST_ENTRY ListHead,
13659 IN OUT PLIST_ENTRY ListEntry,
13660 IN OUT PKSPIN_LOCK Lock);
13661
13662 NTKERNELAPI
13663 PLIST_ENTRY
13664 FASTCALL
13665 ExInterlockedInsertTailList(
13666 IN OUT PLIST_ENTRY ListHead,
13667 IN OUT PLIST_ENTRY ListEntry,
13668 IN OUT PKSPIN_LOCK Lock);
13669
13670 NTKERNELAPI
13671 PSINGLE_LIST_ENTRY
13672 FASTCALL
13673 ExInterlockedPopEntryList(
13674 IN OUT PSINGLE_LIST_ENTRY ListHead,
13675 IN OUT PKSPIN_LOCK Lock);
13676
13677 NTKERNELAPI
13678 PSINGLE_LIST_ENTRY
13679 FASTCALL
13680 ExInterlockedPushEntryList(
13681 IN OUT PSINGLE_LIST_ENTRY ListHead,
13682 IN OUT PSINGLE_LIST_ENTRY ListEntry,
13683 IN OUT PKSPIN_LOCK Lock);
13684
13685 NTKERNELAPI
13686 PLIST_ENTRY
13687 FASTCALL
13688 ExInterlockedRemoveHeadList(
13689 IN OUT PLIST_ENTRY ListHead,
13690 IN OUT PKSPIN_LOCK Lock);
13691
13692 NTKERNELAPI
13693 BOOLEAN
13694 NTAPI
13695 ExIsProcessorFeaturePresent(
13696 IN ULONG ProcessorFeature);
13697
13698 NTKERNELAPI
13699 BOOLEAN
13700 NTAPI
13701 ExIsResourceAcquiredExclusiveLite(
13702 IN PERESOURCE Resource);
13703
13704 NTKERNELAPI
13705 ULONG
13706 NTAPI
13707 ExIsResourceAcquiredSharedLite(
13708 IN PERESOURCE Resource);
13709
13710 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
13711
13712 NTKERNELAPI
13713 VOID
13714 NTAPI
13715 ExLocalTimeToSystemTime(
13716 IN PLARGE_INTEGER LocalTime,
13717 OUT PLARGE_INTEGER SystemTime);
13718
13719 NTKERNELAPI
13720 VOID
13721 NTAPI
13722 ExNotifyCallback(
13723 IN PCALLBACK_OBJECT CallbackObject,
13724 IN PVOID Argument1 OPTIONAL,
13725 IN PVOID Argument2 OPTIONAL);
13726
13727 NTKERNELAPI
13728 VOID
13729 NTAPI
13730 ExQueueWorkItem(
13731 IN OUT PWORK_QUEUE_ITEM WorkItem,
13732 IN WORK_QUEUE_TYPE QueueType);
13733
13734 NTKERNELAPI
13735 DECLSPEC_NORETURN
13736 VOID
13737 NTAPI
13738 ExRaiseStatus(
13739 IN NTSTATUS Status);
13740
13741 NTKERNELAPI
13742 PVOID
13743 NTAPI
13744 ExRegisterCallback(
13745 IN PCALLBACK_OBJECT CallbackObject,
13746 IN PCALLBACK_FUNCTION CallbackFunction,
13747 IN PVOID CallbackContext OPTIONAL);
13748
13749 NTKERNELAPI
13750 NTSTATUS
13751 NTAPI
13752 ExReinitializeResourceLite(
13753 IN OUT PERESOURCE Resource);
13754
13755 NTKERNELAPI
13756 VOID
13757 NTAPI
13758 ExReleaseResourceForThreadLite(
13759 IN OUT PERESOURCE Resource,
13760 IN ERESOURCE_THREAD ResourceThreadId);
13761
13762 NTKERNELAPI
13763 VOID
13764 FASTCALL
13765 ExReleaseResourceLite(
13766 IN OUT PERESOURCE Resource);
13767
13768 NTKERNELAPI
13769 VOID
13770 NTAPI
13771 ExSetResourceOwnerPointer(
13772 IN OUT PERESOURCE Resource,
13773 IN PVOID OwnerPointer);
13774
13775 NTKERNELAPI
13776 ULONG
13777 NTAPI
13778 ExSetTimerResolution(
13779 IN ULONG DesiredTime,
13780 IN BOOLEAN SetResolution);
13781
13782 NTKERNELAPI
13783 VOID
13784 NTAPI
13785 ExSystemTimeToLocalTime(
13786 IN PLARGE_INTEGER SystemTime,
13787 OUT PLARGE_INTEGER LocalTime);
13788
13789 NTKERNELAPI
13790 VOID
13791 NTAPI
13792 ExUnregisterCallback(
13793 IN OUT PVOID CbRegistration);
13794
13795 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13796
13797 #if (NTDDI_VERSION >= NTDDI_WINXP)
13798
13799 NTKERNELAPI
13800 BOOLEAN
13801 FASTCALL
13802 ExAcquireRundownProtection(
13803 IN OUT PEX_RUNDOWN_REF RunRef);
13804
13805 NTKERNELAPI
13806 VOID
13807 FASTCALL
13808 ExInitializeRundownProtection(
13809 OUT PEX_RUNDOWN_REF RunRef);
13810
13811 NTKERNELAPI
13812 VOID
13813 FASTCALL
13814 ExReInitializeRundownProtection(
13815 IN OUT PEX_RUNDOWN_REF RunRef);
13816
13817 NTKERNELAPI
13818 VOID
13819 FASTCALL
13820 ExReleaseRundownProtection(
13821 IN OUT PEX_RUNDOWN_REF RunRef);
13822
13823 NTKERNELAPI
13824 VOID
13825 FASTCALL
13826 ExRundownCompleted(
13827 OUT PEX_RUNDOWN_REF RunRef);
13828
13829 NTKERNELAPI
13830 BOOLEAN
13831 NTAPI
13832 ExVerifySuite(
13833 IN SUITE_TYPE SuiteType);
13834
13835 NTKERNELAPI
13836 VOID
13837 FASTCALL
13838 ExWaitForRundownProtectionRelease(
13839 IN OUT PEX_RUNDOWN_REF RunRef);
13840 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13841
13842 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
13843
13844 NTKERNELAPI
13845 BOOLEAN
13846 FASTCALL
13847 ExAcquireRundownProtectionEx(
13848 IN OUT PEX_RUNDOWN_REF RunRef,
13849 IN ULONG Count);
13850
13851 NTKERNELAPI
13852 VOID
13853 FASTCALL
13854 ExReleaseRundownProtectionEx(
13855 IN OUT PEX_RUNDOWN_REF RunRef,
13856 IN ULONG Count);
13857
13858 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
13859
13860 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
13861
13862 NTKERNELAPI
13863 PEX_RUNDOWN_REF_CACHE_AWARE
13864 NTAPI
13865 ExAllocateCacheAwareRundownProtection(
13866 IN POOL_TYPE PoolType,
13867 IN ULONG PoolTag);
13868
13869 NTKERNELAPI
13870 SIZE_T
13871 NTAPI
13872 ExSizeOfRundownProtectionCacheAware(VOID);
13873
13874 NTKERNELAPI
13875 PVOID
13876 NTAPI
13877 ExEnterCriticalRegionAndAcquireResourceShared(
13878 IN OUT PERESOURCE Resource);
13879
13880 NTKERNELAPI
13881 PVOID
13882 NTAPI
13883 ExEnterCriticalRegionAndAcquireResourceExclusive(
13884 IN OUT PERESOURCE Resource);
13885
13886 NTKERNELAPI
13887 PVOID
13888 NTAPI
13889 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
13890 IN OUT PERESOURCE Resource);
13891
13892 NTKERNELAPI
13893 VOID
13894 FASTCALL
13895 ExReleaseResourceAndLeaveCriticalRegion(
13896 IN OUT PERESOURCE Resource);
13897
13898 NTKERNELAPI
13899 VOID
13900 NTAPI
13901 ExInitializeRundownProtectionCacheAware(
13902 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13903 IN SIZE_T RunRefSize);
13904
13905 NTKERNELAPI
13906 VOID
13907 NTAPI
13908 ExFreeCacheAwareRundownProtection(
13909 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13910
13911 NTKERNELAPI
13912 BOOLEAN
13913 FASTCALL
13914 ExAcquireRundownProtectionCacheAware(
13915 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13916
13917 NTKERNELAPI
13918 VOID
13919 FASTCALL
13920 ExReleaseRundownProtectionCacheAware(
13921 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13922
13923 NTKERNELAPI
13924 BOOLEAN
13925 FASTCALL
13926 ExAcquireRundownProtectionCacheAwareEx(
13927 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13928 IN ULONG Count);
13929
13930 NTKERNELAPI
13931 VOID
13932 FASTCALL
13933 ExReleaseRundownProtectionCacheAwareEx(
13934 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
13935 IN ULONG Count);
13936
13937 NTKERNELAPI
13938 VOID
13939 FASTCALL
13940 ExWaitForRundownProtectionReleaseCacheAware(
13941 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
13942
13943 NTKERNELAPI
13944 VOID
13945 FASTCALL
13946 ExReInitializeRundownProtectionCacheAware(
13947 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13948
13949 NTKERNELAPI
13950 VOID
13951 FASTCALL
13952 ExRundownCompletedCacheAware(
13953 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13954
13955 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
13956
13957 #if (NTDDI_VERSION >= NTDDI_VISTA)
13958
13959 NTKERNELAPI
13960 NTSTATUS
13961 NTAPI
13962 ExInitializeLookasideListEx(
13963 OUT PLOOKASIDE_LIST_EX Lookaside,
13964 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
13965 IN PFREE_FUNCTION_EX Free OPTIONAL,
13966 IN POOL_TYPE PoolType,
13967 IN ULONG Flags,
13968 IN SIZE_T Size,
13969 IN ULONG Tag,
13970 IN USHORT Depth);
13971
13972 NTKERNELAPI
13973 VOID
13974 NTAPI
13975 ExDeleteLookasideListEx(
13976 IN OUT PLOOKASIDE_LIST_EX Lookaside);
13977
13978 NTKERNELAPI
13979 VOID
13980 NTAPI
13981 ExFlushLookasideListEx(
13982 IN OUT PLOOKASIDE_LIST_EX Lookaside);
13983
13984 FORCEINLINE
13985 PVOID
13986 ExAllocateFromLookasideListEx(
13987 IN OUT PLOOKASIDE_LIST_EX Lookaside)
13988 {
13989 PVOID Entry;
13990
13991 Lookaside->L.TotalAllocates += 1;
13992 #ifdef NONAMELESSUNION
13993 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
13994 if (Entry == NULL) {
13995 Lookaside->L.u2.AllocateMisses += 1;
13996 Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
13997 Lookaside->L.Size,
13998 Lookaside->L.Tag,
13999 Lookaside);
14000 }
14001 #else /* NONAMELESSUNION */
14002 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14003 if (Entry == NULL) {
14004 Lookaside->L.AllocateMisses += 1;
14005 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
14006 Lookaside->L.Size,
14007 Lookaside->L.Tag,
14008 Lookaside);
14009 }
14010 #endif /* NONAMELESSUNION */
14011 return Entry;
14012 }
14013
14014 FORCEINLINE
14015 VOID
14016 ExFreeToLookasideListEx(
14017 IN OUT PLOOKASIDE_LIST_EX Lookaside,
14018 IN PVOID Entry)
14019 {
14020 Lookaside->L.TotalFrees += 1;
14021 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14022 Lookaside->L.FreeMisses += 1;
14023 (Lookaside->L.FreeEx)(Entry, Lookaside);
14024 } else {
14025 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14026 }
14027 return;
14028 }
14029
14030 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14031
14032 #if (NTDDI_VERSION >= NTDDI_WIN7)
14033
14034 NTKERNELAPI
14035 VOID
14036 NTAPI
14037 ExSetResourceOwnerPointerEx(
14038 IN OUT PERESOURCE Resource,
14039 IN PVOID OwnerPointer,
14040 IN ULONG Flags);
14041
14042 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
14043
14044 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14045
14046 static __inline PVOID
14047 ExAllocateFromNPagedLookasideList(
14048 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
14049 {
14050 PVOID Entry;
14051
14052 Lookaside->L.TotalAllocates++;
14053 #ifdef NONAMELESSUNION
14054 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14055 Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
14056 &Lookaside->Lock__ObsoleteButDoNotDelete);
14057 #else
14058 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
14059 #endif
14060 if (Entry == NULL) {
14061 Lookaside->L.u2.AllocateMisses++;
14062 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
14063 Lookaside->L.Size,
14064 Lookaside->L.Tag);
14065 }
14066 #else /* NONAMELESSUNION */
14067 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14068 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
14069 &Lookaside->Lock__ObsoleteButDoNotDelete);
14070 #else
14071 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14072 #endif
14073 if (Entry == NULL) {
14074 Lookaside->L.AllocateMisses++;
14075 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
14076 Lookaside->L.Size,
14077 Lookaside->L.Tag);
14078 }
14079 #endif /* NONAMELESSUNION */
14080 return Entry;
14081 }
14082
14083 static __inline VOID
14084 ExFreeToNPagedLookasideList(
14085 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
14086 IN PVOID Entry)
14087 {
14088 Lookaside->L.TotalFrees++;
14089 #ifdef NONAMELESSUNION
14090 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
14091 Lookaside->L.u3.FreeMisses++;
14092 (Lookaside->L.u5.Free)(Entry);
14093 } else {
14094 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14095 ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
14096 (PSLIST_ENTRY)Entry,
14097 &Lookaside->Lock__ObsoleteButDoNotDelete);
14098 #else
14099 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
14100 #endif
14101 }
14102 #else /* NONAMELESSUNION */
14103 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14104 Lookaside->L.FreeMisses++;
14105 (Lookaside->L.Free)(Entry);
14106 } else {
14107 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14108 ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
14109 (PSLIST_ENTRY)Entry,
14110 &Lookaside->Lock__ObsoleteButDoNotDelete);
14111 #else
14112 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14113 #endif
14114 }
14115 #endif /* NONAMELESSUNION */
14116 }
14117
14118 /******************************************************************************
14119 * Object Manager Functions *
14120 ******************************************************************************/
14121
14122 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14123 NTKERNELAPI
14124 LONG_PTR
14125 FASTCALL
14126 ObfDereferenceObject(
14127 IN PVOID Object);
14128 #define ObDereferenceObject ObfDereferenceObject
14129
14130 NTKERNELAPI
14131 NTSTATUS
14132 NTAPI
14133 ObGetObjectSecurity(
14134 IN PVOID Object,
14135 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
14136 OUT PBOOLEAN MemoryAllocated);
14137
14138 NTKERNELAPI
14139 LONG_PTR
14140 FASTCALL
14141 ObfReferenceObject(
14142 IN PVOID Object);
14143 #define ObReferenceObject ObfReferenceObject
14144
14145 NTKERNELAPI
14146 NTSTATUS
14147 NTAPI
14148 ObReferenceObjectByHandle(
14149 IN HANDLE Handle,
14150 IN ACCESS_MASK DesiredAccess,
14151 IN POBJECT_TYPE ObjectType OPTIONAL,
14152 IN KPROCESSOR_MODE AccessMode,
14153 OUT PVOID *Object,
14154 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14155
14156 NTKERNELAPI
14157 NTSTATUS
14158 NTAPI
14159 ObReferenceObjectByPointer(
14160 IN PVOID Object,
14161 IN ACCESS_MASK DesiredAccess,
14162 IN POBJECT_TYPE ObjectType OPTIONAL,
14163 IN KPROCESSOR_MODE AccessMode);
14164
14165 NTKERNELAPI
14166 VOID
14167 NTAPI
14168 ObReleaseObjectSecurity(
14169 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
14170 IN BOOLEAN MemoryAllocated);
14171 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14172
14173 #if (NTDDI_VERSION >= NTDDI_VISTA)
14174 NTKERNELAPI
14175 VOID
14176 NTAPI
14177 ObDereferenceObjectDeferDelete(
14178 IN PVOID Object);
14179 #endif
14180
14181 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
14182 NTKERNELAPI
14183 NTSTATUS
14184 NTAPI
14185 ObRegisterCallbacks(
14186 IN POB_CALLBACK_REGISTRATION CallbackRegistration,
14187 OUT PVOID *RegistrationHandle);
14188
14189 NTKERNELAPI
14190 VOID
14191 NTAPI
14192 ObUnRegisterCallbacks(
14193 IN PVOID RegistrationHandle);
14194
14195 NTKERNELAPI
14196 USHORT
14197 NTAPI
14198 ObGetFilterVersion(VOID);
14199
14200 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
14201
14202 #if (NTDDI_VERSION >= NTDDI_WIN7)
14203 NTKERNELAPI
14204 NTSTATUS
14205 NTAPI
14206 ObReferenceObjectByHandleWithTag(
14207 IN HANDLE Handle,
14208 IN ACCESS_MASK DesiredAccess,
14209 IN POBJECT_TYPE ObjectType OPTIONAL,
14210 IN KPROCESSOR_MODE AccessMode,
14211 IN ULONG Tag,
14212 OUT PVOID *Object,
14213 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14214
14215 NTKERNELAPI
14216 LONG_PTR
14217 FASTCALL
14218 ObfReferenceObjectWithTag(
14219 IN PVOID Object,
14220 IN ULONG Tag);
14221
14222 NTKERNELAPI
14223 NTSTATUS
14224 NTAPI
14225 ObReferenceObjectByPointerWithTag(
14226 IN PVOID Object,
14227 IN ACCESS_MASK DesiredAccess,
14228 IN POBJECT_TYPE ObjectType OPTIONAL,
14229 IN KPROCESSOR_MODE AccessMode,
14230 IN ULONG Tag);
14231
14232 NTKERNELAPI
14233 LONG_PTR
14234 FASTCALL
14235 ObfDereferenceObjectWithTag(
14236 IN PVOID Object,
14237 IN ULONG Tag);
14238
14239 NTKERNELAPI
14240 VOID
14241 NTAPI
14242 ObDereferenceObjectDeferDeleteWithTag(
14243 IN PVOID Object,
14244 IN ULONG Tag);
14245
14246 #define ObDereferenceObject ObfDereferenceObject
14247 #define ObReferenceObject ObfReferenceObject
14248 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
14249 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
14250 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14251
14252 /******************************************************************************
14253 * Process Manager Functions *
14254 ******************************************************************************/
14255
14256 NTKERNELAPI
14257 NTSTATUS
14258 NTAPI
14259 PsWrapApcWow64Thread(
14260 IN OUT PVOID *ApcContext,
14261 IN OUT PVOID *ApcRoutine);
14262
14263 /*
14264 * PEPROCESS
14265 * PsGetCurrentProcess(VOID)
14266 */
14267 #define PsGetCurrentProcess IoGetCurrentProcess
14268
14269 #if !defined(_PSGETCURRENTTHREAD_)
14270 #define _PSGETCURRENTTHREAD_
14271 FORCEINLINE
14272 PETHREAD
14273 NTAPI
14274 PsGetCurrentThread(VOID)
14275 {
14276 return (PETHREAD)KeGetCurrentThread();
14277 }
14278 #endif /* !_PSGETCURRENTTHREAD_ */
14279
14280
14281 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14282
14283 NTKERNELAPI
14284 NTSTATUS
14285 NTAPI
14286 PsCreateSystemThread(
14287 OUT PHANDLE ThreadHandle,
14288 IN ULONG DesiredAccess,
14289 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14290 IN HANDLE ProcessHandle OPTIONAL,
14291 OUT PCLIENT_ID ClientId OPTIONAL,
14292 IN PKSTART_ROUTINE StartRoutine,
14293 IN PVOID StartContext OPTIONAL);
14294
14295 NTKERNELAPI
14296 NTSTATUS
14297 NTAPI
14298 PsTerminateSystemThread(
14299 IN NTSTATUS ExitStatus);
14300
14301 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14302
14303
14304 /******************************************************************************
14305 * WMI Library Support Functions *
14306 ******************************************************************************/
14307
14308 #ifdef RUN_WPP
14309 #if (NTDDI_VERSION >= NTDDI_WINXP)
14310 NTKERNELAPI
14311 NTSTATUS
14312 __cdecl
14313 WmiTraceMessage(
14314 IN TRACEHANDLE LoggerHandle,
14315 IN ULONG MessageFlags,
14316 IN LPGUID MessageGuid,
14317 IN USHORT MessageNumber,
14318 IN ...);
14319 #endif
14320 #endif /* RUN_WPP */
14321
14322 #if (NTDDI_VERSION >= NTDDI_WINXP)
14323
14324 NTKERNELAPI
14325 NTSTATUS
14326 NTAPI
14327 WmiQueryTraceInformation(
14328 IN TRACE_INFORMATION_CLASS TraceInformationClass,
14329 OUT PVOID TraceInformation,
14330 IN ULONG TraceInformationLength,
14331 OUT PULONG RequiredLength OPTIONAL,
14332 IN PVOID Buffer OPTIONAL);
14333
14334 #if 0
14335 /* FIXME: Get va_list from where? */
14336 NTKERNELAPI
14337 NTSTATUS
14338 NTAPI
14339 WmiTraceMessageVa(
14340 IN TRACEHANDLE LoggerHandle,
14341 IN ULONG MessageFlags,
14342 IN LPGUID MessageGuid,
14343 IN USHORT MessageNumber,
14344 IN va_list MessageArgList);
14345 #endif
14346
14347 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14348
14349 #ifndef TRACE_INFORMATION_CLASS_DEFINE
14350
14351 #if (NTDDI_VERSION >= NTDDI_WINXP)
14352 NTKERNELAPI
14353 NTSTATUS
14354 NTAPI
14355 WmiQueryTraceInformation(
14356 IN TRACE_INFORMATION_CLASS TraceInformationClass,
14357 OUT PVOID TraceInformation,
14358 IN ULONG TraceInformationLength,
14359 OUT PULONG RequiredLength OPTIONAL,
14360 IN PVOID Buffer OPTIONAL);
14361 #endif
14362
14363 #define TRACE_INFORMATION_CLASS_DEFINE
14364
14365 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
14366
14367 #if (NTDDI_VERSION >= NTDDI_VISTA)
14368
14369 NTSTATUS
14370 NTKERNELAPI
14371 NTAPI
14372 EtwRegister(
14373 IN LPCGUID ProviderId,
14374 IN PETWENABLECALLBACK EnableCallback OPTIONAL,
14375 IN PVOID CallbackContext OPTIONAL,
14376 OUT PREGHANDLE RegHandle);
14377
14378 NTSTATUS
14379 NTKERNELAPI
14380 NTAPI
14381 EtwUnregister(
14382 IN REGHANDLE RegHandle);
14383
14384 BOOLEAN
14385 NTKERNELAPI
14386 NTAPI
14387 EtwEventEnabled(
14388 IN REGHANDLE RegHandle,
14389 IN PCEVENT_DESCRIPTOR EventDescriptor);
14390
14391 BOOLEAN
14392 NTKERNELAPI
14393 NTAPI
14394 EtwProviderEnabled(
14395 IN REGHANDLE RegHandle,
14396 IN UCHAR Level,
14397 IN ULONGLONG Keyword);
14398
14399 NTSTATUS
14400 NTKERNELAPI
14401 NTAPI
14402 EtwActivityIdControl(
14403 IN ULONG ControlCode,
14404 IN OUT LPGUID ActivityId);
14405
14406 NTSTATUS
14407 NTKERNELAPI
14408 NTAPI
14409 EtwWrite(
14410 IN REGHANDLE RegHandle,
14411 IN PCEVENT_DESCRIPTOR EventDescriptor,
14412 IN LPCGUID ActivityId OPTIONAL,
14413 IN ULONG UserDataCount,
14414 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14415
14416 NTSTATUS
14417 NTKERNELAPI
14418 NTAPI
14419 EtwWriteTransfer(
14420 IN REGHANDLE RegHandle,
14421 IN PCEVENT_DESCRIPTOR EventDescriptor,
14422 IN LPCGUID ActivityId OPTIONAL,
14423 IN LPCGUID RelatedActivityId OPTIONAL,
14424 IN ULONG UserDataCount,
14425 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14426
14427 NTSTATUS
14428 NTKERNELAPI
14429 NTAPI
14430 EtwWriteString(
14431 IN REGHANDLE RegHandle,
14432 IN UCHAR Level,
14433 IN ULONGLONG Keyword,
14434 IN LPCGUID ActivityId OPTIONAL,
14435 IN PCWSTR String);
14436
14437 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14438
14439 #if (NTDDI_VERSION >= NTDDI_WIN7)
14440 NTSTATUS
14441 NTKERNELAPI
14442 NTAPI
14443 EtwWriteEx(
14444 IN REGHANDLE RegHandle,
14445 IN PCEVENT_DESCRIPTOR EventDescriptor,
14446 IN ULONG64 Filter,
14447 IN ULONG Flags,
14448 IN LPCGUID ActivityId OPTIONAL,
14449 IN LPCGUID RelatedActivityId OPTIONAL,
14450 IN ULONG UserDataCount,
14451 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14452 #endif
14453
14454
14455
14456 /******************************************************************************
14457 * Kernel Debugger Functions *
14458 ******************************************************************************/
14459
14460 #ifndef _DBGNT_
14461
14462 ULONG
14463 __cdecl
14464 DbgPrint(
14465 IN PCSTR Format,
14466 IN ...);
14467
14468 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14469 NTSYSAPI
14470 ULONG
14471 __cdecl
14472 DbgPrintReturnControlC(
14473 IN PCCH Format,
14474 IN ...);
14475 #endif
14476
14477 #if (NTDDI_VERSION >= NTDDI_WINXP)
14478
14479 NTSYSAPI
14480 ULONG
14481 __cdecl
14482 DbgPrintEx(
14483 IN ULONG ComponentId,
14484 IN ULONG Level,
14485 IN PCSTR Format,
14486 IN ...);
14487
14488 #ifdef _VA_LIST_DEFINED
14489
14490 NTSYSAPI
14491 ULONG
14492 NTAPI
14493 vDbgPrintEx(
14494 IN ULONG ComponentId,
14495 IN ULONG Level,
14496 IN PCCH Format,
14497 IN va_list ap);
14498
14499 NTSYSAPI
14500 ULONG
14501 NTAPI
14502 vDbgPrintExWithPrefix(
14503 IN PCCH Prefix,
14504 IN ULONG ComponentId,
14505 IN ULONG Level,
14506 IN PCCH Format,
14507 IN va_list ap);
14508
14509 #endif /* _VA_LIST_DEFINED */
14510
14511 NTSYSAPI
14512 NTSTATUS
14513 NTAPI
14514 DbgQueryDebugFilterState(
14515 IN ULONG ComponentId,
14516 IN ULONG Level);
14517
14518 NTSYSAPI
14519 NTSTATUS
14520 NTAPI
14521 DbgSetDebugFilterState(
14522 IN ULONG ComponentId,
14523 IN ULONG Level,
14524 IN BOOLEAN State);
14525
14526 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14527
14528 #if (NTDDI_VERSION >= NTDDI_VISTA)
14529
14530 typedef VOID
14531 (*PDEBUG_PRINT_CALLBACK)(
14532 IN PSTRING Output,
14533 IN ULONG ComponentId,
14534 IN ULONG Level);
14535
14536 NTSYSAPI
14537 NTSTATUS
14538 NTAPI
14539 DbgSetDebugPrintCallback(
14540 IN PDEBUG_PRINT_CALLBACK DebugPrintCallback,
14541 IN BOOLEAN Enable);
14542
14543 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14544
14545 #endif /* _DBGNT_ */
14546
14547 #if DBG
14548
14549 #define KdPrint(_x_) DbgPrint _x_
14550 #define KdPrintEx(_x_) DbgPrintEx _x_
14551 #define vKdPrintEx(_x_) vDbgPrintEx _x_
14552 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
14553 #define KdBreakPoint() DbgBreakPoint()
14554 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
14555
14556 #else /* !DBG */
14557
14558 #define KdPrint(_x_)
14559 #define KdPrintEx(_x_)
14560 #define vKdPrintEx(_x_)
14561 #define vKdPrintExWithPrefix(_x_)
14562 #define KdBreakPoint()
14563 #define KdBreakPointWithStatus(s)
14564
14565 #endif /* !DBG */
14566
14567 #if defined(__GNUC__)
14568
14569 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
14570 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
14571 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14572 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14573
14574 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
14575
14576 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
14577 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
14578 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
14579 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
14580
14581 #else
14582
14583 extern BOOLEAN KdDebuggerNotPresent;
14584 extern BOOLEAN KdDebuggerEnabled;
14585 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14586 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14587
14588 #endif
14589
14590 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14591
14592 NTKERNELAPI
14593 NTSTATUS
14594 NTAPI
14595 KdDisableDebugger(VOID);
14596
14597 NTKERNELAPI
14598 NTSTATUS
14599 NTAPI
14600 KdEnableDebugger(VOID);
14601
14602 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
14603 #define DbgBreakPoint __debugbreak
14604 #else
14605 VOID
14606 NTAPI
14607 DbgBreakPoint(VOID);
14608 #endif
14609
14610 NTSYSAPI
14611 VOID
14612 NTAPI
14613 DbgBreakPointWithStatus(
14614 IN ULONG Status);
14615
14616 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14617
14618 #if (NTDDI_VERSION >= NTDDI_WS03)
14619 NTKERNELAPI
14620 BOOLEAN
14621 NTAPI
14622 KdRefreshDebuggerNotPresent(VOID);
14623 #endif
14624
14625 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
14626 NTKERNELAPI
14627 NTSTATUS
14628 NTAPI
14629 KdChangeOption(
14630 IN KD_OPTION Option,
14631 IN ULONG InBufferBytes OPTIONAL,
14632 IN PVOID InBuffer,
14633 IN ULONG OutBufferBytes OPTIONAL,
14634 OUT PVOID OutBuffer,
14635 OUT PULONG OutBufferNeeded OPTIONAL);
14636 #endif
14637 /* Hardware Abstraction Layer Functions */
14638
14639 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14640
14641 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
14642
14643 FORCEINLINE
14644 PVOID
14645 NTAPI
14646 HalAllocateCommonBuffer(
14647 IN PDMA_ADAPTER DmaAdapter,
14648 IN ULONG Length,
14649 OUT PPHYSICAL_ADDRESS LogicalAddress,
14650 IN BOOLEAN CacheEnabled)
14651 {
14652 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
14653 PVOID commonBuffer;
14654
14655 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
14656 ASSERT( allocateCommonBuffer != NULL );
14657 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
14658 return commonBuffer;
14659 }
14660
14661 FORCEINLINE
14662 VOID
14663 NTAPI
14664 HalFreeCommonBuffer(
14665 IN PDMA_ADAPTER DmaAdapter,
14666 IN ULONG Length,
14667 IN PHYSICAL_ADDRESS LogicalAddress,
14668 IN PVOID VirtualAddress,
14669 IN BOOLEAN CacheEnabled)
14670 {
14671 PFREE_COMMON_BUFFER freeCommonBuffer;
14672
14673 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
14674 ASSERT( freeCommonBuffer != NULL );
14675 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
14676 }
14677
14678 FORCEINLINE
14679 ULONG
14680 NTAPI
14681 HalReadDmaCounter(
14682 IN PDMA_ADAPTER DmaAdapter)
14683 {
14684 PREAD_DMA_COUNTER readDmaCounter;
14685 ULONG counter;
14686
14687 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
14688 ASSERT( readDmaCounter != NULL );
14689 counter = readDmaCounter( DmaAdapter );
14690 return counter;
14691 }
14692
14693 FORCEINLINE
14694 ULONG
14695 HalGetDmaAlignment(
14696 IN PDMA_ADAPTER DmaAdapter)
14697 {
14698 PGET_DMA_ALIGNMENT getDmaAlignment;
14699 ULONG alignment;
14700
14701 getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
14702 ASSERT( getDmaAlignment != NULL );
14703 alignment = getDmaAlignment( DmaAdapter );
14704 return alignment;
14705 }
14706
14707 #endif /* USE_DMA_MACROS ... */
14708
14709 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14710
14711 #ifndef _NTTMAPI_
14712 #define _NTTMAPI_
14713
14714 #include <ktmtypes.h>
14715
14716 #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
14717 #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
14718 #define TRANSACTIONMANAGER_RECOVER (0x0004)
14719 #define TRANSACTIONMANAGER_RENAME (0x0008)
14720 #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
14721 #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
14722
14723 #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14724 TRANSACTIONMANAGER_QUERY_INFORMATION)
14725
14726 #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14727 TRANSACTIONMANAGER_SET_INFORMATION |\
14728 TRANSACTIONMANAGER_RECOVER |\
14729 TRANSACTIONMANAGER_RENAME |\
14730 TRANSACTIONMANAGER_CREATE_RM)
14731
14732 #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
14733
14734 #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14735 TRANSACTIONMANAGER_GENERIC_READ |\
14736 TRANSACTIONMANAGER_GENERIC_WRITE |\
14737 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
14738 TRANSACTIONMANAGER_BIND_TRANSACTION)
14739
14740 #define TRANSACTION_QUERY_INFORMATION (0x0001)
14741 #define TRANSACTION_SET_INFORMATION (0x0002)
14742 #define TRANSACTION_ENLIST (0x0004)
14743 #define TRANSACTION_COMMIT (0x0008)
14744 #define TRANSACTION_ROLLBACK (0x0010)
14745 #define TRANSACTION_PROPAGATE (0x0020)
14746 #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
14747
14748 #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
14749 TRANSACTION_QUERY_INFORMATION |\
14750 SYNCHRONIZE)
14751
14752 #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14753 TRANSACTION_SET_INFORMATION |\
14754 TRANSACTION_COMMIT |\
14755 TRANSACTION_ENLIST |\
14756 TRANSACTION_ROLLBACK |\
14757 TRANSACTION_PROPAGATE |\
14758 SYNCHRONIZE)
14759
14760 #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14761 TRANSACTION_COMMIT |\
14762 TRANSACTION_ROLLBACK |\
14763 SYNCHRONIZE)
14764
14765 #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14766 TRANSACTION_GENERIC_READ |\
14767 TRANSACTION_GENERIC_WRITE |\
14768 TRANSACTION_GENERIC_EXECUTE)
14769
14770 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
14771 STANDARD_RIGHTS_WRITE |\
14772 TRANSACTION_SET_INFORMATION |\
14773 TRANSACTION_ENLIST |\
14774 TRANSACTION_ROLLBACK |\
14775 TRANSACTION_PROPAGATE |\
14776 SYNCHRONIZE)
14777
14778 #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
14779 #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
14780 #define RESOURCEMANAGER_RECOVER (0x0004)
14781 #define RESOURCEMANAGER_ENLIST (0x0008)
14782 #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
14783 #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
14784 #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
14785
14786 #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14787 RESOURCEMANAGER_QUERY_INFORMATION |\
14788 SYNCHRONIZE)
14789
14790 #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14791 RESOURCEMANAGER_SET_INFORMATION |\
14792 RESOURCEMANAGER_RECOVER |\
14793 RESOURCEMANAGER_ENLIST |\
14794 RESOURCEMANAGER_GET_NOTIFICATION |\
14795 RESOURCEMANAGER_REGISTER_PROTOCOL |\
14796 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14797 SYNCHRONIZE)
14798
14799 #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14800 RESOURCEMANAGER_RECOVER |\
14801 RESOURCEMANAGER_ENLIST |\
14802 RESOURCEMANAGER_GET_NOTIFICATION |\
14803 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14804 SYNCHRONIZE)
14805
14806 #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14807 RESOURCEMANAGER_GENERIC_READ |\
14808 RESOURCEMANAGER_GENERIC_WRITE |\
14809 RESOURCEMANAGER_GENERIC_EXECUTE)
14810
14811 #define ENLISTMENT_QUERY_INFORMATION (0x0001)
14812 #define ENLISTMENT_SET_INFORMATION (0x0002)
14813 #define ENLISTMENT_RECOVER (0x0004)
14814 #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
14815 #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
14816
14817 #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
14818 ENLISTMENT_QUERY_INFORMATION)
14819
14820 #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14821 ENLISTMENT_SET_INFORMATION |\
14822 ENLISTMENT_RECOVER |\
14823 ENLISTMENT_SUBORDINATE_RIGHTS |\
14824 ENLISTMENT_SUPERIOR_RIGHTS)
14825
14826 #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14827 ENLISTMENT_RECOVER |\
14828 ENLISTMENT_SUBORDINATE_RIGHTS |\
14829 ENLISTMENT_SUPERIOR_RIGHTS)
14830
14831 #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14832 ENLISTMENT_GENERIC_READ |\
14833 ENLISTMENT_GENERIC_WRITE |\
14834 ENLISTMENT_GENERIC_EXECUTE)
14835
14836 typedef enum _TRANSACTION_OUTCOME {
14837 TransactionOutcomeUndetermined = 1,
14838 TransactionOutcomeCommitted,
14839 TransactionOutcomeAborted,
14840 } TRANSACTION_OUTCOME;
14841
14842
14843 typedef enum _TRANSACTION_STATE {
14844 TransactionStateNormal = 1,
14845 TransactionStateIndoubt,
14846 TransactionStateCommittedNotify,
14847 } TRANSACTION_STATE;
14848
14849
14850 typedef struct _TRANSACTION_BASIC_INFORMATION {
14851 GUID TransactionId;
14852 ULONG State;
14853 ULONG Outcome;
14854 } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
14855
14856 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
14857 GUID TmIdentity;
14858 LARGE_INTEGER VirtualClock;
14859 } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
14860
14861 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
14862 GUID LogIdentity;
14863 } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
14864
14865 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
14866 ULONG LogPathLength;
14867 WCHAR LogPath[1];
14868 } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
14869
14870 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
14871 ULONGLONG LastRecoveredLsn;
14872 } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
14873
14874 typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
14875 ULONG IsolationLevel;
14876 ULONG IsolationFlags;
14877 LARGE_INTEGER Timeout;
14878 ULONG Outcome;
14879 ULONG DescriptionLength;
14880 WCHAR Description[1];
14881 } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
14882
14883 typedef struct _TRANSACTION_BIND_INFORMATION {
14884 HANDLE TmHandle;
14885 } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
14886
14887 typedef struct _TRANSACTION_ENLISTMENT_PAIR {
14888 GUID EnlistmentId;
14889 GUID ResourceManagerId;
14890 } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
14891
14892 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
14893 ULONG NumberOfEnlistments;
14894 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
14895 } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
14896
14897 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
14898 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
14899 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
14900
14901 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
14902 GUID ResourceManagerId;
14903 ULONG DescriptionLength;
14904 WCHAR Description[1];
14905 } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
14906
14907 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
14908 HANDLE IoCompletionPortHandle;
14909 ULONG_PTR CompletionKey;
14910 } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
14911
14912 typedef enum _KTMOBJECT_TYPE {
14913 KTMOBJECT_TRANSACTION,
14914 KTMOBJECT_TRANSACTION_MANAGER,
14915 KTMOBJECT_RESOURCE_MANAGER,
14916 KTMOBJECT_ENLISTMENT,
14917 KTMOBJECT_INVALID
14918 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
14919
14920 typedef struct _KTMOBJECT_CURSOR {
14921 GUID LastQuery;
14922 ULONG ObjectIdCount;
14923 GUID ObjectIds[1];
14924 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
14925
14926 typedef enum _TRANSACTION_INFORMATION_CLASS {
14927 TransactionBasicInformation,
14928 TransactionPropertiesInformation,
14929 TransactionEnlistmentInformation,
14930 TransactionSuperiorEnlistmentInformation
14931 } TRANSACTION_INFORMATION_CLASS;
14932
14933 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
14934 TransactionManagerBasicInformation,
14935 TransactionManagerLogInformation,
14936 TransactionManagerLogPathInformation,
14937 TransactionManagerRecoveryInformation = 4
14938 } TRANSACTIONMANAGER_INFORMATION_CLASS;
14939
14940 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
14941 ResourceManagerBasicInformation,
14942 ResourceManagerCompletionInformation,
14943 } RESOURCEMANAGER_INFORMATION_CLASS;
14944
14945 typedef struct _ENLISTMENT_BASIC_INFORMATION {
14946 GUID EnlistmentId;
14947 GUID TransactionId;
14948 GUID ResourceManagerId;
14949 } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
14950
14951 typedef struct _ENLISTMENT_CRM_INFORMATION {
14952 GUID CrmTransactionManagerId;
14953 GUID CrmResourceManagerId;
14954 GUID CrmEnlistmentId;
14955 } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
14956
14957 typedef enum _ENLISTMENT_INFORMATION_CLASS {
14958 EnlistmentBasicInformation,
14959 EnlistmentRecoveryInformation,
14960 EnlistmentCrmInformation
14961 } ENLISTMENT_INFORMATION_CLASS;
14962
14963 typedef struct _TRANSACTION_LIST_ENTRY {
14964 #if defined(__cplusplus)
14965 ::UOW UOW;
14966 #else
14967 UOW UOW;
14968 #endif
14969 } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
14970
14971 typedef struct _TRANSACTION_LIST_INFORMATION {
14972 ULONG NumberOfTransactions;
14973 TRANSACTION_LIST_ENTRY TransactionInformation[1];
14974 } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
14975
14976 typedef NTSTATUS
14977 (NTAPI *PFN_NT_CREATE_TRANSACTION)(
14978 OUT PHANDLE TransactionHandle,
14979 IN ACCESS_MASK DesiredAccess,
14980 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14981 IN LPGUID Uow OPTIONAL,
14982 IN HANDLE TmHandle OPTIONAL,
14983 IN ULONG CreateOptions OPTIONAL,
14984 IN ULONG IsolationLevel OPTIONAL,
14985 IN ULONG IsolationFlags OPTIONAL,
14986 IN PLARGE_INTEGER Timeout OPTIONAL,
14987 IN PUNICODE_STRING Description OPTIONAL);
14988
14989 typedef NTSTATUS
14990 (NTAPI *PFN_NT_OPEN_TRANSACTION)(
14991 OUT PHANDLE TransactionHandle,
14992 IN ACCESS_MASK DesiredAccess,
14993 IN POBJECT_ATTRIBUTES ObjectAttributes,
14994 IN LPGUID Uow OPTIONAL,
14995 IN HANDLE TmHandle OPTIONAL);
14996
14997 typedef NTSTATUS
14998 (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
14999 IN HANDLE TransactionHandle,
15000 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15001 OUT PVOID TransactionInformation,
15002 IN ULONG TransactionInformationLength,
15003 OUT PULONG ReturnLength OPTIONAL);
15004
15005 typedef NTSTATUS
15006 (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
15007 IN HANDLE TransactionHandle,
15008 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15009 IN PVOID TransactionInformation,
15010 IN ULONG TransactionInformationLength);
15011
15012 typedef NTSTATUS
15013 (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
15014 IN HANDLE TransactionHandle,
15015 IN BOOLEAN Wait);
15016
15017 typedef NTSTATUS
15018 (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
15019 IN HANDLE TransactionHandle,
15020 IN BOOLEAN Wait);
15021
15022 #if (NTDDI_VERSION >= NTDDI_VISTA)
15023
15024 NTSYSCALLAPI
15025 NTSTATUS
15026 NTAPI
15027 NtCreateTransactionManager(
15028 OUT PHANDLE TmHandle,
15029 IN ACCESS_MASK DesiredAccess,
15030 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15031 IN PUNICODE_STRING LogFileName OPTIONAL,
15032 IN ULONG CreateOptions OPTIONAL,
15033 IN ULONG CommitStrength OPTIONAL);
15034
15035 NTSYSCALLAPI
15036 NTSTATUS
15037 NTAPI
15038 NtOpenTransactionManager(
15039 OUT PHANDLE TmHandle,
15040 IN ACCESS_MASK DesiredAccess,
15041 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15042 IN PUNICODE_STRING LogFileName OPTIONAL,
15043 IN LPGUID TmIdentity OPTIONAL,
15044 IN ULONG OpenOptions OPTIONAL);
15045
15046 NTSYSCALLAPI
15047 NTSTATUS
15048 NTAPI
15049 NtRenameTransactionManager(
15050 IN PUNICODE_STRING LogFileName,
15051 IN LPGUID ExistingTransactionManagerGuid);
15052
15053 NTSYSCALLAPI
15054 NTSTATUS
15055 NTAPI
15056 NtRollforwardTransactionManager(
15057 IN HANDLE TransactionManagerHandle,
15058 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15059
15060 NTSYSCALLAPI
15061 NTSTATUS
15062 NTAPI
15063 NtRecoverTransactionManager(
15064 IN HANDLE TransactionManagerHandle);
15065
15066 NTSYSCALLAPI
15067 NTSTATUS
15068 NTAPI
15069 NtQueryInformationTransactionManager(
15070 IN HANDLE TransactionManagerHandle,
15071 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15072 OUT PVOID TransactionManagerInformation,
15073 IN ULONG TransactionManagerInformationLength,
15074 OUT PULONG ReturnLength);
15075
15076 NTSYSCALLAPI
15077 NTSTATUS
15078 NTAPI
15079 NtSetInformationTransactionManager(
15080 IN HANDLE TmHandle OPTIONAL,
15081 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15082 IN PVOID TransactionManagerInformation,
15083 IN ULONG TransactionManagerInformationLength);
15084
15085 NTSYSCALLAPI
15086 NTSTATUS
15087 NTAPI
15088 NtEnumerateTransactionObject(
15089 IN HANDLE RootObjectHandle OPTIONAL,
15090 IN KTMOBJECT_TYPE QueryType,
15091 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15092 IN ULONG ObjectCursorLength,
15093 OUT PULONG ReturnLength);
15094
15095 NTSYSCALLAPI
15096 NTSTATUS
15097 NTAPI
15098 NtCreateTransaction(
15099 OUT PHANDLE TransactionHandle,
15100 IN ACCESS_MASK DesiredAccess,
15101 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15102 IN LPGUID Uow OPTIONAL,
15103 IN HANDLE TmHandle OPTIONAL,
15104 IN ULONG CreateOptions OPTIONAL,
15105 IN ULONG IsolationLevel OPTIONAL,
15106 IN ULONG IsolationFlags OPTIONAL,
15107 IN PLARGE_INTEGER Timeout OPTIONAL,
15108 IN PUNICODE_STRING Description OPTIONAL);
15109
15110 NTSYSCALLAPI
15111 NTSTATUS
15112 NTAPI
15113 NtOpenTransaction(
15114 OUT PHANDLE TransactionHandle,
15115 IN ACCESS_MASK DesiredAccess,
15116 IN POBJECT_ATTRIBUTES ObjectAttributes,
15117 IN LPGUID Uow,
15118 IN HANDLE TmHandle OPTIONAL);
15119
15120 NTSYSCALLAPI
15121 NTSTATUS
15122 NTAPI
15123 NtQueryInformationTransaction(
15124 IN HANDLE TransactionHandle,
15125 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15126 OUT PVOID TransactionInformation,
15127 IN ULONG TransactionInformationLength,
15128 OUT PULONG ReturnLength OPTIONAL);
15129
15130 NTSYSCALLAPI
15131 NTSTATUS
15132 NTAPI
15133 NtSetInformationTransaction(
15134 IN HANDLE TransactionHandle,
15135 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15136 IN PVOID TransactionInformation,
15137 IN ULONG TransactionInformationLength);
15138
15139 NTSYSCALLAPI
15140 NTSTATUS
15141 NTAPI
15142 NtCommitTransaction(
15143 IN HANDLE TransactionHandle,
15144 IN BOOLEAN Wait);
15145
15146 NTSYSCALLAPI
15147 NTSTATUS
15148 NTAPI
15149 NtRollbackTransaction(
15150 IN HANDLE TransactionHandle,
15151 IN BOOLEAN Wait);
15152
15153 NTSYSCALLAPI
15154 NTSTATUS
15155 NTAPI
15156 NtCreateEnlistment(
15157 OUT PHANDLE EnlistmentHandle,
15158 IN ACCESS_MASK DesiredAccess,
15159 IN HANDLE ResourceManagerHandle,
15160 IN HANDLE TransactionHandle,
15161 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15162 IN ULONG CreateOptions OPTIONAL,
15163 IN NOTIFICATION_MASK NotificationMask,
15164 IN PVOID EnlistmentKey OPTIONAL);
15165
15166 NTSYSCALLAPI
15167 NTSTATUS
15168 NTAPI
15169 NtOpenEnlistment(
15170 OUT PHANDLE EnlistmentHandle,
15171 IN ACCESS_MASK DesiredAccess,
15172 IN HANDLE ResourceManagerHandle,
15173 IN LPGUID EnlistmentGuid,
15174 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15175
15176 NTSYSCALLAPI
15177 NTSTATUS
15178 NTAPI
15179 NtQueryInformationEnlistment(
15180 IN HANDLE EnlistmentHandle,
15181 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15182 OUT PVOID EnlistmentInformation,
15183 IN ULONG EnlistmentInformationLength,
15184 OUT PULONG ReturnLength);
15185
15186 NTSYSCALLAPI
15187 NTSTATUS
15188 NTAPI
15189 NtSetInformationEnlistment(
15190 IN HANDLE EnlistmentHandle OPTIONAL,
15191 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15192 IN PVOID EnlistmentInformation,
15193 IN ULONG EnlistmentInformationLength);
15194
15195 NTSYSCALLAPI
15196 NTSTATUS
15197 NTAPI
15198 NtRecoverEnlistment(
15199 IN HANDLE EnlistmentHandle,
15200 IN PVOID EnlistmentKey OPTIONAL);
15201
15202 NTSYSCALLAPI
15203 NTSTATUS
15204 NTAPI
15205 NtPrePrepareEnlistment(
15206 IN HANDLE EnlistmentHandle,
15207 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15208
15209 NTSYSCALLAPI
15210 NTSTATUS
15211 NTAPI
15212 NtPrepareEnlistment(
15213 IN HANDLE EnlistmentHandle,
15214 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15215
15216 NTSYSCALLAPI
15217 NTSTATUS
15218 NTAPI
15219 NtCommitEnlistment(
15220 IN HANDLE EnlistmentHandle,
15221 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15222
15223 NTSYSCALLAPI
15224 NTSTATUS
15225 NTAPI
15226 NtRollbackEnlistment(
15227 IN HANDLE EnlistmentHandle,
15228 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15229
15230 NTSYSCALLAPI
15231 NTSTATUS
15232 NTAPI
15233 NtPrePrepareComplete(
15234 IN HANDLE EnlistmentHandle,
15235 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15236
15237 NTSYSCALLAPI
15238 NTSTATUS
15239 NTAPI
15240 NtPrepareComplete(
15241 IN HANDLE EnlistmentHandle,
15242 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15243
15244 NTSYSCALLAPI
15245 NTSTATUS
15246 NTAPI
15247 NtCommitComplete(
15248 IN HANDLE EnlistmentHandle,
15249 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15250
15251 NTSYSCALLAPI
15252 NTSTATUS
15253 NTAPI
15254 NtReadOnlyEnlistment(
15255 IN HANDLE EnlistmentHandle,
15256 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15257
15258 NTSYSCALLAPI
15259 NTSTATUS
15260 NTAPI
15261 NtRollbackComplete(
15262 IN HANDLE EnlistmentHandle,
15263 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15264
15265 NTSYSCALLAPI
15266 NTSTATUS
15267 NTAPI
15268 NtSinglePhaseReject(
15269 IN HANDLE EnlistmentHandle,
15270 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15271
15272 NTSYSCALLAPI
15273 NTSTATUS
15274 NTAPI
15275 NtCreateResourceManager(
15276 OUT PHANDLE ResourceManagerHandle,
15277 IN ACCESS_MASK DesiredAccess,
15278 IN HANDLE TmHandle,
15279 IN LPGUID RmGuid,
15280 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15281 IN ULONG CreateOptions OPTIONAL,
15282 IN PUNICODE_STRING Description OPTIONAL);
15283
15284 NTSYSCALLAPI
15285 NTSTATUS
15286 NTAPI
15287 NtOpenResourceManager(
15288 OUT PHANDLE ResourceManagerHandle,
15289 IN ACCESS_MASK DesiredAccess,
15290 IN HANDLE TmHandle,
15291 IN LPGUID ResourceManagerGuid OPTIONAL,
15292 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15293
15294 NTSYSCALLAPI
15295 NTSTATUS
15296 NTAPI
15297 NtRecoverResourceManager(
15298 IN HANDLE ResourceManagerHandle);
15299
15300 NTSYSCALLAPI
15301 NTSTATUS
15302 NTAPI
15303 NtGetNotificationResourceManager(
15304 IN HANDLE ResourceManagerHandle,
15305 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15306 IN ULONG NotificationLength,
15307 IN PLARGE_INTEGER Timeout OPTIONAL,
15308 OUT PULONG ReturnLength OPTIONAL,
15309 IN ULONG Asynchronous,
15310 IN ULONG_PTR AsynchronousContext OPTIONAL);
15311
15312 NTSYSCALLAPI
15313 NTSTATUS
15314 NTAPI
15315 NtQueryInformationResourceManager(
15316 IN HANDLE ResourceManagerHandle,
15317 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15318 OUT PVOID ResourceManagerInformation,
15319 IN ULONG ResourceManagerInformationLength,
15320 OUT PULONG ReturnLength OPTIONAL);
15321
15322 NTSYSCALLAPI
15323 NTSTATUS
15324 NTAPI
15325 NtSetInformationResourceManager(
15326 IN HANDLE ResourceManagerHandle,
15327 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15328 IN PVOID ResourceManagerInformation,
15329 IN ULONG ResourceManagerInformationLength);
15330
15331 NTSYSCALLAPI
15332 NTSTATUS
15333 NTAPI
15334 NtRegisterProtocolAddressInformation(
15335 IN HANDLE ResourceManager,
15336 IN PCRM_PROTOCOL_ID ProtocolId,
15337 IN ULONG ProtocolInformationSize,
15338 IN PVOID ProtocolInformation,
15339 IN ULONG CreateOptions OPTIONAL);
15340
15341 NTSYSCALLAPI
15342 NTSTATUS
15343 NTAPI
15344 NtPropagationComplete(
15345 IN HANDLE ResourceManagerHandle,
15346 IN ULONG RequestCookie,
15347 IN ULONG BufferLength,
15348 IN PVOID Buffer);
15349
15350 NTSYSCALLAPI
15351 NTSTATUS
15352 NTAPI
15353 NtPropagationFailed(
15354 IN HANDLE ResourceManagerHandle,
15355 IN ULONG RequestCookie,
15356 IN NTSTATUS PropStatus);
15357
15358 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
15359
15360 #endif /* !_NTTMAPI_ */
15361 /******************************************************************************
15362 * ZwXxx Functions *
15363 ******************************************************************************/
15364
15365
15366 /* Constants */
15367 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
15368 #define ZwCurrentProcess() NtCurrentProcess()
15369 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
15370 #define ZwCurrentThread() NtCurrentThread()
15371
15372
15373 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15374
15375 NTSYSAPI
15376 NTSTATUS
15377 NTAPI
15378 ZwClose(
15379 IN HANDLE Handle);
15380
15381 NTSYSAPI
15382 NTSTATUS
15383 NTAPI
15384 ZwCreateDirectoryObject(
15385 OUT PHANDLE DirectoryHandle,
15386 IN ACCESS_MASK DesiredAccess,
15387 IN POBJECT_ATTRIBUTES ObjectAttributes);
15388
15389 NTSYSAPI
15390 NTSTATUS
15391 NTAPI
15392 ZwCreateFile(
15393 OUT PHANDLE FileHandle,
15394 IN ACCESS_MASK DesiredAccess,
15395 IN POBJECT_ATTRIBUTES ObjectAttributes,
15396 OUT PIO_STATUS_BLOCK IoStatusBlock,
15397 IN PLARGE_INTEGER AllocationSize OPTIONAL,
15398 IN ULONG FileAttributes,
15399 IN ULONG ShareAccess,
15400 IN ULONG CreateDisposition,
15401 IN ULONG CreateOptions,
15402 IN PVOID EaBuffer OPTIONAL,
15403 IN ULONG EaLength);
15404
15405 NTSYSAPI
15406 NTSTATUS
15407 NTAPI
15408 ZwCreateKey(
15409 OUT PHANDLE KeyHandle,
15410 IN ACCESS_MASK DesiredAccess,
15411 IN POBJECT_ATTRIBUTES ObjectAttributes,
15412 IN ULONG TitleIndex,
15413 IN PUNICODE_STRING Class OPTIONAL,
15414 IN ULONG CreateOptions,
15415 OUT PULONG Disposition OPTIONAL);
15416
15417 NTSYSAPI
15418 NTSTATUS
15419 NTAPI
15420 ZwCreateSection(
15421 OUT PHANDLE SectionHandle,
15422 IN ACCESS_MASK DesiredAccess,
15423 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15424 IN PLARGE_INTEGER MaximumSize OPTIONAL,
15425 IN ULONG SectionPageProtection,
15426 IN ULONG AllocationAttributes,
15427 IN HANDLE FileHandle OPTIONAL);
15428
15429 NTSYSAPI
15430 NTSTATUS
15431 NTAPI
15432 ZwDeleteKey(
15433 IN HANDLE KeyHandle);
15434
15435 NTSYSAPI
15436 NTSTATUS
15437 NTAPI
15438 ZwDeleteValueKey(
15439 IN HANDLE KeyHandle,
15440 IN PUNICODE_STRING ValueName);
15441
15442 NTSYSAPI
15443 NTSTATUS
15444 NTAPI
15445 ZwEnumerateKey(
15446 IN HANDLE KeyHandle,
15447 IN ULONG Index,
15448 IN KEY_INFORMATION_CLASS KeyInformationClass,
15449 OUT PVOID KeyInformation OPTIONAL,
15450 IN ULONG Length,
15451 OUT PULONG ResultLength);
15452
15453 NTSYSAPI
15454 NTSTATUS
15455 NTAPI
15456 ZwEnumerateValueKey(
15457 IN HANDLE KeyHandle,
15458 IN ULONG Index,
15459 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15460 OUT PVOID KeyValueInformation OPTIONAL,
15461 IN ULONG Length,
15462 OUT PULONG ResultLength);
15463
15464 NTSYSAPI
15465 NTSTATUS
15466 NTAPI
15467 ZwFlushKey(
15468 IN HANDLE KeyHandle);
15469
15470 NTSYSAPI
15471 NTSTATUS
15472 NTAPI
15473 ZwLoadDriver(
15474 IN PUNICODE_STRING DriverServiceName);
15475
15476 NTSYSAPI
15477 NTSTATUS
15478 NTAPI
15479 ZwMakeTemporaryObject(
15480 IN HANDLE Handle);
15481
15482 NTSYSAPI
15483 NTSTATUS
15484 NTAPI
15485 ZwMapViewOfSection(
15486 IN HANDLE SectionHandle,
15487 IN HANDLE ProcessHandle,
15488 IN OUT PVOID *BaseAddress,
15489 IN ULONG_PTR ZeroBits,
15490 IN SIZE_T CommitSize,
15491 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
15492 IN OUT PSIZE_T ViewSize,
15493 IN SECTION_INHERIT InheritDisposition,
15494 IN ULONG AllocationType,
15495 IN ULONG Protect);
15496
15497 NTSYSAPI
15498 NTSTATUS
15499 NTAPI
15500 ZwOpenFile(
15501 OUT PHANDLE FileHandle,
15502 IN ACCESS_MASK DesiredAccess,
15503 IN POBJECT_ATTRIBUTES ObjectAttributes,
15504 OUT PIO_STATUS_BLOCK IoStatusBlock,
15505 IN ULONG ShareAccess,
15506 IN ULONG OpenOptions);
15507
15508 NTSYSAPI
15509 NTSTATUS
15510 NTAPI
15511 ZwOpenKey(
15512 OUT PHANDLE KeyHandle,
15513 IN ACCESS_MASK DesiredAccess,
15514 IN POBJECT_ATTRIBUTES ObjectAttributes);
15515
15516 NTSYSAPI
15517 NTSTATUS
15518 NTAPI
15519 ZwOpenSection(
15520 OUT PHANDLE SectionHandle,
15521 IN ACCESS_MASK DesiredAccess,
15522 IN POBJECT_ATTRIBUTES ObjectAttributes);
15523
15524 NTSYSAPI
15525 NTSTATUS
15526 NTAPI
15527 ZwOpenSymbolicLinkObject(
15528 OUT PHANDLE LinkHandle,
15529 IN ACCESS_MASK DesiredAccess,
15530 IN POBJECT_ATTRIBUTES ObjectAttributes);
15531
15532 NTSYSAPI
15533 NTSTATUS
15534 NTAPI
15535 ZwQueryInformationFile(
15536 IN HANDLE FileHandle,
15537 OUT PIO_STATUS_BLOCK IoStatusBlock,
15538 OUT PVOID FileInformation,
15539 IN ULONG Length,
15540 IN FILE_INFORMATION_CLASS FileInformationClass);
15541
15542 NTSYSAPI
15543 NTSTATUS
15544 NTAPI
15545 ZwQueryKey(
15546 IN HANDLE KeyHandle,
15547 IN KEY_INFORMATION_CLASS KeyInformationClass,
15548 OUT PVOID KeyInformation OPTIONAL,
15549 IN ULONG Length,
15550 OUT PULONG ResultLength);
15551
15552 NTSYSAPI
15553 NTSTATUS
15554 NTAPI
15555 ZwQuerySymbolicLinkObject(
15556 IN HANDLE LinkHandle,
15557 IN OUT PUNICODE_STRING LinkTarget,
15558 OUT PULONG ReturnedLength OPTIONAL);
15559
15560 NTSYSAPI
15561 NTSTATUS
15562 NTAPI
15563 ZwQueryValueKey(
15564 IN HANDLE KeyHandle,
15565 IN PUNICODE_STRING ValueName,
15566 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15567 OUT PVOID KeyValueInformation OPTIONAL,
15568 IN ULONG Length,
15569 OUT PULONG ResultLength);
15570
15571 NTSYSAPI
15572 NTSTATUS
15573 NTAPI
15574 ZwReadFile(
15575 IN HANDLE FileHandle,
15576 IN HANDLE Event OPTIONAL,
15577 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15578 IN PVOID ApcContext OPTIONAL,
15579 OUT PIO_STATUS_BLOCK IoStatusBlock,
15580 OUT PVOID Buffer,
15581 IN ULONG Length,
15582 IN PLARGE_INTEGER ByteOffset OPTIONAL,
15583 IN PULONG Key OPTIONAL);
15584
15585 NTSYSAPI
15586 NTSTATUS
15587 NTAPI
15588 ZwSetInformationFile(
15589 IN HANDLE FileHandle,
15590 OUT PIO_STATUS_BLOCK IoStatusBlock,
15591 IN PVOID FileInformation,
15592 IN ULONG Length,
15593 IN FILE_INFORMATION_CLASS FileInformationClass);
15594
15595 NTSYSAPI
15596 NTSTATUS
15597 NTAPI
15598 ZwSetValueKey(
15599 IN HANDLE KeyHandle,
15600 IN PUNICODE_STRING ValueName,
15601 IN ULONG TitleIndex OPTIONAL,
15602 IN ULONG Type,
15603 IN PVOID Data OPTIONAL,
15604 IN ULONG DataSize);
15605
15606 NTSYSAPI
15607 NTSTATUS
15608 NTAPI
15609 ZwUnloadDriver(
15610 IN PUNICODE_STRING DriverServiceName);
15611
15612 NTSYSAPI
15613 NTSTATUS
15614 NTAPI
15615 ZwUnmapViewOfSection(
15616 IN HANDLE ProcessHandle,
15617 IN PVOID BaseAddress OPTIONAL);
15618
15619 NTSYSAPI
15620 NTSTATUS
15621 NTAPI
15622 ZwWriteFile(
15623 IN HANDLE FileHandle,
15624 IN HANDLE Event OPTIONAL,
15625 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15626 IN PVOID ApcContext OPTIONAL,
15627 OUT PIO_STATUS_BLOCK IoStatusBlock,
15628 IN PVOID Buffer,
15629 IN ULONG Length,
15630 IN PLARGE_INTEGER ByteOffset OPTIONAL,
15631 IN PULONG Key OPTIONAL);
15632
15633 NTSYSAPI
15634 NTSTATUS
15635 NTAPI
15636 ZwQueryFullAttributesFile(
15637 IN POBJECT_ATTRIBUTES ObjectAttributes,
15638 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
15639
15640 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15641
15642
15643 #if (NTDDI_VERSION >= NTDDI_WS03)
15644 NTSYSCALLAPI
15645 NTSTATUS
15646 NTAPI
15647 ZwOpenEvent(
15648 OUT PHANDLE EventHandle,
15649 IN ACCESS_MASK DesiredAccess,
15650 IN POBJECT_ATTRIBUTES ObjectAttributes);
15651 #endif
15652
15653 #if (NTDDI_VERSION >= NTDDI_VISTA)
15654
15655 NTSYSAPI
15656 NTSTATUS
15657 ZwCreateKeyTransacted(
15658 OUT PHANDLE KeyHandle,
15659 IN ACCESS_MASK DesiredAccess,
15660 IN POBJECT_ATTRIBUTES ObjectAttributes,
15661 IN ULONG TitleIndex,
15662 IN PUNICODE_STRING Class OPTIONAL,
15663 IN ULONG CreateOptions,
15664 IN HANDLE TransactionHandle,
15665 OUT PULONG Disposition OPTIONAL);
15666
15667 NTSYSAPI
15668 NTSTATUS
15669 NTAPI
15670 ZwOpenKeyTransacted(
15671 OUT PHANDLE KeyHandle,
15672 IN ACCESS_MASK DesiredAccess,
15673 IN POBJECT_ATTRIBUTES ObjectAttributes,
15674 IN HANDLE TransactionHandle);
15675
15676 NTSYSCALLAPI
15677 NTSTATUS
15678 NTAPI
15679 ZwCreateTransactionManager(
15680 OUT PHANDLE TmHandle,
15681 IN ACCESS_MASK DesiredAccess,
15682 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15683 IN PUNICODE_STRING LogFileName OPTIONAL,
15684 IN ULONG CreateOptions OPTIONAL,
15685 IN ULONG CommitStrength OPTIONAL);
15686
15687 NTSYSCALLAPI
15688 NTSTATUS
15689 NTAPI
15690 ZwOpenTransactionManager(
15691 OUT PHANDLE TmHandle,
15692 IN ACCESS_MASK DesiredAccess,
15693 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15694 IN PUNICODE_STRING LogFileName OPTIONAL,
15695 IN LPGUID TmIdentity OPTIONAL,
15696 IN ULONG OpenOptions OPTIONAL);
15697
15698 NTSYSCALLAPI
15699 NTSTATUS
15700 NTAPI
15701 ZwRollforwardTransactionManager(
15702 IN HANDLE TransactionManagerHandle,
15703 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15704
15705 NTSYSCALLAPI
15706 NTSTATUS
15707 NTAPI
15708 ZwRecoverTransactionManager(
15709 IN HANDLE TransactionManagerHandle);
15710
15711 NTSYSCALLAPI
15712 NTSTATUS
15713 NTAPI
15714 ZwQueryInformationTransactionManager(
15715 IN HANDLE TransactionManagerHandle,
15716 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15717 OUT PVOID TransactionManagerInformation,
15718 IN ULONG TransactionManagerInformationLength,
15719 OUT PULONG ReturnLength OPTIONAL);
15720
15721 NTSYSCALLAPI
15722 NTSTATUS
15723 NTAPI
15724 ZwSetInformationTransactionManager(
15725 IN HANDLE TmHandle,
15726 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15727 IN PVOID TransactionManagerInformation,
15728 IN ULONG TransactionManagerInformationLength);
15729
15730 NTSYSCALLAPI
15731 NTSTATUS
15732 NTAPI
15733 ZwEnumerateTransactionObject(
15734 IN HANDLE RootObjectHandle OPTIONAL,
15735 IN KTMOBJECT_TYPE QueryType,
15736 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15737 IN ULONG ObjectCursorLength,
15738 OUT PULONG ReturnLength);
15739
15740 NTSYSCALLAPI
15741 NTSTATUS
15742 NTAPI
15743 ZwCreateTransaction(
15744 OUT PHANDLE TransactionHandle,
15745 IN ACCESS_MASK DesiredAccess,
15746 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15747 IN LPGUID Uow OPTIONAL,
15748 IN HANDLE TmHandle OPTIONAL,
15749 IN ULONG CreateOptions OPTIONAL,
15750 IN ULONG IsolationLevel OPTIONAL,
15751 IN ULONG IsolationFlags OPTIONAL,
15752 IN PLARGE_INTEGER Timeout OPTIONAL,
15753 IN PUNICODE_STRING Description OPTIONAL);
15754
15755 NTSYSCALLAPI
15756 NTSTATUS
15757 NTAPI
15758 ZwOpenTransaction(
15759 OUT PHANDLE TransactionHandle,
15760 IN ACCESS_MASK DesiredAccess,
15761 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15762 IN LPGUID Uow,
15763 IN HANDLE TmHandle OPTIONAL);
15764
15765 NTSYSCALLAPI
15766 NTSTATUS
15767 NTAPI
15768 ZwQueryInformationTransaction(
15769 IN HANDLE TransactionHandle,
15770 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15771 OUT PVOID TransactionInformation,
15772 IN ULONG TransactionInformationLength,
15773 OUT PULONG ReturnLength OPTIONAL);
15774
15775 NTSYSCALLAPI
15776 NTSTATUS
15777 NTAPI
15778 ZwSetInformationTransaction(
15779 IN HANDLE TransactionHandle,
15780 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15781 IN PVOID TransactionInformation,
15782 IN ULONG TransactionInformationLength);
15783
15784 NTSYSCALLAPI
15785 NTSTATUS
15786 NTAPI
15787 ZwCommitTransaction(
15788 IN HANDLE TransactionHandle,
15789 IN BOOLEAN Wait);
15790
15791 NTSYSCALLAPI
15792 NTSTATUS
15793 NTAPI
15794 ZwRollbackTransaction(
15795 IN HANDLE TransactionHandle,
15796 IN BOOLEAN Wait);
15797
15798 NTSYSCALLAPI
15799 NTSTATUS
15800 NTAPI
15801 ZwCreateResourceManager(
15802 OUT PHANDLE ResourceManagerHandle,
15803 IN ACCESS_MASK DesiredAccess,
15804 IN HANDLE TmHandle,
15805 IN LPGUID ResourceManagerGuid OPTIONAL,
15806 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15807 IN ULONG CreateOptions OPTIONAL,
15808 IN PUNICODE_STRING Description OPTIONAL);
15809
15810 NTSYSCALLAPI
15811 NTSTATUS
15812 NTAPI
15813 ZwOpenResourceManager(
15814 OUT PHANDLE ResourceManagerHandle,
15815 IN ACCESS_MASK DesiredAccess,
15816 IN HANDLE TmHandle,
15817 IN LPGUID ResourceManagerGuid,
15818 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15819
15820 NTSYSCALLAPI
15821 NTSTATUS
15822 NTAPI
15823 ZwRecoverResourceManager(
15824 IN HANDLE ResourceManagerHandle);
15825
15826 NTSYSCALLAPI
15827 NTSTATUS
15828 NTAPI
15829 ZwGetNotificationResourceManager(
15830 IN HANDLE ResourceManagerHandle,
15831 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15832 IN ULONG NotificationLength,
15833 IN PLARGE_INTEGER Timeout,
15834 IN PULONG ReturnLength OPTIONAL,
15835 IN ULONG Asynchronous,
15836 IN ULONG_PTR AsynchronousContext OPTIONAL);
15837
15838 NTSYSCALLAPI
15839 NTSTATUS
15840 NTAPI
15841 ZwQueryInformationResourceManager(
15842 IN HANDLE ResourceManagerHandle,
15843 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15844 OUT PVOID ResourceManagerInformation,
15845 IN ULONG ResourceManagerInformationLength,
15846 IN PULONG ReturnLength OPTIONAL);
15847
15848 NTSYSCALLAPI
15849 NTSTATUS
15850 NTAPI
15851 ZwSetInformationResourceManager(
15852 IN HANDLE ResourceManagerHandle,
15853 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15854 IN PVOID ResourceManagerInformation,
15855 IN ULONG ResourceManagerInformationLength);
15856
15857 NTSYSCALLAPI
15858 NTSTATUS
15859 NTAPI
15860 ZwCreateEnlistment(
15861 OUT PHANDLE EnlistmentHandle,
15862 IN ACCESS_MASK DesiredAccess,
15863 IN HANDLE ResourceManagerHandle,
15864 IN HANDLE TransactionHandle,
15865 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15866 IN ULONG CreateOptions OPTIONAL,
15867 IN NOTIFICATION_MASK NotificationMask,
15868 IN PVOID EnlistmentKey OPTIONAL);
15869
15870 NTSYSCALLAPI
15871 NTSTATUS
15872 NTAPI
15873 ZwOpenEnlistment(
15874 OUT PHANDLE EnlistmentHandle,
15875 IN ACCESS_MASK DesiredAccess,
15876 IN HANDLE RmHandle,
15877 IN LPGUID EnlistmentGuid,
15878 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15879
15880 NTSYSCALLAPI
15881 NTSTATUS
15882 NTAPI
15883 ZwQueryInformationEnlistment(
15884 IN HANDLE EnlistmentHandle,
15885 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15886 OUT PVOID EnlistmentInformation,
15887 IN ULONG EnlistmentInformationLength,
15888 IN PULONG ReturnLength OPTIONAL);
15889
15890 NTSYSCALLAPI
15891 NTSTATUS
15892 NTAPI
15893 ZwSetInformationEnlistment(
15894 IN HANDLE EnlistmentHandle,
15895 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15896 IN PVOID EnlistmentInformation,
15897 IN ULONG EnlistmentInformationLength);
15898
15899 NTSYSCALLAPI
15900 NTSTATUS
15901 NTAPI
15902 ZwRecoverEnlistment(
15903 IN HANDLE EnlistmentHandle,
15904 IN PVOID EnlistmentKey OPTIONAL);
15905
15906 NTSYSCALLAPI
15907 NTSTATUS
15908 NTAPI
15909 ZwPrePrepareEnlistment(
15910 IN HANDLE EnlistmentHandle,
15911 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15912
15913 NTSYSCALLAPI
15914 NTSTATUS
15915 NTAPI
15916 ZwPrepareEnlistment(
15917 IN HANDLE EnlistmentHandle,
15918 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15919
15920 NTSYSCALLAPI
15921 NTSTATUS
15922 NTAPI
15923 ZwCommitEnlistment(
15924 IN HANDLE EnlistmentHandle,
15925 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15926
15927 NTSYSCALLAPI
15928 NTSTATUS
15929 NTAPI
15930 ZwRollbackEnlistment(
15931 IN HANDLE EnlistmentHandle,
15932 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15933
15934 NTSYSCALLAPI
15935 NTSTATUS
15936 NTAPI
15937 ZwPrePrepareComplete(
15938 IN HANDLE EnlistmentHandle,
15939 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15940
15941 NTSYSCALLAPI
15942 NTSTATUS
15943 NTAPI
15944 ZwPrepareComplete(
15945 IN HANDLE EnlistmentHandle,
15946 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15947
15948 NTSYSCALLAPI
15949 NTSTATUS
15950 NTAPI
15951 ZwCommitComplete(
15952 IN HANDLE EnlistmentHandle,
15953 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15954
15955 NTSYSCALLAPI
15956 NTSTATUS
15957 NTAPI
15958 ZwReadOnlyEnlistment(
15959 IN HANDLE EnlistmentHandle,
15960 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15961
15962 NTSYSCALLAPI
15963 NTSTATUS
15964 NTAPI
15965 ZwRollbackComplete(
15966 IN HANDLE EnlistmentHandle,
15967 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15968
15969 NTSYSCALLAPI
15970 NTSTATUS
15971 NTAPI
15972 ZwSinglePhaseReject(
15973 IN HANDLE EnlistmentHandle,
15974 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15975 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15976 #if (NTDDI_VERSION >= NTDDI_WIN7)
15977
15978 NTSYSAPI
15979 NTSTATUS
15980 NTAPI
15981 ZwOpenKeyEx(
15982 OUT PHANDLE KeyHandle,
15983 IN ACCESS_MASK DesiredAccess,
15984 IN POBJECT_ATTRIBUTES ObjectAttributes,
15985 IN ULONG OpenOptions);
15986
15987 NTSYSAPI
15988 NTSTATUS
15989 NTAPI
15990 ZwOpenKeyTransactedEx(
15991 OUT PHANDLE KeyHandle,
15992 IN ACCESS_MASK DesiredAccess,
15993 IN POBJECT_ATTRIBUTES ObjectAttributes,
15994 IN ULONG OpenOptions,
15995 IN HANDLE TransactionHandle);
15996
15997 NTSYSAPI
15998 NTSTATUS
15999 NTAPI
16000 ZwNotifyChangeMultipleKeys(
16001 IN HANDLE MasterKeyHandle,
16002 IN ULONG Count OPTIONAL,
16003 IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
16004 IN HANDLE Event OPTIONAL,
16005 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
16006 IN PVOID ApcContext OPTIONAL,
16007 OUT PIO_STATUS_BLOCK IoStatusBlock,
16008 IN ULONG CompletionFilter,
16009 IN BOOLEAN WatchTree,
16010 OUT PVOID Buffer OPTIONAL,
16011 IN ULONG BufferSize,
16012 IN BOOLEAN Asynchronous);
16013
16014 NTSYSAPI
16015 NTSTATUS
16016 NTAPI
16017 ZwQueryMultipleValueKey(
16018 IN HANDLE KeyHandle,
16019 IN OUT PKEY_VALUE_ENTRY ValueEntries,
16020 IN ULONG EntryCount,
16021 OUT PVOID ValueBuffer,
16022 IN OUT PULONG BufferLength,
16023 OUT PULONG RequiredBufferLength OPTIONAL);
16024
16025 NTSYSAPI
16026 NTSTATUS
16027 NTAPI
16028 ZwRenameKey(
16029 IN HANDLE KeyHandle,
16030 IN PUNICODE_STRING NewName);
16031
16032 NTSYSAPI
16033 NTSTATUS
16034 NTAPI
16035 ZwSetInformationKey(
16036 IN HANDLE KeyHandle,
16037 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
16038 IN PVOID KeySetInformation,
16039 IN ULONG KeySetInformationLength);
16040
16041 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
16042
16043
16044 #ifdef __cplusplus
16045 }
16046 #endif
16047
16048 #endif /* !_WDMDDK_ */