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