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