[NTOSKRNL]
[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_)
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
10619 /* PVOID MmGetSystemAddressForMdl(
10620 * IN PMDL Mdl);
10621 */
10622 #define MmGetSystemAddressForMdl(Mdl) \
10623 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
10624 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10625 ((Mdl)->MappedSystemVa) : \
10626 (MmMapLockedPages((Mdl), KernelMode)))
10627
10628 /* PVOID
10629 * MmGetSystemAddressForMdlSafe(
10630 * IN PMDL Mdl,
10631 * IN MM_PAGE_PRIORITY Priority)
10632 */
10633 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
10634 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
10635 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10636 (_Mdl)->MappedSystemVa : \
10637 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
10638 KernelMode, MmCached, NULL, FALSE, (_Priority)))
10639
10640 /*
10641 * VOID
10642 * MmInitializeMdl(
10643 * IN PMDL MemoryDescriptorList,
10644 * IN PVOID BaseVa,
10645 * IN SIZE_T Length)
10646 */
10647 #define MmInitializeMdl(_MemoryDescriptorList, \
10648 _BaseVa, \
10649 _Length) \
10650 { \
10651 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
10652 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
10653 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
10654 (_MemoryDescriptorList)->MdlFlags = 0; \
10655 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
10656 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
10657 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
10658 }
10659
10660 /*
10661 * VOID
10662 * MmPrepareMdlForReuse(
10663 * IN PMDL Mdl)
10664 */
10665 #define MmPrepareMdlForReuse(_Mdl) \
10666 { \
10667 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
10668 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
10669 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
10670 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
10671 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
10672 } \
10673 }
10674
10675 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10676 NTKERNELAPI
10677 PVOID
10678 NTAPI
10679 MmAllocateContiguousMemory(
10680 IN SIZE_T NumberOfBytes,
10681 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
10682
10683 NTKERNELAPI
10684 PVOID
10685 NTAPI
10686 MmAllocateContiguousMemorySpecifyCache(
10687 IN SIZE_T NumberOfBytes,
10688 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10689 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10690 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10691 IN MEMORY_CACHING_TYPE CacheType);
10692
10693 NTKERNELAPI
10694 PMDL
10695 NTAPI
10696 MmAllocatePagesForMdl(
10697 IN PHYSICAL_ADDRESS LowAddress,
10698 IN PHYSICAL_ADDRESS HighAddress,
10699 IN PHYSICAL_ADDRESS SkipBytes,
10700 IN SIZE_T TotalBytes);
10701
10702 NTKERNELAPI
10703 VOID
10704 NTAPI
10705 MmBuildMdlForNonPagedPool(
10706 IN OUT PMDLX MemoryDescriptorList);
10707
10708 //DECLSPEC_DEPRECATED_DDK
10709 NTKERNELAPI
10710 PMDL
10711 NTAPI
10712 MmCreateMdl(
10713 IN PMDL MemoryDescriptorList OPTIONAL,
10714 IN PVOID Base,
10715 IN SIZE_T Length);
10716
10717 NTKERNELAPI
10718 VOID
10719 NTAPI
10720 MmFreeContiguousMemory(
10721 IN PVOID BaseAddress);
10722
10723 NTKERNELAPI
10724 VOID
10725 NTAPI
10726 MmFreeContiguousMemorySpecifyCache(
10727 IN PVOID BaseAddress,
10728 IN SIZE_T NumberOfBytes,
10729 IN MEMORY_CACHING_TYPE CacheType);
10730
10731 NTKERNELAPI
10732 VOID
10733 NTAPI
10734 MmFreePagesFromMdl(
10735 IN PMDLX MemoryDescriptorList);
10736
10737 NTKERNELAPI
10738 PVOID
10739 NTAPI
10740 MmGetSystemRoutineAddress(
10741 IN PUNICODE_STRING SystemRoutineName);
10742
10743 NTKERNELAPI
10744 LOGICAL
10745 NTAPI
10746 MmIsDriverVerifying(
10747 IN struct _DRIVER_OBJECT *DriverObject);
10748
10749 NTKERNELAPI
10750 PVOID
10751 NTAPI
10752 MmLockPagableDataSection(
10753 IN PVOID AddressWithinSection);
10754
10755 NTKERNELAPI
10756 PVOID
10757 NTAPI
10758 MmMapIoSpace(
10759 IN PHYSICAL_ADDRESS PhysicalAddress,
10760 IN SIZE_T NumberOfBytes,
10761 IN MEMORY_CACHING_TYPE CacheEnable);
10762
10763 NTKERNELAPI
10764 PVOID
10765 NTAPI
10766 MmMapLockedPages(
10767 IN PMDL MemoryDescriptorList,
10768 IN KPROCESSOR_MODE AccessMode);
10769
10770 NTKERNELAPI
10771 PVOID
10772 NTAPI
10773 MmMapLockedPagesSpecifyCache(
10774 IN PMDLX MemoryDescriptorList,
10775 IN KPROCESSOR_MODE AccessMode,
10776 IN MEMORY_CACHING_TYPE CacheType,
10777 IN PVOID BaseAddress OPTIONAL,
10778 IN ULONG BugCheckOnFailure,
10779 IN MM_PAGE_PRIORITY Priority);
10780
10781 NTKERNELAPI
10782 PVOID
10783 NTAPI
10784 MmPageEntireDriver(
10785 IN PVOID AddressWithinSection);
10786
10787 NTKERNELAPI
10788 VOID
10789 NTAPI
10790 MmProbeAndLockPages(
10791 IN OUT PMDL MemoryDescriptorList,
10792 IN KPROCESSOR_MODE AccessMode,
10793 IN LOCK_OPERATION Operation);
10794
10795 NTKERNELAPI
10796 MM_SYSTEMSIZE
10797 NTAPI
10798 MmQuerySystemSize(VOID);
10799
10800 NTKERNELAPI
10801 VOID
10802 NTAPI
10803 MmResetDriverPaging(
10804 IN PVOID AddressWithinSection);
10805
10806 NTKERNELAPI
10807 SIZE_T
10808 NTAPI
10809 MmSizeOfMdl(
10810 IN PVOID Base,
10811 IN SIZE_T Length);
10812
10813 NTKERNELAPI
10814 VOID
10815 NTAPI
10816 MmUnlockPagableImageSection(
10817 IN PVOID ImageSectionHandle);
10818
10819 NTKERNELAPI
10820 VOID
10821 NTAPI
10822 MmUnlockPages(
10823 IN OUT PMDL MemoryDescriptorList);
10824
10825 NTKERNELAPI
10826 VOID
10827 NTAPI
10828 MmUnmapIoSpace(
10829 IN PVOID BaseAddress,
10830 IN SIZE_T NumberOfBytes);
10831
10832 NTKERNELAPI
10833 VOID
10834 NTAPI
10835 MmProbeAndLockProcessPages(
10836 IN OUT PMDL MemoryDescriptorList,
10837 IN PEPROCESS Process,
10838 IN KPROCESSOR_MODE AccessMode,
10839 IN LOCK_OPERATION Operation);
10840
10841 NTKERNELAPI
10842 VOID
10843 NTAPI
10844 MmUnmapLockedPages(
10845 IN PVOID BaseAddress,
10846 IN PMDL MemoryDescriptorList);
10847
10848 NTKERNELAPI
10849 PVOID
10850 NTAPI
10851 MmAllocateContiguousMemorySpecifyCacheNode(
10852 IN SIZE_T NumberOfBytes,
10853 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10854 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10855 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10856 IN MEMORY_CACHING_TYPE CacheType,
10857 IN NODE_REQUIREMENT PreferredNode);
10858
10859 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10860
10861 #if (NTDDI_VERSION >= NTDDI_WINXP)
10862
10863 NTKERNELAPI
10864 NTSTATUS
10865 NTAPI
10866 MmAdvanceMdl(
10867 IN OUT PMDL Mdl,
10868 IN ULONG NumberOfBytes);
10869
10870 NTKERNELAPI
10871 PVOID
10872 NTAPI
10873 MmAllocateMappingAddress(
10874 IN SIZE_T NumberOfBytes,
10875 IN ULONG PoolTag);
10876
10877 NTKERNELAPI
10878 VOID
10879 NTAPI
10880 MmFreeMappingAddress(
10881 IN PVOID BaseAddress,
10882 IN ULONG PoolTag);
10883
10884 NTKERNELAPI
10885 NTSTATUS
10886 NTAPI
10887 MmIsVerifierEnabled(
10888 OUT PULONG VerifierFlags);
10889
10890 NTKERNELAPI
10891 PVOID
10892 NTAPI
10893 MmMapLockedPagesWithReservedMapping(
10894 IN PVOID MappingAddress,
10895 IN ULONG PoolTag,
10896 IN PMDL MemoryDescriptorList,
10897 IN MEMORY_CACHING_TYPE CacheType);
10898
10899 NTKERNELAPI
10900 NTSTATUS
10901 NTAPI
10902 MmProtectMdlSystemAddress(
10903 IN PMDL MemoryDescriptorList,
10904 IN ULONG NewProtect);
10905
10906 NTKERNELAPI
10907 VOID
10908 NTAPI
10909 MmUnmapReservedMapping(
10910 IN PVOID BaseAddress,
10911 IN ULONG PoolTag,
10912 IN PMDL MemoryDescriptorList);
10913
10914 NTKERNELAPI
10915 NTSTATUS
10916 NTAPI
10917 MmAddVerifierThunks(
10918 IN PVOID ThunkBuffer,
10919 IN ULONG ThunkBufferSize);
10920
10921 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10922 #if (NTDDI_VERSION >= NTDDI_WS03)
10923 NTKERNELAPI
10924 LOGICAL
10925 NTAPI
10926 MmIsIoSpaceActive(
10927 IN PHYSICAL_ADDRESS StartAddress,
10928 IN SIZE_T NumberOfBytes);
10929
10930 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10931 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10932 NTKERNELAPI
10933 PMDL
10934 NTAPI
10935 MmAllocatePagesForMdlEx(
10936 IN PHYSICAL_ADDRESS LowAddress,
10937 IN PHYSICAL_ADDRESS HighAddress,
10938 IN PHYSICAL_ADDRESS SkipBytes,
10939 IN SIZE_T TotalBytes,
10940 IN MEMORY_CACHING_TYPE CacheType,
10941 IN ULONG Flags);
10942 #endif
10943
10944 #if (NTDDI_VERSION >= NTDDI_VISTA)
10945 NTKERNELAPI
10946 LOGICAL
10947 NTAPI
10948 MmIsDriverVerifyingByAddress(
10949 IN PVOID AddressWithinSection);
10950 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10951
10952 /******************************************************************************
10953 * Security Manager Functions *
10954 ******************************************************************************/
10955
10956 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10957 NTKERNELAPI
10958 BOOLEAN
10959 NTAPI
10960 SeAccessCheck(
10961 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10962 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
10963 IN BOOLEAN SubjectContextLocked,
10964 IN ACCESS_MASK DesiredAccess,
10965 IN ACCESS_MASK PreviouslyGrantedAccess,
10966 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
10967 IN PGENERIC_MAPPING GenericMapping,
10968 IN KPROCESSOR_MODE AccessMode,
10969 OUT PACCESS_MASK GrantedAccess,
10970 OUT PNTSTATUS AccessStatus);
10971
10972 NTKERNELAPI
10973 NTSTATUS
10974 NTAPI
10975 SeAssignSecurity(
10976 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10977 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10978 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10979 IN BOOLEAN IsDirectoryObject,
10980 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10981 IN PGENERIC_MAPPING GenericMapping,
10982 IN POOL_TYPE PoolType);
10983
10984 NTKERNELAPI
10985 NTSTATUS
10986 NTAPI
10987 SeAssignSecurityEx(
10988 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10989 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10990 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10991 IN GUID *ObjectType OPTIONAL,
10992 IN BOOLEAN IsDirectoryObject,
10993 IN ULONG AutoInheritFlags,
10994 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10995 IN PGENERIC_MAPPING GenericMapping,
10996 IN POOL_TYPE PoolType);
10997
10998 NTKERNELAPI
10999 NTSTATUS
11000 NTAPI
11001 SeDeassignSecurity(
11002 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
11003
11004 NTKERNELAPI
11005 BOOLEAN
11006 NTAPI
11007 SeValidSecurityDescriptor(
11008 IN ULONG Length,
11009 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11010
11011 NTKERNELAPI
11012 ULONG
11013 NTAPI
11014 SeObjectCreateSaclAccessBits(
11015 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11016
11017 NTKERNELAPI
11018 VOID
11019 NTAPI
11020 SeReleaseSubjectContext(
11021 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11022
11023 NTKERNELAPI
11024 VOID
11025 NTAPI
11026 SeUnlockSubjectContext(
11027 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11028
11029 NTKERNELAPI
11030 VOID
11031 NTAPI
11032 SeCaptureSubjectContext(
11033 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11034
11035 NTKERNELAPI
11036 VOID
11037 NTAPI
11038 SeLockSubjectContext(
11039 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11040
11041
11042 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11043
11044 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11045
11046 NTSTATUS
11047 NTAPI
11048 SeSetAuditParameter(
11049 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
11050 IN SE_ADT_PARAMETER_TYPE Type,
11051 IN ULONG Index,
11052 IN PVOID Data);
11053
11054 NTSTATUS
11055 NTAPI
11056 SeReportSecurityEvent(
11057 IN ULONG Flags,
11058 IN PUNICODE_STRING SourceName,
11059 IN PSID UserSid OPTIONAL,
11060 IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
11061
11062 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11063
11064 #if (NTDDI_VERSION >= NTDDI_VISTA)
11065 NTKERNELAPI
11066 ULONG
11067 NTAPI
11068 SeComputeAutoInheritByObjectType(
11069 IN PVOID ObjectType,
11070 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
11071 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
11072
11073 #ifdef SE_NTFS_WORLD_CACHE
11074 VOID
11075 NTAPI
11076 SeGetWorldRights(
11077 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
11078 IN PGENERIC_MAPPING GenericMapping,
11079 OUT PACCESS_MASK GrantedAccess);
11080 #endif /* SE_NTFS_WORLD_CACHE */
11081 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11082 /******************************************************************************
11083 * Configuration Manager Functions *
11084 ******************************************************************************/
11085
11086 #if (NTDDI_VERSION >= NTDDI_WINXP)
11087 NTKERNELAPI
11088 NTSTATUS
11089 NTAPI
11090 CmRegisterCallback(
11091 IN PEX_CALLBACK_FUNCTION Function,
11092 IN PVOID Context OPTIONAL,
11093 OUT PLARGE_INTEGER Cookie);
11094
11095 NTKERNELAPI
11096 NTSTATUS
11097 NTAPI
11098 CmUnRegisterCallback(
11099 IN LARGE_INTEGER Cookie);
11100 #endif
11101
11102 #if (NTDDI_VERSION >= NTDDI_VISTA)
11103
11104 NTKERNELAPI
11105 NTSTATUS
11106 NTAPI
11107 CmRegisterCallbackEx(
11108 PEX_CALLBACK_FUNCTION Function,
11109 PCUNICODE_STRING Altitude,
11110 PVOID Driver,
11111 PVOID Context,
11112 PLARGE_INTEGER Cookie,
11113 PVOID Reserved);
11114
11115 NTKERNELAPI
11116 VOID
11117 NTAPI
11118 CmGetCallbackVersion(
11119 OUT PULONG Major OPTIONAL,
11120 OUT PULONG Minor OPTIONAL);
11121
11122 NTKERNELAPI
11123 NTSTATUS
11124 NTAPI
11125 CmSetCallbackObjectContext(
11126 IN OUT PVOID Object,
11127 IN PLARGE_INTEGER Cookie,
11128 IN PVOID NewContext,
11129 OUT PVOID *OldContext OPTIONAL);
11130
11131 NTKERNELAPI
11132 NTSTATUS
11133 NTAPI
11134 CmCallbackGetKeyObjectID(
11135 IN PLARGE_INTEGER Cookie,
11136 IN PVOID Object,
11137 OUT PULONG_PTR ObjectID OPTIONAL,
11138 OUT PCUNICODE_STRING *ObjectName OPTIONAL);
11139
11140 NTKERNELAPI
11141 PVOID
11142 NTAPI
11143 CmGetBoundTransaction(
11144 IN PLARGE_INTEGER Cookie,
11145 IN PVOID Object);
11146
11147 #endif // NTDDI_VERSION >= NTDDI_VISTA
11148
11149
11150 /******************************************************************************
11151 * I/O Manager Functions *
11152 ******************************************************************************/
11153
11154 /*
11155 * NTSTATUS
11156 * IoAcquireRemoveLock(
11157 * IN PIO_REMOVE_LOCK RemoveLock,
11158 * IN OPTIONAL PVOID Tag)
11159 */
11160 #if DBG
11161 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11162 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11163 #else
11164 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11165 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
11166 #endif
11167
11168 /*
11169 * VOID
11170 * IoAdjustPagingPathCount(
11171 * IN PLONG Count,
11172 * IN BOOLEAN Increment)
11173 */
11174 #define IoAdjustPagingPathCount(_Count, \
11175 _Increment) \
11176 { \
11177 if (_Increment) \
11178 { \
11179 InterlockedIncrement(_Count); \
11180 } \
11181 else \
11182 { \
11183 InterlockedDecrement(_Count); \
11184 } \
11185 }
11186
11187 #if !defined(_M_AMD64)
11188 NTHALAPI
11189 VOID
11190 NTAPI
11191 READ_PORT_BUFFER_UCHAR(
11192 IN PUCHAR Port,
11193 IN PUCHAR Buffer,
11194 IN ULONG Count);
11195
11196 NTHALAPI
11197 VOID
11198 NTAPI
11199 READ_PORT_BUFFER_ULONG(
11200 IN PULONG Port,
11201 IN PULONG Buffer,
11202 IN ULONG Count);
11203
11204 NTHALAPI
11205 VOID
11206 NTAPI
11207 READ_PORT_BUFFER_USHORT(
11208 IN PUSHORT Port,
11209 IN PUSHORT Buffer,
11210 IN ULONG Count);
11211
11212 NTHALAPI
11213 UCHAR
11214 NTAPI
11215 READ_PORT_UCHAR(
11216 IN PUCHAR Port);
11217
11218 NTHALAPI
11219 ULONG
11220 NTAPI
11221 READ_PORT_ULONG(
11222 IN PULONG Port);
11223
11224 NTHALAPI
11225 USHORT
11226 NTAPI
11227 READ_PORT_USHORT(
11228 IN PUSHORT Port);
11229
11230 NTKERNELAPI
11231 VOID
11232 NTAPI
11233 READ_REGISTER_BUFFER_UCHAR(
11234 IN PUCHAR Register,
11235 IN PUCHAR Buffer,
11236 IN ULONG Count);
11237
11238 NTKERNELAPI
11239 VOID
11240 NTAPI
11241 READ_REGISTER_BUFFER_ULONG(
11242 IN PULONG Register,
11243 IN PULONG Buffer,
11244 IN ULONG Count);
11245
11246 NTKERNELAPI
11247 VOID
11248 NTAPI
11249 READ_REGISTER_BUFFER_USHORT(
11250 IN PUSHORT Register,
11251 IN PUSHORT Buffer,
11252 IN ULONG Count);
11253
11254 NTKERNELAPI
11255 UCHAR
11256 NTAPI
11257 READ_REGISTER_UCHAR(
11258 IN PUCHAR Register);
11259
11260 NTKERNELAPI
11261 ULONG
11262 NTAPI
11263 READ_REGISTER_ULONG(
11264 IN PULONG Register);
11265
11266 NTKERNELAPI
11267 USHORT
11268 NTAPI
11269 READ_REGISTER_USHORT(
11270 IN PUSHORT Register);
11271
11272 NTHALAPI
11273 VOID
11274 NTAPI
11275 WRITE_PORT_BUFFER_UCHAR(
11276 IN PUCHAR Port,
11277 IN PUCHAR Buffer,
11278 IN ULONG Count);
11279
11280 NTHALAPI
11281 VOID
11282 NTAPI
11283 WRITE_PORT_BUFFER_ULONG(
11284 IN PULONG Port,
11285 IN PULONG Buffer,
11286 IN ULONG Count);
11287
11288 NTHALAPI
11289 VOID
11290 NTAPI
11291 WRITE_PORT_BUFFER_USHORT(
11292 IN PUSHORT Port,
11293 IN PUSHORT Buffer,
11294 IN ULONG Count);
11295
11296 NTHALAPI
11297 VOID
11298 NTAPI
11299 WRITE_PORT_UCHAR(
11300 IN PUCHAR Port,
11301 IN UCHAR Value);
11302
11303 NTHALAPI
11304 VOID
11305 NTAPI
11306 WRITE_PORT_ULONG(
11307 IN PULONG Port,
11308 IN ULONG Value);
11309
11310 NTHALAPI
11311 VOID
11312 NTAPI
11313 WRITE_PORT_USHORT(
11314 IN PUSHORT Port,
11315 IN USHORT Value);
11316
11317 NTKERNELAPI
11318 VOID
11319 NTAPI
11320 WRITE_REGISTER_BUFFER_UCHAR(
11321 IN PUCHAR Register,
11322 IN PUCHAR Buffer,
11323 IN ULONG Count);
11324
11325 NTKERNELAPI
11326 VOID
11327 NTAPI
11328 WRITE_REGISTER_BUFFER_ULONG(
11329 IN PULONG Register,
11330 IN PULONG Buffer,
11331 IN ULONG Count);
11332
11333 NTKERNELAPI
11334 VOID
11335 NTAPI
11336 WRITE_REGISTER_BUFFER_USHORT(
11337 IN PUSHORT Register,
11338 IN PUSHORT Buffer,
11339 IN ULONG Count);
11340
11341 NTKERNELAPI
11342 VOID
11343 NTAPI
11344 WRITE_REGISTER_UCHAR(
11345 IN PUCHAR Register,
11346 IN UCHAR Value);
11347
11348 NTKERNELAPI
11349 VOID
11350 NTAPI
11351 WRITE_REGISTER_ULONG(
11352 IN PULONG Register,
11353 IN ULONG Value);
11354
11355 NTKERNELAPI
11356 VOID
11357 NTAPI
11358 WRITE_REGISTER_USHORT(
11359 IN PUSHORT Register,
11360 IN USHORT Value);
11361
11362 #else
11363
11364 FORCEINLINE
11365 VOID
11366 READ_PORT_BUFFER_UCHAR(
11367 IN PUCHAR Port,
11368 IN PUCHAR Buffer,
11369 IN ULONG Count)
11370 {
11371 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11372 }
11373
11374 FORCEINLINE
11375 VOID
11376 READ_PORT_BUFFER_ULONG(
11377 IN PULONG Port,
11378 IN PULONG Buffer,
11379 IN ULONG Count)
11380 {
11381 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11382 }
11383
11384 FORCEINLINE
11385 VOID
11386 READ_PORT_BUFFER_USHORT(
11387 IN PUSHORT Port,
11388 IN PUSHORT Buffer,
11389 IN ULONG Count)
11390 {
11391 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11392 }
11393
11394 FORCEINLINE
11395 UCHAR
11396 READ_PORT_UCHAR(
11397 IN PUCHAR Port)
11398 {
11399 return __inbyte((USHORT)(ULONG_PTR)Port);
11400 }
11401
11402 FORCEINLINE
11403 ULONG
11404 READ_PORT_ULONG(
11405 IN PULONG Port)
11406 {
11407 return __indword((USHORT)(ULONG_PTR)Port);
11408 }
11409
11410 FORCEINLINE
11411 USHORT
11412 READ_PORT_USHORT(
11413 IN PUSHORT Port)
11414 {
11415 return __inword((USHORT)(ULONG_PTR)Port);
11416 }
11417
11418 FORCEINLINE
11419 VOID
11420 READ_REGISTER_BUFFER_UCHAR(
11421 IN PUCHAR Register,
11422 IN PUCHAR Buffer,
11423 IN ULONG Count)
11424 {
11425 __movsb(Register, Buffer, Count);
11426 }
11427
11428 FORCEINLINE
11429 VOID
11430 READ_REGISTER_BUFFER_ULONG(
11431 IN PULONG Register,
11432 IN PULONG Buffer,
11433 IN ULONG Count)
11434 {
11435 __movsd(Register, Buffer, Count);
11436 }
11437
11438 FORCEINLINE
11439 VOID
11440 READ_REGISTER_BUFFER_USHORT(
11441 IN PUSHORT Register,
11442 IN PUSHORT Buffer,
11443 IN ULONG Count)
11444 {
11445 __movsw(Register, Buffer, Count);
11446 }
11447
11448 FORCEINLINE
11449 UCHAR
11450 READ_REGISTER_UCHAR(
11451 IN volatile UCHAR *Register)
11452 {
11453 return *Register;
11454 }
11455
11456 FORCEINLINE
11457 ULONG
11458 READ_REGISTER_ULONG(
11459 IN volatile ULONG *Register)
11460 {
11461 return *Register;
11462 }
11463
11464 FORCEINLINE
11465 USHORT
11466 READ_REGISTER_USHORT(
11467 IN volatile USHORT *Register)
11468 {
11469 return *Register;
11470 }
11471
11472 FORCEINLINE
11473 VOID
11474 WRITE_PORT_BUFFER_UCHAR(
11475 IN PUCHAR Port,
11476 IN PUCHAR Buffer,
11477 IN ULONG Count)
11478 {
11479 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11480 }
11481
11482 FORCEINLINE
11483 VOID
11484 WRITE_PORT_BUFFER_ULONG(
11485 IN PULONG Port,
11486 IN PULONG Buffer,
11487 IN ULONG Count)
11488 {
11489 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11490 }
11491
11492 FORCEINLINE
11493 VOID
11494 WRITE_PORT_BUFFER_USHORT(
11495 IN PUSHORT Port,
11496 IN PUSHORT Buffer,
11497 IN ULONG Count)
11498 {
11499 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11500 }
11501
11502 FORCEINLINE
11503 VOID
11504 WRITE_PORT_UCHAR(
11505 IN PUCHAR Port,
11506 IN UCHAR Value)
11507 {
11508 __outbyte((USHORT)(ULONG_PTR)Port, Value);
11509 }
11510
11511 FORCEINLINE
11512 VOID
11513 WRITE_PORT_ULONG(
11514 IN PULONG Port,
11515 IN ULONG Value)
11516 {
11517 __outdword((USHORT)(ULONG_PTR)Port, Value);
11518 }
11519
11520 FORCEINLINE
11521 VOID
11522 WRITE_PORT_USHORT(
11523 IN PUSHORT Port,
11524 IN USHORT Value)
11525 {
11526 __outword((USHORT)(ULONG_PTR)Port, Value);
11527 }
11528
11529 FORCEINLINE
11530 VOID
11531 WRITE_REGISTER_BUFFER_UCHAR(
11532 IN PUCHAR Register,
11533 IN PUCHAR Buffer,
11534 IN ULONG Count)
11535 {
11536 LONG Synch;
11537 __movsb(Register, Buffer, Count);
11538 InterlockedOr(&Synch, 1);
11539 }
11540
11541 FORCEINLINE
11542 VOID
11543 WRITE_REGISTER_BUFFER_ULONG(
11544 IN PULONG Register,
11545 IN PULONG Buffer,
11546 IN ULONG Count)
11547 {
11548 LONG Synch;
11549 __movsd(Register, Buffer, Count);
11550 InterlockedOr(&Synch, 1);
11551 }
11552
11553 FORCEINLINE
11554 VOID
11555 WRITE_REGISTER_BUFFER_USHORT(
11556 IN PUSHORT Register,
11557 IN PUSHORT Buffer,
11558 IN ULONG Count)
11559 {
11560 LONG Synch;
11561 __movsw(Register, Buffer, Count);
11562 InterlockedOr(&Synch, 1);
11563 }
11564
11565 FORCEINLINE
11566 VOID
11567 WRITE_REGISTER_UCHAR(
11568 IN volatile UCHAR *Register,
11569 IN UCHAR Value)
11570 {
11571 LONG Synch;
11572 *Register = Value;
11573 InterlockedOr(&Synch, 1);
11574 }
11575
11576 FORCEINLINE
11577 VOID
11578 WRITE_REGISTER_ULONG(
11579 IN volatile ULONG *Register,
11580 IN ULONG Value)
11581 {
11582 LONG Synch;
11583 *Register = Value;
11584 InterlockedOr(&Synch, 1);
11585 }
11586
11587 FORCEINLINE
11588 VOID
11589 WRITE_REGISTER_USHORT(
11590 IN volatile USHORT *Register,
11591 IN USHORT Value)
11592 {
11593 LONG Sync;
11594 *Register = Value;
11595 InterlockedOr(&Sync, 1);
11596 }
11597 #endif
11598
11599 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
11600 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11601
11602 #define DMA_MACROS_DEFINED
11603
11604 FORCEINLINE
11605 NTSTATUS
11606 IoAllocateAdapterChannel(
11607 IN PDMA_ADAPTER DmaAdapter,
11608 IN PDEVICE_OBJECT DeviceObject,
11609 IN ULONG NumberOfMapRegisters,
11610 IN PDRIVER_CONTROL ExecutionRoutine,
11611 IN PVOID Context)
11612 {
11613 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
11614 AllocateAdapterChannel =
11615 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
11616 ASSERT(AllocateAdapterChannel);
11617 return AllocateAdapterChannel(DmaAdapter,
11618 DeviceObject,
11619 NumberOfMapRegisters,
11620 ExecutionRoutine,
11621 Context );
11622 }
11623
11624 FORCEINLINE
11625 BOOLEAN
11626 NTAPI
11627 IoFlushAdapterBuffers(
11628 IN PDMA_ADAPTER DmaAdapter,
11629 IN PMDL Mdl,
11630 IN PVOID MapRegisterBase,
11631 IN PVOID CurrentVa,
11632 IN ULONG Length,
11633 IN BOOLEAN WriteToDevice)
11634 {
11635 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
11636 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
11637 ASSERT(FlushAdapterBuffers);
11638 return FlushAdapterBuffers(DmaAdapter,
11639 Mdl,
11640 MapRegisterBase,
11641 CurrentVa,
11642 Length,
11643 WriteToDevice);
11644 }
11645
11646 FORCEINLINE
11647 VOID
11648 NTAPI
11649 IoFreeAdapterChannel(
11650 IN PDMA_ADAPTER DmaAdapter)
11651 {
11652 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
11653 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
11654 ASSERT(FreeAdapterChannel);
11655 FreeAdapterChannel(DmaAdapter);
11656 }
11657
11658 FORCEINLINE
11659 VOID
11660 NTAPI
11661 IoFreeMapRegisters(
11662 IN PDMA_ADAPTER DmaAdapter,
11663 IN PVOID MapRegisterBase,
11664 IN ULONG NumberOfMapRegisters)
11665 {
11666 PFREE_MAP_REGISTERS FreeMapRegisters;
11667 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
11668 ASSERT(FreeMapRegisters);
11669 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
11670 }
11671
11672 FORCEINLINE
11673 PHYSICAL_ADDRESS
11674 NTAPI
11675 IoMapTransfer(
11676 IN PDMA_ADAPTER DmaAdapter,
11677 IN PMDL Mdl,
11678 IN PVOID MapRegisterBase,
11679 IN PVOID CurrentVa,
11680 IN OUT PULONG Length,
11681 IN BOOLEAN WriteToDevice)
11682 {
11683 PMAP_TRANSFER MapTransfer;
11684
11685 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
11686 ASSERT(MapTransfer);
11687 return MapTransfer(DmaAdapter,
11688 Mdl,
11689 MapRegisterBase,
11690 CurrentVa,
11691 Length,
11692 WriteToDevice);
11693 }
11694 #endif
11695
11696 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11697
11698 NTKERNELAPI
11699 VOID
11700 NTAPI
11701 IoAcquireCancelSpinLock(
11702 OUT PKIRQL Irql);
11703
11704 NTKERNELAPI
11705 NTSTATUS
11706 NTAPI
11707 IoAcquireRemoveLockEx(
11708 IN PIO_REMOVE_LOCK RemoveLock,
11709 IN PVOID Tag OPTIONAL,
11710 IN PCSTR File,
11711 IN ULONG Line,
11712 IN ULONG RemlockSize);
11713 NTKERNELAPI
11714 NTSTATUS
11715 NTAPI
11716 IoAllocateDriverObjectExtension(
11717 IN PDRIVER_OBJECT DriverObject,
11718 IN PVOID ClientIdentificationAddress,
11719 IN ULONG DriverObjectExtensionSize,
11720 OUT PVOID *DriverObjectExtension);
11721
11722 NTKERNELAPI
11723 PVOID
11724 NTAPI
11725 IoAllocateErrorLogEntry(
11726 IN PVOID IoObject,
11727 IN UCHAR EntrySize);
11728
11729 NTKERNELAPI
11730 PIRP
11731 NTAPI
11732 IoAllocateIrp(
11733 IN CCHAR StackSize,
11734 IN BOOLEAN ChargeQuota);
11735
11736 NTKERNELAPI
11737 PMDL
11738 NTAPI
11739 IoAllocateMdl(
11740 IN PVOID VirtualAddress OPTIONAL,
11741 IN ULONG Length,
11742 IN BOOLEAN SecondaryBuffer,
11743 IN BOOLEAN ChargeQuota,
11744 IN OUT PIRP Irp OPTIONAL);
11745
11746 NTKERNELAPI
11747 PIO_WORKITEM
11748 NTAPI
11749 IoAllocateWorkItem(
11750 IN PDEVICE_OBJECT DeviceObject);
11751
11752 NTKERNELAPI
11753 NTSTATUS
11754 NTAPI
11755 IoAttachDevice(
11756 IN PDEVICE_OBJECT SourceDevice,
11757 IN PUNICODE_STRING TargetDevice,
11758 OUT PDEVICE_OBJECT *AttachedDevice);
11759
11760 NTKERNELAPI
11761 PDEVICE_OBJECT
11762 NTAPI
11763 IoAttachDeviceToDeviceStack(
11764 IN PDEVICE_OBJECT SourceDevice,
11765 IN PDEVICE_OBJECT TargetDevice);
11766
11767 NTKERNELAPI
11768 PIRP
11769 NTAPI
11770 IoBuildAsynchronousFsdRequest(
11771 IN ULONG MajorFunction,
11772 IN PDEVICE_OBJECT DeviceObject,
11773 IN OUT PVOID Buffer OPTIONAL,
11774 IN ULONG Length OPTIONAL,
11775 IN PLARGE_INTEGER StartingOffset OPTIONAL,
11776 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
11777
11778 NTKERNELAPI
11779 PIRP
11780 NTAPI
11781 IoBuildDeviceIoControlRequest(
11782 IN ULONG IoControlCode,
11783 IN PDEVICE_OBJECT DeviceObject,
11784 IN PVOID InputBuffer OPTIONAL,
11785 IN ULONG InputBufferLength,
11786 OUT PVOID OutputBuffer OPTIONAL,
11787 IN ULONG OutputBufferLength,
11788 IN BOOLEAN InternalDeviceIoControl,
11789 IN PKEVENT Event,
11790 OUT PIO_STATUS_BLOCK IoStatusBlock);
11791
11792 NTKERNELAPI
11793 VOID
11794 NTAPI
11795 IoBuildPartialMdl(
11796 IN PMDL SourceMdl,
11797 IN OUT PMDL TargetMdl,
11798 IN PVOID VirtualAddress,
11799 IN ULONG Length);
11800
11801 NTKERNELAPI
11802 PIRP
11803 NTAPI
11804 IoBuildSynchronousFsdRequest(
11805 IN ULONG MajorFunction,
11806 IN PDEVICE_OBJECT DeviceObject,
11807 IN OUT PVOID Buffer OPTIONAL,
11808 IN ULONG Length OPTIONAL,
11809 IN PLARGE_INTEGER StartingOffset OPTIONAL,
11810 IN PKEVENT Event,
11811 OUT PIO_STATUS_BLOCK IoStatusBlock);
11812
11813 NTKERNELAPI
11814 NTSTATUS
11815 FASTCALL
11816 IofCallDriver(
11817 IN PDEVICE_OBJECT DeviceObject,
11818 IN OUT PIRP Irp);
11819 #define IoCallDriver IofCallDriver
11820
11821 NTKERNELAPI
11822 VOID
11823 FASTCALL
11824 IofCompleteRequest(
11825 IN PIRP Irp,
11826 IN CCHAR PriorityBoost);
11827 #define IoCompleteRequest IofCompleteRequest
11828
11829 NTKERNELAPI
11830 BOOLEAN
11831 NTAPI
11832 IoCancelIrp(
11833 IN PIRP Irp);
11834
11835 NTKERNELAPI
11836 NTSTATUS
11837 NTAPI
11838 IoCheckShareAccess(
11839 IN ACCESS_MASK DesiredAccess,
11840 IN ULONG DesiredShareAccess,
11841 IN OUT PFILE_OBJECT FileObject,
11842 IN OUT PSHARE_ACCESS ShareAccess,
11843 IN BOOLEAN Update);
11844
11845 NTKERNELAPI
11846 VOID
11847 FASTCALL
11848 IofCompleteRequest(
11849 IN PIRP Irp,
11850 IN CCHAR PriorityBoost);
11851
11852 NTKERNELAPI
11853 NTSTATUS
11854 NTAPI
11855 IoConnectInterrupt(
11856 OUT PKINTERRUPT *InterruptObject,
11857 IN PKSERVICE_ROUTINE ServiceRoutine,
11858 IN PVOID ServiceContext OPTIONAL,
11859 IN PKSPIN_LOCK SpinLock OPTIONAL,
11860 IN ULONG Vector,
11861 IN KIRQL Irql,
11862 IN KIRQL SynchronizeIrql,
11863 IN KINTERRUPT_MODE InterruptMode,
11864 IN BOOLEAN ShareVector,
11865 IN KAFFINITY ProcessorEnableMask,
11866 IN BOOLEAN FloatingSave);
11867
11868 NTKERNELAPI
11869 NTSTATUS
11870 NTAPI
11871 IoCreateDevice(
11872 IN PDRIVER_OBJECT DriverObject,
11873 IN ULONG DeviceExtensionSize,
11874 IN PUNICODE_STRING DeviceName OPTIONAL,
11875 IN DEVICE_TYPE DeviceType,
11876 IN ULONG DeviceCharacteristics,
11877 IN BOOLEAN Exclusive,
11878 OUT PDEVICE_OBJECT *DeviceObject);
11879
11880 NTKERNELAPI
11881 NTSTATUS
11882 NTAPI
11883 IoCreateFile(
11884 OUT PHANDLE FileHandle,
11885 IN ACCESS_MASK DesiredAccess,
11886 IN POBJECT_ATTRIBUTES ObjectAttributes,
11887 OUT PIO_STATUS_BLOCK IoStatusBlock,
11888 IN PLARGE_INTEGER AllocationSize OPTIONAL,
11889 IN ULONG FileAttributes,
11890 IN ULONG ShareAccess,
11891 IN ULONG Disposition,
11892 IN ULONG CreateOptions,
11893 IN PVOID EaBuffer OPTIONAL,
11894 IN ULONG EaLength,
11895 IN CREATE_FILE_TYPE CreateFileType,
11896 IN PVOID InternalParameters OPTIONAL,
11897 IN ULONG Options);
11898
11899 NTKERNELAPI
11900 PKEVENT
11901 NTAPI
11902 IoCreateNotificationEvent(
11903 IN PUNICODE_STRING EventName,
11904 OUT PHANDLE EventHandle);
11905
11906 NTKERNELAPI
11907 NTSTATUS
11908 NTAPI
11909 IoCreateSymbolicLink(
11910 IN PUNICODE_STRING SymbolicLinkName,
11911 IN PUNICODE_STRING DeviceName);
11912
11913 NTKERNELAPI
11914 PKEVENT
11915 NTAPI
11916 IoCreateSynchronizationEvent(
11917 IN PUNICODE_STRING EventName,
11918 OUT PHANDLE EventHandle);
11919
11920 NTKERNELAPI
11921 NTSTATUS
11922 NTAPI
11923 IoCreateUnprotectedSymbolicLink(
11924 IN PUNICODE_STRING SymbolicLinkName,
11925 IN PUNICODE_STRING DeviceName);
11926
11927 NTKERNELAPI
11928 VOID
11929 NTAPI
11930 IoDeleteDevice(
11931 IN PDEVICE_OBJECT DeviceObject);
11932
11933 NTKERNELAPI
11934 NTSTATUS
11935 NTAPI
11936 IoDeleteSymbolicLink(
11937 IN PUNICODE_STRING SymbolicLinkName);
11938
11939 NTKERNELAPI
11940 VOID
11941 NTAPI
11942 IoDetachDevice(
11943 IN OUT PDEVICE_OBJECT TargetDevice);
11944
11945 NTKERNELAPI
11946 VOID
11947 NTAPI
11948 IoDisconnectInterrupt(
11949 IN PKINTERRUPT InterruptObject);
11950
11951 NTKERNELAPI
11952 VOID
11953 NTAPI
11954 IoFreeIrp(
11955 IN PIRP Irp);
11956
11957 NTKERNELAPI
11958 VOID
11959 NTAPI
11960 IoFreeMdl(
11961 IN PMDL Mdl);
11962
11963 NTKERNELAPI
11964 VOID
11965 NTAPI
11966 IoFreeWorkItem(
11967 IN PIO_WORKITEM IoWorkItem);
11968
11969 NTKERNELAPI
11970 PDEVICE_OBJECT
11971 NTAPI
11972 IoGetAttachedDevice(
11973 IN PDEVICE_OBJECT DeviceObject);
11974
11975 NTKERNELAPI
11976 PDEVICE_OBJECT
11977 NTAPI
11978 IoGetAttachedDeviceReference(
11979 IN PDEVICE_OBJECT DeviceObject);
11980
11981 NTKERNELAPI
11982 NTSTATUS
11983 NTAPI
11984 IoGetBootDiskInformation(
11985 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
11986 IN ULONG Size);
11987
11988 NTKERNELAPI
11989 NTSTATUS
11990 NTAPI
11991 IoGetDeviceInterfaceAlias(
11992 IN PUNICODE_STRING SymbolicLinkName,
11993 IN CONST GUID *AliasInterfaceClassGuid,
11994 OUT PUNICODE_STRING AliasSymbolicLinkName);
11995
11996 NTKERNELAPI
11997 PEPROCESS
11998 NTAPI
11999 IoGetCurrentProcess(VOID);
12000
12001 NTKERNELAPI
12002 NTSTATUS
12003 NTAPI
12004 IoGetDeviceInterfaces(
12005 IN CONST GUID *InterfaceClassGuid,
12006 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12007 IN ULONG Flags,
12008 OUT PWSTR *SymbolicLinkList);
12009
12010 NTKERNELAPI
12011 NTSTATUS
12012 NTAPI
12013 IoGetDeviceObjectPointer(
12014 IN PUNICODE_STRING ObjectName,
12015 IN ACCESS_MASK DesiredAccess,
12016 OUT PFILE_OBJECT *FileObject,
12017 OUT PDEVICE_OBJECT *DeviceObject);
12018
12019 NTKERNELAPI
12020 NTSTATUS
12021 NTAPI
12022 IoGetDeviceProperty(
12023 IN PDEVICE_OBJECT DeviceObject,
12024 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
12025 IN ULONG BufferLength,
12026 OUT PVOID PropertyBuffer,
12027 OUT PULONG ResultLength);
12028
12029 NTKERNELAPI
12030 PDMA_ADAPTER
12031 NTAPI
12032 IoGetDmaAdapter(
12033 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12034 IN PDEVICE_DESCRIPTION DeviceDescription,
12035 IN OUT PULONG NumberOfMapRegisters);
12036
12037 NTKERNELAPI
12038 PVOID
12039 NTAPI
12040 IoGetDriverObjectExtension(
12041 IN PDRIVER_OBJECT DriverObject,
12042 IN PVOID ClientIdentificationAddress);
12043
12044 NTKERNELAPI
12045 PVOID
12046 NTAPI
12047 IoGetInitialStack(VOID);
12048
12049 NTKERNELAPI
12050 PDEVICE_OBJECT
12051 NTAPI
12052 IoGetRelatedDeviceObject(
12053 IN PFILE_OBJECT FileObject);
12054
12055 NTKERNELAPI
12056 VOID
12057 NTAPI
12058 IoQueueWorkItem(
12059 IN PIO_WORKITEM IoWorkItem,
12060 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
12061 IN WORK_QUEUE_TYPE QueueType,
12062 IN PVOID Context OPTIONAL);
12063
12064 NTKERNELAPI
12065 VOID
12066 NTAPI
12067 IoInitializeIrp(
12068 IN OUT PIRP Irp,
12069 IN USHORT PacketSize,
12070 IN CCHAR StackSize);
12071
12072 NTKERNELAPI
12073 VOID
12074 NTAPI
12075 IoInitializeRemoveLockEx(
12076 IN PIO_REMOVE_LOCK Lock,
12077 IN ULONG AllocateTag,
12078 IN ULONG MaxLockedMinutes,
12079 IN ULONG HighWatermark,
12080 IN ULONG RemlockSize);
12081
12082 NTKERNELAPI
12083 NTSTATUS
12084 NTAPI
12085 IoInitializeTimer(
12086 IN PDEVICE_OBJECT DeviceObject,
12087 IN PIO_TIMER_ROUTINE TimerRoutine,
12088 IN PVOID Context OPTIONAL);
12089
12090 NTKERNELAPI
12091 VOID
12092 NTAPI
12093 IoInvalidateDeviceRelations(
12094 IN PDEVICE_OBJECT DeviceObject,
12095 IN DEVICE_RELATION_TYPE Type);
12096
12097 NTKERNELAPI
12098 VOID
12099 NTAPI
12100 IoInvalidateDeviceState(
12101 IN PDEVICE_OBJECT PhysicalDeviceObject);
12102
12103 NTKERNELAPI
12104 BOOLEAN
12105 NTAPI
12106 IoIsWdmVersionAvailable(
12107 IN UCHAR MajorVersion,
12108 IN UCHAR MinorVersion);
12109
12110 NTKERNELAPI
12111 NTSTATUS
12112 NTAPI
12113 IoOpenDeviceInterfaceRegistryKey(
12114 IN PUNICODE_STRING SymbolicLinkName,
12115 IN ACCESS_MASK DesiredAccess,
12116 OUT PHANDLE DeviceInterfaceKey);
12117
12118 NTKERNELAPI
12119 NTSTATUS
12120 NTAPI
12121 IoOpenDeviceRegistryKey(
12122 IN PDEVICE_OBJECT DeviceObject,
12123 IN ULONG DevInstKeyType,
12124 IN ACCESS_MASK DesiredAccess,
12125 OUT PHANDLE DevInstRegKey);
12126
12127 NTKERNELAPI
12128 NTSTATUS
12129 NTAPI
12130 IoRegisterDeviceInterface(
12131 IN PDEVICE_OBJECT PhysicalDeviceObject,
12132 IN CONST GUID *InterfaceClassGuid,
12133 IN PUNICODE_STRING ReferenceString OPTIONAL,
12134 OUT PUNICODE_STRING SymbolicLinkName);
12135
12136 NTKERNELAPI
12137 NTSTATUS
12138 NTAPI
12139 IoRegisterPlugPlayNotification(
12140 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
12141 IN ULONG EventCategoryFlags,
12142 IN PVOID EventCategoryData OPTIONAL,
12143 IN PDRIVER_OBJECT DriverObject,
12144 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
12145 IN OUT PVOID Context OPTIONAL,
12146 OUT PVOID *NotificationEntry);
12147
12148 NTKERNELAPI
12149 NTSTATUS
12150 NTAPI
12151 IoRegisterShutdownNotification(
12152 IN PDEVICE_OBJECT DeviceObject);
12153
12154 NTKERNELAPI
12155 VOID
12156 NTAPI
12157 IoReleaseCancelSpinLock(
12158 IN KIRQL Irql);
12159
12160 NTKERNELAPI
12161 VOID
12162 NTAPI
12163 IoReleaseRemoveLockAndWaitEx(
12164 IN PIO_REMOVE_LOCK RemoveLock,
12165 IN PVOID Tag OPTIONAL,
12166 IN ULONG RemlockSize);
12167
12168 NTKERNELAPI
12169 VOID
12170 NTAPI
12171 IoReleaseRemoveLockEx(
12172 IN PIO_REMOVE_LOCK RemoveLock,
12173 IN PVOID Tag OPTIONAL,
12174 IN ULONG RemlockSize);
12175
12176 NTKERNELAPI
12177 VOID
12178 NTAPI
12179 IoRemoveShareAccess(
12180 IN PFILE_OBJECT FileObject,
12181 IN OUT PSHARE_ACCESS ShareAccess);
12182
12183 NTKERNELAPI
12184 NTSTATUS
12185 NTAPI
12186 IoReportTargetDeviceChange(
12187 IN PDEVICE_OBJECT PhysicalDeviceObject,
12188 IN PVOID NotificationStructure);
12189
12190 NTKERNELAPI
12191 NTSTATUS
12192 NTAPI
12193 IoReportTargetDeviceChangeAsynchronous(
12194 IN PDEVICE_OBJECT PhysicalDeviceObject,
12195 IN PVOID NotificationStructure,
12196 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
12197 IN PVOID Context OPTIONAL);
12198
12199 NTKERNELAPI
12200 VOID
12201 NTAPI
12202 IoRequestDeviceEject(
12203 IN PDEVICE_OBJECT PhysicalDeviceObject);
12204
12205 NTKERNELAPI
12206 VOID
12207 NTAPI
12208 IoReuseIrp(
12209 IN OUT PIRP Irp,
12210 IN NTSTATUS Status);
12211
12212 NTKERNELAPI
12213 NTSTATUS
12214 NTAPI
12215 IoSetDeviceInterfaceState(
12216 IN PUNICODE_STRING SymbolicLinkName,
12217 IN BOOLEAN Enable);
12218
12219 NTKERNELAPI
12220 VOID
12221 NTAPI
12222 IoSetShareAccess(
12223 IN ACCESS_MASK DesiredAccess,
12224 IN ULONG DesiredShareAccess,
12225 IN OUT PFILE_OBJECT FileObject,
12226 OUT PSHARE_ACCESS ShareAccess);
12227
12228 NTKERNELAPI
12229 VOID
12230 NTAPI
12231 IoStartNextPacket(
12232 IN PDEVICE_OBJECT DeviceObject,
12233 IN BOOLEAN Cancelable);
12234
12235 NTKERNELAPI
12236 VOID
12237 NTAPI
12238 IoStartNextPacketByKey(
12239 IN PDEVICE_OBJECT DeviceObject,
12240 IN BOOLEAN Cancelable,
12241 IN ULONG Key);
12242
12243 NTKERNELAPI
12244 VOID
12245 NTAPI
12246 IoStartPacket(
12247 IN PDEVICE_OBJECT DeviceObject,
12248 IN PIRP Irp,
12249 IN PULONG Key OPTIONAL,
12250 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
12251
12252 NTKERNELAPI
12253 VOID
12254 NTAPI
12255 IoStartTimer(
12256 IN PDEVICE_OBJECT DeviceObject);
12257
12258 NTKERNELAPI
12259 VOID
12260 NTAPI
12261 IoStopTimer(
12262 IN PDEVICE_OBJECT DeviceObject);
12263
12264 NTKERNELAPI
12265 NTSTATUS
12266 NTAPI
12267 IoUnregisterPlugPlayNotification(
12268 IN PVOID NotificationEntry);
12269
12270 NTKERNELAPI
12271 VOID
12272 NTAPI
12273 IoUnregisterShutdownNotification(
12274 IN PDEVICE_OBJECT DeviceObject);
12275
12276 NTKERNELAPI
12277 VOID
12278 NTAPI
12279 IoUpdateShareAccess(
12280 IN PFILE_OBJECT FileObject,
12281 IN OUT PSHARE_ACCESS ShareAccess);
12282
12283 NTKERNELAPI
12284 NTSTATUS
12285 NTAPI
12286 IoWMIAllocateInstanceIds(
12287 IN GUID *Guid,
12288 IN ULONG InstanceCount,
12289 OUT ULONG *FirstInstanceId);
12290
12291 NTKERNELAPI
12292 NTSTATUS
12293 NTAPI
12294 IoWMIQuerySingleInstanceMultiple(
12295 IN PVOID *DataBlockObjectList,
12296 IN PUNICODE_STRING InstanceNames,
12297 IN ULONG ObjectCount,
12298 IN OUT ULONG *InOutBufferSize,
12299 OUT PVOID OutBuffer);
12300
12301 NTKERNELAPI
12302 NTSTATUS
12303 NTAPI
12304 IoWMIRegistrationControl(
12305 IN PDEVICE_OBJECT DeviceObject,
12306 IN ULONG Action);
12307
12308 NTKERNELAPI
12309 NTSTATUS
12310 NTAPI
12311 IoWMISuggestInstanceName(
12312 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12313 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
12314 IN BOOLEAN CombineNames,
12315 OUT PUNICODE_STRING SuggestedInstanceName);
12316
12317 NTKERNELAPI
12318 NTSTATUS
12319 NTAPI
12320 IoWMIWriteEvent(
12321 IN OUT PVOID WnodeEventItem);
12322
12323 NTKERNELAPI
12324 VOID
12325 NTAPI
12326 IoWriteErrorLogEntry(
12327 IN PVOID ElEntry);
12328
12329 NTKERNELAPI
12330 PIRP
12331 NTAPI
12332 IoGetTopLevelIrp(VOID);
12333
12334 NTKERNELAPI
12335 NTSTATUS
12336 NTAPI
12337 IoRegisterLastChanceShutdownNotification(
12338 IN PDEVICE_OBJECT DeviceObject);
12339
12340 NTKERNELAPI
12341 VOID
12342 NTAPI
12343 IoSetTopLevelIrp(
12344 IN PIRP Irp OPTIONAL);
12345
12346
12347 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12348
12349
12350 #if (NTDDI_VERSION >= NTDDI_WINXP)
12351
12352 NTKERNELAPI
12353 NTSTATUS
12354 NTAPI
12355 IoCsqInitialize(
12356 IN PIO_CSQ Csq,
12357 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
12358 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12359 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12360 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12361 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12362 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12363
12364 NTKERNELAPI
12365 VOID
12366 NTAPI
12367 IoCsqInsertIrp(
12368 IN PIO_CSQ Csq,
12369 IN PIRP Irp,
12370 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
12371
12372 NTKERNELAPI
12373 PIRP
12374 NTAPI
12375 IoCsqRemoveIrp(
12376 IN PIO_CSQ Csq,
12377 IN PIO_CSQ_IRP_CONTEXT Context);
12378
12379 NTKERNELAPI
12380 PIRP
12381 NTAPI
12382 IoCsqRemoveNextIrp(
12383 IN PIO_CSQ Csq,
12384 IN PVOID PeekContext OPTIONAL);
12385
12386 NTKERNELAPI
12387 BOOLEAN
12388 NTAPI
12389 IoForwardIrpSynchronously(
12390 IN PDEVICE_OBJECT DeviceObject,
12391 IN PIRP Irp);
12392
12393 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
12394
12395 NTKERNELAPI
12396 VOID
12397 NTAPI
12398 IoFreeErrorLogEntry(
12399 PVOID ElEntry);
12400
12401 NTKERNELAPI
12402 NTSTATUS
12403 NTAPI
12404 IoSetCompletionRoutineEx(
12405 IN PDEVICE_OBJECT DeviceObject,
12406 IN PIRP Irp,
12407 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
12408 IN PVOID Context,
12409 IN BOOLEAN InvokeOnSuccess,
12410 IN BOOLEAN InvokeOnError,
12411 IN BOOLEAN InvokeOnCancel);
12412
12413 VOID
12414 NTAPI
12415 IoSetStartIoAttributes(
12416 IN PDEVICE_OBJECT DeviceObject,
12417 IN BOOLEAN DeferredStartIo,
12418 IN BOOLEAN NonCancelable);
12419
12420 NTKERNELAPI
12421 NTSTATUS
12422 NTAPI
12423 IoWMIDeviceObjectToInstanceName(
12424 IN PVOID DataBlockObject,
12425 IN PDEVICE_OBJECT DeviceObject,
12426 OUT PUNICODE_STRING InstanceName);
12427
12428 NTKERNELAPI
12429 NTSTATUS
12430 NTAPI
12431 IoWMIExecuteMethod(
12432 IN PVOID DataBlockObject,
12433 IN PUNICODE_STRING InstanceName,
12434 IN ULONG MethodId,
12435 IN ULONG InBufferSize,
12436 IN OUT PULONG OutBufferSize,
12437 IN OUT PUCHAR InOutBuffer);
12438
12439 NTKERNELAPI
12440 NTSTATUS
12441 NTAPI
12442 IoWMIHandleToInstanceName(
12443 IN PVOID DataBlockObject,
12444 IN HANDLE FileHandle,
12445 OUT PUNICODE_STRING InstanceName);
12446
12447 NTKERNELAPI
12448 NTSTATUS
12449 NTAPI
12450 IoWMIOpenBlock(
12451 IN GUID *DataBlockGuid,
12452 IN ULONG DesiredAccess,
12453 OUT PVOID *DataBlockObject);
12454
12455 NTKERNELAPI
12456 NTSTATUS
12457 NTAPI
12458 IoWMIQueryAllData(
12459 IN PVOID DataBlockObject,
12460 IN OUT ULONG *InOutBufferSize,
12461 OUT PVOID OutBuffer);
12462
12463 NTKERNELAPI
12464 NTSTATUS
12465 NTAPI
12466 IoWMIQueryAllDataMultiple(
12467 IN PVOID *DataBlockObjectList,
12468 IN ULONG ObjectCount,
12469 IN OUT ULONG *InOutBufferSize,
12470 OUT PVOID OutBuffer);
12471
12472 NTKERNELAPI
12473 NTSTATUS
12474 NTAPI
12475 IoWMIQuerySingleInstance(
12476 IN PVOID DataBlockObject,
12477 IN PUNICODE_STRING InstanceName,
12478 IN OUT ULONG *InOutBufferSize,
12479 OUT PVOID OutBuffer);
12480
12481 NTKERNELAPI
12482 NTSTATUS
12483 NTAPI
12484 IoWMISetNotificationCallback(
12485 IN OUT PVOID Object,
12486 IN WMI_NOTIFICATION_CALLBACK Callback,
12487 IN PVOID Context OPTIONAL);
12488
12489 NTKERNELAPI
12490 NTSTATUS
12491 NTAPI
12492 IoWMISetSingleInstance(
12493 IN PVOID DataBlockObject,
12494 IN PUNICODE_STRING InstanceName,
12495 IN ULONG Version,
12496 IN ULONG ValueBufferSize,
12497 IN PVOID ValueBuffer);
12498
12499 NTKERNELAPI
12500 NTSTATUS
12501 NTAPI
12502 IoWMISetSingleItem(
12503 IN PVOID DataBlockObject,
12504 IN PUNICODE_STRING InstanceName,
12505 IN ULONG DataItemId,
12506 IN ULONG Version,
12507 IN ULONG ValueBufferSize,
12508 IN PVOID ValueBuffer);
12509
12510 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
12511
12512 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
12513 NTKERNELAPI
12514 NTSTATUS
12515 NTAPI
12516 IoValidateDeviceIoControlAccess(
12517 IN PIRP Irp,
12518 IN ULONG RequiredAccess);
12519 #endif
12520
12521 #if (NTDDI_VERSION >= NTDDI_WS03)
12522 NTKERNELAPI
12523 NTSTATUS
12524 NTAPI
12525 IoCsqInitializeEx(
12526 IN PIO_CSQ Csq,
12527 IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
12528 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12529 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12530 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12531 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12532 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12533
12534 NTKERNELAPI
12535 NTSTATUS
12536 NTAPI
12537 IoCsqInsertIrpEx(
12538 IN PIO_CSQ Csq,
12539 IN PIRP Irp,
12540 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL,
12541 IN PVOID InsertContext OPTIONAL);
12542 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
12543
12544
12545 #if (NTDDI_VERSION >= NTDDI_VISTA)
12546 NTKERNELAPI
12547 NTSTATUS
12548 NTAPI
12549 IoGetBootDiskInformationLite(
12550 OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
12551
12552 NTKERNELAPI
12553 NTSTATUS
12554 NTAPI
12555 IoCheckShareAccessEx(
12556 IN ACCESS_MASK DesiredAccess,
12557 IN ULONG DesiredShareAccess,
12558 IN OUT PFILE_OBJECT FileObject,
12559 IN OUT PSHARE_ACCESS ShareAccess,
12560 IN BOOLEAN Update,
12561 IN PBOOLEAN WritePermission);
12562
12563 NTKERNELAPI
12564 NTSTATUS
12565 NTAPI
12566 IoConnectInterruptEx(
12567 IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
12568
12569 NTKERNELAPI
12570 VOID
12571 NTAPI
12572 IoDisconnectInterruptEx(
12573 IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
12574
12575 LOGICAL
12576 NTAPI
12577 IoWithinStackLimits(
12578 IN ULONG_PTR RegionStart,
12579 IN SIZE_T RegionSize);
12580
12581 NTKERNELAPI
12582 VOID
12583 NTAPI
12584 IoSetShareAccessEx(
12585 IN ACCESS_MASK DesiredAccess,
12586 IN ULONG DesiredShareAccess,
12587 IN OUT PFILE_OBJECT FileObject,
12588 OUT PSHARE_ACCESS ShareAccess,
12589 IN PBOOLEAN WritePermission);
12590
12591 ULONG
12592 NTAPI
12593 IoSizeofWorkItem(VOID);
12594
12595 VOID
12596 NTAPI
12597 IoInitializeWorkItem(
12598 IN PVOID IoObject,
12599 IN PIO_WORKITEM IoWorkItem);
12600
12601 VOID
12602 NTAPI
12603 IoUninitializeWorkItem(
12604 IN PIO_WORKITEM IoWorkItem);
12605
12606 VOID
12607 NTAPI
12608 IoQueueWorkItemEx(
12609 IN PIO_WORKITEM IoWorkItem,
12610 IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
12611 IN WORK_QUEUE_TYPE QueueType,
12612 IN PVOID Context OPTIONAL);
12613
12614 IO_PRIORITY_HINT
12615 NTAPI
12616 IoGetIoPriorityHint(
12617 IN PIRP Irp);
12618
12619 NTSTATUS
12620 NTAPI
12621 IoSetIoPriorityHint(
12622 IN PIRP Irp,
12623 IN IO_PRIORITY_HINT PriorityHint);
12624
12625 NTSTATUS
12626 NTAPI
12627 IoAllocateSfioStreamIdentifier(
12628 IN PFILE_OBJECT FileObject,
12629 IN ULONG Length,
12630 IN PVOID Signature,
12631 OUT PVOID *StreamIdentifier);
12632
12633 PVOID
12634 NTAPI
12635 IoGetSfioStreamIdentifier(
12636 IN PFILE_OBJECT FileObject,
12637 IN PVOID Signature);
12638
12639 NTSTATUS
12640 NTAPI
12641 IoFreeSfioStreamIdentifier(
12642 IN PFILE_OBJECT FileObject,
12643 IN PVOID Signature);
12644
12645 NTKERNELAPI
12646 NTSTATUS
12647 NTAPI
12648 IoRequestDeviceEjectEx(
12649 IN PDEVICE_OBJECT PhysicalDeviceObject,
12650 IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL,
12651 IN PVOID Context OPTIONAL,
12652 IN PDRIVER_OBJECT DriverObject OPTIONAL);
12653
12654 NTKERNELAPI
12655 NTSTATUS
12656 NTAPI
12657 IoSetDevicePropertyData(
12658 IN PDEVICE_OBJECT Pdo,
12659 IN CONST DEVPROPKEY *PropertyKey,
12660 IN LCID Lcid,
12661 IN ULONG Flags,
12662 IN DEVPROPTYPE Type,
12663 IN ULONG Size,
12664 IN PVOID Data OPTIONAL);
12665
12666 NTKERNELAPI
12667 NTSTATUS
12668 NTAPI
12669 IoGetDevicePropertyData(
12670 PDEVICE_OBJECT Pdo,
12671 CONST DEVPROPKEY *PropertyKey,
12672 LCID Lcid,
12673 ULONG Flags,
12674 ULONG Size,
12675 PVOID Data,
12676 PULONG RequiredSize,
12677 PDEVPROPTYPE Type);
12678
12679 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12680
12681 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
12682
12683 #if (NTDDI_VERSION >= NTDDI_WS08)
12684 NTKERNELAPI
12685 NTSTATUS
12686 NTAPI
12687 IoReplacePartitionUnit(
12688 IN PDEVICE_OBJECT TargetPdo,
12689 IN PDEVICE_OBJECT SparePdo,
12690 IN ULONG Flags);
12691 #endif
12692
12693 #if (NTDDI_VERSION >= NTDDI_WIN7)
12694
12695 NTKERNELAPI
12696 NTSTATUS
12697 NTAPI
12698 IoGetAffinityInterrupt(
12699 IN PKINTERRUPT InterruptObject,
12700 OUT PGROUP_AFFINITY GroupAffinity);
12701
12702 NTSTATUS
12703 NTAPI
12704 IoGetContainerInformation(
12705 IN IO_CONTAINER_INFORMATION_CLASS InformationClass,
12706 IN PVOID ContainerObject OPTIONAL,
12707 IN OUT PVOID Buffer OPTIONAL,
12708 IN ULONG BufferLength);
12709
12710 NTSTATUS
12711 NTAPI
12712 IoRegisterContainerNotification(
12713 IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
12714 IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
12715 IN PVOID NotificationInformation OPTIONAL,
12716 IN ULONG NotificationInformationLength,
12717 OUT PVOID CallbackRegistration);
12718
12719 VOID
12720 NTAPI
12721 IoUnregisterContainerNotification(
12722 IN PVOID CallbackRegistration);
12723
12724 NTKERNELAPI
12725 NTSTATUS
12726 NTAPI
12727 IoUnregisterPlugPlayNotificationEx(
12728 IN PVOID NotificationEntry);
12729
12730 NTKERNELAPI
12731 NTSTATUS
12732 NTAPI
12733 IoGetDeviceNumaNode(
12734 IN PDEVICE_OBJECT Pdo,
12735 OUT PUSHORT NodeNumber);
12736
12737 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
12738
12739 #if defined(_WIN64)
12740 NTKERNELAPI
12741 ULONG
12742 NTAPI
12743 IoWMIDeviceObjectToProviderId(
12744 IN PDEVICE_OBJECT DeviceObject);
12745 #else
12746 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
12747 #endif
12748
12749 /*
12750 * USHORT
12751 * IoSizeOfIrp(
12752 * IN CCHAR StackSize)
12753 */
12754 #define IoSizeOfIrp(_StackSize) \
12755 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
12756
12757 FORCEINLINE
12758 VOID
12759 IoSkipCurrentIrpStackLocation(
12760 IN OUT PIRP Irp)
12761 {
12762 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
12763 Irp->CurrentLocation++;
12764 #ifdef NONAMELESSUNION
12765 Irp->Tail.Overlay.s.u.CurrentStackLocation++;
12766 #else
12767 Irp->Tail.Overlay.CurrentStackLocation++;
12768 #endif
12769 }
12770
12771 FORCEINLINE
12772 VOID
12773 IoSetNextIrpStackLocation(
12774 IN OUT PIRP Irp)
12775 {
12776 ASSERT(Irp->CurrentLocation > 0);
12777 Irp->CurrentLocation--;
12778 #ifdef NONAMELESSUNION
12779 Irp->Tail.Overlay.s.u.CurrentStackLocation--;
12780 #else
12781 Irp->Tail.Overlay.CurrentStackLocation--;
12782 #endif
12783 }
12784
12785 FORCEINLINE
12786 PIO_STACK_LOCATION
12787 IoGetNextIrpStackLocation(
12788 IN PIRP Irp)
12789 {
12790 ASSERT(Irp->CurrentLocation > 0);
12791 #ifdef NONAMELESSUNION
12792 return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
12793 #else
12794 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
12795 #endif
12796 }
12797
12798 FORCEINLINE
12799 VOID
12800 IoSetCompletionRoutine(
12801 IN PIRP Irp,
12802 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
12803 IN PVOID Context OPTIONAL,
12804 IN BOOLEAN InvokeOnSuccess,
12805 IN BOOLEAN InvokeOnError,
12806 IN BOOLEAN InvokeOnCancel)
12807 {
12808 PIO_STACK_LOCATION irpSp;
12809 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
12810 irpSp = IoGetNextIrpStackLocation(Irp);
12811 irpSp->CompletionRoutine = CompletionRoutine;
12812 irpSp->Context = Context;
12813 irpSp->Control = 0;
12814
12815 if (InvokeOnSuccess) {
12816 irpSp->Control = SL_INVOKE_ON_SUCCESS;
12817 }
12818
12819 if (InvokeOnError) {
12820 irpSp->Control |= SL_INVOKE_ON_ERROR;
12821 }
12822
12823 if (InvokeOnCancel) {
12824 irpSp->Control |= SL_INVOKE_ON_CANCEL;
12825 }
12826 }
12827
12828 /*
12829 * PDRIVER_CANCEL
12830 * IoSetCancelRoutine(
12831 * IN PIRP Irp,
12832 * IN PDRIVER_CANCEL CancelRoutine)
12833 */
12834 #define IoSetCancelRoutine(_Irp, \
12835 _CancelRoutine) \
12836 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
12837 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
12838
12839 /*
12840 * VOID
12841 * IoRequestDpc(
12842 * IN PDEVICE_OBJECT DeviceObject,
12843 * IN PIRP Irp,
12844 * IN PVOID Context);
12845 */
12846 #define IoRequestDpc(DeviceObject, Irp, Context)( \
12847 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
12848
12849 /*
12850 * VOID
12851 * IoReleaseRemoveLock(
12852 * IN PIO_REMOVE_LOCK RemoveLock,
12853 * IN PVOID Tag)
12854 */
12855 #define IoReleaseRemoveLock(_RemoveLock, \
12856 _Tag) \
12857 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12858
12859 /*
12860 * VOID
12861 * IoReleaseRemoveLockAndWait(
12862 * IN PIO_REMOVE_LOCK RemoveLock,
12863 * IN PVOID Tag)
12864 */
12865 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
12866 _Tag) \
12867 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12868
12869 #if defined(_WIN64)
12870 NTKERNELAPI
12871 BOOLEAN
12872 IoIs32bitProcess(
12873 IN PIRP Irp OPTIONAL);
12874 #endif
12875
12876 #define PLUGPLAY_REGKEY_DEVICE 1
12877 #define PLUGPLAY_REGKEY_DRIVER 2
12878 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
12879
12880 FORCEINLINE
12881 PIO_STACK_LOCATION
12882 IoGetCurrentIrpStackLocation(
12883 IN PIRP Irp)
12884 {
12885 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
12886 #ifdef NONAMELESSUNION
12887 return Irp->Tail.Overlay.s.u.CurrentStackLocation;
12888 #else
12889 return Irp->Tail.Overlay.CurrentStackLocation;
12890 #endif
12891 }
12892
12893 FORCEINLINE
12894 VOID
12895 IoMarkIrpPending(
12896 IN OUT PIRP Irp)
12897 {
12898 IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
12899 }
12900
12901 /*
12902 * BOOLEAN
12903 * IoIsErrorUserInduced(
12904 * IN NTSTATUS Status);
12905 */
12906 #define IoIsErrorUserInduced(Status) \
12907 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
12908 ((Status) == STATUS_IO_TIMEOUT) || \
12909 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
12910 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
12911 ((Status) == STATUS_VERIFY_REQUIRED) || \
12912 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
12913 ((Status) == STATUS_WRONG_VOLUME)))
12914
12915 /* VOID
12916 * IoInitializeRemoveLock(
12917 * IN PIO_REMOVE_LOCK Lock,
12918 * IN ULONG AllocateTag,
12919 * IN ULONG MaxLockedMinutes,
12920 * IN ULONG HighWatermark)
12921 */
12922 #define IoInitializeRemoveLock( \
12923 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
12924 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
12925 HighWatermark, sizeof(IO_REMOVE_LOCK))
12926
12927 FORCEINLINE
12928 VOID
12929 IoInitializeDpcRequest(
12930 IN PDEVICE_OBJECT DeviceObject,
12931 IN PIO_DPC_ROUTINE DpcRoutine)
12932 {
12933 KeInitializeDpc( &DeviceObject->Dpc,
12934 (PKDEFERRED_ROUTINE) DpcRoutine,
12935 DeviceObject );
12936 }
12937
12938 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
12939
12940 /*
12941 * ULONG
12942 * IoGetFunctionCodeFromCtlCode(
12943 * IN ULONG ControlCode)
12944 */
12945 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
12946 (((_ControlCode) >> 2) & 0x00000FFF)
12947
12948 FORCEINLINE
12949 VOID
12950 IoCopyCurrentIrpStackLocationToNext(
12951 IN OUT PIRP Irp)
12952 {
12953 PIO_STACK_LOCATION irpSp;
12954 PIO_STACK_LOCATION nextIrpSp;
12955 irpSp = IoGetCurrentIrpStackLocation(Irp);
12956 nextIrpSp = IoGetNextIrpStackLocation(Irp);
12957 RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
12958 nextIrpSp->Control = 0;
12959 }
12960
12961 NTKERNELAPI
12962 VOID
12963 NTAPI
12964 IoGetStackLimits(
12965 OUT PULONG_PTR LowLimit,
12966 OUT PULONG_PTR HighLimit);
12967
12968 FORCEINLINE
12969 ULONG_PTR
12970 IoGetRemainingStackSize(VOID)
12971 {
12972 ULONG_PTR End, Begin;
12973 ULONG_PTR Result;
12974
12975 IoGetStackLimits(&Begin, &End);
12976 Result = (ULONG_PTR)(&End) - Begin;
12977 return Result;
12978 }
12979
12980 #if (NTDDI_VERSION >= NTDDI_WS03)
12981 FORCEINLINE
12982 VOID
12983 IoInitializeThreadedDpcRequest(
12984 IN PDEVICE_OBJECT DeviceObject,
12985 IN PIO_DPC_ROUTINE DpcRoutine)
12986 {
12987 KeInitializeThreadedDpc(&DeviceObject->Dpc,
12988 (PKDEFERRED_ROUTINE) DpcRoutine,
12989 DeviceObject );
12990 }
12991 #endif
12992
12993 /******************************************************************************
12994 * Power Management Support Functions *
12995 ******************************************************************************/
12996
12997 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
12998
12999 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13000
13001 NTKERNELAPI
13002 NTSTATUS
13003 NTAPI
13004 PoCallDriver(
13005 IN struct _DEVICE_OBJECT *DeviceObject,
13006 IN OUT struct _IRP *Irp);
13007
13008 NTKERNELAPI
13009 PULONG
13010 NTAPI
13011 PoRegisterDeviceForIdleDetection(
13012 IN struct _DEVICE_OBJECT *DeviceObject,
13013 IN ULONG ConservationIdleTime,
13014 IN ULONG PerformanceIdleTime,
13015 IN DEVICE_POWER_STATE State);
13016
13017 NTKERNELAPI
13018 PVOID
13019 NTAPI
13020 PoRegisterSystemState(
13021 IN OUT PVOID StateHandle OPTIONAL,
13022 IN EXECUTION_STATE Flags);
13023
13024 NTKERNELAPI
13025 NTSTATUS
13026 NTAPI
13027 PoRequestPowerIrp(
13028 IN struct _DEVICE_OBJECT *DeviceObject,
13029 IN UCHAR MinorFunction,
13030 IN POWER_STATE PowerState,
13031 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
13032 IN PVOID Context OPTIONAL,
13033 OUT struct _IRP **Irp OPTIONAL);
13034
13035 NTKERNELAPI
13036 POWER_STATE
13037 NTAPI
13038 PoSetPowerState(
13039 IN struct _DEVICE_OBJECT *DeviceObject,
13040 IN POWER_STATE_TYPE Type,
13041 IN POWER_STATE State);
13042
13043 NTKERNELAPI
13044 VOID
13045 NTAPI
13046 PoSetSystemState(
13047 IN EXECUTION_STATE Flags);
13048
13049 NTKERNELAPI
13050 VOID
13051 NTAPI
13052 PoStartNextPowerIrp(
13053 IN OUT struct _IRP *Irp);
13054
13055 NTKERNELAPI
13056 VOID
13057 NTAPI
13058 PoUnregisterSystemState(
13059 IN OUT PVOID StateHandle);
13060
13061 NTKERNELAPI
13062 NTSTATUS
13063 NTAPI
13064 PoRequestShutdownEvent(
13065 OUT PVOID *Event);
13066
13067 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13068
13069 #if (NTDDI_VERSION >= NTDDI_VISTA)
13070
13071 NTKERNELAPI
13072 VOID
13073 NTAPI
13074 PoSetSystemWake(
13075 IN OUT struct _IRP *Irp);
13076
13077 NTKERNELAPI
13078 BOOLEAN
13079 NTAPI
13080 PoGetSystemWake(
13081 IN struct _IRP *Irp);
13082
13083 NTKERNELAPI
13084 NTSTATUS
13085 NTAPI
13086 PoRegisterPowerSettingCallback(
13087 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
13088 IN LPCGUID SettingGuid,
13089 IN PPOWER_SETTING_CALLBACK Callback,
13090 IN PVOID Context OPTIONAL,
13091 OUT PVOID *Handle OPTIONAL);
13092
13093 NTKERNELAPI
13094 NTSTATUS
13095 NTAPI
13096 PoUnregisterPowerSettingCallback(
13097 IN OUT PVOID Handle);
13098
13099 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13100
13101 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
13102 NTKERNELAPI
13103 VOID
13104 NTAPI
13105 PoSetDeviceBusyEx(
13106 IN OUT PULONG IdlePointer);
13107 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
13108
13109 #if (NTDDI_VERSION >= NTDDI_WIN7)
13110
13111 NTKERNELAPI
13112 VOID
13113 NTAPI
13114 PoStartDeviceBusy(
13115 IN OUT PULONG IdlePointer);
13116
13117 NTKERNELAPI
13118 VOID
13119 NTAPI
13120 PoEndDeviceBusy(
13121 IN OUT PULONG IdlePointer);
13122
13123 NTKERNELAPI
13124 BOOLEAN
13125 NTAPI
13126 PoQueryWatchdogTime(
13127 IN PDEVICE_OBJECT Pdo,
13128 OUT PULONG SecondsRemaining);
13129
13130 NTKERNELAPI
13131 VOID
13132 NTAPI
13133 PoDeletePowerRequest(
13134 IN OUT PVOID PowerRequest);
13135
13136 NTKERNELAPI
13137 NTSTATUS
13138 NTAPI
13139 PoSetPowerRequest(
13140 IN OUT PVOID PowerRequest,
13141 IN POWER_REQUEST_TYPE Type);
13142
13143 NTKERNELAPI
13144 NTSTATUS
13145 NTAPI
13146 PoClearPowerRequest(
13147 IN OUT PVOID PowerRequest,
13148 IN POWER_REQUEST_TYPE Type);
13149
13150 NTKERNELAPI
13151 NTSTATUS
13152 NTAPI
13153 PoCreatePowerRequest(
13154 OUT PVOID *PowerRequest,
13155 IN PDEVICE_OBJECT DeviceObject,
13156 IN PCOUNTED_REASON_CONTEXT Context);
13157
13158 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13159
13160 /******************************************************************************
13161 * Executive Functions *
13162 ******************************************************************************/
13163
13164 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
13165 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
13166 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
13167
13168 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
13169 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
13170 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
13171 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
13172
13173 #define ExInitializeSListHead InitializeSListHead
13174
13175 #if defined(_NTHAL_) && defined(_X86_)
13176
13177 NTKERNELAPI
13178 VOID
13179 FASTCALL
13180 ExiAcquireFastMutex(
13181 IN OUT PFAST_MUTEX FastMutex);
13182
13183 NTKERNELAPI
13184 VOID
13185 FASTCALL
13186 ExiReleaseFastMutex(
13187 IN OUT PFAST_MUTEX FastMutex);
13188
13189 NTKERNELAPI
13190 BOOLEAN
13191 FASTCALL
13192 ExiTryToAcquireFastMutex(
13193 IN OUT PFAST_MUTEX FastMutex);
13194
13195 #define ExAcquireFastMutex ExiAcquireFastMutex
13196 #define ExReleaseFastMutex ExiReleaseFastMutex
13197 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
13198
13199 #else
13200
13201 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13202
13203 NTKERNELAPI
13204 VOID
13205 FASTCALL
13206 ExAcquireFastMutex(
13207 IN OUT PFAST_MUTEX FastMutex);
13208
13209 NTKERNELAPI
13210 VOID
13211 FASTCALL
13212 ExReleaseFastMutex(
13213 IN OUT PFAST_MUTEX FastMutex);
13214
13215 NTKERNELAPI
13216 BOOLEAN
13217 FASTCALL
13218 ExTryToAcquireFastMutex(
13219 IN OUT PFAST_MUTEX FastMutex);
13220
13221 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13222
13223 #endif /* defined(_NTHAL_) && defined(_X86_) */
13224
13225 #if defined(_X86_)
13226 #define ExInterlockedAddUlong ExfInterlockedAddUlong
13227 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
13228 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
13229 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
13230 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
13231 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
13232 #endif /* defined(_X86_) */
13233
13234 #if defined(_WIN64)
13235
13236 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
13237 defined(_NTHAL_) || defined(_NTOSP_)
13238 NTKERNELAPI
13239 USHORT
13240 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
13241 #else
13242 FORCEINLINE
13243 USHORT
13244 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
13245 {
13246 return (USHORT)(ListHead->Alignment & 0xffff);
13247 }
13248 #endif
13249
13250 NTKERNELAPI
13251 PSLIST_ENTRY
13252 ExpInterlockedFlushSList(
13253 PSLIST_HEADER ListHead);
13254
13255 NTKERNELAPI
13256 PSLIST_ENTRY
13257 ExpInterlockedPopEntrySList(
13258 PSLIST_HEADER ListHead);
13259
13260 NTKERNELAPI
13261 PSLIST_ENTRY
13262 ExpInterlockedPushEntrySList(
13263 PSLIST_HEADER ListHead,
13264 PSLIST_ENTRY ListEntry);
13265
13266 #define ExInterlockedFlushSList(Head) \
13267 ExpInterlockedFlushSList(Head)
13268 #define ExInterlockedPopEntrySList(Head, Lock) \
13269 ExpInterlockedPopEntrySList(Head)
13270 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
13271 ExpInterlockedPushEntrySList(Head, Entry)
13272
13273 #else /* !defined(_WIN64) */
13274
13275 #ifdef NONAMELESSUNION
13276 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
13277 #else
13278 #define ExQueryDepthSList(listhead) (listhead)->Depth
13279 #endif
13280
13281 NTKERNELAPI
13282 PSINGLE_LIST_ENTRY
13283 FASTCALL
13284 ExInterlockedFlushSList(
13285 IN OUT PSLIST_HEADER ListHead);
13286
13287 #endif /* !defined(_WIN64) */
13288
13289 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
13290
13291 NTKERNELAPI
13292 PSINGLE_LIST_ENTRY
13293 FASTCALL
13294 ExInterlockedPopEntrySList(
13295 IN PSLIST_HEADER ListHead,
13296 IN PKSPIN_LOCK Lock);
13297
13298 NTKERNELAPI
13299 PSINGLE_LIST_ENTRY
13300 FASTCALL
13301 ExInterlockedPushEntrySList(
13302 IN PSLIST_HEADER ListHead,
13303 IN PSINGLE_LIST_ENTRY ListEntry,
13304 IN PKSPIN_LOCK Lock);
13305
13306 NTKERNELAPI
13307 PVOID
13308 NTAPI
13309 ExAllocateFromPagedLookasideList(
13310 IN OUT PPAGED_LOOKASIDE_LIST Lookaside);
13311
13312 NTKERNELAPI
13313 VOID
13314 NTAPI
13315 ExFreeToPagedLookasideList(
13316 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13317 IN PVOID Entry);
13318
13319 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
13320
13321 #if !defined(_WIN64)
13322 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
13323 InterlockedPopEntrySList(_ListHead)
13324 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
13325 InterlockedPushEntrySList(_ListHead, _ListEntry)
13326 #endif
13327
13328 static __inline
13329 PVOID
13330 ExAllocateFromPagedLookasideList(
13331 IN OUT PPAGED_LOOKASIDE_LIST Lookaside)
13332 {
13333 PVOID Entry;
13334
13335 Lookaside->L.TotalAllocates++;
13336 #ifdef NONAMELESSUNION
13337 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
13338 if (Entry == NULL) {
13339 Lookaside->L.u2.AllocateMisses++;
13340 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
13341 Lookaside->L.Size,
13342 Lookaside->L.Tag);
13343 }
13344 #else /* NONAMELESSUNION */
13345 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
13346 if (Entry == NULL) {
13347 Lookaside->L.AllocateMisses++;
13348 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
13349 Lookaside->L.Size,
13350 Lookaside->L.Tag);
13351 }
13352 #endif /* NONAMELESSUNION */
13353 return Entry;
13354 }
13355
13356 static __inline
13357 VOID
13358 ExFreeToPagedLookasideList(
13359 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13360 IN PVOID Entry)
13361 {
13362 Lookaside->L.TotalFrees++;
13363 #ifdef NONAMELESSUNION
13364 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
13365 Lookaside->L.u3.FreeMisses++;
13366 (Lookaside->L.u5.Free)(Entry);
13367 } else {
13368 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
13369 }
13370 #else /* NONAMELESSUNION */
13371 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
13372 Lookaside->L.FreeMisses++;
13373 (Lookaside->L.Free)(Entry);
13374 } else {
13375 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
13376 }
13377 #endif /* NONAMELESSUNION */
13378 }
13379
13380 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
13381
13382
13383 /* ERESOURCE_THREAD
13384 * ExGetCurrentResourceThread(
13385 * VOID);
13386 */
13387 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
13388
13389 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
13390
13391 /* VOID
13392 * ExInitializeWorkItem(
13393 * IN PWORK_QUEUE_ITEM Item,
13394 * IN PWORKER_THREAD_ROUTINE Routine,
13395 * IN PVOID Context)
13396 */
13397 #define ExInitializeWorkItem(Item, Routine, Context) \
13398 { \
13399 (Item)->WorkerRoutine = Routine; \
13400 (Item)->Parameter = Context; \
13401 (Item)->List.Flink = NULL; \
13402 }
13403
13404 FORCEINLINE
13405 VOID
13406 ExInitializeFastMutex(
13407 OUT PFAST_MUTEX FastMutex)
13408 {
13409 FastMutex->Count = FM_LOCK_BIT;
13410 FastMutex->Owner = NULL;
13411 FastMutex->Contention = 0;
13412 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
13413 return;
13414 }
13415
13416
13417 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13418 NTKERNELAPI
13419 VOID
13420 FASTCALL
13421 ExAcquireFastMutexUnsafe(
13422 IN OUT PFAST_MUTEX FastMutex);
13423
13424 NTKERNELAPI
13425 VOID
13426 FASTCALL
13427 ExReleaseFastMutexUnsafe(
13428 IN OUT PFAST_MUTEX FastMutex);
13429
13430 NTKERNELAPI
13431 BOOLEAN
13432 NTAPI
13433 ExAcquireResourceExclusiveLite(
13434 IN OUT PERESOURCE Resource,
13435 IN BOOLEAN Wait);
13436
13437 NTKERNELAPI
13438 BOOLEAN
13439 NTAPI
13440 ExAcquireResourceSharedLite(
13441 IN OUT PERESOURCE Resource,
13442 IN BOOLEAN Wait);
13443
13444 NTKERNELAPI
13445 BOOLEAN
13446 NTAPI
13447 ExAcquireSharedStarveExclusive(
13448 IN OUT PERESOURCE Resource,
13449 IN BOOLEAN Wait);
13450
13451 NTKERNELAPI
13452 BOOLEAN
13453 NTAPI
13454 ExAcquireSharedWaitForExclusive(
13455 IN OUT PERESOURCE Resource,
13456 IN BOOLEAN Wait);
13457
13458 NTKERNELAPI
13459 PVOID
13460 NTAPI
13461 ExAllocatePool(
13462 IN POOL_TYPE PoolType,
13463 IN SIZE_T NumberOfBytes);
13464
13465 NTKERNELAPI
13466 PVOID
13467 NTAPI
13468 ExAllocatePoolWithQuota(
13469 IN POOL_TYPE PoolType,
13470 IN SIZE_T NumberOfBytes);
13471
13472 NTKERNELAPI
13473 PVOID
13474 NTAPI
13475 ExAllocatePoolWithQuotaTag(
13476 IN POOL_TYPE PoolType,
13477 IN SIZE_T NumberOfBytes,
13478 IN ULONG Tag);
13479
13480 #ifndef POOL_TAGGING
13481 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
13482 #endif
13483
13484 NTKERNELAPI
13485 PVOID
13486 NTAPI
13487 ExAllocatePoolWithTag(
13488 IN POOL_TYPE PoolType,
13489 IN SIZE_T NumberOfBytes,
13490 IN ULONG Tag);
13491
13492 #ifndef POOL_TAGGING
13493 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
13494 #endif
13495
13496 NTKERNELAPI
13497 PVOID
13498 NTAPI
13499 ExAllocatePoolWithTagPriority(
13500 IN POOL_TYPE PoolType,
13501 IN SIZE_T NumberOfBytes,
13502 IN ULONG Tag,
13503 IN EX_POOL_PRIORITY Priority);
13504
13505 NTKERNELAPI
13506 VOID
13507 NTAPI
13508 ExConvertExclusiveToSharedLite(
13509 IN OUT PERESOURCE Resource);
13510
13511 NTKERNELAPI
13512 NTSTATUS
13513 NTAPI
13514 ExCreateCallback(
13515 OUT PCALLBACK_OBJECT *CallbackObject,
13516 IN POBJECT_ATTRIBUTES ObjectAttributes,
13517 IN BOOLEAN Create,
13518 IN BOOLEAN AllowMultipleCallbacks);
13519
13520 NTKERNELAPI
13521 VOID
13522 NTAPI
13523 ExDeleteNPagedLookasideList(
13524 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
13525
13526 NTKERNELAPI
13527 VOID
13528 NTAPI
13529 ExDeletePagedLookasideList(
13530 IN PPAGED_LOOKASIDE_LIST Lookaside);
13531
13532 NTKERNELAPI
13533 NTSTATUS
13534 NTAPI
13535 ExDeleteResourceLite(
13536 IN OUT PERESOURCE Resource);
13537
13538 NTKERNELAPI
13539 VOID
13540 NTAPI
13541 ExFreePool(
13542 IN PVOID P);
13543
13544 NTKERNELAPI
13545 VOID
13546 NTAPI
13547 ExFreePoolWithTag(
13548 IN PVOID P,
13549 IN ULONG Tag);
13550
13551 NTKERNELAPI
13552 ULONG
13553 NTAPI
13554 ExGetExclusiveWaiterCount(
13555 IN PERESOURCE Resource);
13556
13557 NTKERNELAPI
13558 KPROCESSOR_MODE
13559 NTAPI
13560 ExGetPreviousMode(VOID);
13561
13562 NTKERNELAPI
13563 ULONG
13564 NTAPI
13565 ExGetSharedWaiterCount(
13566 IN PERESOURCE Resource);
13567
13568 NTKERNELAPI
13569 VOID
13570 NTAPI
13571 ExInitializeNPagedLookasideList(
13572 IN PNPAGED_LOOKASIDE_LIST Lookaside,
13573 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13574 IN PFREE_FUNCTION Free OPTIONAL,
13575 IN ULONG Flags,
13576 IN SIZE_T Size,
13577 IN ULONG Tag,
13578 IN USHORT Depth);
13579
13580 NTKERNELAPI
13581 VOID
13582 NTAPI
13583 ExInitializePagedLookasideList(
13584 IN PPAGED_LOOKASIDE_LIST Lookaside,
13585 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13586 IN PFREE_FUNCTION Free OPTIONAL,
13587 IN ULONG Flags,
13588 IN SIZE_T Size,
13589 IN ULONG Tag,
13590 IN USHORT Depth);
13591
13592 NTKERNELAPI
13593 NTSTATUS
13594 NTAPI
13595 ExInitializeResourceLite(
13596 OUT PERESOURCE Resource);
13597
13598 NTKERNELAPI
13599 LARGE_INTEGER
13600 NTAPI
13601 ExInterlockedAddLargeInteger(
13602 IN PLARGE_INTEGER Addend,
13603 IN LARGE_INTEGER Increment,
13604 IN PKSPIN_LOCK Lock);
13605
13606 #if defined(_WIN64)
13607 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13608 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
13609 #else
13610 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13611 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
13612 #endif
13613
13614 NTKERNELAPI
13615 ULONG
13616 FASTCALL
13617 ExInterlockedAddUlong(
13618 IN PULONG Addend,
13619 IN ULONG Increment,
13620 IN OUT PKSPIN_LOCK Lock);
13621
13622 #if defined(_AMD64_) || defined(_IA64_)
13623
13624 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13625 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
13626
13627 #elif defined(_X86_)
13628
13629 NTKERNELAPI
13630 LONGLONG
13631 FASTCALL
13632 ExfInterlockedCompareExchange64(
13633 IN OUT LONGLONG volatile *Destination,
13634 IN PLONGLONG Exchange,
13635 IN PLONGLONG Comperand);
13636
13637 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13638 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
13639
13640 #else
13641
13642 NTKERNELAPI
13643 LONGLONG
13644 FASTCALL
13645 ExInterlockedCompareExchange64(
13646 IN OUT LONGLONG volatile *Destination,
13647 IN PLONGLONG Exchange,
13648 IN PLONGLONG Comparand,
13649 IN PKSPIN_LOCK Lock);
13650
13651 #endif /* defined(_AMD64_) || defined(_IA64_) */
13652
13653 NTKERNELAPI
13654 PLIST_ENTRY
13655 FASTCALL
13656 ExInterlockedInsertHeadList(
13657 IN OUT PLIST_ENTRY ListHead,
13658 IN OUT PLIST_ENTRY ListEntry,
13659 IN OUT PKSPIN_LOCK Lock);
13660
13661 NTKERNELAPI
13662 PLIST_ENTRY
13663 FASTCALL
13664 ExInterlockedInsertTailList(
13665 IN OUT PLIST_ENTRY ListHead,
13666 IN OUT PLIST_ENTRY ListEntry,
13667 IN OUT PKSPIN_LOCK Lock);
13668
13669 NTKERNELAPI
13670 PSINGLE_LIST_ENTRY
13671 FASTCALL
13672 ExInterlockedPopEntryList(
13673 IN OUT PSINGLE_LIST_ENTRY ListHead,
13674 IN OUT PKSPIN_LOCK Lock);
13675
13676 NTKERNELAPI
13677 PSINGLE_LIST_ENTRY
13678 FASTCALL
13679 ExInterlockedPushEntryList(
13680 IN OUT PSINGLE_LIST_ENTRY ListHead,
13681 IN OUT PSINGLE_LIST_ENTRY ListEntry,
13682 IN OUT PKSPIN_LOCK Lock);
13683
13684 NTKERNELAPI
13685 PLIST_ENTRY
13686 FASTCALL
13687 ExInterlockedRemoveHeadList(
13688 IN OUT PLIST_ENTRY ListHead,
13689 IN OUT PKSPIN_LOCK Lock);
13690
13691 NTKERNELAPI
13692 BOOLEAN
13693 NTAPI
13694 ExIsProcessorFeaturePresent(
13695 IN ULONG ProcessorFeature);
13696
13697 NTKERNELAPI
13698 BOOLEAN
13699 NTAPI
13700 ExIsResourceAcquiredExclusiveLite(
13701 IN PERESOURCE Resource);
13702
13703 NTKERNELAPI
13704 ULONG
13705 NTAPI
13706 ExIsResourceAcquiredSharedLite(
13707 IN PERESOURCE Resource);
13708
13709 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
13710
13711 NTKERNELAPI
13712 VOID
13713 NTAPI
13714 ExLocalTimeToSystemTime(
13715 IN PLARGE_INTEGER LocalTime,
13716 OUT PLARGE_INTEGER SystemTime);
13717
13718 NTKERNELAPI
13719 VOID
13720 NTAPI
13721 ExNotifyCallback(
13722 IN PCALLBACK_OBJECT CallbackObject,
13723 IN PVOID Argument1 OPTIONAL,
13724 IN PVOID Argument2 OPTIONAL);
13725
13726 NTKERNELAPI
13727 VOID
13728 NTAPI
13729 ExQueueWorkItem(
13730 IN OUT PWORK_QUEUE_ITEM WorkItem,
13731 IN WORK_QUEUE_TYPE QueueType);
13732
13733 NTKERNELAPI
13734 DECLSPEC_NORETURN
13735 VOID
13736 NTAPI
13737 ExRaiseStatus(
13738 IN NTSTATUS Status);
13739
13740 NTKERNELAPI
13741 PVOID
13742 NTAPI
13743 ExRegisterCallback(
13744 IN PCALLBACK_OBJECT CallbackObject,
13745 IN PCALLBACK_FUNCTION CallbackFunction,
13746 IN PVOID CallbackContext OPTIONAL);
13747
13748 NTKERNELAPI
13749 NTSTATUS
13750 NTAPI
13751 ExReinitializeResourceLite(
13752 IN OUT PERESOURCE Resource);
13753
13754 NTKERNELAPI
13755 VOID
13756 NTAPI
13757 ExReleaseResourceForThreadLite(
13758 IN OUT PERESOURCE Resource,
13759 IN ERESOURCE_THREAD ResourceThreadId);
13760
13761 NTKERNELAPI
13762 VOID
13763 FASTCALL
13764 ExReleaseResourceLite(
13765 IN OUT PERESOURCE Resource);
13766
13767 NTKERNELAPI
13768 VOID
13769 NTAPI
13770 ExSetResourceOwnerPointer(
13771 IN OUT PERESOURCE Resource,
13772 IN PVOID OwnerPointer);
13773
13774 NTKERNELAPI
13775 ULONG
13776 NTAPI
13777 ExSetTimerResolution(
13778 IN ULONG DesiredTime,
13779 IN BOOLEAN SetResolution);
13780
13781 NTKERNELAPI
13782 VOID
13783 NTAPI
13784 ExSystemTimeToLocalTime(
13785 IN PLARGE_INTEGER SystemTime,
13786 OUT PLARGE_INTEGER LocalTime);
13787
13788 NTKERNELAPI
13789 VOID
13790 NTAPI
13791 ExUnregisterCallback(
13792 IN OUT PVOID CbRegistration);
13793
13794 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13795
13796 #if (NTDDI_VERSION >= NTDDI_WINXP)
13797
13798 NTKERNELAPI
13799 BOOLEAN
13800 FASTCALL
13801 ExAcquireRundownProtection(
13802 IN OUT PEX_RUNDOWN_REF RunRef);
13803
13804 NTKERNELAPI
13805 VOID
13806 FASTCALL
13807 ExInitializeRundownProtection(
13808 OUT PEX_RUNDOWN_REF RunRef);
13809
13810 NTKERNELAPI
13811 VOID
13812 FASTCALL
13813 ExReInitializeRundownProtection(
13814 IN OUT PEX_RUNDOWN_REF RunRef);
13815
13816 NTKERNELAPI
13817 VOID
13818 FASTCALL
13819 ExReleaseRundownProtection(
13820 IN OUT PEX_RUNDOWN_REF RunRef);
13821
13822 NTKERNELAPI
13823 VOID
13824 FASTCALL
13825 ExRundownCompleted(
13826 OUT PEX_RUNDOWN_REF RunRef);
13827
13828 NTKERNELAPI
13829 BOOLEAN
13830 NTAPI
13831 ExVerifySuite(
13832 IN SUITE_TYPE SuiteType);
13833
13834 NTKERNELAPI
13835 VOID
13836 FASTCALL
13837 ExWaitForRundownProtectionRelease(
13838 IN OUT PEX_RUNDOWN_REF RunRef);
13839 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13840
13841 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
13842
13843 NTKERNELAPI
13844 BOOLEAN
13845 FASTCALL
13846 ExAcquireRundownProtectionEx(
13847 IN OUT PEX_RUNDOWN_REF RunRef,
13848 IN ULONG Count);
13849
13850 NTKERNELAPI
13851 VOID
13852 FASTCALL
13853 ExReleaseRundownProtectionEx(
13854 IN OUT PEX_RUNDOWN_REF RunRef,
13855 IN ULONG Count);
13856
13857 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
13858
13859 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
13860
13861 NTKERNELAPI
13862 PEX_RUNDOWN_REF_CACHE_AWARE
13863 NTAPI
13864 ExAllocateCacheAwareRundownProtection(
13865 IN POOL_TYPE PoolType,
13866 IN ULONG PoolTag);
13867
13868 NTKERNELAPI
13869 SIZE_T
13870 NTAPI
13871 ExSizeOfRundownProtectionCacheAware(VOID);
13872
13873 NTKERNELAPI
13874 PVOID
13875 NTAPI
13876 ExEnterCriticalRegionAndAcquireResourceShared(
13877 IN OUT PERESOURCE Resource);
13878
13879 NTKERNELAPI
13880 PVOID
13881 NTAPI
13882 ExEnterCriticalRegionAndAcquireResourceExclusive(
13883 IN OUT PERESOURCE Resource);
13884
13885 NTKERNELAPI
13886 PVOID
13887 NTAPI
13888 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
13889 IN OUT PERESOURCE Resource);
13890
13891 NTKERNELAPI
13892 VOID
13893 FASTCALL
13894 ExReleaseResourceAndLeaveCriticalRegion(
13895 IN OUT PERESOURCE Resource);
13896
13897 NTKERNELAPI
13898 VOID
13899 NTAPI
13900 ExInitializeRundownProtectionCacheAware(
13901 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13902 IN SIZE_T RunRefSize);
13903
13904 NTKERNELAPI
13905 VOID
13906 NTAPI
13907 ExFreeCacheAwareRundownProtection(
13908 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13909
13910 NTKERNELAPI
13911 BOOLEAN
13912 FASTCALL
13913 ExAcquireRundownProtectionCacheAware(
13914 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13915
13916 NTKERNELAPI
13917 VOID
13918 FASTCALL
13919 ExReleaseRundownProtectionCacheAware(
13920 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13921
13922 NTKERNELAPI
13923 BOOLEAN
13924 FASTCALL
13925 ExAcquireRundownProtectionCacheAwareEx(
13926 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13927 IN ULONG Count);
13928
13929 NTKERNELAPI
13930 VOID
13931 FASTCALL
13932 ExReleaseRundownProtectionCacheAwareEx(
13933 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
13934 IN ULONG Count);
13935
13936 NTKERNELAPI
13937 VOID
13938 FASTCALL
13939 ExWaitForRundownProtectionReleaseCacheAware(
13940 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
13941
13942 NTKERNELAPI
13943 VOID
13944 FASTCALL
13945 ExReInitializeRundownProtectionCacheAware(
13946 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13947
13948 NTKERNELAPI
13949 VOID
13950 FASTCALL
13951 ExRundownCompletedCacheAware(
13952 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13953
13954 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
13955
13956 #if (NTDDI_VERSION >= NTDDI_VISTA)
13957
13958 NTKERNELAPI
13959 NTSTATUS
13960 NTAPI
13961 ExInitializeLookasideListEx(
13962 OUT PLOOKASIDE_LIST_EX Lookaside,
13963 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
13964 IN PFREE_FUNCTION_EX Free OPTIONAL,
13965 IN POOL_TYPE PoolType,
13966 IN ULONG Flags,
13967 IN SIZE_T Size,
13968 IN ULONG Tag,
13969 IN USHORT Depth);
13970
13971 NTKERNELAPI
13972 VOID
13973 NTAPI
13974 ExDeleteLookasideListEx(
13975 IN OUT PLOOKASIDE_LIST_EX Lookaside);
13976
13977 NTKERNELAPI
13978 VOID
13979 NTAPI
13980 ExFlushLookasideListEx(
13981 IN OUT PLOOKASIDE_LIST_EX Lookaside);
13982
13983 FORCEINLINE
13984 PVOID
13985 ExAllocateFromLookasideListEx(
13986 IN OUT PLOOKASIDE_LIST_EX Lookaside)
13987 {
13988 PVOID Entry;
13989
13990 Lookaside->L.TotalAllocates += 1;
13991 #ifdef NONAMELESSUNION
13992 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
13993 if (Entry == NULL) {
13994 Lookaside->L.u2.AllocateMisses += 1;
13995 Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
13996 Lookaside->L.Size,
13997 Lookaside->L.Tag,
13998 Lookaside);
13999 }
14000 #else /* NONAMELESSUNION */
14001 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14002 if (Entry == NULL) {
14003 Lookaside->L.AllocateMisses += 1;
14004 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
14005 Lookaside->L.Size,
14006 Lookaside->L.Tag,
14007 Lookaside);
14008 }
14009 #endif /* NONAMELESSUNION */
14010 return Entry;
14011 }
14012
14013 FORCEINLINE
14014 VOID
14015 ExFreeToLookasideListEx(
14016 IN OUT PLOOKASIDE_LIST_EX Lookaside,
14017 IN PVOID Entry)
14018 {
14019 Lookaside->L.TotalFrees += 1;
14020 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14021 Lookaside->L.FreeMisses += 1;
14022 (Lookaside->L.FreeEx)(Entry, Lookaside);
14023 } else {
14024 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14025 }
14026 return;
14027 }
14028
14029 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14030
14031 #if (NTDDI_VERSION >= NTDDI_WIN7)
14032
14033 NTKERNELAPI
14034 VOID
14035 NTAPI
14036 ExSetResourceOwnerPointerEx(
14037 IN OUT PERESOURCE Resource,
14038 IN PVOID OwnerPointer,
14039 IN ULONG Flags);
14040
14041 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
14042
14043 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14044
14045 static __inline PVOID
14046 ExAllocateFromNPagedLookasideList(
14047 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
14048 {
14049 PVOID Entry;
14050
14051 Lookaside->L.TotalAllocates++;
14052 #ifdef NONAMELESSUNION
14053 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14054 Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
14055 &Lookaside->Lock__ObsoleteButDoNotDelete);
14056 #else
14057 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
14058 #endif
14059 if (Entry == NULL) {
14060 Lookaside->L.u2.AllocateMisses++;
14061 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
14062 Lookaside->L.Size,
14063 Lookaside->L.Tag);
14064 }
14065 #else /* NONAMELESSUNION */
14066 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14067 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
14068 &Lookaside->Lock__ObsoleteButDoNotDelete);
14069 #else
14070 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14071 #endif
14072 if (Entry == NULL) {
14073 Lookaside->L.AllocateMisses++;
14074 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
14075 Lookaside->L.Size,
14076 Lookaside->L.Tag);
14077 }
14078 #endif /* NONAMELESSUNION */
14079 return Entry;
14080 }
14081
14082 static __inline VOID
14083 ExFreeToNPagedLookasideList(
14084 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
14085 IN PVOID Entry)
14086 {
14087 Lookaside->L.TotalFrees++;
14088 #ifdef NONAMELESSUNION
14089 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
14090 Lookaside->L.u3.FreeMisses++;
14091 (Lookaside->L.u5.Free)(Entry);
14092 } else {
14093 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14094 ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
14095 (PSLIST_ENTRY)Entry,
14096 &Lookaside->Lock__ObsoleteButDoNotDelete);
14097 #else
14098 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
14099 #endif
14100 }
14101 #else /* NONAMELESSUNION */
14102 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14103 Lookaside->L.FreeMisses++;
14104 (Lookaside->L.Free)(Entry);
14105 } else {
14106 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14107 ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
14108 (PSLIST_ENTRY)Entry,
14109 &Lookaside->Lock__ObsoleteButDoNotDelete);
14110 #else
14111 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14112 #endif
14113 }
14114 #endif /* NONAMELESSUNION */
14115 }
14116
14117 /******************************************************************************
14118 * Object Manager Functions *
14119 ******************************************************************************/
14120
14121 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14122 NTKERNELAPI
14123 LONG_PTR
14124 FASTCALL
14125 ObfDereferenceObject(
14126 IN PVOID Object);
14127 #define ObDereferenceObject ObfDereferenceObject
14128
14129 NTKERNELAPI
14130 NTSTATUS
14131 NTAPI
14132 ObGetObjectSecurity(
14133 IN PVOID Object,
14134 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
14135 OUT PBOOLEAN MemoryAllocated);
14136
14137 NTKERNELAPI
14138 LONG_PTR
14139 FASTCALL
14140 ObfReferenceObject(
14141 IN PVOID Object);
14142 #define ObReferenceObject ObfReferenceObject
14143
14144 NTKERNELAPI
14145 NTSTATUS
14146 NTAPI
14147 ObReferenceObjectByHandle(
14148 IN HANDLE Handle,
14149 IN ACCESS_MASK DesiredAccess,
14150 IN POBJECT_TYPE ObjectType OPTIONAL,
14151 IN KPROCESSOR_MODE AccessMode,
14152 OUT PVOID *Object,
14153 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14154
14155 NTKERNELAPI
14156 NTSTATUS
14157 NTAPI
14158 ObReferenceObjectByPointer(
14159 IN PVOID Object,
14160 IN ACCESS_MASK DesiredAccess,
14161 IN POBJECT_TYPE ObjectType OPTIONAL,
14162 IN KPROCESSOR_MODE AccessMode);
14163
14164 NTKERNELAPI
14165 VOID
14166 NTAPI
14167 ObReleaseObjectSecurity(
14168 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
14169 IN BOOLEAN MemoryAllocated);
14170 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14171
14172 #if (NTDDI_VERSION >= NTDDI_VISTA)
14173 NTKERNELAPI
14174 VOID
14175 NTAPI
14176 ObDereferenceObjectDeferDelete(
14177 IN PVOID Object);
14178 #endif
14179
14180 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
14181 NTKERNELAPI
14182 NTSTATUS
14183 NTAPI
14184 ObRegisterCallbacks(
14185 IN POB_CALLBACK_REGISTRATION CallbackRegistration,
14186 OUT PVOID *RegistrationHandle);
14187
14188 NTKERNELAPI
14189 VOID
14190 NTAPI
14191 ObUnRegisterCallbacks(
14192 IN PVOID RegistrationHandle);
14193
14194 NTKERNELAPI
14195 USHORT
14196 NTAPI
14197 ObGetFilterVersion(VOID);
14198
14199 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
14200
14201 #if (NTDDI_VERSION >= NTDDI_WIN7)
14202 NTKERNELAPI
14203 NTSTATUS
14204 NTAPI
14205 ObReferenceObjectByHandleWithTag(
14206 IN HANDLE Handle,
14207 IN ACCESS_MASK DesiredAccess,
14208 IN POBJECT_TYPE ObjectType OPTIONAL,
14209 IN KPROCESSOR_MODE AccessMode,
14210 IN ULONG Tag,
14211 OUT PVOID *Object,
14212 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14213
14214 NTKERNELAPI
14215 LONG_PTR
14216 FASTCALL
14217 ObfReferenceObjectWithTag(
14218 IN PVOID Object,
14219 IN ULONG Tag);
14220
14221 NTKERNELAPI
14222 NTSTATUS
14223 NTAPI
14224 ObReferenceObjectByPointerWithTag(
14225 IN PVOID Object,
14226 IN ACCESS_MASK DesiredAccess,
14227 IN POBJECT_TYPE ObjectType OPTIONAL,
14228 IN KPROCESSOR_MODE AccessMode,
14229 IN ULONG Tag);
14230
14231 NTKERNELAPI
14232 LONG_PTR
14233 FASTCALL
14234 ObfDereferenceObjectWithTag(
14235 IN PVOID Object,
14236 IN ULONG Tag);
14237
14238 NTKERNELAPI
14239 VOID
14240 NTAPI
14241 ObDereferenceObjectDeferDeleteWithTag(
14242 IN PVOID Object,
14243 IN ULONG Tag);
14244
14245 #define ObDereferenceObject ObfDereferenceObject
14246 #define ObReferenceObject ObfReferenceObject
14247 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
14248 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
14249 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14250
14251 /******************************************************************************
14252 * Process Manager Functions *
14253 ******************************************************************************/
14254
14255 NTKERNELAPI
14256 NTSTATUS
14257 NTAPI
14258 PsWrapApcWow64Thread(
14259 IN OUT PVOID *ApcContext,
14260 IN OUT PVOID *ApcRoutine);
14261
14262 /*
14263 * PEPROCESS
14264 * PsGetCurrentProcess(VOID)
14265 */
14266 #define PsGetCurrentProcess IoGetCurrentProcess
14267
14268 #if !defined(_PSGETCURRENTTHREAD_)
14269 #define _PSGETCURRENTTHREAD_
14270 FORCEINLINE
14271 PETHREAD
14272 NTAPI
14273 PsGetCurrentThread(VOID)
14274 {
14275 return (PETHREAD)KeGetCurrentThread();
14276 }
14277 #endif /* !_PSGETCURRENTTHREAD_ */
14278
14279
14280 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14281
14282 NTKERNELAPI
14283 NTSTATUS
14284 NTAPI
14285 PsCreateSystemThread(
14286 OUT PHANDLE ThreadHandle,
14287 IN ULONG DesiredAccess,
14288 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14289 IN HANDLE ProcessHandle OPTIONAL,
14290 OUT PCLIENT_ID ClientId OPTIONAL,
14291 IN PKSTART_ROUTINE StartRoutine,
14292 IN PVOID StartContext OPTIONAL);
14293
14294 NTKERNELAPI
14295 NTSTATUS
14296 NTAPI
14297 PsTerminateSystemThread(
14298 IN NTSTATUS ExitStatus);
14299
14300 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14301
14302
14303 /******************************************************************************
14304 * WMI Library Support Functions *
14305 ******************************************************************************/
14306
14307 #ifdef RUN_WPP
14308 #if (NTDDI_VERSION >= NTDDI_WINXP)
14309 NTKERNELAPI
14310 NTSTATUS
14311 __cdecl
14312 WmiTraceMessage(
14313 IN TRACEHANDLE LoggerHandle,
14314 IN ULONG MessageFlags,
14315 IN LPGUID MessageGuid,
14316 IN USHORT MessageNumber,
14317 IN ...);
14318 #endif
14319 #endif /* RUN_WPP */
14320
14321 #if (NTDDI_VERSION >= NTDDI_WINXP)
14322
14323 NTKERNELAPI
14324 NTSTATUS
14325 NTAPI
14326 WmiQueryTraceInformation(
14327 IN TRACE_INFORMATION_CLASS TraceInformationClass,
14328 OUT PVOID TraceInformation,
14329 IN ULONG TraceInformationLength,
14330 OUT PULONG RequiredLength OPTIONAL,
14331 IN PVOID Buffer OPTIONAL);
14332
14333 #if 0
14334 /* FIXME: Get va_list from where? */
14335 NTKERNELAPI
14336 NTSTATUS
14337 NTAPI
14338 WmiTraceMessageVa(
14339 IN TRACEHANDLE LoggerHandle,
14340 IN ULONG MessageFlags,
14341 IN LPGUID MessageGuid,
14342 IN USHORT MessageNumber,
14343 IN va_list MessageArgList);
14344 #endif
14345
14346 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14347
14348 #ifndef TRACE_INFORMATION_CLASS_DEFINE
14349
14350 #if (NTDDI_VERSION >= NTDDI_WINXP)
14351 NTKERNELAPI
14352 NTSTATUS
14353 NTAPI
14354 WmiQueryTraceInformation(
14355 IN TRACE_INFORMATION_CLASS TraceInformationClass,
14356 OUT PVOID TraceInformation,
14357 IN ULONG TraceInformationLength,
14358 OUT PULONG RequiredLength OPTIONAL,
14359 IN PVOID Buffer OPTIONAL);
14360 #endif
14361
14362 #define TRACE_INFORMATION_CLASS_DEFINE
14363
14364 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
14365
14366 #if (NTDDI_VERSION >= NTDDI_VISTA)
14367
14368 NTSTATUS
14369 NTKERNELAPI
14370 NTAPI
14371 EtwRegister(
14372 IN LPCGUID ProviderId,
14373 IN PETWENABLECALLBACK EnableCallback OPTIONAL,
14374 IN PVOID CallbackContext OPTIONAL,
14375 OUT PREGHANDLE RegHandle);
14376
14377 NTSTATUS
14378 NTKERNELAPI
14379 NTAPI
14380 EtwUnregister(
14381 IN REGHANDLE RegHandle);
14382
14383 BOOLEAN
14384 NTKERNELAPI
14385 NTAPI
14386 EtwEventEnabled(
14387 IN REGHANDLE RegHandle,
14388 IN PCEVENT_DESCRIPTOR EventDescriptor);
14389
14390 BOOLEAN
14391 NTKERNELAPI
14392 NTAPI
14393 EtwProviderEnabled(
14394 IN REGHANDLE RegHandle,
14395 IN UCHAR Level,
14396 IN ULONGLONG Keyword);
14397
14398 NTSTATUS
14399 NTKERNELAPI
14400 NTAPI
14401 EtwActivityIdControl(
14402 IN ULONG ControlCode,
14403 IN OUT LPGUID ActivityId);
14404
14405 NTSTATUS
14406 NTKERNELAPI
14407 NTAPI
14408 EtwWrite(
14409 IN REGHANDLE RegHandle,
14410 IN PCEVENT_DESCRIPTOR EventDescriptor,
14411 IN LPCGUID ActivityId OPTIONAL,
14412 IN ULONG UserDataCount,
14413 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14414
14415 NTSTATUS
14416 NTKERNELAPI
14417 NTAPI
14418 EtwWriteTransfer(
14419 IN REGHANDLE RegHandle,
14420 IN PCEVENT_DESCRIPTOR EventDescriptor,
14421 IN LPCGUID ActivityId OPTIONAL,
14422 IN LPCGUID RelatedActivityId OPTIONAL,
14423 IN ULONG UserDataCount,
14424 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14425
14426 NTSTATUS
14427 NTKERNELAPI
14428 NTAPI
14429 EtwWriteString(
14430 IN REGHANDLE RegHandle,
14431 IN UCHAR Level,
14432 IN ULONGLONG Keyword,
14433 IN LPCGUID ActivityId OPTIONAL,
14434 IN PCWSTR String);
14435
14436 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14437
14438 #if (NTDDI_VERSION >= NTDDI_WIN7)
14439 NTSTATUS
14440 NTKERNELAPI
14441 NTAPI
14442 EtwWriteEx(
14443 IN REGHANDLE RegHandle,
14444 IN PCEVENT_DESCRIPTOR EventDescriptor,
14445 IN ULONG64 Filter,
14446 IN ULONG Flags,
14447 IN LPCGUID ActivityId OPTIONAL,
14448 IN LPCGUID RelatedActivityId OPTIONAL,
14449 IN ULONG UserDataCount,
14450 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14451 #endif
14452
14453
14454
14455 /******************************************************************************
14456 * Kernel Debugger Functions *
14457 ******************************************************************************/
14458
14459 #ifndef _DBGNT_
14460
14461 ULONG
14462 __cdecl
14463 DbgPrint(
14464 IN PCSTR Format,
14465 IN ...);
14466
14467 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14468 NTSYSAPI
14469 ULONG
14470 __cdecl
14471 DbgPrintReturnControlC(
14472 IN PCCH Format,
14473 IN ...);
14474 #endif
14475
14476 #if (NTDDI_VERSION >= NTDDI_WINXP)
14477
14478 NTSYSAPI
14479 ULONG
14480 __cdecl
14481 DbgPrintEx(
14482 IN ULONG ComponentId,
14483 IN ULONG Level,
14484 IN PCSTR Format,
14485 IN ...);
14486
14487 #ifdef _VA_LIST_DEFINED
14488
14489 NTSYSAPI
14490 ULONG
14491 NTAPI
14492 vDbgPrintEx(
14493 IN ULONG ComponentId,
14494 IN ULONG Level,
14495 IN PCCH Format,
14496 IN va_list ap);
14497
14498 NTSYSAPI
14499 ULONG
14500 NTAPI
14501 vDbgPrintExWithPrefix(
14502 IN PCCH Prefix,
14503 IN ULONG ComponentId,
14504 IN ULONG Level,
14505 IN PCCH Format,
14506 IN va_list ap);
14507
14508 #endif /* _VA_LIST_DEFINED */
14509
14510 NTSYSAPI
14511 NTSTATUS
14512 NTAPI
14513 DbgQueryDebugFilterState(
14514 IN ULONG ComponentId,
14515 IN ULONG Level);
14516
14517 NTSYSAPI
14518 NTSTATUS
14519 NTAPI
14520 DbgSetDebugFilterState(
14521 IN ULONG ComponentId,
14522 IN ULONG Level,
14523 IN BOOLEAN State);
14524
14525 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14526
14527 #if (NTDDI_VERSION >= NTDDI_VISTA)
14528
14529 typedef VOID
14530 (*PDEBUG_PRINT_CALLBACK)(
14531 IN PSTRING Output,
14532 IN ULONG ComponentId,
14533 IN ULONG Level);
14534
14535 NTSYSAPI
14536 NTSTATUS
14537 NTAPI
14538 DbgSetDebugPrintCallback(
14539 IN PDEBUG_PRINT_CALLBACK DebugPrintCallback,
14540 IN BOOLEAN Enable);
14541
14542 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14543
14544 #endif /* _DBGNT_ */
14545
14546 #if DBG
14547
14548 #define KdPrint(_x_) DbgPrint _x_
14549 #define KdPrintEx(_x_) DbgPrintEx _x_
14550 #define vKdPrintEx(_x_) vDbgPrintEx _x_
14551 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
14552 #define KdBreakPoint() DbgBreakPoint()
14553 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
14554
14555 #else /* !DBG */
14556
14557 #define KdPrint(_x_)
14558 #define KdPrintEx(_x_)
14559 #define vKdPrintEx(_x_)
14560 #define vKdPrintExWithPrefix(_x_)
14561 #define KdBreakPoint()
14562 #define KdBreakPointWithStatus(s)
14563
14564 #endif /* !DBG */
14565
14566 #if defined(__GNUC__)
14567
14568 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
14569 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
14570 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14571 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14572
14573 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
14574
14575 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
14576 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
14577 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
14578 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
14579
14580 #else
14581
14582 extern BOOLEAN KdDebuggerNotPresent;
14583 extern BOOLEAN KdDebuggerEnabled;
14584 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14585 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14586
14587 #endif
14588
14589 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14590
14591 NTKERNELAPI
14592 NTSTATUS
14593 NTAPI
14594 KdDisableDebugger(VOID);
14595
14596 NTKERNELAPI
14597 NTSTATUS
14598 NTAPI
14599 KdEnableDebugger(VOID);
14600
14601 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
14602 #define DbgBreakPoint __debugbreak
14603 #else
14604 VOID
14605 NTAPI
14606 DbgBreakPoint(VOID);
14607 #endif
14608
14609 NTSYSAPI
14610 VOID
14611 NTAPI
14612 DbgBreakPointWithStatus(
14613 IN ULONG Status);
14614
14615 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14616
14617 #if (NTDDI_VERSION >= NTDDI_WS03)
14618 NTKERNELAPI
14619 BOOLEAN
14620 NTAPI
14621 KdRefreshDebuggerNotPresent(VOID);
14622 #endif
14623
14624 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
14625 NTKERNELAPI
14626 NTSTATUS
14627 NTAPI
14628 KdChangeOption(
14629 IN KD_OPTION Option,
14630 IN ULONG InBufferBytes OPTIONAL,
14631 IN PVOID InBuffer,
14632 IN ULONG OutBufferBytes OPTIONAL,
14633 OUT PVOID OutBuffer,
14634 OUT PULONG OutBufferNeeded OPTIONAL);
14635 #endif
14636 /* Hardware Abstraction Layer Functions */
14637
14638 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14639
14640 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
14641
14642 FORCEINLINE
14643 PVOID
14644 NTAPI
14645 HalAllocateCommonBuffer(
14646 IN PDMA_ADAPTER DmaAdapter,
14647 IN ULONG Length,
14648 OUT PPHYSICAL_ADDRESS LogicalAddress,
14649 IN BOOLEAN CacheEnabled)
14650 {
14651 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
14652 PVOID commonBuffer;
14653
14654 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
14655 ASSERT( allocateCommonBuffer != NULL );
14656 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
14657 return commonBuffer;
14658 }
14659
14660 FORCEINLINE
14661 VOID
14662 NTAPI
14663 HalFreeCommonBuffer(
14664 IN PDMA_ADAPTER DmaAdapter,
14665 IN ULONG Length,
14666 IN PHYSICAL_ADDRESS LogicalAddress,
14667 IN PVOID VirtualAddress,
14668 IN BOOLEAN CacheEnabled)
14669 {
14670 PFREE_COMMON_BUFFER freeCommonBuffer;
14671
14672 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
14673 ASSERT( freeCommonBuffer != NULL );
14674 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
14675 }
14676
14677 FORCEINLINE
14678 ULONG
14679 NTAPI
14680 HalReadDmaCounter(
14681 IN PDMA_ADAPTER DmaAdapter)
14682 {
14683 PREAD_DMA_COUNTER readDmaCounter;
14684 ULONG counter;
14685
14686 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
14687 ASSERT( readDmaCounter != NULL );
14688 counter = readDmaCounter( DmaAdapter );
14689 return counter;
14690 }
14691
14692 FORCEINLINE
14693 ULONG
14694 HalGetDmaAlignment(
14695 IN PDMA_ADAPTER DmaAdapter)
14696 {
14697 PGET_DMA_ALIGNMENT getDmaAlignment;
14698 ULONG alignment;
14699
14700 getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
14701 ASSERT( getDmaAlignment != NULL );
14702 alignment = getDmaAlignment( DmaAdapter );
14703 return alignment;
14704 }
14705
14706 #endif /* USE_DMA_MACROS ... */
14707
14708 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14709
14710 #ifndef _NTTMAPI_
14711 #define _NTTMAPI_
14712
14713 #include <ktmtypes.h>
14714
14715 #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
14716 #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
14717 #define TRANSACTIONMANAGER_RECOVER (0x0004)
14718 #define TRANSACTIONMANAGER_RENAME (0x0008)
14719 #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
14720 #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
14721
14722 #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14723 TRANSACTIONMANAGER_QUERY_INFORMATION)
14724
14725 #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14726 TRANSACTIONMANAGER_SET_INFORMATION |\
14727 TRANSACTIONMANAGER_RECOVER |\
14728 TRANSACTIONMANAGER_RENAME |\
14729 TRANSACTIONMANAGER_CREATE_RM)
14730
14731 #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
14732
14733 #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14734 TRANSACTIONMANAGER_GENERIC_READ |\
14735 TRANSACTIONMANAGER_GENERIC_WRITE |\
14736 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
14737 TRANSACTIONMANAGER_BIND_TRANSACTION)
14738
14739 #define TRANSACTION_QUERY_INFORMATION (0x0001)
14740 #define TRANSACTION_SET_INFORMATION (0x0002)
14741 #define TRANSACTION_ENLIST (0x0004)
14742 #define TRANSACTION_COMMIT (0x0008)
14743 #define TRANSACTION_ROLLBACK (0x0010)
14744 #define TRANSACTION_PROPAGATE (0x0020)
14745 #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
14746
14747 #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
14748 TRANSACTION_QUERY_INFORMATION |\
14749 SYNCHRONIZE)
14750
14751 #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14752 TRANSACTION_SET_INFORMATION |\
14753 TRANSACTION_COMMIT |\
14754 TRANSACTION_ENLIST |\
14755 TRANSACTION_ROLLBACK |\
14756 TRANSACTION_PROPAGATE |\
14757 SYNCHRONIZE)
14758
14759 #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14760 TRANSACTION_COMMIT |\
14761 TRANSACTION_ROLLBACK |\
14762 SYNCHRONIZE)
14763
14764 #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14765 TRANSACTION_GENERIC_READ |\
14766 TRANSACTION_GENERIC_WRITE |\
14767 TRANSACTION_GENERIC_EXECUTE)
14768
14769 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
14770 STANDARD_RIGHTS_WRITE |\
14771 TRANSACTION_SET_INFORMATION |\
14772 TRANSACTION_ENLIST |\
14773 TRANSACTION_ROLLBACK |\
14774 TRANSACTION_PROPAGATE |\
14775 SYNCHRONIZE)
14776
14777 #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
14778 #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
14779 #define RESOURCEMANAGER_RECOVER (0x0004)
14780 #define RESOURCEMANAGER_ENLIST (0x0008)
14781 #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
14782 #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
14783 #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
14784
14785 #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14786 RESOURCEMANAGER_QUERY_INFORMATION |\
14787 SYNCHRONIZE)
14788
14789 #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14790 RESOURCEMANAGER_SET_INFORMATION |\
14791 RESOURCEMANAGER_RECOVER |\
14792 RESOURCEMANAGER_ENLIST |\
14793 RESOURCEMANAGER_GET_NOTIFICATION |\
14794 RESOURCEMANAGER_REGISTER_PROTOCOL |\
14795 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14796 SYNCHRONIZE)
14797
14798 #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14799 RESOURCEMANAGER_RECOVER |\
14800 RESOURCEMANAGER_ENLIST |\
14801 RESOURCEMANAGER_GET_NOTIFICATION |\
14802 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14803 SYNCHRONIZE)
14804
14805 #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14806 RESOURCEMANAGER_GENERIC_READ |\
14807 RESOURCEMANAGER_GENERIC_WRITE |\
14808 RESOURCEMANAGER_GENERIC_EXECUTE)
14809
14810 #define ENLISTMENT_QUERY_INFORMATION (0x0001)
14811 #define ENLISTMENT_SET_INFORMATION (0x0002)
14812 #define ENLISTMENT_RECOVER (0x0004)
14813 #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
14814 #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
14815
14816 #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
14817 ENLISTMENT_QUERY_INFORMATION)
14818
14819 #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14820 ENLISTMENT_SET_INFORMATION |\
14821 ENLISTMENT_RECOVER |\
14822 ENLISTMENT_SUBORDINATE_RIGHTS |\
14823 ENLISTMENT_SUPERIOR_RIGHTS)
14824
14825 #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14826 ENLISTMENT_RECOVER |\
14827 ENLISTMENT_SUBORDINATE_RIGHTS |\
14828 ENLISTMENT_SUPERIOR_RIGHTS)
14829
14830 #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14831 ENLISTMENT_GENERIC_READ |\
14832 ENLISTMENT_GENERIC_WRITE |\
14833 ENLISTMENT_GENERIC_EXECUTE)
14834
14835 typedef enum _TRANSACTION_OUTCOME {
14836 TransactionOutcomeUndetermined = 1,
14837 TransactionOutcomeCommitted,
14838 TransactionOutcomeAborted,
14839 } TRANSACTION_OUTCOME;
14840
14841
14842 typedef enum _TRANSACTION_STATE {
14843 TransactionStateNormal = 1,
14844 TransactionStateIndoubt,
14845 TransactionStateCommittedNotify,
14846 } TRANSACTION_STATE;
14847
14848
14849 typedef struct _TRANSACTION_BASIC_INFORMATION {
14850 GUID TransactionId;
14851 ULONG State;
14852 ULONG Outcome;
14853 } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
14854
14855 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
14856 GUID TmIdentity;
14857 LARGE_INTEGER VirtualClock;
14858 } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
14859
14860 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
14861 GUID LogIdentity;
14862 } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
14863
14864 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
14865 ULONG LogPathLength;
14866 WCHAR LogPath[1];
14867 } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
14868
14869 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
14870 ULONGLONG LastRecoveredLsn;
14871 } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
14872
14873 typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
14874 ULONG IsolationLevel;
14875 ULONG IsolationFlags;
14876 LARGE_INTEGER Timeout;
14877 ULONG Outcome;
14878 ULONG DescriptionLength;
14879 WCHAR Description[1];
14880 } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
14881
14882 typedef struct _TRANSACTION_BIND_INFORMATION {
14883 HANDLE TmHandle;
14884 } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
14885
14886 typedef struct _TRANSACTION_ENLISTMENT_PAIR {
14887 GUID EnlistmentId;
14888 GUID ResourceManagerId;
14889 } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
14890
14891 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
14892 ULONG NumberOfEnlistments;
14893 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
14894 } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
14895
14896 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
14897 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
14898 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
14899
14900 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
14901 GUID ResourceManagerId;
14902 ULONG DescriptionLength;
14903 WCHAR Description[1];
14904 } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
14905
14906 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
14907 HANDLE IoCompletionPortHandle;
14908 ULONG_PTR CompletionKey;
14909 } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
14910
14911 typedef enum _KTMOBJECT_TYPE {
14912 KTMOBJECT_TRANSACTION,
14913 KTMOBJECT_TRANSACTION_MANAGER,
14914 KTMOBJECT_RESOURCE_MANAGER,
14915 KTMOBJECT_ENLISTMENT,
14916 KTMOBJECT_INVALID
14917 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
14918
14919 typedef struct _KTMOBJECT_CURSOR {
14920 GUID LastQuery;
14921 ULONG ObjectIdCount;
14922 GUID ObjectIds[1];
14923 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
14924
14925 typedef enum _TRANSACTION_INFORMATION_CLASS {
14926 TransactionBasicInformation,
14927 TransactionPropertiesInformation,
14928 TransactionEnlistmentInformation,
14929 TransactionSuperiorEnlistmentInformation
14930 } TRANSACTION_INFORMATION_CLASS;
14931
14932 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
14933 TransactionManagerBasicInformation,
14934 TransactionManagerLogInformation,
14935 TransactionManagerLogPathInformation,
14936 TransactionManagerRecoveryInformation = 4
14937 } TRANSACTIONMANAGER_INFORMATION_CLASS;
14938
14939 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
14940 ResourceManagerBasicInformation,
14941 ResourceManagerCompletionInformation,
14942 } RESOURCEMANAGER_INFORMATION_CLASS;
14943
14944 typedef struct _ENLISTMENT_BASIC_INFORMATION {
14945 GUID EnlistmentId;
14946 GUID TransactionId;
14947 GUID ResourceManagerId;
14948 } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
14949
14950 typedef struct _ENLISTMENT_CRM_INFORMATION {
14951 GUID CrmTransactionManagerId;
14952 GUID CrmResourceManagerId;
14953 GUID CrmEnlistmentId;
14954 } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
14955
14956 typedef enum _ENLISTMENT_INFORMATION_CLASS {
14957 EnlistmentBasicInformation,
14958 EnlistmentRecoveryInformation,
14959 EnlistmentCrmInformation
14960 } ENLISTMENT_INFORMATION_CLASS;
14961
14962 typedef struct _TRANSACTION_LIST_ENTRY {
14963 #if defined(__cplusplus)
14964 ::UOW UOW;
14965 #else
14966 UOW UOW;
14967 #endif
14968 } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
14969
14970 typedef struct _TRANSACTION_LIST_INFORMATION {
14971 ULONG NumberOfTransactions;
14972 TRANSACTION_LIST_ENTRY TransactionInformation[1];
14973 } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
14974
14975 typedef NTSTATUS
14976 (NTAPI *PFN_NT_CREATE_TRANSACTION)(
14977 OUT PHANDLE TransactionHandle,
14978 IN ACCESS_MASK DesiredAccess,
14979 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14980 IN LPGUID Uow OPTIONAL,
14981 IN HANDLE TmHandle OPTIONAL,
14982 IN ULONG CreateOptions OPTIONAL,
14983 IN ULONG IsolationLevel OPTIONAL,
14984 IN ULONG IsolationFlags OPTIONAL,
14985 IN PLARGE_INTEGER Timeout OPTIONAL,
14986 IN PUNICODE_STRING Description OPTIONAL);
14987
14988 typedef NTSTATUS
14989 (NTAPI *PFN_NT_OPEN_TRANSACTION)(
14990 OUT PHANDLE TransactionHandle,
14991 IN ACCESS_MASK DesiredAccess,
14992 IN POBJECT_ATTRIBUTES ObjectAttributes,
14993 IN LPGUID Uow OPTIONAL,
14994 IN HANDLE TmHandle OPTIONAL);
14995
14996 typedef NTSTATUS
14997 (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
14998 IN HANDLE TransactionHandle,
14999 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15000 OUT PVOID TransactionInformation,
15001 IN ULONG TransactionInformationLength,
15002 OUT PULONG ReturnLength OPTIONAL);
15003
15004 typedef NTSTATUS
15005 (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
15006 IN HANDLE TransactionHandle,
15007 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15008 IN PVOID TransactionInformation,
15009 IN ULONG TransactionInformationLength);
15010
15011 typedef NTSTATUS
15012 (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
15013 IN HANDLE TransactionHandle,
15014 IN BOOLEAN Wait);
15015
15016 typedef NTSTATUS
15017 (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
15018 IN HANDLE TransactionHandle,
15019 IN BOOLEAN Wait);
15020
15021 #if (NTDDI_VERSION >= NTDDI_VISTA)
15022
15023 NTSYSCALLAPI
15024 NTSTATUS
15025 NTAPI
15026 NtCreateTransactionManager(
15027 OUT PHANDLE TmHandle,
15028 IN ACCESS_MASK DesiredAccess,
15029 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15030 IN PUNICODE_STRING LogFileName OPTIONAL,
15031 IN ULONG CreateOptions OPTIONAL,
15032 IN ULONG CommitStrength OPTIONAL);
15033
15034 NTSYSCALLAPI
15035 NTSTATUS
15036 NTAPI
15037 NtOpenTransactionManager(
15038 OUT PHANDLE TmHandle,
15039 IN ACCESS_MASK DesiredAccess,
15040 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15041 IN PUNICODE_STRING LogFileName OPTIONAL,
15042 IN LPGUID TmIdentity OPTIONAL,
15043 IN ULONG OpenOptions OPTIONAL);
15044
15045 NTSYSCALLAPI
15046 NTSTATUS
15047 NTAPI
15048 NtRenameTransactionManager(
15049 IN PUNICODE_STRING LogFileName,
15050 IN LPGUID ExistingTransactionManagerGuid);
15051
15052 NTSYSCALLAPI
15053 NTSTATUS
15054 NTAPI
15055 NtRollforwardTransactionManager(
15056 IN HANDLE TransactionManagerHandle,
15057 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15058
15059 NTSYSCALLAPI
15060 NTSTATUS
15061 NTAPI
15062 NtRecoverTransactionManager(
15063 IN HANDLE TransactionManagerHandle);
15064
15065 NTSYSCALLAPI
15066 NTSTATUS
15067 NTAPI
15068 NtQueryInformationTransactionManager(
15069 IN HANDLE TransactionManagerHandle,
15070 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15071 OUT PVOID TransactionManagerInformation,
15072 IN ULONG TransactionManagerInformationLength,
15073 OUT PULONG ReturnLength);
15074
15075 NTSYSCALLAPI
15076 NTSTATUS
15077 NTAPI
15078 NtSetInformationTransactionManager(
15079 IN HANDLE TmHandle OPTIONAL,
15080 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15081 IN PVOID TransactionManagerInformation,
15082 IN ULONG TransactionManagerInformationLength);
15083
15084 NTSYSCALLAPI
15085 NTSTATUS
15086 NTAPI
15087 NtEnumerateTransactionObject(
15088 IN HANDLE RootObjectHandle OPTIONAL,
15089 IN KTMOBJECT_TYPE QueryType,
15090 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15091 IN ULONG ObjectCursorLength,
15092 OUT PULONG ReturnLength);
15093
15094 NTSYSCALLAPI
15095 NTSTATUS
15096 NTAPI
15097 NtCreateTransaction(
15098 OUT PHANDLE TransactionHandle,
15099 IN ACCESS_MASK DesiredAccess,
15100 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15101 IN LPGUID Uow OPTIONAL,
15102 IN HANDLE TmHandle OPTIONAL,
15103 IN ULONG CreateOptions OPTIONAL,
15104 IN ULONG IsolationLevel OPTIONAL,
15105 IN ULONG IsolationFlags OPTIONAL,
15106 IN PLARGE_INTEGER Timeout OPTIONAL,
15107 IN PUNICODE_STRING Description OPTIONAL);
15108
15109 NTSYSCALLAPI
15110 NTSTATUS
15111 NTAPI
15112 NtOpenTransaction(
15113 OUT PHANDLE TransactionHandle,
15114 IN ACCESS_MASK DesiredAccess,
15115 IN POBJECT_ATTRIBUTES ObjectAttributes,
15116 IN LPGUID Uow,
15117 IN HANDLE TmHandle OPTIONAL);
15118
15119 NTSYSCALLAPI
15120 NTSTATUS
15121 NTAPI
15122 NtQueryInformationTransaction(
15123 IN HANDLE TransactionHandle,
15124 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15125 OUT PVOID TransactionInformation,
15126 IN ULONG TransactionInformationLength,
15127 OUT PULONG ReturnLength OPTIONAL);
15128
15129 NTSYSCALLAPI
15130 NTSTATUS
15131 NTAPI
15132 NtSetInformationTransaction(
15133 IN HANDLE TransactionHandle,
15134 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15135 IN PVOID TransactionInformation,
15136 IN ULONG TransactionInformationLength);
15137
15138 NTSYSCALLAPI
15139 NTSTATUS
15140 NTAPI
15141 NtCommitTransaction(
15142 IN HANDLE TransactionHandle,
15143 IN BOOLEAN Wait);
15144
15145 NTSYSCALLAPI
15146 NTSTATUS
15147 NTAPI
15148 NtRollbackTransaction(
15149 IN HANDLE TransactionHandle,
15150 IN BOOLEAN Wait);
15151
15152 NTSYSCALLAPI
15153 NTSTATUS
15154 NTAPI
15155 NtCreateEnlistment(
15156 OUT PHANDLE EnlistmentHandle,
15157 IN ACCESS_MASK DesiredAccess,
15158 IN HANDLE ResourceManagerHandle,
15159 IN HANDLE TransactionHandle,
15160 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15161 IN ULONG CreateOptions OPTIONAL,
15162 IN NOTIFICATION_MASK NotificationMask,
15163 IN PVOID EnlistmentKey OPTIONAL);
15164
15165 NTSYSCALLAPI
15166 NTSTATUS
15167 NTAPI
15168 NtOpenEnlistment(
15169 OUT PHANDLE EnlistmentHandle,
15170 IN ACCESS_MASK DesiredAccess,
15171 IN HANDLE ResourceManagerHandle,
15172 IN LPGUID EnlistmentGuid,
15173 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15174
15175 NTSYSCALLAPI
15176 NTSTATUS
15177 NTAPI
15178 NtQueryInformationEnlistment(
15179 IN HANDLE EnlistmentHandle,
15180 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15181 OUT PVOID EnlistmentInformation,
15182 IN ULONG EnlistmentInformationLength,
15183 OUT PULONG ReturnLength);
15184
15185 NTSYSCALLAPI
15186 NTSTATUS
15187 NTAPI
15188 NtSetInformationEnlistment(
15189 IN HANDLE EnlistmentHandle OPTIONAL,
15190 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15191 IN PVOID EnlistmentInformation,
15192 IN ULONG EnlistmentInformationLength);
15193
15194 NTSYSCALLAPI
15195 NTSTATUS
15196 NTAPI
15197 NtRecoverEnlistment(
15198 IN HANDLE EnlistmentHandle,
15199 IN PVOID EnlistmentKey OPTIONAL);
15200
15201 NTSYSCALLAPI
15202 NTSTATUS
15203 NTAPI
15204 NtPrePrepareEnlistment(
15205 IN HANDLE EnlistmentHandle,
15206 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15207
15208 NTSYSCALLAPI
15209 NTSTATUS
15210 NTAPI
15211 NtPrepareEnlistment(
15212 IN HANDLE EnlistmentHandle,
15213 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15214
15215 NTSYSCALLAPI
15216 NTSTATUS
15217 NTAPI
15218 NtCommitEnlistment(
15219 IN HANDLE EnlistmentHandle,
15220 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15221
15222 NTSYSCALLAPI
15223 NTSTATUS
15224 NTAPI
15225 NtRollbackEnlistment(
15226 IN HANDLE EnlistmentHandle,
15227 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15228
15229 NTSYSCALLAPI
15230 NTSTATUS
15231 NTAPI
15232 NtPrePrepareComplete(
15233 IN HANDLE EnlistmentHandle,
15234 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15235
15236 NTSYSCALLAPI
15237 NTSTATUS
15238 NTAPI
15239 NtPrepareComplete(
15240 IN HANDLE EnlistmentHandle,
15241 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15242
15243 NTSYSCALLAPI
15244 NTSTATUS
15245 NTAPI
15246 NtCommitComplete(
15247 IN HANDLE EnlistmentHandle,
15248 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15249
15250 NTSYSCALLAPI
15251 NTSTATUS
15252 NTAPI
15253 NtReadOnlyEnlistment(
15254 IN HANDLE EnlistmentHandle,
15255 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15256
15257 NTSYSCALLAPI
15258 NTSTATUS
15259 NTAPI
15260 NtRollbackComplete(
15261 IN HANDLE EnlistmentHandle,
15262 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15263
15264 NTSYSCALLAPI
15265 NTSTATUS
15266 NTAPI
15267 NtSinglePhaseReject(
15268 IN HANDLE EnlistmentHandle,
15269 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15270
15271 NTSYSCALLAPI
15272 NTSTATUS
15273 NTAPI
15274 NtCreateResourceManager(
15275 OUT PHANDLE ResourceManagerHandle,
15276 IN ACCESS_MASK DesiredAccess,
15277 IN HANDLE TmHandle,
15278 IN LPGUID RmGuid,
15279 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15280 IN ULONG CreateOptions OPTIONAL,
15281 IN PUNICODE_STRING Description OPTIONAL);
15282
15283 NTSYSCALLAPI
15284 NTSTATUS
15285 NTAPI
15286 NtOpenResourceManager(
15287 OUT PHANDLE ResourceManagerHandle,
15288 IN ACCESS_MASK DesiredAccess,
15289 IN HANDLE TmHandle,
15290 IN LPGUID ResourceManagerGuid OPTIONAL,
15291 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15292
15293 NTSYSCALLAPI
15294 NTSTATUS
15295 NTAPI
15296 NtRecoverResourceManager(
15297 IN HANDLE ResourceManagerHandle);
15298
15299 NTSYSCALLAPI
15300 NTSTATUS
15301 NTAPI
15302 NtGetNotificationResourceManager(
15303 IN HANDLE ResourceManagerHandle,
15304 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15305 IN ULONG NotificationLength,
15306 IN PLARGE_INTEGER Timeout OPTIONAL,
15307 OUT PULONG ReturnLength OPTIONAL,
15308 IN ULONG Asynchronous,
15309 IN ULONG_PTR AsynchronousContext OPTIONAL);
15310
15311 NTSYSCALLAPI
15312 NTSTATUS
15313 NTAPI
15314 NtQueryInformationResourceManager(
15315 IN HANDLE ResourceManagerHandle,
15316 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15317 OUT PVOID ResourceManagerInformation,
15318 IN ULONG ResourceManagerInformationLength,
15319 OUT PULONG ReturnLength OPTIONAL);
15320
15321 NTSYSCALLAPI
15322 NTSTATUS
15323 NTAPI
15324 NtSetInformationResourceManager(
15325 IN HANDLE ResourceManagerHandle,
15326 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15327 IN PVOID ResourceManagerInformation,
15328 IN ULONG ResourceManagerInformationLength);
15329
15330 NTSYSCALLAPI
15331 NTSTATUS
15332 NTAPI
15333 NtRegisterProtocolAddressInformation(
15334 IN HANDLE ResourceManager,
15335 IN PCRM_PROTOCOL_ID ProtocolId,
15336 IN ULONG ProtocolInformationSize,
15337 IN PVOID ProtocolInformation,
15338 IN ULONG CreateOptions OPTIONAL);
15339
15340 NTSYSCALLAPI
15341 NTSTATUS
15342 NTAPI
15343 NtPropagationComplete(
15344 IN HANDLE ResourceManagerHandle,
15345 IN ULONG RequestCookie,
15346 IN ULONG BufferLength,
15347 IN PVOID Buffer);
15348
15349 NTSYSCALLAPI
15350 NTSTATUS
15351 NTAPI
15352 NtPropagationFailed(
15353 IN HANDLE ResourceManagerHandle,
15354 IN ULONG RequestCookie,
15355 IN NTSTATUS PropStatus);
15356
15357 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
15358
15359 #endif /* !_NTTMAPI_ */
15360 /******************************************************************************
15361 * ZwXxx Functions *
15362 ******************************************************************************/
15363
15364
15365 /* Constants */
15366 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
15367 #define ZwCurrentProcess() NtCurrentProcess()
15368 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
15369 #define ZwCurrentThread() NtCurrentThread()
15370
15371
15372 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15373
15374 NTSYSAPI
15375 NTSTATUS
15376 NTAPI
15377 ZwClose(
15378 IN HANDLE Handle);
15379
15380 NTSYSAPI
15381 NTSTATUS
15382 NTAPI
15383 ZwCreateDirectoryObject(
15384 OUT PHANDLE DirectoryHandle,
15385 IN ACCESS_MASK DesiredAccess,
15386 IN POBJECT_ATTRIBUTES ObjectAttributes);
15387
15388 NTSYSAPI
15389 NTSTATUS
15390 NTAPI
15391 ZwCreateFile(
15392 OUT PHANDLE FileHandle,
15393 IN ACCESS_MASK DesiredAccess,
15394 IN POBJECT_ATTRIBUTES ObjectAttributes,
15395 OUT PIO_STATUS_BLOCK IoStatusBlock,
15396 IN PLARGE_INTEGER AllocationSize OPTIONAL,
15397 IN ULONG FileAttributes,
15398 IN ULONG ShareAccess,
15399 IN ULONG CreateDisposition,
15400 IN ULONG CreateOptions,
15401 IN PVOID EaBuffer OPTIONAL,
15402 IN ULONG EaLength);
15403
15404 NTSYSAPI
15405 NTSTATUS
15406 NTAPI
15407 ZwCreateKey(
15408 OUT PHANDLE KeyHandle,
15409 IN ACCESS_MASK DesiredAccess,
15410 IN POBJECT_ATTRIBUTES ObjectAttributes,
15411 IN ULONG TitleIndex,
15412 IN PUNICODE_STRING Class OPTIONAL,
15413 IN ULONG CreateOptions,
15414 OUT PULONG Disposition OPTIONAL);
15415
15416 NTSYSAPI
15417 NTSTATUS
15418 NTAPI
15419 ZwCreateSection(
15420 OUT PHANDLE SectionHandle,
15421 IN ACCESS_MASK DesiredAccess,
15422 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15423 IN PLARGE_INTEGER MaximumSize OPTIONAL,
15424 IN ULONG SectionPageProtection,
15425 IN ULONG AllocationAttributes,
15426 IN HANDLE FileHandle OPTIONAL);
15427
15428 NTSYSAPI
15429 NTSTATUS
15430 NTAPI
15431 ZwDeleteKey(
15432 IN HANDLE KeyHandle);
15433
15434 NTSYSAPI
15435 NTSTATUS
15436 NTAPI
15437 ZwDeleteValueKey(
15438 IN HANDLE KeyHandle,
15439 IN PUNICODE_STRING ValueName);
15440
15441 NTSYSAPI
15442 NTSTATUS
15443 NTAPI
15444 ZwEnumerateKey(
15445 IN HANDLE KeyHandle,
15446 IN ULONG Index,
15447 IN KEY_INFORMATION_CLASS KeyInformationClass,
15448 OUT PVOID KeyInformation OPTIONAL,
15449 IN ULONG Length,
15450 OUT PULONG ResultLength);
15451
15452 NTSYSAPI
15453 NTSTATUS
15454 NTAPI
15455 ZwEnumerateValueKey(
15456 IN HANDLE KeyHandle,
15457 IN ULONG Index,
15458 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15459 OUT PVOID KeyValueInformation OPTIONAL,
15460 IN ULONG Length,
15461 OUT PULONG ResultLength);
15462
15463 NTSYSAPI
15464 NTSTATUS
15465 NTAPI
15466 ZwFlushKey(
15467 IN HANDLE KeyHandle);
15468
15469 NTSYSAPI
15470 NTSTATUS
15471 NTAPI
15472 ZwLoadDriver(
15473 IN PUNICODE_STRING DriverServiceName);
15474
15475 NTSYSAPI
15476 NTSTATUS
15477 NTAPI
15478 ZwMakeTemporaryObject(
15479 IN HANDLE Handle);
15480
15481 NTSYSAPI
15482 NTSTATUS
15483 NTAPI
15484 ZwMapViewOfSection(
15485 IN HANDLE SectionHandle,
15486 IN HANDLE ProcessHandle,
15487 IN OUT PVOID *BaseAddress,
15488 IN ULONG_PTR ZeroBits,
15489 IN SIZE_T CommitSize,
15490 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
15491 IN OUT PSIZE_T ViewSize,
15492 IN SECTION_INHERIT InheritDisposition,
15493 IN ULONG AllocationType,
15494 IN ULONG Protect);
15495
15496 NTSYSAPI
15497 NTSTATUS
15498 NTAPI
15499 ZwOpenFile(
15500 OUT PHANDLE FileHandle,
15501 IN ACCESS_MASK DesiredAccess,
15502 IN POBJECT_ATTRIBUTES ObjectAttributes,
15503 OUT PIO_STATUS_BLOCK IoStatusBlock,
15504 IN ULONG ShareAccess,
15505 IN ULONG OpenOptions);
15506
15507 NTSYSAPI
15508 NTSTATUS
15509 NTAPI
15510 ZwOpenKey(
15511 OUT PHANDLE KeyHandle,
15512 IN ACCESS_MASK DesiredAccess,
15513 IN POBJECT_ATTRIBUTES ObjectAttributes);
15514
15515 NTSYSAPI
15516 NTSTATUS
15517 NTAPI
15518 ZwOpenSection(
15519 OUT PHANDLE SectionHandle,
15520 IN ACCESS_MASK DesiredAccess,
15521 IN POBJECT_ATTRIBUTES ObjectAttributes);
15522
15523 NTSYSAPI
15524 NTSTATUS
15525 NTAPI
15526 ZwOpenSymbolicLinkObject(
15527 OUT PHANDLE LinkHandle,
15528 IN ACCESS_MASK DesiredAccess,
15529 IN POBJECT_ATTRIBUTES ObjectAttributes);
15530
15531 NTSYSAPI
15532 NTSTATUS
15533 NTAPI
15534 ZwQueryInformationFile(
15535 IN HANDLE FileHandle,
15536 OUT PIO_STATUS_BLOCK IoStatusBlock,
15537 OUT PVOID FileInformation,
15538 IN ULONG Length,
15539 IN FILE_INFORMATION_CLASS FileInformationClass);
15540
15541 NTSYSAPI
15542 NTSTATUS
15543 NTAPI
15544 ZwQueryKey(
15545 IN HANDLE KeyHandle,
15546 IN KEY_INFORMATION_CLASS KeyInformationClass,
15547 OUT PVOID KeyInformation OPTIONAL,
15548 IN ULONG Length,
15549 OUT PULONG ResultLength);
15550
15551 NTSYSAPI
15552 NTSTATUS
15553 NTAPI
15554 ZwQuerySymbolicLinkObject(
15555 IN HANDLE LinkHandle,
15556 IN OUT PUNICODE_STRING LinkTarget,
15557 OUT PULONG ReturnedLength OPTIONAL);
15558
15559 NTSYSAPI
15560 NTSTATUS
15561 NTAPI
15562 ZwQueryValueKey(
15563 IN HANDLE KeyHandle,
15564 IN PUNICODE_STRING ValueName,
15565 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15566 OUT PVOID KeyValueInformation OPTIONAL,
15567 IN ULONG Length,
15568 OUT PULONG ResultLength);
15569
15570 NTSYSAPI
15571 NTSTATUS
15572 NTAPI
15573 ZwReadFile(
15574 IN HANDLE FileHandle,
15575 IN HANDLE Event OPTIONAL,
15576 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15577 IN PVOID ApcContext OPTIONAL,
15578 OUT PIO_STATUS_BLOCK IoStatusBlock,
15579 OUT PVOID Buffer,
15580 IN ULONG Length,
15581 IN PLARGE_INTEGER ByteOffset OPTIONAL,
15582 IN PULONG Key OPTIONAL);
15583
15584 NTSYSAPI
15585 NTSTATUS
15586 NTAPI
15587 ZwSetInformationFile(
15588 IN HANDLE FileHandle,
15589 OUT PIO_STATUS_BLOCK IoStatusBlock,
15590 IN PVOID FileInformation,
15591 IN ULONG Length,
15592 IN FILE_INFORMATION_CLASS FileInformationClass);
15593
15594 NTSYSAPI
15595 NTSTATUS
15596 NTAPI
15597 ZwSetValueKey(
15598 IN HANDLE KeyHandle,
15599 IN PUNICODE_STRING ValueName,
15600 IN ULONG TitleIndex OPTIONAL,
15601 IN ULONG Type,
15602 IN PVOID Data OPTIONAL,
15603 IN ULONG DataSize);
15604
15605 NTSYSAPI
15606 NTSTATUS
15607 NTAPI
15608 ZwUnloadDriver(
15609 IN PUNICODE_STRING DriverServiceName);
15610
15611 NTSYSAPI
15612 NTSTATUS
15613 NTAPI
15614 ZwUnmapViewOfSection(
15615 IN HANDLE ProcessHandle,
15616 IN PVOID BaseAddress OPTIONAL);
15617
15618 NTSYSAPI
15619 NTSTATUS
15620 NTAPI
15621 ZwWriteFile(
15622 IN HANDLE FileHandle,
15623 IN HANDLE Event OPTIONAL,
15624 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15625 IN PVOID ApcContext OPTIONAL,
15626 OUT PIO_STATUS_BLOCK IoStatusBlock,
15627 IN PVOID Buffer,
15628 IN ULONG Length,
15629 IN PLARGE_INTEGER ByteOffset OPTIONAL,
15630 IN PULONG Key OPTIONAL);
15631
15632 NTSYSAPI
15633 NTSTATUS
15634 NTAPI
15635 ZwQueryFullAttributesFile(
15636 IN POBJECT_ATTRIBUTES ObjectAttributes,
15637 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
15638
15639 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15640
15641
15642 #if (NTDDI_VERSION >= NTDDI_WS03)
15643 NTSYSCALLAPI
15644 NTSTATUS
15645 NTAPI
15646 ZwOpenEvent(
15647 OUT PHANDLE EventHandle,
15648 IN ACCESS_MASK DesiredAccess,
15649 IN POBJECT_ATTRIBUTES ObjectAttributes);
15650 #endif
15651
15652 #if (NTDDI_VERSION >= NTDDI_VISTA)
15653
15654 NTSYSAPI
15655 NTSTATUS
15656 ZwCreateKeyTransacted(
15657 OUT PHANDLE KeyHandle,
15658 IN ACCESS_MASK DesiredAccess,
15659 IN POBJECT_ATTRIBUTES ObjectAttributes,
15660 IN ULONG TitleIndex,
15661 IN PUNICODE_STRING Class OPTIONAL,
15662 IN ULONG CreateOptions,
15663 IN HANDLE TransactionHandle,
15664 OUT PULONG Disposition OPTIONAL);
15665
15666 NTSYSAPI
15667 NTSTATUS
15668 NTAPI
15669 ZwOpenKeyTransacted(
15670 OUT PHANDLE KeyHandle,
15671 IN ACCESS_MASK DesiredAccess,
15672 IN POBJECT_ATTRIBUTES ObjectAttributes,
15673 IN HANDLE TransactionHandle);
15674
15675 NTSYSCALLAPI
15676 NTSTATUS
15677 NTAPI
15678 ZwCreateTransactionManager(
15679 OUT PHANDLE TmHandle,
15680 IN ACCESS_MASK DesiredAccess,
15681 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15682 IN PUNICODE_STRING LogFileName OPTIONAL,
15683 IN ULONG CreateOptions OPTIONAL,
15684 IN ULONG CommitStrength OPTIONAL);
15685
15686 NTSYSCALLAPI
15687 NTSTATUS
15688 NTAPI
15689 ZwOpenTransactionManager(
15690 OUT PHANDLE TmHandle,
15691 IN ACCESS_MASK DesiredAccess,
15692 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15693 IN PUNICODE_STRING LogFileName OPTIONAL,
15694 IN LPGUID TmIdentity OPTIONAL,
15695 IN ULONG OpenOptions OPTIONAL);
15696
15697 NTSYSCALLAPI
15698 NTSTATUS
15699 NTAPI
15700 ZwRollforwardTransactionManager(
15701 IN HANDLE TransactionManagerHandle,
15702 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15703
15704 NTSYSCALLAPI
15705 NTSTATUS
15706 NTAPI
15707 ZwRecoverTransactionManager(
15708 IN HANDLE TransactionManagerHandle);
15709
15710 NTSYSCALLAPI
15711 NTSTATUS
15712 NTAPI
15713 ZwQueryInformationTransactionManager(
15714 IN HANDLE TransactionManagerHandle,
15715 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15716 OUT PVOID TransactionManagerInformation,
15717 IN ULONG TransactionManagerInformationLength,
15718 OUT PULONG ReturnLength OPTIONAL);
15719
15720 NTSYSCALLAPI
15721 NTSTATUS
15722 NTAPI
15723 ZwSetInformationTransactionManager(
15724 IN HANDLE TmHandle,
15725 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15726 IN PVOID TransactionManagerInformation,
15727 IN ULONG TransactionManagerInformationLength);
15728
15729 NTSYSCALLAPI
15730 NTSTATUS
15731 NTAPI
15732 ZwEnumerateTransactionObject(
15733 IN HANDLE RootObjectHandle OPTIONAL,
15734 IN KTMOBJECT_TYPE QueryType,
15735 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15736 IN ULONG ObjectCursorLength,
15737 OUT PULONG ReturnLength);
15738
15739 NTSYSCALLAPI
15740 NTSTATUS
15741 NTAPI
15742 ZwCreateTransaction(
15743 OUT PHANDLE TransactionHandle,
15744 IN ACCESS_MASK DesiredAccess,
15745 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15746 IN LPGUID Uow OPTIONAL,
15747 IN HANDLE TmHandle OPTIONAL,
15748 IN ULONG CreateOptions OPTIONAL,
15749 IN ULONG IsolationLevel OPTIONAL,
15750 IN ULONG IsolationFlags OPTIONAL,
15751 IN PLARGE_INTEGER Timeout OPTIONAL,
15752 IN PUNICODE_STRING Description OPTIONAL);
15753
15754 NTSYSCALLAPI
15755 NTSTATUS
15756 NTAPI
15757 ZwOpenTransaction(
15758 OUT PHANDLE TransactionHandle,
15759 IN ACCESS_MASK DesiredAccess,
15760 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15761 IN LPGUID Uow,
15762 IN HANDLE TmHandle OPTIONAL);
15763
15764 NTSYSCALLAPI
15765 NTSTATUS
15766 NTAPI
15767 ZwQueryInformationTransaction(
15768 IN HANDLE TransactionHandle,
15769 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15770 OUT PVOID TransactionInformation,
15771 IN ULONG TransactionInformationLength,
15772 OUT PULONG ReturnLength OPTIONAL);
15773
15774 NTSYSCALLAPI
15775 NTSTATUS
15776 NTAPI
15777 ZwSetInformationTransaction(
15778 IN HANDLE TransactionHandle,
15779 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15780 IN PVOID TransactionInformation,
15781 IN ULONG TransactionInformationLength);
15782
15783 NTSYSCALLAPI
15784 NTSTATUS
15785 NTAPI
15786 ZwCommitTransaction(
15787 IN HANDLE TransactionHandle,
15788 IN BOOLEAN Wait);
15789
15790 NTSYSCALLAPI
15791 NTSTATUS
15792 NTAPI
15793 ZwRollbackTransaction(
15794 IN HANDLE TransactionHandle,
15795 IN BOOLEAN Wait);
15796
15797 NTSYSCALLAPI
15798 NTSTATUS
15799 NTAPI
15800 ZwCreateResourceManager(
15801 OUT PHANDLE ResourceManagerHandle,
15802 IN ACCESS_MASK DesiredAccess,
15803 IN HANDLE TmHandle,
15804 IN LPGUID ResourceManagerGuid OPTIONAL,
15805 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15806 IN ULONG CreateOptions OPTIONAL,
15807 IN PUNICODE_STRING Description OPTIONAL);
15808
15809 NTSYSCALLAPI
15810 NTSTATUS
15811 NTAPI
15812 ZwOpenResourceManager(
15813 OUT PHANDLE ResourceManagerHandle,
15814 IN ACCESS_MASK DesiredAccess,
15815 IN HANDLE TmHandle,
15816 IN LPGUID ResourceManagerGuid,
15817 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15818
15819 NTSYSCALLAPI
15820 NTSTATUS
15821 NTAPI
15822 ZwRecoverResourceManager(
15823 IN HANDLE ResourceManagerHandle);
15824
15825 NTSYSCALLAPI
15826 NTSTATUS
15827 NTAPI
15828 ZwGetNotificationResourceManager(
15829 IN HANDLE ResourceManagerHandle,
15830 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15831 IN ULONG NotificationLength,
15832 IN PLARGE_INTEGER Timeout,
15833 IN PULONG ReturnLength OPTIONAL,
15834 IN ULONG Asynchronous,
15835 IN ULONG_PTR AsynchronousContext OPTIONAL);
15836
15837 NTSYSCALLAPI
15838 NTSTATUS
15839 NTAPI
15840 ZwQueryInformationResourceManager(
15841 IN HANDLE ResourceManagerHandle,
15842 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15843 OUT PVOID ResourceManagerInformation,
15844 IN ULONG ResourceManagerInformationLength,
15845 IN PULONG ReturnLength OPTIONAL);
15846
15847 NTSYSCALLAPI
15848 NTSTATUS
15849 NTAPI
15850 ZwSetInformationResourceManager(
15851 IN HANDLE ResourceManagerHandle,
15852 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15853 IN PVOID ResourceManagerInformation,
15854 IN ULONG ResourceManagerInformationLength);
15855
15856 NTSYSCALLAPI
15857 NTSTATUS
15858 NTAPI
15859 ZwCreateEnlistment(
15860 OUT PHANDLE EnlistmentHandle,
15861 IN ACCESS_MASK DesiredAccess,
15862 IN HANDLE ResourceManagerHandle,
15863 IN HANDLE TransactionHandle,
15864 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15865 IN ULONG CreateOptions OPTIONAL,
15866 IN NOTIFICATION_MASK NotificationMask,
15867 IN PVOID EnlistmentKey OPTIONAL);
15868
15869 NTSYSCALLAPI
15870 NTSTATUS
15871 NTAPI
15872 ZwOpenEnlistment(
15873 OUT PHANDLE EnlistmentHandle,
15874 IN ACCESS_MASK DesiredAccess,
15875 IN HANDLE RmHandle,
15876 IN LPGUID EnlistmentGuid,
15877 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15878
15879 NTSYSCALLAPI
15880 NTSTATUS
15881 NTAPI
15882 ZwQueryInformationEnlistment(
15883 IN HANDLE EnlistmentHandle,
15884 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15885 OUT PVOID EnlistmentInformation,
15886 IN ULONG EnlistmentInformationLength,
15887 IN PULONG ReturnLength OPTIONAL);
15888
15889 NTSYSCALLAPI
15890 NTSTATUS
15891 NTAPI
15892 ZwSetInformationEnlistment(
15893 IN HANDLE EnlistmentHandle,
15894 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15895 IN PVOID EnlistmentInformation,
15896 IN ULONG EnlistmentInformationLength);
15897
15898 NTSYSCALLAPI
15899 NTSTATUS
15900 NTAPI
15901 ZwRecoverEnlistment(
15902 IN HANDLE EnlistmentHandle,
15903 IN PVOID EnlistmentKey OPTIONAL);
15904
15905 NTSYSCALLAPI
15906 NTSTATUS
15907 NTAPI
15908 ZwPrePrepareEnlistment(
15909 IN HANDLE EnlistmentHandle,
15910 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15911
15912 NTSYSCALLAPI
15913 NTSTATUS
15914 NTAPI
15915 ZwPrepareEnlistment(
15916 IN HANDLE EnlistmentHandle,
15917 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15918
15919 NTSYSCALLAPI
15920 NTSTATUS
15921 NTAPI
15922 ZwCommitEnlistment(
15923 IN HANDLE EnlistmentHandle,
15924 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15925
15926 NTSYSCALLAPI
15927 NTSTATUS
15928 NTAPI
15929 ZwRollbackEnlistment(
15930 IN HANDLE EnlistmentHandle,
15931 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15932
15933 NTSYSCALLAPI
15934 NTSTATUS
15935 NTAPI
15936 ZwPrePrepareComplete(
15937 IN HANDLE EnlistmentHandle,
15938 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15939
15940 NTSYSCALLAPI
15941 NTSTATUS
15942 NTAPI
15943 ZwPrepareComplete(
15944 IN HANDLE EnlistmentHandle,
15945 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15946
15947 NTSYSCALLAPI
15948 NTSTATUS
15949 NTAPI
15950 ZwCommitComplete(
15951 IN HANDLE EnlistmentHandle,
15952 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15953
15954 NTSYSCALLAPI
15955 NTSTATUS
15956 NTAPI
15957 ZwReadOnlyEnlistment(
15958 IN HANDLE EnlistmentHandle,
15959 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15960
15961 NTSYSCALLAPI
15962 NTSTATUS
15963 NTAPI
15964 ZwRollbackComplete(
15965 IN HANDLE EnlistmentHandle,
15966 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15967
15968 NTSYSCALLAPI
15969 NTSTATUS
15970 NTAPI
15971 ZwSinglePhaseReject(
15972 IN HANDLE EnlistmentHandle,
15973 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15974 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15975 #if (NTDDI_VERSION >= NTDDI_WIN7)
15976
15977 NTSYSAPI
15978 NTSTATUS
15979 NTAPI
15980 ZwOpenKeyEx(
15981 OUT PHANDLE KeyHandle,
15982 IN ACCESS_MASK DesiredAccess,
15983 IN POBJECT_ATTRIBUTES ObjectAttributes,
15984 IN ULONG OpenOptions);
15985
15986 NTSYSAPI
15987 NTSTATUS
15988 NTAPI
15989 ZwOpenKeyTransactedEx(
15990 OUT PHANDLE KeyHandle,
15991 IN ACCESS_MASK DesiredAccess,
15992 IN POBJECT_ATTRIBUTES ObjectAttributes,
15993 IN ULONG OpenOptions,
15994 IN HANDLE TransactionHandle);
15995
15996 NTSYSAPI
15997 NTSTATUS
15998 NTAPI
15999 ZwNotifyChangeMultipleKeys(
16000 IN HANDLE MasterKeyHandle,
16001 IN ULONG Count OPTIONAL,
16002 IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
16003 IN HANDLE Event OPTIONAL,
16004 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
16005 IN PVOID ApcContext OPTIONAL,
16006 OUT PIO_STATUS_BLOCK IoStatusBlock,
16007 IN ULONG CompletionFilter,
16008 IN BOOLEAN WatchTree,
16009 OUT PVOID Buffer OPTIONAL,
16010 IN ULONG BufferSize,
16011 IN BOOLEAN Asynchronous);
16012
16013 NTSYSAPI
16014 NTSTATUS
16015 NTAPI
16016 ZwQueryMultipleValueKey(
16017 IN HANDLE KeyHandle,
16018 IN OUT PKEY_VALUE_ENTRY ValueEntries,
16019 IN ULONG EntryCount,
16020 OUT PVOID ValueBuffer,
16021 IN OUT PULONG BufferLength,
16022 OUT PULONG RequiredBufferLength OPTIONAL);
16023
16024 NTSYSAPI
16025 NTSTATUS
16026 NTAPI
16027 ZwRenameKey(
16028 IN HANDLE KeyHandle,
16029 IN PUNICODE_STRING NewName);
16030
16031 NTSYSAPI
16032 NTSTATUS
16033 NTAPI
16034 ZwSetInformationKey(
16035 IN HANDLE KeyHandle,
16036 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
16037 IN PVOID KeySetInformation,
16038 IN ULONG KeySetInformationLength);
16039
16040 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
16041
16042
16043 #ifdef __cplusplus
16044 }
16045 #endif
16046
16047 #endif /* !_WDMDDK_ */