[NDK]
[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 PBOOLEAN 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 #define KeAcquireSpinLock(SpinLock, OldIrql) \
7927 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
7928
7929 FORCEINLINE
7930 PKTHREAD
7931 KeGetCurrentThread(VOID)
7932 {
7933 return (struct _KTHREAD *)__readgsqword(0x188);
7934 }
7935
7936 /* x86 and x64 performs a 0x2C interrupt */
7937 #define DbgRaiseAssertionFailure __int2c
7938
7939 #elif defined(_M_IA64)
7940 /** Kernel definitions for IA64 **/
7941
7942 /* Interrupt request levels */
7943 #define PASSIVE_LEVEL 0
7944 #define LOW_LEVEL 0
7945 #define APC_LEVEL 1
7946 #define DISPATCH_LEVEL 2
7947 #define CMC_LEVEL 3
7948 #define DEVICE_LEVEL_BASE 4
7949 #define PC_LEVEL 12
7950 #define IPI_LEVEL 14
7951 #define DRS_LEVEL 14
7952 #define CLOCK_LEVEL 13
7953 #define POWER_LEVEL 15
7954 #define PROFILE_LEVEL 15
7955 #define HIGH_LEVEL 15
7956
7957 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
7958 extern volatile LARGE_INTEGER KeTickCount;
7959
7960 #define PAUSE_PROCESSOR __yield();
7961
7962 FORCEINLINE
7963 VOID
7964 KeFlushWriteBuffer(VOID)
7965 {
7966 __mf ();
7967 return;
7968 }
7969
7970 NTSYSAPI
7971 PKTHREAD
7972 NTAPI
7973 KeGetCurrentThread(VOID);
7974
7975
7976 #elif defined(_M_PPC)
7977
7978 /* Interrupt request levels */
7979 #define PASSIVE_LEVEL 0
7980 #define LOW_LEVEL 0
7981 #define APC_LEVEL 1
7982 #define DISPATCH_LEVEL 2
7983 #define PROFILE_LEVEL 27
7984 #define CLOCK1_LEVEL 28
7985 #define CLOCK2_LEVEL 28
7986 #define IPI_LEVEL 29
7987 #define POWER_LEVEL 30
7988 #define HIGH_LEVEL 31
7989
7990 //
7991 // Used to contain PFNs and PFN counts
7992 //
7993 typedef ULONG PFN_COUNT;
7994 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
7995 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
7996
7997
7998 typedef struct _KFLOATING_SAVE {
7999 ULONG Dummy;
8000 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8001
8002 typedef struct _KPCR_TIB {
8003 PVOID ExceptionList; /* 00 */
8004 PVOID StackBase; /* 04 */
8005 PVOID StackLimit; /* 08 */
8006 PVOID SubSystemTib; /* 0C */
8007 _ANONYMOUS_UNION union {
8008 PVOID FiberData; /* 10 */
8009 ULONG Version; /* 10 */
8010 } DUMMYUNIONNAME;
8011 PVOID ArbitraryUserPointer; /* 14 */
8012 struct _KPCR_TIB *Self; /* 18 */
8013 } KPCR_TIB, *PKPCR_TIB; /* 1C */
8014
8015 #define PCR_MINOR_VERSION 1
8016 #define PCR_MAJOR_VERSION 1
8017
8018 typedef struct _KPCR {
8019 KPCR_TIB Tib; /* 00 */
8020 struct _KPCR *Self; /* 1C */
8021 struct _KPRCB *Prcb; /* 20 */
8022 KIRQL Irql; /* 24 */
8023 ULONG IRR; /* 28 */
8024 ULONG IrrActive; /* 2C */
8025 ULONG IDR; /* 30 */
8026 PVOID KdVersionBlock; /* 34 */
8027 PUSHORT IDT; /* 38 */
8028 PUSHORT GDT; /* 3C */
8029 struct _KTSS *TSS; /* 40 */
8030 USHORT MajorVersion; /* 44 */
8031 USHORT MinorVersion; /* 46 */
8032 KAFFINITY SetMember; /* 48 */
8033 ULONG StallScaleFactor; /* 4C */
8034 UCHAR SpareUnused; /* 50 */
8035 UCHAR Number; /* 51 */
8036 } KPCR, *PKPCR; /* 54 */
8037
8038 #define KeGetPcr() PCR
8039
8040 #define YieldProcessor() __asm__ __volatile__("nop");
8041
8042 FORCEINLINE
8043 ULONG
8044 NTAPI
8045 KeGetCurrentProcessorNumber(VOID)
8046 {
8047 ULONG Number;
8048 __asm__ __volatile__ (
8049 "lwz %0, %c1(12)\n"
8050 : "=r" (Number)
8051 : "i" (FIELD_OFFSET(KPCR, Number))
8052 );
8053 return Number;
8054 }
8055
8056 NTHALAPI
8057 VOID
8058 FASTCALL
8059 KfLowerIrql(
8060 IN KIRQL NewIrql);
8061 #define KeLowerIrql(a) KfLowerIrql(a)
8062
8063 NTHALAPI
8064 KIRQL
8065 FASTCALL
8066 KfRaiseIrql(
8067 IN KIRQL NewIrql);
8068 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8069
8070 NTHALAPI
8071 KIRQL
8072 NTAPI
8073 KeRaiseIrqlToDpcLevel(VOID);
8074
8075 NTHALAPI
8076 KIRQL
8077 NTAPI
8078 KeRaiseIrqlToSynchLevel(VOID);
8079
8080
8081
8082 #elif defined(_M_MIPS)
8083 #error MIPS Headers are totally incorrect
8084
8085 //
8086 // Used to contain PFNs and PFN counts
8087 //
8088 typedef ULONG PFN_COUNT;
8089 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
8090 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
8091
8092 #define PASSIVE_LEVEL 0
8093 #define APC_LEVEL 1
8094 #define DISPATCH_LEVEL 2
8095 #define PROFILE_LEVEL 27
8096 #define IPI_LEVEL 29
8097 #define HIGH_LEVEL 31
8098
8099 typedef struct _KPCR {
8100 struct _KPRCB *Prcb; /* 20 */
8101 KIRQL Irql; /* 24 */
8102 ULONG IRR; /* 28 */
8103 ULONG IDR; /* 30 */
8104 } KPCR, *PKPCR;
8105
8106 #define KeGetPcr() PCR
8107
8108 typedef struct _KFLOATING_SAVE {
8109 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8110
8111 static __inline
8112 ULONG
8113 NTAPI
8114 KeGetCurrentProcessorNumber(VOID)
8115 {
8116 return 0;
8117 }
8118
8119 #define YieldProcessor() __asm__ __volatile__("nop");
8120
8121 #define KeLowerIrql(a) KfLowerIrql(a)
8122 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8123
8124 NTKERNELAPI
8125 VOID
8126 NTAPI
8127 KfLowerIrql(
8128 IN KIRQL NewIrql);
8129
8130 NTKERNELAPI
8131 KIRQL
8132 NTAPI
8133 KfRaiseIrql(
8134 IN KIRQL NewIrql);
8135
8136 NTKERNELAPI
8137 KIRQL
8138 NTAPI
8139 KeRaiseIrqlToDpcLevel(VOID);
8140
8141 NTKERNELAPI
8142 KIRQL
8143 NTAPI
8144 KeRaiseIrqlToSynchLevel(VOID);
8145
8146
8147 #elif defined(_M_ARM)
8148 #include <armddk.h>
8149 #else
8150 #error Unknown Architecture
8151 #endif
8152
8153 /******************************************************************************
8154 * Runtime Library Functions *
8155 ******************************************************************************/
8156
8157
8158 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
8159
8160 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
8161
8162 FORCEINLINE
8163 VOID
8164 InitializeListHead(
8165 OUT PLIST_ENTRY ListHead)
8166 {
8167 ListHead->Flink = ListHead->Blink = ListHead;
8168 }
8169
8170 BOOLEAN
8171 FORCEINLINE
8172 IsListEmpty(
8173 IN CONST LIST_ENTRY * ListHead)
8174 {
8175 return (BOOLEAN)(ListHead->Flink == ListHead);
8176 }
8177
8178 FORCEINLINE
8179 BOOLEAN
8180 RemoveEntryList(
8181 IN PLIST_ENTRY Entry)
8182 {
8183 PLIST_ENTRY OldFlink;
8184 PLIST_ENTRY OldBlink;
8185
8186 OldFlink = Entry->Flink;
8187 OldBlink = Entry->Blink;
8188 OldFlink->Blink = OldBlink;
8189 OldBlink->Flink = OldFlink;
8190 return (BOOLEAN)(OldFlink == OldBlink);
8191 }
8192
8193 FORCEINLINE
8194 PLIST_ENTRY
8195 RemoveHeadList(
8196 IN OUT PLIST_ENTRY ListHead)
8197 {
8198 PLIST_ENTRY Flink;
8199 PLIST_ENTRY Entry;
8200
8201 Entry = ListHead->Flink;
8202 Flink = Entry->Flink;
8203 ListHead->Flink = Flink;
8204 Flink->Blink = ListHead;
8205 return Entry;
8206 }
8207
8208 FORCEINLINE
8209 PLIST_ENTRY
8210 RemoveTailList(
8211 IN OUT PLIST_ENTRY ListHead)
8212 {
8213 PLIST_ENTRY Blink;
8214 PLIST_ENTRY Entry;
8215
8216 Entry = ListHead->Blink;
8217 Blink = Entry->Blink;
8218 ListHead->Blink = Blink;
8219 Blink->Flink = ListHead;
8220 return Entry;
8221 }
8222
8223 FORCEINLINE
8224 VOID
8225 InsertTailList(
8226 IN OUT PLIST_ENTRY ListHead,
8227 IN OUT PLIST_ENTRY Entry)
8228 {
8229 PLIST_ENTRY OldBlink;
8230 OldBlink = ListHead->Blink;
8231 Entry->Flink = ListHead;
8232 Entry->Blink = OldBlink;
8233 OldBlink->Flink = Entry;
8234 ListHead->Blink = Entry;
8235 }
8236
8237 FORCEINLINE
8238 VOID
8239 InsertHeadList(
8240 IN OUT PLIST_ENTRY ListHead,
8241 IN OUT PLIST_ENTRY Entry)
8242 {
8243 PLIST_ENTRY OldFlink;
8244 OldFlink = ListHead->Flink;
8245 Entry->Flink = OldFlink;
8246 Entry->Blink = ListHead;
8247 OldFlink->Blink = Entry;
8248 ListHead->Flink = Entry;
8249 }
8250
8251 FORCEINLINE
8252 VOID
8253 AppendTailList(
8254 IN OUT PLIST_ENTRY ListHead,
8255 IN OUT PLIST_ENTRY ListToAppend)
8256 {
8257 PLIST_ENTRY ListEnd = ListHead->Blink;
8258
8259 ListHead->Blink->Flink = ListToAppend;
8260 ListHead->Blink = ListToAppend->Blink;
8261 ListToAppend->Blink->Flink = ListHead;
8262 ListToAppend->Blink = ListEnd;
8263 }
8264
8265 FORCEINLINE
8266 PSINGLE_LIST_ENTRY
8267 PopEntryList(
8268 IN OUT PSINGLE_LIST_ENTRY ListHead)
8269 {
8270 PSINGLE_LIST_ENTRY FirstEntry;
8271 FirstEntry = ListHead->Next;
8272 if (FirstEntry != NULL) {
8273 ListHead->Next = FirstEntry->Next;
8274 }
8275 return FirstEntry;
8276 }
8277
8278 FORCEINLINE
8279 VOID
8280 PushEntryList(
8281 IN OUT PSINGLE_LIST_ENTRY ListHead,
8282 IN OUT PSINGLE_LIST_ENTRY Entry)
8283 {
8284 Entry->Next = ListHead->Next;
8285 ListHead->Next = Entry;
8286 }
8287
8288 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
8289
8290 NTSYSAPI
8291 VOID
8292 NTAPI
8293 RtlAssert(
8294 IN PVOID FailedAssertion,
8295 IN PVOID FileName,
8296 IN ULONG LineNumber,
8297 IN PSTR Message);
8298
8299 /* VOID
8300 * RtlCopyMemory(
8301 * IN VOID UNALIGNED *Destination,
8302 * IN CONST VOID UNALIGNED *Source,
8303 * IN SIZE_T Length)
8304 */
8305 #define RtlCopyMemory(Destination, Source, Length) \
8306 memcpy(Destination, Source, Length)
8307
8308 #define RtlCopyBytes RtlCopyMemory
8309
8310 #if defined(_M_AMD64)
8311 NTSYSAPI
8312 VOID
8313 NTAPI
8314 RtlCopyMemoryNonTemporal(
8315 VOID UNALIGNED *Destination,
8316 CONST VOID UNALIGNED *Source,
8317 SIZE_T Length);
8318 #else
8319 #define RtlCopyMemoryNonTemporal RtlCopyMemory
8320 #endif
8321
8322 /* BOOLEAN
8323 * RtlEqualLuid(
8324 * IN PLUID Luid1,
8325 * IN PLUID Luid2)
8326 */
8327 #define RtlEqualLuid(Luid1, Luid2) \
8328 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
8329
8330 /* ULONG
8331 * RtlEqualMemory(
8332 * IN VOID UNALIGNED *Destination,
8333 * IN CONST VOID UNALIGNED *Source,
8334 * IN SIZE_T Length)
8335 */
8336 #define RtlEqualMemory(Destination, Source, Length) \
8337 (!memcmp(Destination, Source, Length))
8338
8339 /* VOID
8340 * RtlFillMemory(
8341 * IN VOID UNALIGNED *Destination,
8342 * IN SIZE_T Length,
8343 * IN UCHAR Fill)
8344 */
8345 #define RtlFillMemory(Destination, Length, Fill) \
8346 memset(Destination, Fill, Length)
8347
8348 #define RtlFillBytes RtlFillMemory
8349
8350 NTSYSAPI
8351 VOID
8352 NTAPI
8353 RtlFreeUnicodeString(
8354 IN OUT PUNICODE_STRING UnicodeString);
8355
8356 NTSYSAPI
8357 NTSTATUS
8358 NTAPI
8359 RtlGUIDFromString(
8360 IN PUNICODE_STRING GuidString,
8361 OUT GUID *Guid);
8362
8363 NTSYSAPI
8364 VOID
8365 NTAPI
8366 RtlInitUnicodeString(
8367 IN OUT PUNICODE_STRING DestinationString,
8368 IN PCWSTR SourceString OPTIONAL);
8369
8370 /* VOID
8371 * RtlMoveMemory(
8372 * IN VOID UNALIGNED *Destination,
8373 * IN CONST VOID UNALIGNED *Source,
8374 * IN SIZE_T Length)
8375 */
8376 #define RtlMoveMemory(Destination, Source, Length) \
8377 memmove(Destination, Source, Length)
8378
8379 NTSYSAPI
8380 NTSTATUS
8381 NTAPI
8382 RtlStringFromGUID(
8383 IN REFGUID Guid,
8384 OUT PUNICODE_STRING GuidString);
8385
8386 /* VOID
8387 * RtlZeroMemory(
8388 * IN VOID UNALIGNED *Destination,
8389 * IN SIZE_T Length)
8390 */
8391 #define RtlZeroMemory(Destination, Length) \
8392 memset(Destination, 0, Length)
8393
8394 #define RtlZeroBytes RtlZeroMemory
8395
8396 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8397
8398
8399
8400 NTSYSAPI
8401 BOOLEAN
8402 NTAPI
8403 RtlAreBitsClear(
8404 IN PRTL_BITMAP BitMapHeader,
8405 IN ULONG StartingIndex,
8406 IN ULONG Length);
8407
8408 NTSYSAPI
8409 BOOLEAN
8410 NTAPI
8411 RtlAreBitsSet(
8412 IN PRTL_BITMAP BitMapHeader,
8413 IN ULONG StartingIndex,
8414 IN ULONG Length);
8415
8416 NTSYSAPI
8417 NTSTATUS
8418 NTAPI
8419 RtlAnsiStringToUnicodeString(
8420 IN OUT PUNICODE_STRING DestinationString,
8421 IN PANSI_STRING SourceString,
8422 IN BOOLEAN AllocateDestinationString);
8423
8424 NTSYSAPI
8425 ULONG
8426 NTAPI
8427 RtlxAnsiStringToUnicodeSize(
8428 IN PCANSI_STRING AnsiString);
8429
8430 #define RtlAnsiStringToUnicodeSize(String) ( \
8431 NLS_MB_CODE_PAGE_TAG ? \
8432 RtlxAnsiStringToUnicodeSize(String) : \
8433 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
8434 )
8435
8436 NTSYSAPI
8437 NTSTATUS
8438 NTAPI
8439 RtlAppendUnicodeStringToString(
8440 IN OUT PUNICODE_STRING Destination,
8441 IN PCUNICODE_STRING Source);
8442
8443 NTSYSAPI
8444 NTSTATUS
8445 NTAPI
8446 RtlAppendUnicodeToString(
8447 IN OUT PUNICODE_STRING Destination,
8448 IN PCWSTR Source);
8449
8450 NTSYSAPI
8451 NTSTATUS
8452 NTAPI
8453 RtlCheckRegistryKey(
8454 IN ULONG RelativeTo,
8455 IN PWSTR Path);
8456
8457 NTSYSAPI
8458 VOID
8459 NTAPI
8460 RtlClearAllBits(
8461 IN PRTL_BITMAP BitMapHeader);
8462
8463 NTSYSAPI
8464 VOID
8465 NTAPI
8466 RtlClearBits(
8467 IN PRTL_BITMAP BitMapHeader,
8468 IN ULONG StartingIndex,
8469 IN ULONG NumberToClear);
8470
8471 NTSYSAPI
8472 SIZE_T
8473 NTAPI
8474 RtlCompareMemory(
8475 IN CONST VOID *Source1,
8476 IN CONST VOID *Source2,
8477 IN SIZE_T Length);
8478
8479 NTSYSAPI
8480 LONG
8481 NTAPI
8482 RtlCompareUnicodeString(
8483 IN PCUNICODE_STRING String1,
8484 IN PCUNICODE_STRING String2,
8485 IN BOOLEAN CaseInSensitive);
8486
8487 NTSYSAPI
8488 LONG
8489 NTAPI
8490 RtlCompareUnicodeStrings(
8491 IN PCWCH String1,
8492 IN SIZE_T String1Length,
8493 IN PCWCH String2,
8494 IN SIZE_T String2Length,
8495 IN BOOLEAN CaseInSensitive);
8496
8497 NTSYSAPI
8498 VOID
8499 NTAPI
8500 RtlCopyUnicodeString(
8501 IN OUT PUNICODE_STRING DestinationString,
8502 IN PCUNICODE_STRING SourceString OPTIONAL);
8503
8504 NTSYSAPI
8505 NTSTATUS
8506 NTAPI
8507 RtlCreateRegistryKey(
8508 IN ULONG RelativeTo,
8509 IN PWSTR Path);
8510
8511 NTSYSAPI
8512 NTSTATUS
8513 NTAPI
8514 RtlCreateSecurityDescriptor(
8515 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
8516 IN ULONG Revision);
8517
8518 NTSYSAPI
8519 NTSTATUS
8520 NTAPI
8521 RtlDeleteRegistryValue(
8522 IN ULONG RelativeTo,
8523 IN PCWSTR Path,
8524 IN PCWSTR ValueName);
8525
8526 NTSYSAPI
8527 BOOLEAN
8528 NTAPI
8529 RtlEqualUnicodeString(
8530 IN CONST UNICODE_STRING *String1,
8531 IN CONST UNICODE_STRING *String2,
8532 IN BOOLEAN CaseInSensitive);
8533
8534 #if !defined(_AMD64_) && !defined(_IA64_)
8535 NTSYSAPI
8536 LARGE_INTEGER
8537 NTAPI
8538 RtlExtendedIntegerMultiply(
8539 IN LARGE_INTEGER Multiplicand,
8540 IN LONG Multiplier);
8541
8542 NTSYSAPI
8543 LARGE_INTEGER
8544 NTAPI
8545 RtlExtendedLargeIntegerDivide(
8546 IN LARGE_INTEGER Dividend,
8547 IN ULONG Divisor,
8548 OUT PULONG Remainder OPTIONAL);
8549 #endif
8550
8551 #if defined(_X86_) || defined(_IA64_)
8552 NTSYSAPI
8553 LARGE_INTEGER
8554 NTAPI
8555 RtlExtendedMagicDivide(
8556 IN LARGE_INTEGER Dividend,
8557 IN LARGE_INTEGER MagicDivisor,
8558 IN CCHAR ShiftCount);
8559 #endif
8560
8561 NTSYSAPI
8562 VOID
8563 NTAPI
8564 RtlFreeAnsiString(
8565 IN PANSI_STRING AnsiString);
8566
8567 NTSYSAPI
8568 ULONG
8569 NTAPI
8570 RtlFindClearBits(
8571 IN PRTL_BITMAP BitMapHeader,
8572 IN ULONG NumberToFind,
8573 IN ULONG HintIndex);
8574
8575 NTSYSAPI
8576 ULONG
8577 NTAPI
8578 RtlFindClearBitsAndSet(
8579 IN PRTL_BITMAP BitMapHeader,
8580 IN ULONG NumberToFind,
8581 IN ULONG HintIndex);
8582
8583 NTSYSAPI
8584 ULONG
8585 NTAPI
8586 RtlFindFirstRunClear(
8587 IN PRTL_BITMAP BitMapHeader,
8588 OUT PULONG StartingIndex);
8589
8590 NTSYSAPI
8591 ULONG
8592 NTAPI
8593 RtlFindClearRuns(
8594 IN PRTL_BITMAP BitMapHeader,
8595 OUT PRTL_BITMAP_RUN RunArray,
8596 IN ULONG SizeOfRunArray,
8597 IN BOOLEAN LocateLongestRuns);
8598
8599 NTSYSAPI
8600 ULONG
8601 NTAPI
8602 RtlFindLastBackwardRunClear(
8603 IN PRTL_BITMAP BitMapHeader,
8604 IN ULONG FromIndex,
8605 OUT PULONG StartingRunIndex);
8606
8607 NTSYSAPI
8608 CCHAR
8609 NTAPI
8610 RtlFindLeastSignificantBit(
8611 IN ULONGLONG Set);
8612
8613 NTSYSAPI
8614 ULONG
8615 NTAPI
8616 RtlFindLongestRunClear(
8617 IN PRTL_BITMAP BitMapHeader,
8618 OUT PULONG StartingIndex);
8619
8620 NTSYSAPI
8621 CCHAR
8622 NTAPI
8623 RtlFindMostSignificantBit(
8624 IN ULONGLONG Set);
8625
8626 NTSYSAPI
8627 ULONG
8628 NTAPI
8629 RtlFindNextForwardRunClear(
8630 IN PRTL_BITMAP BitMapHeader,
8631 IN ULONG FromIndex,
8632 OUT PULONG StartingRunIndex);
8633
8634 NTSYSAPI
8635 ULONG
8636 NTAPI
8637 RtlFindSetBits(
8638 IN PRTL_BITMAP BitMapHeader,
8639 IN ULONG NumberToFind,
8640 IN ULONG HintIndex);
8641
8642 NTSYSAPI
8643 ULONG
8644 NTAPI
8645 RtlFindSetBitsAndClear(
8646 IN PRTL_BITMAP BitMapHeader,
8647 IN ULONG NumberToFind,
8648 IN ULONG HintIndex);
8649
8650 NTSYSAPI
8651 VOID
8652 NTAPI
8653 RtlInitAnsiString(
8654 IN OUT PANSI_STRING DestinationString,
8655 IN PCSZ SourceString);
8656
8657 NTSYSAPI
8658 VOID
8659 NTAPI
8660 RtlInitializeBitMap(
8661 IN PRTL_BITMAP BitMapHeader,
8662 IN PULONG BitMapBuffer,
8663 IN ULONG SizeOfBitMap);
8664
8665 NTSYSAPI
8666 VOID
8667 NTAPI
8668 RtlInitString(
8669 IN OUT PSTRING DestinationString,
8670 IN PCSZ SourceString);
8671
8672 NTSYSAPI
8673 NTSTATUS
8674 NTAPI
8675 RtlIntegerToUnicodeString(
8676 IN ULONG Value,
8677 IN ULONG Base OPTIONAL,
8678 IN OUT PUNICODE_STRING String);
8679
8680 NTSYSAPI
8681 NTSTATUS
8682 NTAPI
8683 RtlInt64ToUnicodeString(
8684 IN ULONGLONG Value,
8685 IN ULONG Base OPTIONAL,
8686 IN OUT PUNICODE_STRING String);
8687
8688 #ifdef _WIN64
8689 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8690 RtlInt64ToUnicodeString(Value, Base, String)
8691 #else
8692 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8693 RtlIntegerToUnicodeString(Value, Base, String)
8694 #endif
8695
8696 /* BOOLEAN
8697 * RtlIsZeroLuid(
8698 * IN PLUID L1);
8699 */
8700 #define RtlIsZeroLuid(_L1) \
8701 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
8702
8703 NTSYSAPI
8704 ULONG
8705 NTAPI
8706 RtlLengthSecurityDescriptor(
8707 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8708
8709 NTSYSAPI
8710 ULONG
8711 NTAPI
8712 RtlNumberOfClearBits(
8713 IN PRTL_BITMAP BitMapHeader);
8714
8715 NTSYSAPI
8716 ULONG
8717 NTAPI
8718 RtlNumberOfSetBits(
8719 IN PRTL_BITMAP BitMapHeader);
8720
8721 NTSYSAPI
8722 NTSTATUS
8723 NTAPI
8724 RtlQueryRegistryValues(
8725 IN ULONG RelativeTo,
8726 IN PCWSTR Path,
8727 IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable,
8728 IN PVOID Context OPTIONAL,
8729 IN PVOID Environment OPTIONAL);
8730
8731 #define SHORT_SIZE (sizeof(USHORT))
8732 #define SHORT_MASK (SHORT_SIZE - 1)
8733 #define LONG_SIZE (sizeof(LONG))
8734 #define LONGLONG_SIZE (sizeof(LONGLONG))
8735 #define LONG_MASK (LONG_SIZE - 1)
8736 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
8737 #define LOWBYTE_MASK 0x00FF
8738
8739 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
8740 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
8741 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
8742 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
8743
8744 NTSYSAPI
8745 VOID
8746 NTAPI
8747 RtlSetAllBits(
8748 IN PRTL_BITMAP BitMapHeader);
8749
8750 NTSYSAPI
8751 VOID
8752 NTAPI
8753 RtlSetBits(
8754 IN PRTL_BITMAP BitMapHeader,
8755 IN ULONG StartingIndex,
8756 IN ULONG NumberToSet);
8757
8758 NTSYSAPI
8759 NTSTATUS
8760 NTAPI
8761 RtlSetDaclSecurityDescriptor(
8762 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
8763 IN BOOLEAN DaclPresent,
8764 IN PACL Dacl OPTIONAL,
8765 IN BOOLEAN DaclDefaulted OPTIONAL);
8766
8767 #if defined(_AMD64_)
8768
8769 /* VOID
8770 * RtlStoreUlong(
8771 * IN PULONG Address,
8772 * IN ULONG Value);
8773 */
8774 #define RtlStoreUlong(Address,Value) \
8775 *(ULONG UNALIGNED *)(Address) = (Value)
8776
8777 /* VOID
8778 * RtlStoreUlonglong(
8779 * IN OUT PULONGLONG Address,
8780 * ULONGLONG Value);
8781 */
8782 #define RtlStoreUlonglong(Address,Value) \
8783 *(ULONGLONG UNALIGNED *)(Address) = (Value)
8784
8785 /* VOID
8786 * RtlStoreUshort(
8787 * IN PUSHORT Address,
8788 * IN USHORT Value);
8789 */
8790 #define RtlStoreUshort(Address,Value) \
8791 *(USHORT UNALIGNED *)(Address) = (Value)
8792
8793 /* VOID
8794 * RtlRetrieveUshort(
8795 * PUSHORT DestinationAddress,
8796 * PUSHORT SourceAddress);
8797 */
8798 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8799 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
8800
8801 /* VOID
8802 * RtlRetrieveUlong(
8803 * PULONG DestinationAddress,
8804 * PULONG SourceAddress);
8805 */
8806 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8807 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
8808
8809 #else
8810
8811 #define RtlStoreUlong(Address,Value) \
8812 if ((ULONG_PTR)(Address) & LONG_MASK) { \
8813 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
8814 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
8815 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
8816 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
8817 } \
8818 else { \
8819 *((PULONG)(Address)) = (ULONG) (Value); \
8820 }
8821
8822 #define RtlStoreUlonglong(Address,Value) \
8823 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
8824 RtlStoreUlong((ULONG_PTR)(Address), \
8825 (ULONGLONG)(Value) & 0xFFFFFFFF); \
8826 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
8827 (ULONGLONG)(Value) >> 32); \
8828 } else { \
8829 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
8830 }
8831
8832 #define RtlStoreUshort(Address,Value) \
8833 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
8834 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
8835 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
8836 } \
8837 else { \
8838 *((PUSHORT) (Address)) = (USHORT)Value; \
8839 }
8840
8841 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8842 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8843 { \
8844 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8845 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8846 } \
8847 else \
8848 { \
8849 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
8850 }
8851
8852 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8853 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8854 { \
8855 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8856 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8857 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
8858 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
8859 } \
8860 else \
8861 { \
8862 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
8863 }
8864
8865 #endif /* defined(_AMD64_) */
8866
8867 #ifdef _WIN64
8868 /* VOID
8869 * RtlStoreUlongPtr(
8870 * IN OUT PULONG_PTR Address,
8871 * IN ULONG_PTR Value);
8872 */
8873 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
8874 #else
8875 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
8876 #endif /* _WIN64 */
8877
8878
8879 NTSYSAPI
8880 BOOLEAN
8881 NTAPI
8882 RtlTimeFieldsToTime(
8883 IN PTIME_FIELDS TimeFields,
8884 IN PLARGE_INTEGER Time);
8885
8886 NTSYSAPI
8887 VOID
8888 NTAPI
8889 RtlTimeToTimeFields(
8890 IN PLARGE_INTEGER Time,
8891 IN PTIME_FIELDS TimeFields);
8892
8893 NTSYSAPI
8894 ULONG
8895 FASTCALL
8896 RtlUlongByteSwap(
8897 IN ULONG Source);
8898
8899 NTSYSAPI
8900 ULONGLONG
8901 FASTCALL
8902 RtlUlonglongByteSwap(
8903 IN ULONGLONG Source);
8904
8905 NTSYSAPI
8906 NTSTATUS
8907 NTAPI
8908 RtlUnicodeStringToAnsiString(
8909 IN OUT PANSI_STRING DestinationString,
8910 IN PCUNICODE_STRING SourceString,
8911 IN BOOLEAN AllocateDestinationString);
8912
8913 NTSYSAPI
8914 ULONG
8915 NTAPI
8916 RtlxUnicodeStringToAnsiSize(
8917 IN PCUNICODE_STRING UnicodeString);
8918
8919 #define RtlUnicodeStringToAnsiSize(String) ( \
8920 NLS_MB_CODE_PAGE_TAG ? \
8921 RtlxUnicodeStringToAnsiSize(String) : \
8922 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
8923 )
8924
8925 NTSYSAPI
8926 NTSTATUS
8927 NTAPI
8928 RtlUnicodeStringToInteger(
8929 IN PCUNICODE_STRING String,
8930 IN ULONG Base OPTIONAL,
8931 OUT PULONG Value);
8932
8933 NTSYSAPI
8934 WCHAR
8935 NTAPI
8936 RtlUpcaseUnicodeChar(
8937 IN WCHAR SourceCharacter);
8938
8939 NTSYSAPI
8940 USHORT
8941 FASTCALL
8942 RtlUshortByteSwap(
8943 IN USHORT Source);
8944
8945 NTSYSAPI
8946 BOOLEAN
8947 NTAPI
8948 RtlValidRelativeSecurityDescriptor(
8949 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
8950 IN ULONG SecurityDescriptorLength,
8951 IN SECURITY_INFORMATION RequiredInformation);
8952
8953 NTSYSAPI
8954 BOOLEAN
8955 NTAPI
8956 RtlValidSecurityDescriptor(
8957 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8958
8959 NTSYSAPI
8960 NTSTATUS
8961 NTAPI
8962 RtlWriteRegistryValue(
8963 IN ULONG RelativeTo,
8964 IN PCWSTR Path,
8965 IN PCWSTR ValueName,
8966 IN ULONG ValueType,
8967 IN PVOID ValueData,
8968 IN ULONG ValueLength);
8969
8970
8971 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8972
8973
8974 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
8975 NTSYSAPI
8976 VOID
8977 FASTCALL
8978 RtlPrefetchMemoryNonTemporal(
8979 IN PVOID Source,
8980 IN SIZE_T Length);
8981 #endif
8982
8983
8984 #if (NTDDI_VERSION >= NTDDI_WINXP)
8985
8986
8987
8988 NTSYSAPI
8989 VOID
8990 NTAPI
8991 RtlClearBit(
8992 PRTL_BITMAP BitMapHeader,
8993 ULONG BitNumber);
8994
8995 NTSYSAPI
8996 WCHAR
8997 NTAPI
8998 RtlDowncaseUnicodeChar(
8999 IN WCHAR SourceCharacter);
9000
9001 NTSYSAPI
9002 VOID
9003 NTAPI
9004 RtlSetBit(
9005 PRTL_BITMAP BitMapHeader,
9006 ULONG BitNumber);
9007
9008 NTSYSAPI
9009 BOOLEAN
9010 NTAPI
9011 RtlTestBit(
9012 IN PRTL_BITMAP BitMapHeader,
9013 IN ULONG BitNumber);
9014
9015 NTSYSAPI
9016 NTSTATUS
9017 NTAPI
9018 RtlHashUnicodeString(
9019 IN CONST UNICODE_STRING *String,
9020 IN BOOLEAN CaseInSensitive,
9021 IN ULONG HashAlgorithm,
9022 OUT PULONG HashValue);
9023
9024
9025 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
9026
9027 #if (NTDDI_VERSION >= NTDDI_VISTA)
9028
9029
9030
9031 NTSYSAPI
9032 ULONG
9033 NTAPI
9034 RtlNumberOfSetBitsUlongPtr(
9035 IN ULONG_PTR Target);
9036
9037 NTSYSAPI
9038 ULONGLONG
9039 NTAPI
9040 RtlIoDecodeMemIoResource(
9041 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
9042 OUT PULONGLONG Alignment OPTIONAL,
9043 OUT PULONGLONG MinimumAddress OPTIONAL,
9044 OUT PULONGLONG MaximumAddress OPTIONAL);
9045
9046 NTSYSAPI
9047 NTSTATUS
9048 NTAPI
9049 RtlIoEncodeMemIoResource(
9050 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
9051 IN UCHAR Type,
9052 IN ULONGLONG Length,
9053 IN ULONGLONG Alignment,
9054 IN ULONGLONG MinimumAddress,
9055 IN ULONGLONG MaximumAddress);
9056
9057 NTSYSAPI
9058 ULONGLONG
9059 NTAPI
9060 RtlCmDecodeMemIoResource(
9061 IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
9062 OUT PULONGLONG Start OPTIONAL);
9063
9064 NTSYSAPI
9065 NTSTATUS
9066 NTAPI
9067 RtlFindClosestEncodableLength(
9068 IN ULONGLONG SourceLength,
9069 OUT PULONGLONG TargetLength);
9070
9071 NTSYSAPI
9072 NTSTATUS
9073 NTAPI
9074 RtlCmEncodeMemIoResource(
9075 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
9076 IN UCHAR Type,
9077 IN ULONGLONG Length,
9078 IN ULONGLONG Start);
9079
9080
9081 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
9082
9083 #if (NTDDI_VERSION >= NTDDI_WIN7)
9084
9085
9086
9087 NTSYSAPI
9088 NTSTATUS
9089 NTAPI
9090 RtlUnicodeToUTF8N(
9091 OUT PCHAR UTF8StringDestination,
9092 IN ULONG UTF8StringMaxByteCount,
9093 OUT PULONG UTF8StringActualByteCount,
9094 IN PCWCH UnicodeStringSource,
9095 IN ULONG UnicodeStringByteCount);
9096
9097 NTSYSAPI
9098 NTSTATUS
9099 NTAPI
9100 RtlUTF8ToUnicodeN(
9101 OUT PWSTR UnicodeStringDestination,
9102 IN ULONG UnicodeStringMaxByteCount,
9103 OUT PULONG UnicodeStringActualByteCount,
9104 IN PCCH UTF8StringSource,
9105 IN ULONG UTF8StringByteCount);
9106
9107 NTSYSAPI
9108 ULONG64
9109 NTAPI
9110 RtlGetEnabledExtendedFeatures(
9111 IN ULONG64 FeatureMask);
9112
9113
9114 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
9115
9116
9117 #if !defined(MIDL_PASS)
9118 /* inline funftions */
9119 //DECLSPEC_DEPRECATED_DDK_WINXP
9120 static __inline
9121 LARGE_INTEGER
9122 NTAPI_INLINE
9123 RtlConvertLongToLargeInteger(
9124 IN LONG SignedInteger)
9125 {
9126 LARGE_INTEGER ret;
9127 ret.QuadPart = SignedInteger;
9128 return ret;
9129 }
9130
9131 //DECLSPEC_DEPRECATED_DDK_WINXP
9132 static __inline
9133 LARGE_INTEGER
9134 NTAPI_INLINE
9135 RtlConvertUlongToLargeInteger(
9136 IN ULONG UnsignedInteger)
9137 {
9138 LARGE_INTEGER ret;
9139 ret.QuadPart = UnsignedInteger;
9140 return ret;
9141 }
9142
9143 //DECLSPEC_DEPRECATED_DDK_WINXP
9144 static __inline
9145 LARGE_INTEGER
9146 NTAPI_INLINE
9147 RtlLargeIntegerShiftLeft(
9148 IN LARGE_INTEGER LargeInteger,
9149 IN CCHAR ShiftCount)
9150 {
9151 LARGE_INTEGER Result;
9152
9153 Result.QuadPart = LargeInteger.QuadPart << ShiftCount;
9154 return Result;
9155 }
9156
9157 //DECLSPEC_DEPRECATED_DDK_WINXP
9158 static __inline
9159 LARGE_INTEGER
9160 NTAPI_INLINE
9161 RtlLargeIntegerShiftRight(
9162 IN LARGE_INTEGER LargeInteger,
9163 IN CCHAR ShiftCount)
9164 {
9165 LARGE_INTEGER Result;
9166
9167 Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount;
9168 return Result;
9169 }
9170
9171 //DECLSPEC_DEPRECATED_DDK
9172 static __inline
9173 ULONG
9174 NTAPI_INLINE
9175 RtlEnlargedUnsignedDivide(
9176 IN ULARGE_INTEGER Dividend,
9177 IN ULONG Divisor,
9178 IN OUT PULONG Remainder)
9179 {
9180 if (Remainder)
9181 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9182 return (ULONG)(Dividend.QuadPart / Divisor);
9183 }
9184
9185 //DECLSPEC_DEPRECATED_DDK
9186 static __inline
9187 LARGE_INTEGER
9188 NTAPI_INLINE
9189 RtlLargeIntegerNegate(
9190 IN LARGE_INTEGER Subtrahend)
9191 {
9192 LARGE_INTEGER Difference;
9193
9194 Difference.QuadPart = -Subtrahend.QuadPart;
9195 return Difference;
9196 }
9197
9198 //DECLSPEC_DEPRECATED_DDK
9199 static __inline
9200 LARGE_INTEGER
9201 NTAPI_INLINE
9202 RtlLargeIntegerSubtract(
9203 IN LARGE_INTEGER Minuend,
9204 IN LARGE_INTEGER Subtrahend)
9205 {
9206 LARGE_INTEGER Difference;
9207
9208 Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
9209 return Difference;
9210 }
9211
9212 //DECLSPEC_DEPRECATED_DDK
9213 static __inline
9214 LARGE_INTEGER
9215 NTAPI_INLINE
9216 RtlEnlargedUnsignedMultiply(
9217 IN ULONG Multiplicand,
9218 IN ULONG Multiplier)
9219 {
9220 LARGE_INTEGER ret;
9221 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9222 return ret;
9223 }
9224
9225 //DECLSPEC_DEPRECATED_DDK
9226 static __inline
9227 LARGE_INTEGER
9228 NTAPI_INLINE
9229 RtlEnlargedIntegerMultiply(
9230 IN LONG Multiplicand,
9231 IN LONG Multiplier)
9232 {
9233 LARGE_INTEGER ret;
9234 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9235 return ret;
9236 }
9237
9238 FORCEINLINE
9239 VOID
9240 RtlInitEmptyAnsiString(
9241 OUT PANSI_STRING AnsiString,
9242 IN PCHAR Buffer,
9243 IN USHORT BufferSize)
9244 {
9245 AnsiString->Length = 0;
9246 AnsiString->MaximumLength = BufferSize;
9247 AnsiString->Buffer = Buffer;
9248 }
9249
9250 FORCEINLINE
9251 VOID
9252 RtlInitEmptyUnicodeString(
9253 OUT PUNICODE_STRING UnicodeString,
9254 IN PWSTR Buffer,
9255 IN USHORT BufferSize)
9256 {
9257 UnicodeString->Length = 0;
9258 UnicodeString->MaximumLength = BufferSize;
9259 UnicodeString->Buffer = Buffer;
9260 }
9261
9262 #if defined(_AMD64_) || defined(_IA64_)
9263
9264
9265 static __inline
9266 LARGE_INTEGER
9267 NTAPI_INLINE
9268 RtlExtendedIntegerMultiply(
9269 IN LARGE_INTEGER Multiplicand,
9270 IN LONG Multiplier)
9271 {
9272 LARGE_INTEGER ret;
9273 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
9274 return ret;
9275 }
9276
9277 static __inline
9278 LARGE_INTEGER
9279 NTAPI_INLINE
9280 RtlExtendedLargeIntegerDivide(
9281 IN LARGE_INTEGER Dividend,
9282 IN ULONG Divisor,
9283 OUT PULONG Remainder OPTIONAL)
9284 {
9285 LARGE_INTEGER ret;
9286 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
9287 if (Remainder)
9288 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9289 return ret;
9290 }
9291
9292
9293
9294 #endif /* defined(_AMD64_) || defined(_IA64_) */
9295
9296
9297 #if defined(_AMD64_)
9298
9299 #define MultiplyHigh __mulh
9300 #define UnsignedMultiplyHigh __umulh
9301
9302 //DECLSPEC_DEPRECATED_DDK
9303 static __inline
9304 LARGE_INTEGER
9305 NTAPI_INLINE
9306 RtlExtendedMagicDivide(
9307 IN LARGE_INTEGER Dividend,
9308 IN LARGE_INTEGER MagicDivisor,
9309 IN CCHAR ShiftCount)
9310 {
9311 LARGE_INTEGER ret;
9312 ULONG64 ret64;
9313 BOOLEAN Pos;
9314 Pos = (Dividend.QuadPart >= 0);
9315 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
9316 MagicDivisor.QuadPart);
9317 ret64 >>= ShiftCount;
9318 ret.QuadPart = Pos ? ret64 : -ret64;
9319 return ret;
9320 }
9321 #endif
9322
9323 //DECLSPEC_DEPRECATED_DDK
9324 static __inline
9325 LARGE_INTEGER
9326 NTAPI_INLINE
9327 RtlLargeIntegerAdd(
9328 IN LARGE_INTEGER Addend1,
9329 IN LARGE_INTEGER Addend2)
9330 {
9331 LARGE_INTEGER ret;
9332 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
9333 return ret;
9334 }
9335
9336 /* VOID
9337 * RtlLargeIntegerAnd(
9338 * IN OUT LARGE_INTEGER Result,
9339 * IN LARGE_INTEGER Source,
9340 * IN LARGE_INTEGER Mask);
9341 */
9342 #define RtlLargeIntegerAnd(Result, Source, Mask) \
9343 Result.QuadPart = Source.QuadPart & Mask.QuadPart
9344
9345 //DECLSPEC_DEPRECATED_DDK
9346 static __inline
9347 LARGE_INTEGER
9348 NTAPI_INLINE
9349 RtlLargeIntegerArithmeticShift(
9350 IN LARGE_INTEGER LargeInteger,
9351 IN CCHAR ShiftCount)
9352 {
9353 LARGE_INTEGER ret;
9354 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
9355 return ret;
9356 }
9357
9358 /* BOOLEAN
9359 * RtlLargeIntegerEqualTo(
9360 * IN LARGE_INTEGER Operand1,
9361 * IN LARGE_INTEGER Operand2);
9362 */
9363 #define RtlLargeIntegerEqualTo(X,Y) \
9364 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
9365
9366 FORCEINLINE
9367 PVOID
9368 RtlSecureZeroMemory(
9369 OUT PVOID Pointer,
9370 IN SIZE_T Size)
9371 {
9372 volatile char* vptr = (volatile char*)Pointer;
9373 #if defined(_M_AMD64)
9374 __stosb((PUCHAR)vptr, 0, Size);
9375 #else
9376 char * endptr = (char *)vptr + Size;
9377 while (vptr < endptr) {
9378 *vptr = 0; vptr++;
9379 }
9380 #endif
9381 return Pointer;
9382 }
9383
9384 #if defined(_M_AMD64)
9385 FORCEINLINE
9386 BOOLEAN
9387 RtlCheckBit(
9388 IN PRTL_BITMAP BitMapHeader,
9389 IN ULONG BitPosition)
9390 {
9391 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
9392 }
9393 #else
9394 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
9395 #endif /* defined(_M_AMD64) */
9396
9397 #define RtlLargeIntegerGreaterThan(X,Y) ( \
9398 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
9399 ((X).HighPart > (Y).HighPart) \
9400 )
9401
9402 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
9403 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
9404 ((X).HighPart > (Y).HighPart) \
9405 )
9406
9407 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
9408 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
9409 )
9410
9411 #define RtlLargeIntegerLessThan(X,Y) ( \
9412 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
9413 ((X).HighPart < (Y).HighPart) \
9414 )
9415
9416 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
9417 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
9418 ((X).HighPart < (Y).HighPart) \
9419 )
9420
9421 #define RtlLargeIntegerGreaterThanZero(X) ( \
9422 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
9423 ((X).HighPart > 0 ) \
9424 )
9425
9426 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
9427
9428 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
9429
9430 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
9431
9432 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
9433
9434 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
9435
9436 #endif /* !defined(MIDL_PASS) */
9437
9438 /* Byte Swap Functions */
9439 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
9440 ((defined(_M_AMD64) || defined(_M_IA64)) \
9441 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
9442
9443 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
9444 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
9445 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
9446
9447 #endif
9448
9449 #if DBG
9450
9451 #define ASSERT(exp) \
9452 (VOID)((!(exp)) ? \
9453 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
9454
9455 #define ASSERTMSG(msg, exp) \
9456 (VOID)((!(exp)) ? \
9457 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
9458
9459 #define RTL_SOFT_ASSERT(exp) \
9460 (VOID)((!(exp)) ? \
9461 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
9462
9463 #define RTL_SOFT_ASSERTMSG(msg, exp) \
9464 (VOID)((!(exp)) ? \
9465 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
9466
9467 #define RTL_VERIFY(exp) ASSERT(exp)
9468 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
9469
9470 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
9471 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
9472
9473 #if defined(_MSC_VER)
9474
9475 #define NT_ASSERT(exp) \
9476 ((!(exp)) ? \
9477 (__annotation(L"Debug", L"AssertFail", L#exp), \
9478 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9479
9480 #define NT_ASSERTMSG(msg, exp) \
9481 ((!(exp)) ? \
9482 (__annotation(L"Debug", L"AssertFail", L##msg), \
9483 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9484
9485 #define NT_ASSERTMSGW(msg, exp) \
9486 ((!(exp)) ? \
9487 (__annotation(L"Debug", L"AssertFail", msg), \
9488 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9489
9490 #define NT_VERIFY NT_ASSERT
9491 #define NT_VERIFYMSG NT_ASSERTMSG
9492 #define NT_VERIFYMSGW NT_ASSERTMSGW
9493
9494 #else
9495
9496 /* GCC doesn't support __annotation (nor PDB) */
9497 #define NT_ASSERT(exp) \
9498 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
9499
9500 #define NT_ASSERTMSG NT_ASSERT
9501 #define NT_ASSERTMSGW NT_ASSERT
9502
9503 #endif
9504
9505 #else /* !DBG */
9506
9507 #define ASSERT(exp) ((VOID) 0)
9508 #define ASSERTMSG(msg, exp) ((VOID) 0)
9509
9510 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
9511 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
9512
9513 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
9514 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9515
9516 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
9517 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9518
9519 #define NT_ASSERT(exp) ((VOID)0)
9520 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
9521 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
9522
9523 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
9524 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
9525 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
9526
9527 #endif /* DBG */
9528
9529 #define InitializeListHead32(ListHead) (\
9530 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
9531
9532 #if !defined(_WINBASE_)
9533
9534 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
9535
9536 NTKERNELAPI
9537 VOID
9538 InitializeSListHead(
9539 OUT PSLIST_HEADER SListHead);
9540
9541 #else
9542
9543 VOID
9544 FORCEINLINE
9545 InitializeSListHead(
9546 OUT PSLIST_HEADER SListHead)
9547 {
9548 #if defined(_IA64_)
9549 ULONG64 FeatureBits;
9550 #endif
9551
9552 #if defined(_WIN64)
9553 if (((ULONG_PTR)SListHead & 0xf) != 0) {
9554 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
9555 }
9556 #endif
9557 RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
9558 #if defined(_IA64_)
9559 FeatureBits = __getReg(CV_IA64_CPUID4);
9560 if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
9561 SListHead->Header16.HeaderType = 1;
9562 SListHead->Header16.Init = 1;
9563 }
9564 #endif
9565 }
9566
9567 #endif
9568
9569 #if defined(_WIN64)
9570
9571 #define InterlockedPopEntrySList(Head) \
9572 ExpInterlockedPopEntrySList(Head)
9573
9574 #define InterlockedPushEntrySList(Head, Entry) \
9575 ExpInterlockedPushEntrySList(Head, Entry)
9576
9577 #define InterlockedFlushSList(Head) \
9578 ExpInterlockedFlushSList(Head)
9579
9580 #define QueryDepthSList(Head) \
9581 ExQueryDepthSList(Head)
9582
9583 #else /* !defined(_WIN64) */
9584
9585 NTKERNELAPI
9586 PSLIST_ENTRY
9587 FASTCALL
9588 InterlockedPopEntrySList(
9589 IN PSLIST_HEADER ListHead);
9590
9591 NTKERNELAPI
9592 PSLIST_ENTRY
9593 FASTCALL
9594 InterlockedPushEntrySList(
9595 IN PSLIST_HEADER ListHead,
9596 IN PSLIST_ENTRY ListEntry);
9597
9598 #define InterlockedFlushSList(ListHead) \
9599 ExInterlockedFlushSList(ListHead)
9600
9601 #define QueryDepthSList(Head) \
9602 ExQueryDepthSList(Head)
9603
9604 #endif /* !defined(_WIN64) */
9605
9606 #endif /* !defined(_WINBASE_) */
9607
9608 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
9609 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
9610 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
9611 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
9612 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
9613 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
9614 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
9615 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
9616 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
9617 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
9618 (PCONTEXT_EX)(Context + 1), \
9619 Chunk)
9620
9621 BOOLEAN
9622 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)(
9623 IN ULONG Version);
9624
9625 BOOLEAN
9626 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
9627 IN ULONG Version);
9628
9629 #ifndef RtlIsNtDdiVersionAvailable
9630 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
9631 #endif
9632
9633 #ifndef RtlIsServicePackVersionInstalled
9634 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
9635 #endif
9636
9637 #define RtlInterlockedSetBits(Flags, Flag) \
9638 InterlockedOr((PLONG)(Flags), Flag)
9639
9640 #define RtlInterlockedAndBits(Flags, Flag) \
9641 InterlockedAnd((PLONG)(Flags), Flag)
9642
9643 #define RtlInterlockedClearBits(Flags, Flag) \
9644 RtlInterlockedAndBits(Flags, ~(Flag))
9645
9646 #define RtlInterlockedXorBits(Flags, Flag) \
9647 InterlockedXor(Flags, Flag)
9648
9649 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
9650 (VOID) RtlInterlockedSetBits(Flags, Flag)
9651
9652 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
9653 (VOID) RtlInterlockedAndBits(Flags, Flag)
9654
9655 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
9656 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
9657
9658
9659 /******************************************************************************
9660 * Kernel Functions *
9661 ******************************************************************************/
9662
9663 NTKERNELAPI
9664 VOID
9665 NTAPI
9666 KeInitializeEvent(
9667 OUT PRKEVENT Event,
9668 IN EVENT_TYPE Type,
9669 IN BOOLEAN State);
9670
9671 NTKERNELAPI
9672 VOID
9673 NTAPI
9674 KeClearEvent(
9675 IN OUT PRKEVENT Event);
9676
9677 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9678
9679
9680
9681 #if defined(_NTDDK_) || defined(_NTIFS_)
9682 NTKERNELAPI
9683 VOID
9684 NTAPI
9685 ProbeForRead(
9686 IN CONST VOID *Address, /* CONST is added */
9687 IN SIZE_T Length,
9688 IN ULONG Alignment);
9689 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
9690
9691 NTKERNELAPI
9692 VOID
9693 NTAPI
9694 ProbeForWrite(
9695 IN PVOID Address,
9696 IN SIZE_T Length,
9697 IN ULONG Alignment);
9698
9699
9700 #if defined(SINGLE_GROUP_LEGACY_API)
9701
9702 NTKERNELAPI
9703 VOID
9704 NTAPI
9705 KeRevertToUserAffinityThread(VOID);
9706
9707 NTKERNELAPI
9708 VOID
9709 NTAPI
9710 KeSetSystemAffinityThread(
9711 IN KAFFINITY Affinity);
9712
9713 NTKERNELAPI
9714 VOID
9715 NTAPI
9716 KeSetTargetProcessorDpc(
9717 IN OUT PRKDPC Dpc,
9718 IN CCHAR Number);
9719
9720 NTKERNELAPI
9721 KAFFINITY
9722 NTAPI
9723 KeQueryActiveProcessors(VOID);
9724
9725
9726 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
9727
9728 #if !defined(_M_AMD64)
9729
9730 NTKERNELAPI
9731 ULONGLONG
9732 NTAPI
9733 KeQueryInterruptTime(VOID);
9734
9735 NTKERNELAPI
9736 VOID
9737 NTAPI
9738 KeQuerySystemTime(
9739 OUT PLARGE_INTEGER CurrentTime);
9740
9741 #endif /* !_M_AMD64 */
9742
9743 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
9744 NTKERNELAPI
9745 VOID
9746 NTAPI
9747 KeInitializeSpinLock(
9748 IN PKSPIN_LOCK SpinLock);
9749 #else
9750 FORCEINLINE
9751 VOID
9752 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
9753 {
9754 /* Clear the lock */
9755 *SpinLock = 0;
9756 }
9757 #endif
9758
9759 NTKERNELAPI
9760 DECLSPEC_NORETURN
9761 VOID
9762 NTAPI
9763 KeBugCheckEx(
9764 IN ULONG BugCheckCode,
9765 IN ULONG_PTR BugCheckParameter1,
9766 IN ULONG_PTR BugCheckParameter2,
9767 IN ULONG_PTR BugCheckParameter3,
9768 IN ULONG_PTR BugCheckParameter4);
9769
9770 NTKERNELAPI
9771 BOOLEAN
9772 NTAPI
9773 KeCancelTimer(
9774 IN OUT PKTIMER);
9775
9776 NTKERNELAPI
9777 NTSTATUS
9778 NTAPI
9779 KeDelayExecutionThread(
9780 IN KPROCESSOR_MODE WaitMode,
9781 IN BOOLEAN Alertable,
9782 IN PLARGE_INTEGER Interval);
9783
9784 NTKERNELAPI
9785 BOOLEAN
9786 NTAPI
9787 KeDeregisterBugCheckCallback(
9788 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
9789
9790 NTKERNELAPI
9791 VOID
9792 NTAPI
9793 KeEnterCriticalRegion(VOID);
9794
9795 NTKERNELAPI
9796 VOID
9797 NTAPI
9798 KeInitializeDeviceQueue(
9799 OUT PKDEVICE_QUEUE DeviceQueue);
9800
9801 NTKERNELAPI
9802 VOID
9803 NTAPI
9804 KeInitializeDpc(
9805 OUT PRKDPC Dpc,
9806 IN PKDEFERRED_ROUTINE DeferredRoutine,
9807 IN PVOID DeferredContext OPTIONAL);
9808
9809 NTKERNELAPI
9810 VOID
9811 NTAPI
9812 KeInitializeMutex(
9813 OUT PRKMUTEX Mutex,
9814 IN ULONG Level);
9815
9816 NTKERNELAPI
9817 VOID
9818 NTAPI
9819 KeInitializeSemaphore(
9820 OUT PRKSEMAPHORE Semaphore,
9821 IN LONG Count,
9822 IN LONG Limit);
9823
9824 NTKERNELAPI
9825 VOID
9826 NTAPI
9827 KeInitializeTimer(
9828 OUT PKTIMER Timer);
9829
9830 NTKERNELAPI
9831 VOID
9832 NTAPI
9833 KeInitializeTimerEx(
9834 OUT PKTIMER Timer,
9835 IN TIMER_TYPE Type);
9836
9837 NTKERNELAPI
9838 BOOLEAN
9839 NTAPI
9840 KeInsertByKeyDeviceQueue(
9841 IN OUT PKDEVICE_QUEUE DeviceQueue,
9842 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
9843 IN ULONG SortKey);
9844
9845 NTKERNELAPI
9846 BOOLEAN
9847 NTAPI
9848 KeInsertDeviceQueue(
9849 IN OUT PKDEVICE_QUEUE DeviceQueue,
9850 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9851
9852 NTKERNELAPI
9853 BOOLEAN
9854 NTAPI
9855 KeInsertQueueDpc(
9856 IN OUT PRKDPC Dpc,
9857 IN PVOID SystemArgument1 OPTIONAL,
9858 IN PVOID SystemArgument2 OPTIONAL);
9859
9860 NTKERNELAPI
9861 VOID
9862 NTAPI
9863 KeLeaveCriticalRegion(VOID);
9864
9865 NTHALAPI
9866 LARGE_INTEGER
9867 NTAPI
9868 KeQueryPerformanceCounter(
9869 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
9870
9871 NTKERNELAPI
9872 KPRIORITY
9873 NTAPI
9874 KeQueryPriorityThread(
9875 IN PRKTHREAD Thread);
9876
9877 NTKERNELAPI
9878 ULONG
9879 NTAPI
9880 KeQueryTimeIncrement(VOID);
9881
9882 NTKERNELAPI
9883 LONG
9884 NTAPI
9885 KeReadStateEvent(
9886 IN PRKEVENT Event);
9887
9888 NTKERNELAPI
9889 LONG
9890 NTAPI
9891 KeReadStateMutex(
9892 IN PRKMUTEX Mutex);
9893
9894 NTKERNELAPI
9895 LONG
9896 NTAPI
9897 KeReadStateSemaphore(
9898 IN PRKSEMAPHORE Semaphore);
9899
9900 NTKERNELAPI
9901 BOOLEAN
9902 NTAPI
9903 KeReadStateTimer(
9904 IN PKTIMER Timer);
9905
9906 NTKERNELAPI
9907 BOOLEAN
9908 NTAPI
9909 KeRegisterBugCheckCallback(
9910 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
9911 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
9912 IN PVOID Buffer,
9913 IN ULONG Length,
9914 IN PUCHAR Component);
9915
9916 NTKERNELAPI
9917 LONG
9918 NTAPI
9919 KeReleaseMutex(
9920 IN OUT PRKMUTEX Mutex,
9921 IN BOOLEAN Wait);
9922
9923 NTKERNELAPI
9924 LONG
9925 NTAPI
9926 KeReleaseSemaphore(
9927 IN OUT PRKSEMAPHORE Semaphore,
9928 IN KPRIORITY Increment,
9929 IN LONG Adjustment,
9930 IN BOOLEAN Wait);
9931
9932 NTKERNELAPI
9933 PKDEVICE_QUEUE_ENTRY
9934 NTAPI
9935 KeRemoveByKeyDeviceQueue(
9936 IN OUT PKDEVICE_QUEUE DeviceQueue,
9937 IN ULONG SortKey);
9938
9939 NTKERNELAPI
9940 PKDEVICE_QUEUE_ENTRY
9941 NTAPI
9942 KeRemoveDeviceQueue(
9943 IN OUT PKDEVICE_QUEUE DeviceQueue);
9944
9945 NTKERNELAPI
9946 BOOLEAN
9947 NTAPI
9948 KeRemoveEntryDeviceQueue(
9949 IN OUT PKDEVICE_QUEUE DeviceQueue,
9950 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9951
9952 NTKERNELAPI
9953 BOOLEAN
9954 NTAPI
9955 KeRemoveQueueDpc(
9956 IN OUT PRKDPC Dpc);
9957
9958 NTKERNELAPI
9959 LONG
9960 NTAPI
9961 KeResetEvent(
9962 IN OUT PRKEVENT Event);
9963
9964 NTKERNELAPI
9965 LONG
9966 NTAPI
9967 KeSetEvent(
9968 IN OUT PRKEVENT Event,
9969 IN KPRIORITY Increment,
9970 IN BOOLEAN Wait);
9971
9972 NTKERNELAPI
9973 VOID
9974 NTAPI
9975 KeSetImportanceDpc(
9976 IN OUT PRKDPC Dpc,
9977 IN KDPC_IMPORTANCE Importance);
9978
9979 NTKERNELAPI
9980 KPRIORITY
9981 NTAPI
9982 KeSetPriorityThread(
9983 IN OUT PKTHREAD Thread,
9984 IN KPRIORITY Priority);
9985
9986 NTKERNELAPI
9987 BOOLEAN
9988 NTAPI
9989 KeSetTimer(
9990 IN OUT PKTIMER Timer,
9991 IN LARGE_INTEGER DueTime,
9992 IN PKDPC Dpc OPTIONAL);
9993
9994 NTKERNELAPI
9995 BOOLEAN
9996 NTAPI
9997 KeSetTimerEx(
9998 IN OUT PKTIMER Timer,
9999 IN LARGE_INTEGER DueTime,
10000 IN LONG Period OPTIONAL,
10001 IN PKDPC Dpc OPTIONAL);
10002
10003 NTHALAPI
10004 VOID
10005 NTAPI
10006 KeStallExecutionProcessor(
10007 IN ULONG MicroSeconds);
10008
10009 NTKERNELAPI
10010 BOOLEAN
10011 NTAPI
10012 KeSynchronizeExecution(
10013 IN OUT PKINTERRUPT Interrupt,
10014 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
10015 IN PVOID SynchronizeContext OPTIONAL);
10016
10017 NTKERNELAPI
10018 NTSTATUS
10019 NTAPI
10020 KeWaitForMultipleObjects(
10021 IN ULONG Count,
10022 IN PVOID Object[],
10023 IN WAIT_TYPE WaitType,
10024 IN KWAIT_REASON WaitReason,
10025 IN KPROCESSOR_MODE WaitMode,
10026 IN BOOLEAN Alertable,
10027 IN PLARGE_INTEGER Timeout OPTIONAL,
10028 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
10029
10030 #define KeWaitForMutexObject KeWaitForSingleObject
10031
10032 NTKERNELAPI
10033 NTSTATUS
10034 NTAPI
10035 KeWaitForSingleObject(
10036 IN PVOID Object,
10037 IN KWAIT_REASON WaitReason,
10038 IN KPROCESSOR_MODE WaitMode,
10039 IN BOOLEAN Alertable,
10040 IN PLARGE_INTEGER Timeout OPTIONAL);
10041
10042 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10043
10044 #if (NTDDI_VERSION >= NTDDI_WINXP)
10045
10046 _DECL_HAL_KE_IMPORT
10047 VOID
10048 FASTCALL
10049 KeAcquireInStackQueuedSpinLock(
10050 IN OUT PKSPIN_LOCK SpinLock,
10051 OUT PKLOCK_QUEUE_HANDLE LockHandle);
10052
10053 NTKERNELAPI
10054 VOID
10055 FASTCALL
10056 KeAcquireInStackQueuedSpinLockAtDpcLevel(
10057 IN OUT PKSPIN_LOCK SpinLock,
10058 OUT PKLOCK_QUEUE_HANDLE LockHandle);
10059
10060 NTKERNELAPI
10061 KIRQL
10062 NTAPI
10063 KeAcquireInterruptSpinLock(
10064 IN OUT PKINTERRUPT Interrupt);
10065
10066 NTKERNELAPI
10067 BOOLEAN
10068 NTAPI
10069 KeAreApcsDisabled(VOID);
10070
10071 NTKERNELAPI
10072 ULONG
10073 NTAPI
10074 KeGetRecommendedSharedDataAlignment(VOID);
10075
10076 NTKERNELAPI
10077 ULONG
10078 NTAPI
10079 KeQueryRuntimeThread(
10080 IN PKTHREAD Thread,
10081 OUT PULONG UserTime);
10082
10083 NTKERNELAPI
10084 VOID
10085 FASTCALL
10086 KeReleaseInStackQueuedSpinLockFromDpcLevel(
10087 IN PKLOCK_QUEUE_HANDLE LockHandle);
10088
10089 NTKERNELAPI
10090 VOID
10091 NTAPI
10092 KeReleaseInterruptSpinLock(
10093 IN OUT PKINTERRUPT Interrupt,
10094 IN KIRQL OldIrql);
10095
10096 NTKERNELAPI
10097 PKDEVICE_QUEUE_ENTRY
10098 NTAPI
10099 KeRemoveByKeyDeviceQueueIfBusy(
10100 IN OUT PKDEVICE_QUEUE DeviceQueue,
10101 IN ULONG SortKey);
10102
10103 _DECL_HAL_KE_IMPORT
10104 VOID
10105 FASTCALL
10106 KeReleaseInStackQueuedSpinLock(
10107 IN PKLOCK_QUEUE_HANDLE LockHandle);
10108
10109 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10110
10111 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
10112
10113 NTKERNELAPI
10114 BOOLEAN
10115 NTAPI
10116 KeDeregisterBugCheckReasonCallback(
10117 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
10118
10119 NTKERNELAPI
10120 BOOLEAN
10121 NTAPI
10122 KeRegisterBugCheckReasonCallback(
10123 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
10124 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
10125 IN KBUGCHECK_CALLBACK_REASON Reason,
10126 IN PUCHAR Component);
10127
10128 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
10129
10130 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10131 NTKERNELAPI
10132 VOID
10133 NTAPI
10134 KeFlushQueuedDpcs(VOID);
10135 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
10136
10137 #if (NTDDI_VERSION >= NTDDI_WS03)
10138
10139 NTKERNELAPI
10140 PVOID
10141 NTAPI
10142 KeRegisterNmiCallback(
10143 IN PNMI_CALLBACK CallbackRoutine,
10144 IN PVOID Context OPTIONAL);
10145
10146 NTKERNELAPI
10147 NTSTATUS
10148 NTAPI
10149 KeDeregisterNmiCallback(
10150 IN PVOID Handle);
10151
10152 NTKERNELAPI
10153 VOID
10154 NTAPI
10155 KeInitializeThreadedDpc(
10156 OUT PRKDPC Dpc,
10157 IN PKDEFERRED_ROUTINE DeferredRoutine,
10158 IN PVOID DeferredContext OPTIONAL);
10159
10160 NTKERNELAPI
10161 ULONG_PTR
10162 NTAPI
10163 KeIpiGenericCall(
10164 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
10165 IN ULONG_PTR Context);
10166
10167 NTKERNELAPI
10168 KIRQL
10169 FASTCALL
10170 KeAcquireSpinLockForDpc(
10171 IN OUT PKSPIN_LOCK SpinLock);
10172
10173 NTKERNELAPI
10174 VOID
10175 FASTCALL
10176 KeReleaseSpinLockForDpc(
10177 IN OUT PKSPIN_LOCK SpinLock,
10178 IN KIRQL OldIrql);
10179
10180 NTKERNELAPI
10181 BOOLEAN
10182 FASTCALL
10183 KeTestSpinLock(
10184 IN PKSPIN_LOCK SpinLock);
10185
10186 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10187
10188 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10189
10190 NTKERNELAPI
10191 BOOLEAN
10192 FASTCALL
10193 KeTryToAcquireSpinLockAtDpcLevel(
10194 IN OUT PKSPIN_LOCK SpinLock);
10195
10196 NTKERNELAPI
10197 BOOLEAN
10198 NTAPI
10199 KeAreAllApcsDisabled(VOID);
10200
10201 NTKERNELAPI
10202 VOID
10203 FASTCALL
10204 KeAcquireGuardedMutex(
10205 IN OUT PKGUARDED_MUTEX GuardedMutex);
10206
10207 NTKERNELAPI
10208 VOID
10209 FASTCALL
10210 KeAcquireGuardedMutexUnsafe(
10211 IN OUT PKGUARDED_MUTEX GuardedMutex);
10212
10213 NTKERNELAPI
10214 VOID
10215 NTAPI
10216 KeEnterGuardedRegion(VOID);
10217
10218 NTKERNELAPI
10219 VOID
10220 NTAPI
10221 KeLeaveGuardedRegion(VOID);
10222
10223 NTKERNELAPI
10224 VOID
10225 FASTCALL
10226 KeInitializeGuardedMutex(
10227 OUT PKGUARDED_MUTEX GuardedMutex);
10228
10229 NTKERNELAPI
10230 VOID
10231 FASTCALL
10232 KeReleaseGuardedMutexUnsafe(
10233 IN OUT PKGUARDED_MUTEX GuardedMutex);
10234
10235 NTKERNELAPI
10236 VOID
10237 FASTCALL
10238 KeReleaseGuardedMutex(
10239 IN OUT PKGUARDED_MUTEX GuardedMutex);
10240
10241 NTKERNELAPI
10242 BOOLEAN
10243 FASTCALL
10244 KeTryToAcquireGuardedMutex(
10245 IN OUT PKGUARDED_MUTEX GuardedMutex);
10246
10247 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
10248
10249 #if (NTDDI_VERSION >= NTDDI_VISTA)
10250 NTKERNELAPI
10251 VOID
10252 FASTCALL
10253 KeAcquireInStackQueuedSpinLockForDpc(
10254 IN OUT PKSPIN_LOCK SpinLock,
10255 OUT PKLOCK_QUEUE_HANDLE LockHandle);
10256
10257 NTKERNELAPI
10258 VOID
10259 FASTCALL
10260 KeReleaseInStackQueuedSpinLockForDpc(
10261 IN PKLOCK_QUEUE_HANDLE LockHandle);
10262
10263 NTKERNELAPI
10264 NTSTATUS
10265 NTAPI
10266 KeQueryDpcWatchdogInformation(
10267 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
10268
10269 #if defined(SINGLE_GROUP_LEGACY_API)
10270
10271 NTKERNELAPI
10272 KAFFINITY
10273 NTAPI
10274 KeSetSystemAffinityThreadEx(
10275 IN KAFFINITY Affinity);
10276
10277 NTKERNELAPI
10278 VOID
10279 NTAPI
10280 KeRevertToUserAffinityThreadEx(
10281 IN KAFFINITY Affinity);
10282
10283 NTKERNELAPI
10284 ULONG
10285 NTAPI
10286 KeQueryActiveProcessorCount(
10287 OUT PKAFFINITY ActiveProcessors OPTIONAL);
10288
10289 NTKERNELAPI
10290 ULONG
10291 NTAPI
10292 KeQueryMaximumProcessorCount(VOID);
10293 #endif
10294
10295 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10296
10297 #if (NTDDI_VERSION >= NTDDI_WS08)
10298
10299 PVOID
10300 KeRegisterProcessorChangeCallback(
10301 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
10302 IN PVOID CallbackContext OPTIONAL,
10303 IN ULONG Flags);
10304
10305 VOID
10306 KeDeregisterProcessorChangeCallback(
10307 IN PVOID CallbackHandle);
10308
10309 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
10310
10311 #if (NTDDI_VERSION >= NTDDI_WIN7)
10312
10313
10314 ULONG64
10315 NTAPI
10316 KeQueryTotalCycleTimeProcess(
10317 IN OUT PKPROCESS Process,
10318 OUT PULONG64 CycleTimeStamp);
10319
10320 ULONG64
10321 NTAPI
10322 KeQueryTotalCycleTimeThread(
10323 IN OUT PKTHREAD Thread,
10324 OUT PULONG64 CycleTimeStamp);
10325
10326 NTKERNELAPI
10327 NTSTATUS
10328 NTAPI
10329 KeSetTargetProcessorDpcEx(
10330 IN OUT PKDPC Dpc,
10331 IN PPROCESSOR_NUMBER ProcNumber);
10332
10333 NTKERNELAPI
10334 VOID
10335 NTAPI
10336 KeSetSystemGroupAffinityThread(
10337 IN PGROUP_AFFINITY Affinity,
10338 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
10339
10340 NTKERNELAPI
10341 VOID
10342 NTAPI
10343 KeRevertToUserGroupAffinityThread(
10344 IN PGROUP_AFFINITY PreviousAffinity);
10345
10346 NTKERNELAPI
10347 BOOLEAN
10348 NTAPI
10349 KeSetCoalescableTimer(
10350 IN OUT PKTIMER Timer,
10351 IN LARGE_INTEGER DueTime,
10352 IN ULONG Period,
10353 IN ULONG TolerableDelay,
10354 IN PKDPC Dpc OPTIONAL);
10355
10356 NTKERNELAPI
10357 ULONGLONG
10358 NTAPI
10359 KeQueryUnbiasedInterruptTime(VOID);
10360
10361 NTKERNELAPI
10362 ULONG
10363 NTAPI
10364 KeQueryActiveProcessorCountEx(
10365 IN USHORT GroupNumber);
10366
10367 NTKERNELAPI
10368 ULONG
10369 NTAPI
10370 KeQueryMaximumProcessorCountEx(
10371 IN USHORT GroupNumber);
10372
10373 NTKERNELAPI
10374 USHORT
10375 NTAPI
10376 KeQueryActiveGroupCount(VOID);
10377
10378 NTKERNELAPI
10379 USHORT
10380 NTAPI
10381 KeQueryMaximumGroupCount(VOID);
10382
10383 NTKERNELAPI
10384 KAFFINITY
10385 NTAPI
10386 KeQueryGroupAffinity(
10387 IN USHORT GroupNumber);
10388
10389 NTKERNELAPI
10390 ULONG
10391 NTAPI
10392 KeGetCurrentProcessorNumberEx(
10393 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
10394
10395 NTKERNELAPI
10396 VOID
10397 NTAPI
10398 KeQueryNodeActiveAffinity(
10399 IN USHORT NodeNumber,
10400 OUT PGROUP_AFFINITY Affinity OPTIONAL,
10401 OUT PUSHORT Count OPTIONAL);
10402
10403 NTKERNELAPI
10404 USHORT
10405 NTAPI
10406 KeQueryNodeMaximumProcessorCount(
10407 IN USHORT NodeNumber);
10408
10409 NTKERNELAPI
10410 USHORT
10411 NTAPI
10412 KeQueryHighestNodeNumber(VOID);
10413
10414 NTKERNELAPI
10415 USHORT
10416 NTAPI
10417 KeGetCurrentNodeNumber(VOID);
10418
10419 NTKERNELAPI
10420 NTSTATUS
10421 NTAPI
10422 KeQueryLogicalProcessorRelationship(
10423 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
10424 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
10425 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
10426 IN OUT PULONG Length);
10427
10428 NTKERNELAPI
10429 NTSTATUS
10430 NTAPI
10431 KeSaveExtendedProcessorState(
10432 IN ULONG64 Mask,
10433 OUT PXSTATE_SAVE XStateSave);
10434
10435 NTKERNELAPI
10436 VOID
10437 NTAPI
10438 KeRestoreExtendedProcessorState(
10439 IN PXSTATE_SAVE XStateSave);
10440
10441 NTSTATUS
10442 NTAPI
10443 KeGetProcessorNumberFromIndex(
10444 IN ULONG ProcIndex,
10445 OUT PPROCESSOR_NUMBER ProcNumber);
10446
10447 ULONG
10448 NTAPI
10449 KeGetProcessorIndexFromNumber(
10450 IN PPROCESSOR_NUMBER ProcNumber);
10451
10452 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10453
10454 #if !defined(_IA64_)
10455 NTHALAPI
10456 VOID
10457 NTAPI
10458 KeFlushWriteBuffer(VOID);
10459 #endif
10460
10461 /* VOID
10462 * KeInitializeCallbackRecord(
10463 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
10464 */
10465 #define KeInitializeCallbackRecord(CallbackRecord) \
10466 CallbackRecord->State = BufferEmpty;
10467
10468 #if DBG
10469
10470 #if (NTDDI_VERSION >= NTDDI_VISTA)
10471 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
10472 #else
10473 #define PAGED_ASSERT( exp ) ASSERT( exp )
10474 #endif
10475
10476 #define PAGED_CODE() { \
10477 if (KeGetCurrentIrql() > APC_LEVEL) { \
10478 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
10479 PAGED_ASSERT(FALSE); \
10480 } \
10481 }
10482
10483 #else
10484
10485 #define PAGED_CODE()
10486
10487 #endif /* DBG */
10488
10489 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
10490
10491 /******************************************************************************
10492 * Memory manager Functions *
10493 ******************************************************************************/
10494 /* Alignment Macros */
10495 #define ALIGN_DOWN_BY(size, align) \
10496 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
10497
10498 #define ALIGN_UP_BY(size, align) \
10499 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
10500
10501 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
10502 ((PVOID)ALIGN_DOWN_BY(ptr, align))
10503
10504 #define ALIGN_UP_POINTER_BY(ptr, align) \
10505 ((PVOID)ALIGN_UP_BY(ptr, align))
10506
10507 #define ALIGN_DOWN(size, type) \
10508 ALIGN_DOWN_BY(size, sizeof(type))
10509
10510 #define ALIGN_UP(size, type) \
10511 ALIGN_UP_BY(size, sizeof(type))
10512
10513 #define ALIGN_DOWN_POINTER(ptr, type) \
10514 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
10515
10516 #define ALIGN_UP_POINTER(ptr, type) \
10517 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
10518
10519 #ifndef FIELD_OFFSET
10520 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
10521 #endif
10522
10523 #ifndef FIELD_SIZE
10524 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
10525 #endif
10526
10527 #define POOL_TAGGING 1
10528
10529 #if DBG
10530 #define IF_DEBUG if (TRUE)
10531 #else
10532 #define IF_DEBUG if (FALSE)
10533 #endif /* DBG */
10534
10535 /* ULONG
10536 * BYTE_OFFSET(
10537 * IN PVOID Va)
10538 */
10539 #define BYTE_OFFSET(Va) \
10540 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
10541
10542 /* ULONG
10543 * BYTES_TO_PAGES(
10544 * IN ULONG Size)
10545 */
10546 #define BYTES_TO_PAGES(Size) \
10547 (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT)
10548
10549 /* PVOID
10550 * PAGE_ALIGN(
10551 * IN PVOID Va)
10552 */
10553 #define PAGE_ALIGN(Va) \
10554 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
10555
10556 /* ULONG_PTR
10557 * ROUND_TO_PAGES(
10558 * IN ULONG_PTR Size)
10559 */
10560 #define ROUND_TO_PAGES(Size) \
10561 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
10562
10563 /* ULONG
10564 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
10565 * IN PVOID Va,
10566 * IN ULONG Size)
10567 */
10568 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
10569 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
10570 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
10571
10572 #define COMPUTE_PAGES_SPANNED(Va, Size) \
10573 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
10574
10575 /*
10576 * ULONG
10577 * MmGetMdlByteCount(
10578 * IN PMDL Mdl)
10579 */
10580 #define MmGetMdlByteCount(_Mdl) \
10581 ((_Mdl)->ByteCount)
10582
10583 /*
10584 * ULONG
10585 * MmGetMdlByteOffset(
10586 * IN PMDL Mdl)
10587 */
10588 #define MmGetMdlByteOffset(_Mdl) \
10589 ((_Mdl)->ByteOffset)
10590
10591 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
10592
10593 /*
10594 * PPFN_NUMBER
10595 * MmGetMdlPfnArray(
10596 * IN PMDL Mdl)
10597 */
10598 #define MmGetMdlPfnArray(_Mdl) \
10599 ((PPFN_NUMBER) ((_Mdl) + 1))
10600
10601 /*
10602 * PVOID
10603 * MmGetMdlVirtualAddress(
10604 * IN PMDL Mdl)
10605 */
10606 #define MmGetMdlVirtualAddress(_Mdl) \
10607 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
10608
10609 #define MmGetProcedureAddress(Address) (Address)
10610
10611 /* PVOID MmGetSystemAddressForMdl(
10612 * IN PMDL Mdl);
10613 */
10614 #define MmGetSystemAddressForMdl(Mdl) \
10615 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
10616 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10617 ((Mdl)->MappedSystemVa) : \
10618 (MmMapLockedPages((Mdl), KernelMode)))
10619
10620 /* PVOID
10621 * MmGetSystemAddressForMdlSafe(
10622 * IN PMDL Mdl,
10623 * IN MM_PAGE_PRIORITY Priority)
10624 */
10625 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
10626 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
10627 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10628 (_Mdl)->MappedSystemVa : \
10629 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
10630 KernelMode, MmCached, NULL, FALSE, (_Priority)))
10631
10632 /*
10633 * VOID
10634 * MmInitializeMdl(
10635 * IN PMDL MemoryDescriptorList,
10636 * IN PVOID BaseVa,
10637 * IN SIZE_T Length)
10638 */
10639 #define MmInitializeMdl(_MemoryDescriptorList, \
10640 _BaseVa, \
10641 _Length) \
10642 { \
10643 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
10644 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
10645 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
10646 (_MemoryDescriptorList)->MdlFlags = 0; \
10647 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
10648 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
10649 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
10650 }
10651
10652 /*
10653 * VOID
10654 * MmPrepareMdlForReuse(
10655 * IN PMDL Mdl)
10656 */
10657 #define MmPrepareMdlForReuse(_Mdl) \
10658 { \
10659 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
10660 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
10661 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
10662 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
10663 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
10664 } \
10665 }
10666
10667 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10668
10669 NTKERNELAPI
10670 PVOID
10671 NTAPI
10672 MmAllocateContiguousMemory(
10673 IN SIZE_T NumberOfBytes,
10674 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
10675
10676 NTKERNELAPI
10677 PVOID
10678 NTAPI
10679 MmAllocateContiguousMemorySpecifyCache(
10680 IN SIZE_T NumberOfBytes,
10681 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10682 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10683 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10684 IN MEMORY_CACHING_TYPE CacheType);
10685
10686 NTKERNELAPI
10687 PMDL
10688 NTAPI
10689 MmAllocatePagesForMdl(
10690 IN PHYSICAL_ADDRESS LowAddress,
10691 IN PHYSICAL_ADDRESS HighAddress,
10692 IN PHYSICAL_ADDRESS SkipBytes,
10693 IN SIZE_T TotalBytes);
10694
10695 NTKERNELAPI
10696 VOID
10697 NTAPI
10698 MmBuildMdlForNonPagedPool(
10699 IN OUT PMDLX MemoryDescriptorList);
10700
10701 //DECLSPEC_DEPRECATED_DDK
10702 NTKERNELAPI
10703 PMDL
10704 NTAPI
10705 MmCreateMdl(
10706 IN PMDL MemoryDescriptorList OPTIONAL,
10707 IN PVOID Base,
10708 IN SIZE_T Length);
10709
10710 NTKERNELAPI
10711 VOID
10712 NTAPI
10713 MmFreeContiguousMemory(
10714 IN PVOID BaseAddress);
10715
10716 NTKERNELAPI
10717 VOID
10718 NTAPI
10719 MmFreeContiguousMemorySpecifyCache(
10720 IN PVOID BaseAddress,
10721 IN SIZE_T NumberOfBytes,
10722 IN MEMORY_CACHING_TYPE CacheType);
10723
10724 NTKERNELAPI
10725 VOID
10726 NTAPI
10727 MmFreePagesFromMdl(
10728 IN PMDLX MemoryDescriptorList);
10729
10730 NTKERNELAPI
10731 PVOID
10732 NTAPI
10733 MmGetSystemRoutineAddress(
10734 IN PUNICODE_STRING SystemRoutineName);
10735
10736 NTKERNELAPI
10737 LOGICAL
10738 NTAPI
10739 MmIsDriverVerifying(
10740 IN struct _DRIVER_OBJECT *DriverObject);
10741
10742 NTKERNELAPI
10743 PVOID
10744 NTAPI
10745 MmLockPagableDataSection(
10746 IN PVOID AddressWithinSection);
10747
10748 NTKERNELAPI
10749 PVOID
10750 NTAPI
10751 MmMapIoSpace(
10752 IN PHYSICAL_ADDRESS PhysicalAddress,
10753 IN SIZE_T NumberOfBytes,
10754 IN MEMORY_CACHING_TYPE CacheEnable);
10755
10756 NTKERNELAPI
10757 PVOID
10758 NTAPI
10759 MmMapLockedPages(
10760 IN PMDL MemoryDescriptorList,
10761 IN KPROCESSOR_MODE AccessMode);
10762
10763 NTKERNELAPI
10764 PVOID
10765 NTAPI
10766 MmMapLockedPagesSpecifyCache(
10767 IN PMDLX MemoryDescriptorList,
10768 IN KPROCESSOR_MODE AccessMode,
10769 IN MEMORY_CACHING_TYPE CacheType,
10770 IN PVOID BaseAddress OPTIONAL,
10771 IN ULONG BugCheckOnFailure,
10772 IN MM_PAGE_PRIORITY Priority);
10773
10774 NTKERNELAPI
10775 PVOID
10776 NTAPI
10777 MmPageEntireDriver(
10778 IN PVOID AddressWithinSection);
10779
10780 NTKERNELAPI
10781 VOID
10782 NTAPI
10783 MmProbeAndLockPages(
10784 IN OUT PMDL MemoryDescriptorList,
10785 IN KPROCESSOR_MODE AccessMode,
10786 IN LOCK_OPERATION Operation);
10787
10788 NTKERNELAPI
10789 MM_SYSTEMSIZE
10790 NTAPI
10791 MmQuerySystemSize(VOID);
10792
10793 NTKERNELAPI
10794 VOID
10795 NTAPI
10796 MmResetDriverPaging(
10797 IN PVOID AddressWithinSection);
10798
10799 NTKERNELAPI
10800 SIZE_T
10801 NTAPI
10802 MmSizeOfMdl(
10803 IN PVOID Base,
10804 IN SIZE_T Length);
10805
10806 NTKERNELAPI
10807 VOID
10808 NTAPI
10809 MmUnlockPagableImageSection(
10810 IN PVOID ImageSectionHandle);
10811
10812 NTKERNELAPI
10813 VOID
10814 NTAPI
10815 MmUnlockPages(
10816 IN OUT PMDL MemoryDescriptorList);
10817
10818 NTKERNELAPI
10819 VOID
10820 NTAPI
10821 MmUnmapIoSpace(
10822 IN PVOID BaseAddress,
10823 IN SIZE_T NumberOfBytes);
10824
10825 NTKERNELAPI
10826 VOID
10827 NTAPI
10828 MmProbeAndLockProcessPages(
10829 IN OUT PMDL MemoryDescriptorList,
10830 IN PEPROCESS Process,
10831 IN KPROCESSOR_MODE AccessMode,
10832 IN LOCK_OPERATION Operation);
10833
10834 NTKERNELAPI
10835 VOID
10836 NTAPI
10837 MmUnmapLockedPages(
10838 IN PVOID BaseAddress,
10839 IN PMDL MemoryDescriptorList);
10840
10841 NTKERNELAPI
10842 PVOID
10843 NTAPI
10844 MmAllocateContiguousMemorySpecifyCacheNode(
10845 IN SIZE_T NumberOfBytes,
10846 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10847 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10848 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10849 IN MEMORY_CACHING_TYPE CacheType,
10850 IN NODE_REQUIREMENT PreferredNode);
10851
10852 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10853
10854 #if (NTDDI_VERSION >= NTDDI_WINXP)
10855
10856 NTKERNELAPI
10857 NTSTATUS
10858 NTAPI
10859 MmAdvanceMdl(
10860 IN OUT PMDL Mdl,
10861 IN ULONG NumberOfBytes);
10862
10863 NTKERNELAPI
10864 PVOID
10865 NTAPI
10866 MmAllocateMappingAddress(
10867 IN SIZE_T NumberOfBytes,
10868 IN ULONG PoolTag);
10869
10870 NTKERNELAPI
10871 VOID
10872 NTAPI
10873 MmFreeMappingAddress(
10874 IN PVOID BaseAddress,
10875 IN ULONG PoolTag);
10876
10877 NTKERNELAPI
10878 NTSTATUS
10879 NTAPI
10880 MmIsVerifierEnabled(
10881 OUT PULONG VerifierFlags);
10882
10883 NTKERNELAPI
10884 PVOID
10885 NTAPI
10886 MmMapLockedPagesWithReservedMapping(
10887 IN PVOID MappingAddress,
10888 IN ULONG PoolTag,
10889 IN PMDL MemoryDescriptorList,
10890 IN MEMORY_CACHING_TYPE CacheType);
10891
10892 NTKERNELAPI
10893 NTSTATUS
10894 NTAPI
10895 MmProtectMdlSystemAddress(
10896 IN PMDL MemoryDescriptorList,
10897 IN ULONG NewProtect);
10898
10899 NTKERNELAPI
10900 VOID
10901 NTAPI
10902 MmUnmapReservedMapping(
10903 IN PVOID BaseAddress,
10904 IN ULONG PoolTag,
10905 IN PMDL MemoryDescriptorList);
10906
10907 NTKERNELAPI
10908 NTSTATUS
10909 NTAPI
10910 MmAddVerifierThunks(
10911 IN PVOID ThunkBuffer,
10912 IN ULONG ThunkBufferSize);
10913
10914 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10915
10916 #if (NTDDI_VERSION >= NTDDI_WS03)
10917 NTKERNELAPI
10918 LOGICAL
10919 NTAPI
10920 MmIsIoSpaceActive(
10921 IN PHYSICAL_ADDRESS StartAddress,
10922 IN SIZE_T NumberOfBytes);
10923 #endif
10924
10925 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10926 NTKERNELAPI
10927 PMDL
10928 NTAPI
10929 MmAllocatePagesForMdlEx(
10930 IN PHYSICAL_ADDRESS LowAddress,
10931 IN PHYSICAL_ADDRESS HighAddress,
10932 IN PHYSICAL_ADDRESS SkipBytes,
10933 IN SIZE_T TotalBytes,
10934 IN MEMORY_CACHING_TYPE CacheType,
10935 IN ULONG Flags);
10936 #endif
10937
10938 #if (NTDDI_VERSION >= NTDDI_VISTA)
10939
10940 NTKERNELAPI
10941 LOGICAL
10942 NTAPI
10943 MmIsDriverVerifyingByAddress(
10944 IN PVOID AddressWithinSection);
10945 #endif
10946
10947 /******************************************************************************
10948 * Security Manager Functions *
10949 ******************************************************************************/
10950
10951 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10952
10953 NTKERNELAPI
10954 BOOLEAN
10955 NTAPI
10956 SeAccessCheck(
10957 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10958 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
10959 IN BOOLEAN SubjectContextLocked,
10960 IN ACCESS_MASK DesiredAccess,
10961 IN ACCESS_MASK PreviouslyGrantedAccess,
10962 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
10963 IN PGENERIC_MAPPING GenericMapping,
10964 IN KPROCESSOR_MODE AccessMode,
10965 OUT PACCESS_MASK GrantedAccess,
10966 OUT PNTSTATUS AccessStatus);
10967
10968 NTKERNELAPI
10969 NTSTATUS
10970 NTAPI
10971 SeAssignSecurity(
10972 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10973 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10974 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10975 IN BOOLEAN IsDirectoryObject,
10976 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10977 IN PGENERIC_MAPPING GenericMapping,
10978 IN POOL_TYPE PoolType);
10979
10980 NTKERNELAPI
10981 NTSTATUS
10982 NTAPI
10983 SeAssignSecurityEx(
10984 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
10985 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
10986 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
10987 IN GUID *ObjectType OPTIONAL,
10988 IN BOOLEAN IsDirectoryObject,
10989 IN ULONG AutoInheritFlags,
10990 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
10991 IN PGENERIC_MAPPING GenericMapping,
10992 IN POOL_TYPE PoolType);
10993
10994 NTKERNELAPI
10995 NTSTATUS
10996 NTAPI
10997 SeDeassignSecurity(
10998 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
10999
11000 NTKERNELAPI
11001 BOOLEAN
11002 NTAPI
11003 SeValidSecurityDescriptor(
11004 IN ULONG Length,
11005 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11006
11007 NTKERNELAPI
11008 ULONG
11009 NTAPI
11010 SeObjectCreateSaclAccessBits(
11011 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11012
11013 NTKERNELAPI
11014 VOID
11015 NTAPI
11016 SeReleaseSubjectContext(
11017 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11018
11019 NTKERNELAPI
11020 VOID
11021 NTAPI
11022 SeUnlockSubjectContext(
11023 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11024
11025 NTKERNELAPI
11026 VOID
11027 NTAPI
11028 SeCaptureSubjectContext(
11029 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11030
11031 NTKERNELAPI
11032 VOID
11033 NTAPI
11034 SeLockSubjectContext(
11035 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11036
11037 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11038
11039 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11040
11041 NTSTATUS
11042 NTAPI
11043 SeSetAuditParameter(
11044 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
11045 IN SE_ADT_PARAMETER_TYPE Type,
11046 IN ULONG Index,
11047 IN PVOID Data);
11048
11049 NTSTATUS
11050 NTAPI
11051 SeReportSecurityEvent(
11052 IN ULONG Flags,
11053 IN PUNICODE_STRING SourceName,
11054 IN PSID UserSid OPTIONAL,
11055 IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
11056
11057 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11058
11059 #if (NTDDI_VERSION >= NTDDI_VISTA)
11060
11061 NTKERNELAPI
11062 ULONG
11063 NTAPI
11064 SeComputeAutoInheritByObjectType(
11065 IN PVOID ObjectType,
11066 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
11067 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
11068
11069 #ifdef SE_NTFS_WORLD_CACHE
11070 VOID
11071 NTAPI
11072 SeGetWorldRights(
11073 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
11074 IN PGENERIC_MAPPING GenericMapping,
11075 OUT PACCESS_MASK GrantedAccess);
11076 #endif /* SE_NTFS_WORLD_CACHE */
11077
11078 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11079 /******************************************************************************
11080 * Configuration Manager Functions *
11081 ******************************************************************************/
11082
11083 #if (NTDDI_VERSION >= NTDDI_WINXP)
11084 NTKERNELAPI
11085 NTSTATUS
11086 NTAPI
11087 CmRegisterCallback(
11088 IN PEX_CALLBACK_FUNCTION Function,
11089 IN PVOID Context OPTIONAL,
11090 OUT PLARGE_INTEGER Cookie);
11091
11092 NTKERNELAPI
11093 NTSTATUS
11094 NTAPI
11095 CmUnRegisterCallback(
11096 IN LARGE_INTEGER Cookie);
11097 #endif
11098
11099 #if (NTDDI_VERSION >= NTDDI_VISTA)
11100
11101 NTKERNELAPI
11102 NTSTATUS
11103 NTAPI
11104 CmRegisterCallbackEx(
11105 PEX_CALLBACK_FUNCTION Function,
11106 PCUNICODE_STRING Altitude,
11107 PVOID Driver,
11108 PVOID Context,
11109 PLARGE_INTEGER Cookie,
11110 PVOID Reserved);
11111
11112 NTKERNELAPI
11113 VOID
11114 NTAPI
11115 CmGetCallbackVersion(
11116 OUT PULONG Major OPTIONAL,
11117 OUT PULONG Minor OPTIONAL);
11118
11119 NTKERNELAPI
11120 NTSTATUS
11121 NTAPI
11122 CmSetCallbackObjectContext(
11123 IN OUT PVOID Object,
11124 IN PLARGE_INTEGER Cookie,
11125 IN PVOID NewContext,
11126 OUT PVOID *OldContext OPTIONAL);
11127
11128 NTKERNELAPI
11129 NTSTATUS
11130 NTAPI
11131 CmCallbackGetKeyObjectID(
11132 IN PLARGE_INTEGER Cookie,
11133 IN PVOID Object,
11134 OUT PULONG_PTR ObjectID OPTIONAL,
11135 OUT PCUNICODE_STRING *ObjectName OPTIONAL);
11136
11137 NTKERNELAPI
11138 PVOID
11139 NTAPI
11140 CmGetBoundTransaction(
11141 IN PLARGE_INTEGER Cookie,
11142 IN PVOID Object);
11143
11144 #endif // NTDDI_VERSION >= NTDDI_VISTA
11145
11146
11147 /******************************************************************************
11148 * I/O Manager Functions *
11149 ******************************************************************************/
11150
11151
11152 /*
11153 * NTSTATUS
11154 * IoAcquireRemoveLock(
11155 * IN PIO_REMOVE_LOCK RemoveLock,
11156 * IN OPTIONAL PVOID Tag)
11157 */
11158 #if DBG
11159 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11160 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11161 #else
11162 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11163 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
11164 #endif
11165
11166 /*
11167 * VOID
11168 * IoAdjustPagingPathCount(
11169 * IN PLONG Count,
11170 * IN BOOLEAN Increment)
11171 */
11172 #define IoAdjustPagingPathCount(_Count, \
11173 _Increment) \
11174 { \
11175 if (_Increment) \
11176 { \
11177 InterlockedIncrement(_Count); \
11178 } \
11179 else \
11180 { \
11181 InterlockedDecrement(_Count); \
11182 } \
11183 }
11184
11185 #if !defined(_M_AMD64)
11186 NTHALAPI
11187 VOID
11188 NTAPI
11189 READ_PORT_BUFFER_UCHAR(
11190 IN PUCHAR Port,
11191 IN PUCHAR Buffer,
11192 IN ULONG Count);
11193
11194 NTHALAPI
11195 VOID
11196 NTAPI
11197 READ_PORT_BUFFER_ULONG(
11198 IN PULONG Port,
11199 IN PULONG Buffer,
11200 IN ULONG Count);
11201
11202 NTHALAPI
11203 VOID
11204 NTAPI
11205 READ_PORT_BUFFER_USHORT(
11206 IN PUSHORT Port,
11207 IN PUSHORT Buffer,
11208 IN ULONG Count);
11209
11210 NTHALAPI
11211 UCHAR
11212 NTAPI
11213 READ_PORT_UCHAR(
11214 IN PUCHAR Port);
11215
11216 NTHALAPI
11217 ULONG
11218 NTAPI
11219 READ_PORT_ULONG(
11220 IN PULONG Port);
11221
11222 NTHALAPI
11223 USHORT
11224 NTAPI
11225 READ_PORT_USHORT(
11226 IN PUSHORT Port);
11227
11228 NTKERNELAPI
11229 VOID
11230 NTAPI
11231 READ_REGISTER_BUFFER_UCHAR(
11232 IN PUCHAR Register,
11233 IN PUCHAR Buffer,
11234 IN ULONG Count);
11235
11236 NTKERNELAPI
11237 VOID
11238 NTAPI
11239 READ_REGISTER_BUFFER_ULONG(
11240 IN PULONG Register,
11241 IN PULONG Buffer,
11242 IN ULONG Count);
11243
11244 NTKERNELAPI
11245 VOID
11246 NTAPI
11247 READ_REGISTER_BUFFER_USHORT(
11248 IN PUSHORT Register,
11249 IN PUSHORT Buffer,
11250 IN ULONG Count);
11251
11252 NTKERNELAPI
11253 UCHAR
11254 NTAPI
11255 READ_REGISTER_UCHAR(
11256 IN PUCHAR Register);
11257
11258 NTKERNELAPI
11259 ULONG
11260 NTAPI
11261 READ_REGISTER_ULONG(
11262 IN PULONG Register);
11263
11264 NTKERNELAPI
11265 USHORT
11266 NTAPI
11267 READ_REGISTER_USHORT(
11268 IN PUSHORT Register);
11269
11270 NTHALAPI
11271 VOID
11272 NTAPI
11273 WRITE_PORT_BUFFER_UCHAR(
11274 IN PUCHAR Port,
11275 IN PUCHAR Buffer,
11276 IN ULONG Count);
11277
11278 NTHALAPI
11279 VOID
11280 NTAPI
11281 WRITE_PORT_BUFFER_ULONG(
11282 IN PULONG Port,
11283 IN PULONG Buffer,
11284 IN ULONG Count);
11285
11286 NTHALAPI
11287 VOID
11288 NTAPI
11289 WRITE_PORT_BUFFER_USHORT(
11290 IN PUSHORT Port,
11291 IN PUSHORT Buffer,
11292 IN ULONG Count);
11293
11294 NTHALAPI
11295 VOID
11296 NTAPI
11297 WRITE_PORT_UCHAR(
11298 IN PUCHAR Port,
11299 IN UCHAR Value);
11300
11301 NTHALAPI
11302 VOID
11303 NTAPI
11304 WRITE_PORT_ULONG(
11305 IN PULONG Port,
11306 IN ULONG Value);
11307
11308 NTHALAPI
11309 VOID
11310 NTAPI
11311 WRITE_PORT_USHORT(
11312 IN PUSHORT Port,
11313 IN USHORT Value);
11314
11315 NTKERNELAPI
11316 VOID
11317 NTAPI
11318 WRITE_REGISTER_BUFFER_UCHAR(
11319 IN PUCHAR Register,
11320 IN PUCHAR Buffer,
11321 IN ULONG Count);
11322
11323 NTKERNELAPI
11324 VOID
11325 NTAPI
11326 WRITE_REGISTER_BUFFER_ULONG(
11327 IN PULONG Register,
11328 IN PULONG Buffer,
11329 IN ULONG Count);
11330
11331 NTKERNELAPI
11332 VOID
11333 NTAPI
11334 WRITE_REGISTER_BUFFER_USHORT(
11335 IN PUSHORT Register,
11336 IN PUSHORT Buffer,
11337 IN ULONG Count);
11338
11339 NTKERNELAPI
11340 VOID
11341 NTAPI
11342 WRITE_REGISTER_UCHAR(
11343 IN PUCHAR Register,
11344 IN UCHAR Value);
11345
11346 NTKERNELAPI
11347 VOID
11348 NTAPI
11349 WRITE_REGISTER_ULONG(
11350 IN PULONG Register,
11351 IN ULONG Value);
11352
11353 NTKERNELAPI
11354 VOID
11355 NTAPI
11356 WRITE_REGISTER_USHORT(
11357 IN PUSHORT Register,
11358 IN USHORT Value);
11359
11360 #else
11361
11362 FORCEINLINE
11363 VOID
11364 READ_PORT_BUFFER_UCHAR(
11365 IN PUCHAR Port,
11366 IN PUCHAR Buffer,
11367 IN ULONG Count)
11368 {
11369 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11370 }
11371
11372 FORCEINLINE
11373 VOID
11374 READ_PORT_BUFFER_ULONG(
11375 IN PULONG Port,
11376 IN PULONG Buffer,
11377 IN ULONG Count)
11378 {
11379 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11380 }
11381
11382 FORCEINLINE
11383 VOID
11384 READ_PORT_BUFFER_USHORT(
11385 IN PUSHORT Port,
11386 IN PUSHORT Buffer,
11387 IN ULONG Count)
11388 {
11389 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11390 }
11391
11392 FORCEINLINE
11393 UCHAR
11394 READ_PORT_UCHAR(
11395 IN PUCHAR Port)
11396 {
11397 return __inbyte((USHORT)(ULONG_PTR)Port);
11398 }
11399
11400 FORCEINLINE
11401 ULONG
11402 READ_PORT_ULONG(
11403 IN PULONG Port)
11404 {
11405 return __indword((USHORT)(ULONG_PTR)Port);
11406 }
11407
11408 FORCEINLINE
11409 USHORT
11410 READ_PORT_USHORT(
11411 IN PUSHORT Port)
11412 {
11413 return __inword((USHORT)(ULONG_PTR)Port);
11414 }
11415
11416 FORCEINLINE
11417 VOID
11418 READ_REGISTER_BUFFER_UCHAR(
11419 IN PUCHAR Register,
11420 IN PUCHAR Buffer,
11421 IN ULONG Count)
11422 {
11423 __movsb(Register, Buffer, Count);
11424 }
11425
11426 FORCEINLINE
11427 VOID
11428 READ_REGISTER_BUFFER_ULONG(
11429 IN PULONG Register,
11430 IN PULONG Buffer,
11431 IN ULONG Count)
11432 {
11433 __movsd(Register, Buffer, Count);
11434 }
11435
11436 FORCEINLINE
11437 VOID
11438 READ_REGISTER_BUFFER_USHORT(
11439 IN PUSHORT Register,
11440 IN PUSHORT Buffer,
11441 IN ULONG Count)
11442 {
11443 __movsw(Register, Buffer, Count);
11444 }
11445
11446 FORCEINLINE
11447 UCHAR
11448 READ_REGISTER_UCHAR(
11449 IN volatile UCHAR *Register)
11450 {
11451 return *Register;
11452 }
11453
11454 FORCEINLINE
11455 ULONG
11456 READ_REGISTER_ULONG(
11457 IN volatile ULONG *Register)
11458 {
11459 return *Register;
11460 }
11461
11462 FORCEINLINE
11463 USHORT
11464 READ_REGISTER_USHORT(
11465 IN volatile USHORT *Register)
11466 {
11467 return *Register;
11468 }
11469
11470 FORCEINLINE
11471 VOID
11472 WRITE_PORT_BUFFER_UCHAR(
11473 IN PUCHAR Port,
11474 IN PUCHAR Buffer,
11475 IN ULONG Count)
11476 {
11477 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11478 }
11479
11480 FORCEINLINE
11481 VOID
11482 WRITE_PORT_BUFFER_ULONG(
11483 IN PULONG Port,
11484 IN PULONG Buffer,
11485 IN ULONG Count)
11486 {
11487 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11488 }
11489
11490 FORCEINLINE
11491 VOID
11492 WRITE_PORT_BUFFER_USHORT(
11493 IN PUSHORT Port,
11494 IN PUSHORT Buffer,
11495 IN ULONG Count)
11496 {
11497 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11498 }
11499
11500 FORCEINLINE
11501 VOID
11502 WRITE_PORT_UCHAR(
11503 IN PUCHAR Port,
11504 IN UCHAR Value)
11505 {
11506 __outbyte((USHORT)(ULONG_PTR)Port, Value);
11507 }
11508
11509 FORCEINLINE
11510 VOID
11511 WRITE_PORT_ULONG(
11512 IN PULONG Port,
11513 IN ULONG Value)
11514 {
11515 __outdword((USHORT)(ULONG_PTR)Port, Value);
11516 }
11517
11518 FORCEINLINE
11519 VOID
11520 WRITE_PORT_USHORT(
11521 IN PUSHORT Port,
11522 IN USHORT Value)
11523 {
11524 __outword((USHORT)(ULONG_PTR)Port, Value);
11525 }
11526
11527 FORCEINLINE
11528 VOID
11529 WRITE_REGISTER_BUFFER_UCHAR(
11530 IN PUCHAR Register,
11531 IN PUCHAR Buffer,
11532 IN ULONG Count)
11533 {
11534 LONG Synch;
11535 __movsb(Register, Buffer, Count);
11536 InterlockedOr(&Synch, 1);
11537 }
11538
11539 FORCEINLINE
11540 VOID
11541 WRITE_REGISTER_BUFFER_ULONG(
11542 IN PULONG Register,
11543 IN PULONG Buffer,
11544 IN ULONG Count)
11545 {
11546 LONG Synch;
11547 __movsd(Register, Buffer, Count);
11548 InterlockedOr(&Synch, 1);
11549 }
11550
11551 FORCEINLINE
11552 VOID
11553 WRITE_REGISTER_BUFFER_USHORT(
11554 IN PUSHORT Register,
11555 IN PUSHORT Buffer,
11556 IN ULONG Count)
11557 {
11558 LONG Synch;
11559 __movsw(Register, Buffer, Count);
11560 InterlockedOr(&Synch, 1);
11561 }
11562
11563 FORCEINLINE
11564 VOID
11565 WRITE_REGISTER_UCHAR(
11566 IN volatile UCHAR *Register,
11567 IN UCHAR Value)
11568 {
11569 LONG Synch;
11570 *Register = Value;
11571 InterlockedOr(&Synch, 1);
11572 }
11573
11574 FORCEINLINE
11575 VOID
11576 WRITE_REGISTER_ULONG(
11577 IN volatile ULONG *Register,
11578 IN ULONG Value)
11579 {
11580 LONG Synch;
11581 *Register = Value;
11582 InterlockedOr(&Synch, 1);
11583 }
11584
11585 FORCEINLINE
11586 VOID
11587 WRITE_REGISTER_USHORT(
11588 IN volatile USHORT *Register,
11589 IN USHORT Value)
11590 {
11591 LONG Sync;
11592 *Register = Value;
11593 InterlockedOr(&Sync, 1);
11594 }
11595 #endif
11596
11597 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
11598 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11599
11600 #define DMA_MACROS_DEFINED
11601
11602 FORCEINLINE
11603 NTSTATUS
11604 IoAllocateAdapterChannel(
11605 IN PDMA_ADAPTER DmaAdapter,
11606 IN PDEVICE_OBJECT DeviceObject,
11607 IN ULONG NumberOfMapRegisters,
11608 IN PDRIVER_CONTROL ExecutionRoutine,
11609 IN PVOID Context)
11610 {
11611 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
11612 AllocateAdapterChannel =
11613 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
11614 ASSERT(AllocateAdapterChannel);
11615 return AllocateAdapterChannel(DmaAdapter,
11616 DeviceObject,
11617 NumberOfMapRegisters,
11618 ExecutionRoutine,
11619 Context );
11620 }
11621
11622 FORCEINLINE
11623 BOOLEAN
11624 NTAPI
11625 IoFlushAdapterBuffers(
11626 IN PDMA_ADAPTER DmaAdapter,
11627 IN PMDL Mdl,
11628 IN PVOID MapRegisterBase,
11629 IN PVOID CurrentVa,
11630 IN ULONG Length,
11631 IN BOOLEAN WriteToDevice)
11632 {
11633 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
11634 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
11635 ASSERT(FlushAdapterBuffers);
11636 return FlushAdapterBuffers(DmaAdapter,
11637 Mdl,
11638 MapRegisterBase,
11639 CurrentVa,
11640 Length,
11641 WriteToDevice);
11642 }
11643
11644 FORCEINLINE
11645 VOID
11646 NTAPI
11647 IoFreeAdapterChannel(
11648 IN PDMA_ADAPTER DmaAdapter)
11649 {
11650 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
11651 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
11652 ASSERT(FreeAdapterChannel);
11653 FreeAdapterChannel(DmaAdapter);
11654 }
11655
11656 FORCEINLINE
11657 VOID
11658 NTAPI
11659 IoFreeMapRegisters(
11660 IN PDMA_ADAPTER DmaAdapter,
11661 IN PVOID MapRegisterBase,
11662 IN ULONG NumberOfMapRegisters)
11663 {
11664 PFREE_MAP_REGISTERS FreeMapRegisters;
11665 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
11666 ASSERT(FreeMapRegisters);
11667 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
11668 }
11669
11670 FORCEINLINE
11671 PHYSICAL_ADDRESS
11672 NTAPI
11673 IoMapTransfer(
11674 IN PDMA_ADAPTER DmaAdapter,
11675 IN PMDL Mdl,
11676 IN PVOID MapRegisterBase,
11677 IN PVOID CurrentVa,
11678 IN OUT PULONG Length,
11679 IN BOOLEAN WriteToDevice)
11680 {
11681 PMAP_TRANSFER MapTransfer;
11682
11683 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
11684 ASSERT(MapTransfer);
11685 return MapTransfer(DmaAdapter,
11686 Mdl,
11687 MapRegisterBase,
11688 CurrentVa,
11689 Length,
11690 WriteToDevice);
11691 }
11692 #endif
11693
11694 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11695
11696 NTKERNELAPI
11697 VOID
11698 NTAPI
11699 IoAcquireCancelSpinLock(
11700 OUT PKIRQL Irql);
11701
11702 NTKERNELAPI
11703 NTSTATUS
11704 NTAPI
11705 IoAcquireRemoveLockEx(
11706 IN PIO_REMOVE_LOCK RemoveLock,
11707 IN PVOID Tag OPTIONAL,
11708 IN PCSTR File,
11709 IN ULONG Line,
11710 IN ULONG RemlockSize);
11711 NTKERNELAPI
11712 NTSTATUS
11713 NTAPI
11714 IoAllocateDriverObjectExtension(
11715 IN PDRIVER_OBJECT DriverObject,
11716 IN PVOID ClientIdentificationAddress,
11717 IN ULONG DriverObjectExtensionSize,
11718 OUT PVOID *DriverObjectExtension);
11719
11720 NTKERNELAPI
11721 PVOID
11722 NTAPI
11723 IoAllocateErrorLogEntry(
11724 IN PVOID IoObject,
11725 IN UCHAR EntrySize);
11726
11727 NTKERNELAPI
11728 PIRP
11729 NTAPI
11730 IoAllocateIrp(
11731 IN CCHAR StackSize,
11732 IN BOOLEAN ChargeQuota);
11733
11734 NTKERNELAPI
11735 PMDL
11736 NTAPI
11737 IoAllocateMdl(
11738 IN PVOID VirtualAddress OPTIONAL,
11739 IN ULONG Length,
11740 IN BOOLEAN SecondaryBuffer,
11741 IN BOOLEAN ChargeQuota,
11742 IN OUT PIRP Irp OPTIONAL);
11743
11744 NTKERNELAPI
11745 PIO_WORKITEM
11746 NTAPI
11747 IoAllocateWorkItem(
11748 IN PDEVICE_OBJECT DeviceObject);
11749
11750 NTKERNELAPI
11751 NTSTATUS
11752 NTAPI
11753 IoAttachDevice(
11754 IN PDEVICE_OBJECT SourceDevice,
11755 IN PUNICODE_STRING TargetDevice,
11756 OUT PDEVICE_OBJECT *AttachedDevice);
11757
11758 NTKERNELAPI
11759 PDEVICE_OBJECT
11760 NTAPI
11761 IoAttachDeviceToDeviceStack(
11762 IN PDEVICE_OBJECT SourceDevice,
11763 IN PDEVICE_OBJECT TargetDevice);
11764
11765 NTKERNELAPI
11766 PIRP
11767 NTAPI
11768 IoBuildAsynchronousFsdRequest(
11769 IN ULONG MajorFunction,
11770 IN PDEVICE_OBJECT DeviceObject,
11771 IN OUT PVOID Buffer OPTIONAL,
11772 IN ULONG Length OPTIONAL,
11773 IN PLARGE_INTEGER StartingOffset OPTIONAL,
11774 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
11775
11776 NTKERNELAPI
11777 PIRP
11778 NTAPI
11779 IoBuildDeviceIoControlRequest(
11780 IN ULONG IoControlCode,
11781 IN PDEVICE_OBJECT DeviceObject,
11782 IN PVOID InputBuffer OPTIONAL,
11783 IN ULONG InputBufferLength,
11784 OUT PVOID OutputBuffer OPTIONAL,
11785 IN ULONG OutputBufferLength,
11786 IN BOOLEAN InternalDeviceIoControl,
11787 IN PKEVENT Event,
11788 OUT PIO_STATUS_BLOCK IoStatusBlock);
11789
11790 NTKERNELAPI
11791 VOID
11792 NTAPI
11793 IoBuildPartialMdl(
11794 IN PMDL SourceMdl,
11795 IN OUT PMDL TargetMdl,
11796 IN PVOID VirtualAddress,
11797 IN ULONG Length);
11798
11799 NTKERNELAPI
11800 PIRP
11801 NTAPI
11802 IoBuildSynchronousFsdRequest(
11803 IN ULONG MajorFunction,
11804 IN PDEVICE_OBJECT DeviceObject,
11805 IN OUT PVOID Buffer OPTIONAL,
11806 IN ULONG Length OPTIONAL,
11807 IN PLARGE_INTEGER StartingOffset OPTIONAL,
11808 IN PKEVENT Event,
11809 OUT PIO_STATUS_BLOCK IoStatusBlock);
11810
11811 NTKERNELAPI
11812 NTSTATUS
11813 FASTCALL
11814 IofCallDriver(
11815 IN PDEVICE_OBJECT DeviceObject,
11816 IN OUT PIRP Irp);
11817 #define IoCallDriver IofCallDriver
11818
11819 NTKERNELAPI
11820 VOID
11821 FASTCALL
11822 IofCompleteRequest(
11823 IN PIRP Irp,
11824 IN CCHAR PriorityBoost);
11825 #define IoCompleteRequest IofCompleteRequest
11826
11827 NTKERNELAPI
11828 BOOLEAN
11829 NTAPI
11830 IoCancelIrp(
11831 IN PIRP Irp);
11832
11833 NTKERNELAPI
11834 NTSTATUS
11835 NTAPI
11836 IoCheckShareAccess(
11837 IN ACCESS_MASK DesiredAccess,
11838 IN ULONG DesiredShareAccess,
11839 IN OUT PFILE_OBJECT FileObject,
11840 IN OUT PSHARE_ACCESS ShareAccess,
11841 IN BOOLEAN Update);
11842
11843 NTKERNELAPI
11844 VOID
11845 FASTCALL
11846 IofCompleteRequest(
11847 IN PIRP Irp,
11848 IN CCHAR PriorityBoost);
11849
11850 NTKERNELAPI
11851 NTSTATUS
11852 NTAPI
11853 IoConnectInterrupt(
11854 OUT PKINTERRUPT *InterruptObject,
11855 IN PKSERVICE_ROUTINE ServiceRoutine,
11856 IN PVOID ServiceContext OPTIONAL,
11857 IN PKSPIN_LOCK SpinLock OPTIONAL,
11858 IN ULONG Vector,
11859 IN KIRQL Irql,
11860 IN KIRQL SynchronizeIrql,
11861 IN KINTERRUPT_MODE InterruptMode,
11862 IN BOOLEAN ShareVector,
11863 IN KAFFINITY ProcessorEnableMask,
11864 IN BOOLEAN FloatingSave);
11865
11866 NTKERNELAPI
11867 NTSTATUS
11868 NTAPI
11869 IoCreateDevice(
11870 IN PDRIVER_OBJECT DriverObject,
11871 IN ULONG DeviceExtensionSize,
11872 IN PUNICODE_STRING DeviceName OPTIONAL,
11873 IN DEVICE_TYPE DeviceType,
11874 IN ULONG DeviceCharacteristics,
11875 IN BOOLEAN Exclusive,
11876 OUT PDEVICE_OBJECT *DeviceObject);
11877
11878 NTKERNELAPI
11879 NTSTATUS
11880 NTAPI
11881 IoCreateFile(
11882 OUT PHANDLE FileHandle,
11883 IN ACCESS_MASK DesiredAccess,
11884 IN POBJECT_ATTRIBUTES ObjectAttributes,
11885 OUT PIO_STATUS_BLOCK IoStatusBlock,
11886 IN PLARGE_INTEGER AllocationSize OPTIONAL,
11887 IN ULONG FileAttributes,
11888 IN ULONG ShareAccess,
11889 IN ULONG Disposition,
11890 IN ULONG CreateOptions,
11891 IN PVOID EaBuffer OPTIONAL,
11892 IN ULONG EaLength,
11893 IN CREATE_FILE_TYPE CreateFileType,
11894 IN PVOID InternalParameters OPTIONAL,
11895 IN ULONG Options);
11896
11897 NTKERNELAPI
11898 PKEVENT
11899 NTAPI
11900 IoCreateNotificationEvent(
11901 IN PUNICODE_STRING EventName,
11902 OUT PHANDLE EventHandle);
11903
11904 NTKERNELAPI
11905 NTSTATUS
11906 NTAPI
11907 IoCreateSymbolicLink(
11908 IN PUNICODE_STRING SymbolicLinkName,
11909 IN PUNICODE_STRING DeviceName);
11910
11911 NTKERNELAPI
11912 PKEVENT
11913 NTAPI
11914 IoCreateSynchronizationEvent(
11915 IN PUNICODE_STRING EventName,
11916 OUT PHANDLE EventHandle);
11917
11918 NTKERNELAPI
11919 NTSTATUS
11920 NTAPI
11921 IoCreateUnprotectedSymbolicLink(
11922 IN PUNICODE_STRING SymbolicLinkName,
11923 IN PUNICODE_STRING DeviceName);
11924
11925 NTKERNELAPI
11926 VOID
11927 NTAPI
11928 IoDeleteDevice(
11929 IN PDEVICE_OBJECT DeviceObject);
11930
11931 NTKERNELAPI
11932 NTSTATUS
11933 NTAPI
11934 IoDeleteSymbolicLink(
11935 IN PUNICODE_STRING SymbolicLinkName);
11936
11937 NTKERNELAPI
11938 VOID
11939 NTAPI
11940 IoDetachDevice(
11941 IN OUT PDEVICE_OBJECT TargetDevice);
11942
11943 NTKERNELAPI
11944 VOID
11945 NTAPI
11946 IoDisconnectInterrupt(
11947 IN PKINTERRUPT InterruptObject);
11948
11949 NTKERNELAPI
11950 VOID
11951 NTAPI
11952 IoFreeIrp(
11953 IN PIRP Irp);
11954
11955 NTKERNELAPI
11956 VOID
11957 NTAPI
11958 IoFreeMdl(
11959 IN PMDL Mdl);
11960
11961 NTKERNELAPI
11962 VOID
11963 NTAPI
11964 IoFreeWorkItem(
11965 IN PIO_WORKITEM IoWorkItem);
11966
11967 NTKERNELAPI
11968 PDEVICE_OBJECT
11969 NTAPI
11970 IoGetAttachedDevice(
11971 IN PDEVICE_OBJECT DeviceObject);
11972
11973 NTKERNELAPI
11974 PDEVICE_OBJECT
11975 NTAPI
11976 IoGetAttachedDeviceReference(
11977 IN PDEVICE_OBJECT DeviceObject);
11978
11979 NTKERNELAPI
11980 NTSTATUS
11981 NTAPI
11982 IoGetBootDiskInformation(
11983 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
11984 IN ULONG Size);
11985
11986 NTKERNELAPI
11987 NTSTATUS
11988 NTAPI
11989 IoGetDeviceInterfaceAlias(
11990 IN PUNICODE_STRING SymbolicLinkName,
11991 IN CONST GUID *AliasInterfaceClassGuid,
11992 OUT PUNICODE_STRING AliasSymbolicLinkName);
11993
11994 NTKERNELAPI
11995 PEPROCESS
11996 NTAPI
11997 IoGetCurrentProcess(VOID);
11998
11999 NTKERNELAPI
12000 NTSTATUS
12001 NTAPI
12002 IoGetDeviceInterfaces(
12003 IN CONST GUID *InterfaceClassGuid,
12004 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12005 IN ULONG Flags,
12006 OUT PWSTR *SymbolicLinkList);
12007
12008 NTKERNELAPI
12009 NTSTATUS
12010 NTAPI
12011 IoGetDeviceObjectPointer(
12012 IN PUNICODE_STRING ObjectName,
12013 IN ACCESS_MASK DesiredAccess,
12014 OUT PFILE_OBJECT *FileObject,
12015 OUT PDEVICE_OBJECT *DeviceObject);
12016
12017 NTKERNELAPI
12018 NTSTATUS
12019 NTAPI
12020 IoGetDeviceProperty(
12021 IN PDEVICE_OBJECT DeviceObject,
12022 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
12023 IN ULONG BufferLength,
12024 OUT PVOID PropertyBuffer,
12025 OUT PULONG ResultLength);
12026
12027 NTKERNELAPI
12028 PDMA_ADAPTER
12029 NTAPI
12030 IoGetDmaAdapter(
12031 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12032 IN PDEVICE_DESCRIPTION DeviceDescription,
12033 IN OUT PULONG NumberOfMapRegisters);
12034
12035 NTKERNELAPI
12036 PVOID
12037 NTAPI
12038 IoGetDriverObjectExtension(
12039 IN PDRIVER_OBJECT DriverObject,
12040 IN PVOID ClientIdentificationAddress);
12041
12042 NTKERNELAPI
12043 PVOID
12044 NTAPI
12045 IoGetInitialStack(VOID);
12046
12047 NTKERNELAPI
12048 PDEVICE_OBJECT
12049 NTAPI
12050 IoGetRelatedDeviceObject(
12051 IN PFILE_OBJECT FileObject);
12052
12053 NTKERNELAPI
12054 VOID
12055 NTAPI
12056 IoQueueWorkItem(
12057 IN PIO_WORKITEM IoWorkItem,
12058 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
12059 IN WORK_QUEUE_TYPE QueueType,
12060 IN PVOID Context OPTIONAL);
12061
12062 NTKERNELAPI
12063 VOID
12064 NTAPI
12065 IoInitializeIrp(
12066 IN OUT PIRP Irp,
12067 IN USHORT PacketSize,
12068 IN CCHAR StackSize);
12069
12070 NTKERNELAPI
12071 VOID
12072 NTAPI
12073 IoInitializeRemoveLockEx(
12074 IN PIO_REMOVE_LOCK Lock,
12075 IN ULONG AllocateTag,
12076 IN ULONG MaxLockedMinutes,
12077 IN ULONG HighWatermark,
12078 IN ULONG RemlockSize);
12079
12080 NTKERNELAPI
12081 NTSTATUS
12082 NTAPI
12083 IoInitializeTimer(
12084 IN PDEVICE_OBJECT DeviceObject,
12085 IN PIO_TIMER_ROUTINE TimerRoutine,
12086 IN PVOID Context OPTIONAL);
12087
12088 NTKERNELAPI
12089 VOID
12090 NTAPI
12091 IoInvalidateDeviceRelations(
12092 IN PDEVICE_OBJECT DeviceObject,
12093 IN DEVICE_RELATION_TYPE Type);
12094
12095 NTKERNELAPI
12096 VOID
12097 NTAPI
12098 IoInvalidateDeviceState(
12099 IN PDEVICE_OBJECT PhysicalDeviceObject);
12100
12101 NTKERNELAPI
12102 BOOLEAN
12103 NTAPI
12104 IoIsWdmVersionAvailable(
12105 IN UCHAR MajorVersion,
12106 IN UCHAR MinorVersion);
12107
12108 NTKERNELAPI
12109 NTSTATUS
12110 NTAPI
12111 IoOpenDeviceInterfaceRegistryKey(
12112 IN PUNICODE_STRING SymbolicLinkName,
12113 IN ACCESS_MASK DesiredAccess,
12114 OUT PHANDLE DeviceInterfaceKey);
12115
12116 NTKERNELAPI
12117 NTSTATUS
12118 NTAPI
12119 IoOpenDeviceRegistryKey(
12120 IN PDEVICE_OBJECT DeviceObject,
12121 IN ULONG DevInstKeyType,
12122 IN ACCESS_MASK DesiredAccess,
12123 OUT PHANDLE DevInstRegKey);
12124
12125 NTKERNELAPI
12126 NTSTATUS
12127 NTAPI
12128 IoRegisterDeviceInterface(
12129 IN PDEVICE_OBJECT PhysicalDeviceObject,
12130 IN CONST GUID *InterfaceClassGuid,
12131 IN PUNICODE_STRING ReferenceString OPTIONAL,
12132 OUT PUNICODE_STRING SymbolicLinkName);
12133
12134 NTKERNELAPI
12135 NTSTATUS
12136 NTAPI
12137 IoRegisterPlugPlayNotification(
12138 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
12139 IN ULONG EventCategoryFlags,
12140 IN PVOID EventCategoryData OPTIONAL,
12141 IN PDRIVER_OBJECT DriverObject,
12142 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
12143 IN OUT PVOID Context OPTIONAL,
12144 OUT PVOID *NotificationEntry);
12145
12146 NTKERNELAPI
12147 NTSTATUS
12148 NTAPI
12149 IoRegisterShutdownNotification(
12150 IN PDEVICE_OBJECT DeviceObject);
12151
12152 NTKERNELAPI
12153 VOID
12154 NTAPI
12155 IoReleaseCancelSpinLock(
12156 IN KIRQL Irql);
12157
12158 NTKERNELAPI
12159 VOID
12160 NTAPI
12161 IoReleaseRemoveLockAndWaitEx(
12162 IN PIO_REMOVE_LOCK RemoveLock,
12163 IN PVOID Tag OPTIONAL,
12164 IN ULONG RemlockSize);
12165
12166 NTKERNELAPI
12167 VOID
12168 NTAPI
12169 IoReleaseRemoveLockEx(
12170 IN PIO_REMOVE_LOCK RemoveLock,
12171 IN PVOID Tag OPTIONAL,
12172 IN ULONG RemlockSize);
12173
12174 NTKERNELAPI
12175 VOID
12176 NTAPI
12177 IoRemoveShareAccess(
12178 IN PFILE_OBJECT FileObject,
12179 IN OUT PSHARE_ACCESS ShareAccess);
12180
12181 NTKERNELAPI
12182 NTSTATUS
12183 NTAPI
12184 IoReportTargetDeviceChange(
12185 IN PDEVICE_OBJECT PhysicalDeviceObject,
12186 IN PVOID NotificationStructure);
12187
12188 NTKERNELAPI
12189 NTSTATUS
12190 NTAPI
12191 IoReportTargetDeviceChangeAsynchronous(
12192 IN PDEVICE_OBJECT PhysicalDeviceObject,
12193 IN PVOID NotificationStructure,
12194 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
12195 IN PVOID Context OPTIONAL);
12196
12197 NTKERNELAPI
12198 VOID
12199 NTAPI
12200 IoRequestDeviceEject(
12201 IN PDEVICE_OBJECT PhysicalDeviceObject);
12202
12203 NTKERNELAPI
12204 VOID
12205 NTAPI
12206 IoReuseIrp(
12207 IN OUT PIRP Irp,
12208 IN NTSTATUS Status);
12209
12210 NTKERNELAPI
12211 NTSTATUS
12212 NTAPI
12213 IoSetDeviceInterfaceState(
12214 IN PUNICODE_STRING SymbolicLinkName,
12215 IN BOOLEAN Enable);
12216
12217 NTKERNELAPI
12218 VOID
12219 NTAPI
12220 IoSetShareAccess(
12221 IN ACCESS_MASK DesiredAccess,
12222 IN ULONG DesiredShareAccess,
12223 IN OUT PFILE_OBJECT FileObject,
12224 OUT PSHARE_ACCESS ShareAccess);
12225
12226 NTKERNELAPI
12227 VOID
12228 NTAPI
12229 IoStartNextPacket(
12230 IN PDEVICE_OBJECT DeviceObject,
12231 IN BOOLEAN Cancelable);
12232
12233 NTKERNELAPI
12234 VOID
12235 NTAPI
12236 IoStartNextPacketByKey(
12237 IN PDEVICE_OBJECT DeviceObject,
12238 IN BOOLEAN Cancelable,
12239 IN ULONG Key);
12240
12241 NTKERNELAPI
12242 VOID
12243 NTAPI
12244 IoStartPacket(
12245 IN PDEVICE_OBJECT DeviceObject,
12246 IN PIRP Irp,
12247 IN PULONG Key OPTIONAL,
12248 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
12249
12250 NTKERNELAPI
12251 VOID
12252 NTAPI
12253 IoStartTimer(
12254 IN PDEVICE_OBJECT DeviceObject);
12255
12256 NTKERNELAPI
12257 VOID
12258 NTAPI
12259 IoStopTimer(
12260 IN PDEVICE_OBJECT DeviceObject);
12261
12262 NTKERNELAPI
12263 NTSTATUS
12264 NTAPI
12265 IoUnregisterPlugPlayNotification(
12266 IN PVOID NotificationEntry);
12267
12268 NTKERNELAPI
12269 VOID
12270 NTAPI
12271 IoUnregisterShutdownNotification(
12272 IN PDEVICE_OBJECT DeviceObject);
12273
12274 NTKERNELAPI
12275 VOID
12276 NTAPI
12277 IoUpdateShareAccess(
12278 IN PFILE_OBJECT FileObject,
12279 IN OUT PSHARE_ACCESS ShareAccess);
12280
12281 NTKERNELAPI
12282 NTSTATUS
12283 NTAPI
12284 IoWMIAllocateInstanceIds(
12285 IN GUID *Guid,
12286 IN ULONG InstanceCount,
12287 OUT ULONG *FirstInstanceId);
12288
12289 NTKERNELAPI
12290 NTSTATUS
12291 NTAPI
12292 IoWMIQuerySingleInstanceMultiple(
12293 IN PVOID *DataBlockObjectList,
12294 IN PUNICODE_STRING InstanceNames,
12295 IN ULONG ObjectCount,
12296 IN OUT ULONG *InOutBufferSize,
12297 OUT PVOID OutBuffer);
12298
12299 NTKERNELAPI
12300 NTSTATUS
12301 NTAPI
12302 IoWMIRegistrationControl(
12303 IN PDEVICE_OBJECT DeviceObject,
12304 IN ULONG Action);
12305
12306 NTKERNELAPI
12307 NTSTATUS
12308 NTAPI
12309 IoWMISuggestInstanceName(
12310 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12311 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
12312 IN BOOLEAN CombineNames,
12313 OUT PUNICODE_STRING SuggestedInstanceName);
12314
12315 NTKERNELAPI
12316 NTSTATUS
12317 NTAPI
12318 IoWMIWriteEvent(
12319 IN OUT PVOID WnodeEventItem);
12320
12321 NTKERNELAPI
12322 VOID
12323 NTAPI
12324 IoWriteErrorLogEntry(
12325 IN PVOID ElEntry);
12326
12327 NTKERNELAPI
12328 PIRP
12329 NTAPI
12330 IoGetTopLevelIrp(VOID);
12331
12332 NTKERNELAPI
12333 NTSTATUS
12334 NTAPI
12335 IoRegisterLastChanceShutdownNotification(
12336 IN PDEVICE_OBJECT DeviceObject);
12337
12338 NTKERNELAPI
12339 VOID
12340 NTAPI
12341 IoSetTopLevelIrp(
12342 IN PIRP Irp OPTIONAL);
12343
12344 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12345
12346
12347 #if (NTDDI_VERSION >= NTDDI_WINXP)
12348
12349 NTKERNELAPI
12350 NTSTATUS
12351 NTAPI
12352 IoCsqInitialize(
12353 IN PIO_CSQ Csq,
12354 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
12355 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12356 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12357 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12358 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12359 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12360
12361 NTKERNELAPI
12362 VOID
12363 NTAPI
12364 IoCsqInsertIrp(
12365 IN PIO_CSQ Csq,
12366 IN PIRP Irp,
12367 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
12368
12369 NTKERNELAPI
12370 PIRP
12371 NTAPI
12372 IoCsqRemoveIrp(
12373 IN PIO_CSQ Csq,
12374 IN PIO_CSQ_IRP_CONTEXT Context);
12375
12376 NTKERNELAPI
12377 PIRP
12378 NTAPI
12379 IoCsqRemoveNextIrp(
12380 IN PIO_CSQ Csq,
12381 IN PVOID PeekContext OPTIONAL);
12382
12383 NTKERNELAPI
12384 BOOLEAN
12385 NTAPI
12386 IoForwardIrpSynchronously(
12387 IN PDEVICE_OBJECT DeviceObject,
12388 IN PIRP Irp);
12389
12390 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
12391
12392 NTKERNELAPI
12393 VOID
12394 NTAPI
12395 IoFreeErrorLogEntry(
12396 PVOID ElEntry);
12397
12398 NTKERNELAPI
12399 NTSTATUS
12400 NTAPI
12401 IoSetCompletionRoutineEx(
12402 IN PDEVICE_OBJECT DeviceObject,
12403 IN PIRP Irp,
12404 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
12405 IN PVOID Context,
12406 IN BOOLEAN InvokeOnSuccess,
12407 IN BOOLEAN InvokeOnError,
12408 IN BOOLEAN InvokeOnCancel);
12409
12410 VOID
12411 NTAPI
12412 IoSetStartIoAttributes(
12413 IN PDEVICE_OBJECT DeviceObject,
12414 IN BOOLEAN DeferredStartIo,
12415 IN BOOLEAN NonCancelable);
12416
12417 NTKERNELAPI
12418 NTSTATUS
12419 NTAPI
12420 IoWMIDeviceObjectToInstanceName(
12421 IN PVOID DataBlockObject,
12422 IN PDEVICE_OBJECT DeviceObject,
12423 OUT PUNICODE_STRING InstanceName);
12424
12425 NTKERNELAPI
12426 NTSTATUS
12427 NTAPI
12428 IoWMIExecuteMethod(
12429 IN PVOID DataBlockObject,
12430 IN PUNICODE_STRING InstanceName,
12431 IN ULONG MethodId,
12432 IN ULONG InBufferSize,
12433 IN OUT PULONG OutBufferSize,
12434 IN OUT PUCHAR InOutBuffer);
12435
12436 NTKERNELAPI
12437 NTSTATUS
12438 NTAPI
12439 IoWMIHandleToInstanceName(
12440 IN PVOID DataBlockObject,
12441 IN HANDLE FileHandle,
12442 OUT PUNICODE_STRING InstanceName);
12443
12444 NTKERNELAPI
12445 NTSTATUS
12446 NTAPI
12447 IoWMIOpenBlock(
12448 IN GUID *DataBlockGuid,
12449 IN ULONG DesiredAccess,
12450 OUT PVOID *DataBlockObject);
12451
12452 NTKERNELAPI
12453 NTSTATUS
12454 NTAPI
12455 IoWMIQueryAllData(
12456 IN PVOID DataBlockObject,
12457 IN OUT ULONG *InOutBufferSize,
12458 OUT PVOID OutBuffer);
12459
12460 NTKERNELAPI
12461 NTSTATUS
12462 NTAPI
12463 IoWMIQueryAllDataMultiple(
12464 IN PVOID *DataBlockObjectList,
12465 IN ULONG ObjectCount,
12466 IN OUT ULONG *InOutBufferSize,
12467 OUT PVOID OutBuffer);
12468
12469 NTKERNELAPI
12470 NTSTATUS
12471 NTAPI
12472 IoWMIQuerySingleInstance(
12473 IN PVOID DataBlockObject,
12474 IN PUNICODE_STRING InstanceName,
12475 IN OUT ULONG *InOutBufferSize,
12476 OUT PVOID OutBuffer);
12477
12478 NTKERNELAPI
12479 NTSTATUS
12480 NTAPI
12481 IoWMISetNotificationCallback(
12482 IN OUT PVOID Object,
12483 IN WMI_NOTIFICATION_CALLBACK Callback,
12484 IN PVOID Context OPTIONAL);
12485
12486 NTKERNELAPI
12487 NTSTATUS
12488 NTAPI
12489 IoWMISetSingleInstance(
12490 IN PVOID DataBlockObject,
12491 IN PUNICODE_STRING InstanceName,
12492 IN ULONG Version,
12493 IN ULONG ValueBufferSize,
12494 IN PVOID ValueBuffer);
12495
12496 NTKERNELAPI
12497 NTSTATUS
12498 NTAPI
12499 IoWMISetSingleItem(
12500 IN PVOID DataBlockObject,
12501 IN PUNICODE_STRING InstanceName,
12502 IN ULONG DataItemId,
12503 IN ULONG Version,
12504 IN ULONG ValueBufferSize,
12505 IN PVOID ValueBuffer);
12506 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
12507
12508 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
12509 NTKERNELAPI
12510 NTSTATUS
12511 NTAPI
12512 IoValidateDeviceIoControlAccess(
12513 IN PIRP Irp,
12514 IN ULONG RequiredAccess);
12515 #endif
12516
12517 #if (NTDDI_VERSION >= NTDDI_WS03)
12518
12519 NTKERNELAPI
12520 NTSTATUS
12521 NTAPI
12522 IoCsqInitializeEx(
12523 IN PIO_CSQ Csq,
12524 IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
12525 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12526 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12527 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12528 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12529 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12530
12531 NTKERNELAPI
12532 NTSTATUS
12533 NTAPI
12534 IoCsqInsertIrpEx(
12535 IN PIO_CSQ Csq,
12536 IN PIRP Irp,
12537 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL,
12538 IN PVOID InsertContext OPTIONAL);
12539 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
12540
12541
12542 #if (NTDDI_VERSION >= NTDDI_VISTA)
12543
12544 NTKERNELAPI
12545 NTSTATUS
12546 NTAPI
12547 IoGetBootDiskInformationLite(
12548 OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
12549
12550 NTKERNELAPI
12551 NTSTATUS
12552 NTAPI
12553 IoCheckShareAccessEx(
12554 IN ACCESS_MASK DesiredAccess,
12555 IN ULONG DesiredShareAccess,
12556 IN OUT PFILE_OBJECT FileObject,
12557 IN OUT PSHARE_ACCESS ShareAccess,
12558 IN BOOLEAN Update,
12559 IN PBOOLEAN WritePermission);
12560
12561 NTKERNELAPI
12562 NTSTATUS
12563 NTAPI
12564 IoConnectInterruptEx(
12565 IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
12566
12567 NTKERNELAPI
12568 VOID
12569 NTAPI
12570 IoDisconnectInterruptEx(
12571 IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
12572
12573 LOGICAL
12574 NTAPI
12575 IoWithinStackLimits(
12576 IN ULONG_PTR RegionStart,
12577 IN SIZE_T RegionSize);
12578
12579 NTKERNELAPI
12580 VOID
12581 NTAPI
12582 IoSetShareAccessEx(
12583 IN ACCESS_MASK DesiredAccess,
12584 IN ULONG DesiredShareAccess,
12585 IN OUT PFILE_OBJECT FileObject,
12586 OUT PSHARE_ACCESS ShareAccess,
12587 IN PBOOLEAN WritePermission);
12588
12589 ULONG
12590 NTAPI
12591 IoSizeofWorkItem(VOID);
12592
12593 VOID
12594 NTAPI
12595 IoInitializeWorkItem(
12596 IN PVOID IoObject,
12597 IN PIO_WORKITEM IoWorkItem);
12598
12599 VOID
12600 NTAPI
12601 IoUninitializeWorkItem(
12602 IN PIO_WORKITEM IoWorkItem);
12603
12604 VOID
12605 NTAPI
12606 IoQueueWorkItemEx(
12607 IN PIO_WORKITEM IoWorkItem,
12608 IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
12609 IN WORK_QUEUE_TYPE QueueType,
12610 IN PVOID Context OPTIONAL);
12611
12612 IO_PRIORITY_HINT
12613 NTAPI
12614 IoGetIoPriorityHint(
12615 IN PIRP Irp);
12616
12617 NTSTATUS
12618 NTAPI
12619 IoSetIoPriorityHint(
12620 IN PIRP Irp,
12621 IN IO_PRIORITY_HINT PriorityHint);
12622
12623 NTSTATUS
12624 NTAPI
12625 IoAllocateSfioStreamIdentifier(
12626 IN PFILE_OBJECT FileObject,
12627 IN ULONG Length,
12628 IN PVOID Signature,
12629 OUT PVOID *StreamIdentifier);
12630
12631 PVOID
12632 NTAPI
12633 IoGetSfioStreamIdentifier(
12634 IN PFILE_OBJECT FileObject,
12635 IN PVOID Signature);
12636
12637 NTSTATUS
12638 NTAPI
12639 IoFreeSfioStreamIdentifier(
12640 IN PFILE_OBJECT FileObject,
12641 IN PVOID Signature);
12642
12643 NTKERNELAPI
12644 NTSTATUS
12645 NTAPI
12646 IoRequestDeviceEjectEx(
12647 IN PDEVICE_OBJECT PhysicalDeviceObject,
12648 IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL,
12649 IN PVOID Context OPTIONAL,
12650 IN PDRIVER_OBJECT DriverObject OPTIONAL);
12651
12652 NTKERNELAPI
12653 NTSTATUS
12654 NTAPI
12655 IoSetDevicePropertyData(
12656 IN PDEVICE_OBJECT Pdo,
12657 IN CONST DEVPROPKEY *PropertyKey,
12658 IN LCID Lcid,
12659 IN ULONG Flags,
12660 IN DEVPROPTYPE Type,
12661 IN ULONG Size,
12662 IN PVOID Data OPTIONAL);
12663
12664 NTKERNELAPI
12665 NTSTATUS
12666 NTAPI
12667 IoGetDevicePropertyData(
12668 PDEVICE_OBJECT Pdo,
12669 CONST DEVPROPKEY *PropertyKey,
12670 LCID Lcid,
12671 ULONG Flags,
12672 ULONG Size,
12673 PVOID Data,
12674 PULONG RequiredSize,
12675 PDEVPROPTYPE Type);
12676
12677 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12678
12679 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
12680
12681 #if (NTDDI_VERSION >= NTDDI_WS08)
12682 NTKERNELAPI
12683 NTSTATUS
12684 NTAPI
12685 IoReplacePartitionUnit(
12686 IN PDEVICE_OBJECT TargetPdo,
12687 IN PDEVICE_OBJECT SparePdo,
12688 IN ULONG Flags);
12689 #endif
12690
12691 #if (NTDDI_VERSION >= NTDDI_WIN7)
12692
12693 NTKERNELAPI
12694 NTSTATUS
12695 NTAPI
12696 IoGetAffinityInterrupt(
12697 IN PKINTERRUPT InterruptObject,
12698 OUT PGROUP_AFFINITY GroupAffinity);
12699
12700 NTSTATUS
12701 NTAPI
12702 IoGetContainerInformation(
12703 IN IO_CONTAINER_INFORMATION_CLASS InformationClass,
12704 IN PVOID ContainerObject OPTIONAL,
12705 IN OUT PVOID Buffer OPTIONAL,
12706 IN ULONG BufferLength);
12707
12708 NTSTATUS
12709 NTAPI
12710 IoRegisterContainerNotification(
12711 IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
12712 IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
12713 IN PVOID NotificationInformation OPTIONAL,
12714 IN ULONG NotificationInformationLength,
12715 OUT PVOID CallbackRegistration);
12716
12717 VOID
12718 NTAPI
12719 IoUnregisterContainerNotification(
12720 IN PVOID CallbackRegistration);
12721
12722 NTKERNELAPI
12723 NTSTATUS
12724 NTAPI
12725 IoUnregisterPlugPlayNotificationEx(
12726 IN PVOID NotificationEntry);
12727
12728 NTKERNELAPI
12729 NTSTATUS
12730 NTAPI
12731 IoGetDeviceNumaNode(
12732 IN PDEVICE_OBJECT Pdo,
12733 OUT PUSHORT NodeNumber);
12734
12735 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
12736
12737 #if defined(_WIN64)
12738 NTKERNELAPI
12739 ULONG
12740 NTAPI
12741 IoWMIDeviceObjectToProviderId(
12742 IN PDEVICE_OBJECT DeviceObject);
12743 #else
12744 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
12745 #endif
12746
12747 /*
12748 * USHORT
12749 * IoSizeOfIrp(
12750 * IN CCHAR StackSize)
12751 */
12752 #define IoSizeOfIrp(_StackSize) \
12753 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
12754
12755 FORCEINLINE
12756 VOID
12757 IoSkipCurrentIrpStackLocation(
12758 IN OUT PIRP Irp)
12759 {
12760 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
12761 Irp->CurrentLocation++;
12762 Irp->Tail.Overlay.CurrentStackLocation++;
12763 }
12764
12765 FORCEINLINE
12766 VOID
12767 IoSetNextIrpStackLocation(
12768 IN OUT PIRP Irp)
12769 {
12770 ASSERT(Irp->CurrentLocation > 0);
12771 Irp->CurrentLocation--;
12772 Irp->Tail.Overlay.CurrentStackLocation--;
12773 }
12774
12775 FORCEINLINE
12776 PIO_STACK_LOCATION
12777 IoGetNextIrpStackLocation(
12778 IN PIRP Irp)
12779 {
12780 ASSERT(Irp->CurrentLocation > 0);
12781 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
12782 }
12783
12784 FORCEINLINE
12785 VOID
12786 IoSetCompletionRoutine(
12787 IN PIRP Irp,
12788 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
12789 IN PVOID Context OPTIONAL,
12790 IN BOOLEAN InvokeOnSuccess,
12791 IN BOOLEAN InvokeOnError,
12792 IN BOOLEAN InvokeOnCancel)
12793 {
12794 PIO_STACK_LOCATION irpSp;
12795 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
12796 irpSp = IoGetNextIrpStackLocation(Irp);
12797 irpSp->CompletionRoutine = CompletionRoutine;
12798 irpSp->Context = Context;
12799 irpSp->Control = 0;
12800
12801 if (InvokeOnSuccess) {
12802 irpSp->Control = SL_INVOKE_ON_SUCCESS;
12803 }
12804
12805 if (InvokeOnError) {
12806 irpSp->Control |= SL_INVOKE_ON_ERROR;
12807 }
12808
12809 if (InvokeOnCancel) {
12810 irpSp->Control |= SL_INVOKE_ON_CANCEL;
12811 }
12812 }
12813
12814 /*
12815 * PDRIVER_CANCEL
12816 * IoSetCancelRoutine(
12817 * IN PIRP Irp,
12818 * IN PDRIVER_CANCEL CancelRoutine)
12819 */
12820 #define IoSetCancelRoutine(_Irp, \
12821 _CancelRoutine) \
12822 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
12823 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
12824
12825 /*
12826 * VOID
12827 * IoRequestDpc(
12828 * IN PDEVICE_OBJECT DeviceObject,
12829 * IN PIRP Irp,
12830 * IN PVOID Context);
12831 */
12832 #define IoRequestDpc(DeviceObject, Irp, Context)( \
12833 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
12834
12835 /*
12836 * VOID
12837 * IoReleaseRemoveLock(
12838 * IN PIO_REMOVE_LOCK RemoveLock,
12839 * IN PVOID Tag)
12840 */
12841 #define IoReleaseRemoveLock(_RemoveLock, \
12842 _Tag) \
12843 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12844
12845 /*
12846 * VOID
12847 * IoReleaseRemoveLockAndWait(
12848 * IN PIO_REMOVE_LOCK RemoveLock,
12849 * IN PVOID Tag)
12850 */
12851 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
12852 _Tag) \
12853 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12854
12855 #if defined(_WIN64)
12856 NTKERNELAPI
12857 BOOLEAN
12858 IoIs32bitProcess(
12859 IN PIRP Irp OPTIONAL);
12860 #endif
12861
12862 #define PLUGPLAY_REGKEY_DEVICE 1
12863 #define PLUGPLAY_REGKEY_DRIVER 2
12864 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
12865
12866 FORCEINLINE
12867 PIO_STACK_LOCATION
12868 IoGetCurrentIrpStackLocation(
12869 IN PIRP Irp)
12870 {
12871 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
12872 return Irp->Tail.Overlay.CurrentStackLocation;
12873 }
12874
12875 FORCEINLINE
12876 VOID
12877 IoMarkIrpPending(
12878 IN OUT PIRP Irp)
12879 {
12880 IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
12881 }
12882
12883 /*
12884 * BOOLEAN
12885 * IoIsErrorUserInduced(
12886 * IN NTSTATUS Status);
12887 */
12888 #define IoIsErrorUserInduced(Status) \
12889 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
12890 ((Status) == STATUS_IO_TIMEOUT) || \
12891 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
12892 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
12893 ((Status) == STATUS_VERIFY_REQUIRED) || \
12894 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
12895 ((Status) == STATUS_WRONG_VOLUME)))
12896
12897 /* VOID
12898 * IoInitializeRemoveLock(
12899 * IN PIO_REMOVE_LOCK Lock,
12900 * IN ULONG AllocateTag,
12901 * IN ULONG MaxLockedMinutes,
12902 * IN ULONG HighWatermark)
12903 */
12904 #define IoInitializeRemoveLock( \
12905 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
12906 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
12907 HighWatermark, sizeof(IO_REMOVE_LOCK))
12908
12909 VOID
12910 FORCEINLINE
12911 IoInitializeDpcRequest(
12912 IN PDEVICE_OBJECT DeviceObject,
12913 IN PIO_DPC_ROUTINE DpcRoutine)
12914 {
12915 KeInitializeDpc( &DeviceObject->Dpc,
12916 (PKDEFERRED_ROUTINE) DpcRoutine,
12917 DeviceObject );
12918 }
12919
12920 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
12921
12922 /*
12923 * ULONG
12924 * IoGetFunctionCodeFromCtlCode(
12925 * IN ULONG ControlCode)
12926 */
12927 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
12928 (((_ControlCode) >> 2) & 0x00000FFF)
12929
12930 FORCEINLINE
12931 VOID
12932 IoCopyCurrentIrpStackLocationToNext(
12933 IN OUT PIRP Irp)
12934 {
12935 PIO_STACK_LOCATION irpSp;
12936 PIO_STACK_LOCATION nextIrpSp;
12937 irpSp = IoGetCurrentIrpStackLocation(Irp);
12938 nextIrpSp = IoGetNextIrpStackLocation(Irp);
12939 RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
12940 nextIrpSp->Control = 0;
12941 }
12942
12943 NTKERNELAPI
12944 VOID
12945 NTAPI
12946 IoGetStackLimits(
12947 OUT PULONG_PTR LowLimit,
12948 OUT PULONG_PTR HighLimit);
12949
12950 FORCEINLINE
12951 ULONG_PTR
12952 IoGetRemainingStackSize(VOID)
12953 {
12954 ULONG_PTR End, Begin;
12955 ULONG_PTR Result;
12956
12957 IoGetStackLimits(&Begin, &End);
12958 Result = (ULONG_PTR)(&End) - Begin;
12959 return Result;
12960 }
12961
12962 #if (NTDDI_VERSION >= NTDDI_WS03)
12963 VOID
12964 FORCEINLINE
12965 IoInitializeThreadedDpcRequest(
12966 IN PDEVICE_OBJECT DeviceObject,
12967 IN PIO_DPC_ROUTINE DpcRoutine)
12968 {
12969 KeInitializeThreadedDpc(&DeviceObject->Dpc,
12970 (PKDEFERRED_ROUTINE) DpcRoutine,
12971 DeviceObject );
12972 }
12973 #endif
12974
12975 /******************************************************************************
12976 * Power Management Support Functions *
12977 ******************************************************************************/
12978
12979 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
12980
12981 #if (NTDDI_VERSION >= NTDDI_WIN2K)
12982
12983 NTKERNELAPI
12984 NTSTATUS
12985 NTAPI
12986 PoCallDriver(
12987 IN struct _DEVICE_OBJECT *DeviceObject,
12988 IN OUT struct _IRP *Irp);
12989
12990 NTKERNELAPI
12991 PULONG
12992 NTAPI
12993 PoRegisterDeviceForIdleDetection(
12994 IN struct _DEVICE_OBJECT *DeviceObject,
12995 IN ULONG ConservationIdleTime,
12996 IN ULONG PerformanceIdleTime,
12997 IN DEVICE_POWER_STATE State);
12998
12999 NTKERNELAPI
13000 PVOID
13001 NTAPI
13002 PoRegisterSystemState(
13003 IN OUT PVOID StateHandle OPTIONAL,
13004 IN EXECUTION_STATE Flags);
13005
13006 NTKERNELAPI
13007 NTSTATUS
13008 NTAPI
13009 PoRequestPowerIrp(
13010 IN struct _DEVICE_OBJECT *DeviceObject,
13011 IN UCHAR MinorFunction,
13012 IN POWER_STATE PowerState,
13013 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
13014 IN PVOID Context OPTIONAL,
13015 OUT struct _IRP **Irp OPTIONAL);
13016
13017 NTKERNELAPI
13018 POWER_STATE
13019 NTAPI
13020 PoSetPowerState(
13021 IN struct _DEVICE_OBJECT *DeviceObject,
13022 IN POWER_STATE_TYPE Type,
13023 IN POWER_STATE State);
13024
13025 NTKERNELAPI
13026 VOID
13027 NTAPI
13028 PoSetSystemState(
13029 IN EXECUTION_STATE Flags);
13030
13031 NTKERNELAPI
13032 VOID
13033 NTAPI
13034 PoStartNextPowerIrp(
13035 IN OUT struct _IRP *Irp);
13036
13037 NTKERNELAPI
13038 VOID
13039 NTAPI
13040 PoUnregisterSystemState(
13041 IN OUT PVOID StateHandle);
13042
13043 NTKERNELAPI
13044 NTSTATUS
13045 NTAPI
13046 PoRequestShutdownEvent(
13047 OUT PVOID *Event);
13048
13049 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13050
13051 #if (NTDDI_VERSION >= NTDDI_VISTA)
13052
13053 NTKERNELAPI
13054 VOID
13055 NTAPI
13056 PoSetSystemWake(
13057 IN OUT struct _IRP *Irp);
13058
13059 NTKERNELAPI
13060 BOOLEAN
13061 NTAPI
13062 PoGetSystemWake(
13063 IN struct _IRP *Irp);
13064
13065 NTKERNELAPI
13066 NTSTATUS
13067 NTAPI
13068 PoRegisterPowerSettingCallback(
13069 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
13070 IN LPCGUID SettingGuid,
13071 IN PPOWER_SETTING_CALLBACK Callback,
13072 IN PVOID Context OPTIONAL,
13073 OUT PVOID *Handle OPTIONAL);
13074
13075 NTKERNELAPI
13076 NTSTATUS
13077 NTAPI
13078 PoUnregisterPowerSettingCallback(
13079 IN OUT PVOID Handle);
13080
13081 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13082
13083 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
13084 NTKERNELAPI
13085 VOID
13086 NTAPI
13087 PoSetDeviceBusyEx(
13088 IN OUT PULONG IdlePointer);
13089 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
13090
13091 #if (NTDDI_VERSION >= NTDDI_WIN7)
13092
13093 NTKERNELAPI
13094 VOID
13095 NTAPI
13096 PoStartDeviceBusy(
13097 IN OUT PULONG IdlePointer);
13098
13099 NTKERNELAPI
13100 VOID
13101 NTAPI
13102 PoEndDeviceBusy(
13103 IN OUT PULONG IdlePointer);
13104
13105 NTKERNELAPI
13106 BOOLEAN
13107 NTAPI
13108 PoQueryWatchdogTime(
13109 IN PDEVICE_OBJECT Pdo,
13110 OUT PULONG SecondsRemaining);
13111
13112 NTKERNELAPI
13113 VOID
13114 NTAPI
13115 PoDeletePowerRequest(
13116 IN OUT PVOID PowerRequest);
13117
13118 NTKERNELAPI
13119 NTSTATUS
13120 NTAPI
13121 PoSetPowerRequest(
13122 IN OUT PVOID PowerRequest,
13123 IN POWER_REQUEST_TYPE Type);
13124
13125 NTKERNELAPI
13126 NTSTATUS
13127 NTAPI
13128 PoClearPowerRequest(
13129 IN OUT PVOID PowerRequest,
13130 IN POWER_REQUEST_TYPE Type);
13131
13132 NTKERNELAPI
13133 NTSTATUS
13134 NTAPI
13135 PoCreatePowerRequest(
13136 OUT PVOID *PowerRequest,
13137 IN PDEVICE_OBJECT DeviceObject,
13138 IN PCOUNTED_REASON_CONTEXT Context);
13139
13140 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13141
13142 /******************************************************************************
13143 * Executive Functions *
13144 ******************************************************************************/
13145
13146 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
13147 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
13148 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
13149
13150 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
13151 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
13152 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
13153 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
13154
13155 #define ExInitializeSListHead InitializeSListHead
13156
13157 #if defined(_NTHAL_) && defined(_X86_)
13158
13159 NTKERNELAPI
13160 VOID
13161 FASTCALL
13162 ExiAcquireFastMutex(
13163 IN OUT PFAST_MUTEX FastMutex);
13164
13165 NTKERNELAPI
13166 VOID
13167 FASTCALL
13168 ExiReleaseFastMutex(
13169 IN OUT PFAST_MUTEX FastMutex);
13170
13171 NTKERNELAPI
13172 BOOLEAN
13173 FASTCALL
13174 ExiTryToAcquireFastMutex(
13175 IN OUT PFAST_MUTEX FastMutex);
13176
13177 #define ExAcquireFastMutex ExiAcquireFastMutex
13178 #define ExReleaseFastMutex ExiReleaseFastMutex
13179 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
13180
13181 #else
13182
13183 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13184
13185 NTKERNELAPI
13186 VOID
13187 FASTCALL
13188 ExAcquireFastMutex(
13189 IN OUT PFAST_MUTEX FastMutex);
13190
13191 NTKERNELAPI
13192 VOID
13193 FASTCALL
13194 ExReleaseFastMutex(
13195 IN OUT PFAST_MUTEX FastMutex);
13196
13197 NTKERNELAPI
13198 BOOLEAN
13199 FASTCALL
13200 ExTryToAcquireFastMutex(
13201 IN OUT PFAST_MUTEX FastMutex);
13202
13203 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13204
13205 #endif /* defined(_NTHAL_) && defined(_X86_) */
13206
13207 #if defined(_X86_)
13208 #define ExInterlockedAddUlong ExfInterlockedAddUlong
13209 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
13210 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
13211 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
13212 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
13213 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
13214 #endif /* defined(_X86_) */
13215
13216 #if defined(_WIN64)
13217
13218 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
13219 defined(_NTHAL_) || defined(_NTOSP_)
13220 NTKERNELAPI
13221 USHORT
13222 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
13223 #else
13224 FORCEINLINE
13225 USHORT
13226 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
13227 {
13228 return (USHORT)(ListHead->Alignment & 0xffff);
13229 }
13230 #endif
13231
13232 NTKERNELAPI
13233 PSLIST_ENTRY
13234 ExpInterlockedFlushSList(
13235 PSLIST_HEADER ListHead);
13236
13237 NTKERNELAPI
13238 PSLIST_ENTRY
13239 ExpInterlockedPopEntrySList(
13240 PSLIST_HEADER ListHead);
13241
13242 NTKERNELAPI
13243 PSLIST_ENTRY
13244 ExpInterlockedPushEntrySList(
13245 PSLIST_HEADER ListHead,
13246 PSLIST_ENTRY ListEntry);
13247
13248 #define ExInterlockedFlushSList(Head) \
13249 ExpInterlockedFlushSList(Head)
13250 #define ExInterlockedPopEntrySList(Head, Lock) \
13251 ExpInterlockedPopEntrySList(Head)
13252 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
13253 ExpInterlockedPushEntrySList(Head, Entry)
13254
13255 #else /* !defined(_WIN64) */
13256
13257 #define ExQueryDepthSList(listhead) (listhead)->Depth
13258
13259 NTKERNELAPI
13260 PSINGLE_LIST_ENTRY
13261 FASTCALL
13262 ExInterlockedFlushSList(
13263 IN OUT PSLIST_HEADER ListHead);
13264
13265 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
13266
13267 NTKERNELAPI
13268 PSINGLE_LIST_ENTRY
13269 FASTCALL
13270 ExInterlockedPopEntrySList(
13271 IN PSLIST_HEADER ListHead,
13272 IN PKSPIN_LOCK Lock);
13273
13274 NTKERNELAPI
13275 PSINGLE_LIST_ENTRY
13276 FASTCALL
13277 ExInterlockedPushEntrySList(
13278 IN PSLIST_HEADER ListHead,
13279 IN PSINGLE_LIST_ENTRY ListEntry,
13280 IN PKSPIN_LOCK Lock);
13281
13282 NTKERNELAPI
13283 PVOID
13284 NTAPI
13285 ExAllocateFromPagedLookasideList(
13286 IN OUT PPAGED_LOOKASIDE_LIST Lookaside);
13287
13288 NTKERNELAPI
13289 VOID
13290 NTAPI
13291 ExFreeToPagedLookasideList(
13292 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13293 IN PVOID Entry);
13294
13295 #else
13296
13297 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
13298 InterlockedPopEntrySList(_ListHead)
13299 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
13300 InterlockedPushEntrySList(_ListHead, _ListEntry)
13301
13302 static __inline
13303 PVOID
13304 ExAllocateFromPagedLookasideList(
13305 IN OUT PPAGED_LOOKASIDE_LIST Lookaside)
13306 {
13307 PVOID Entry;
13308
13309 Lookaside->L.TotalAllocates++;
13310 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
13311 if (Entry == NULL) {
13312 Lookaside->L.AllocateMisses++;
13313 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
13314 Lookaside->L.Size,
13315 Lookaside->L.Tag);
13316 }
13317 return Entry;
13318 }
13319
13320 static __inline
13321 VOID
13322 ExFreeToPagedLookasideList(
13323 IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13324 IN PVOID Entry)
13325 {
13326 Lookaside->L.TotalFrees++;
13327 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
13328 Lookaside->L.FreeMisses++;
13329 (Lookaside->L.Free)(Entry);
13330 } else {
13331 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
13332 }
13333 }
13334
13335 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
13336
13337 #endif /* !defined(_WIN64) */
13338
13339 /* ERESOURCE_THREAD
13340 * ExGetCurrentResourceThread(
13341 * VOID);
13342 */
13343 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
13344
13345 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
13346
13347 /* VOID
13348 * ExInitializeWorkItem(
13349 * IN PWORK_QUEUE_ITEM Item,
13350 * IN PWORKER_THREAD_ROUTINE Routine,
13351 * IN PVOID Context)
13352 */
13353 #define ExInitializeWorkItem(Item, Routine, Context) \
13354 { \
13355 (Item)->WorkerRoutine = Routine; \
13356 (Item)->Parameter = Context; \
13357 (Item)->List.Flink = NULL; \
13358 }
13359
13360 FORCEINLINE
13361 VOID
13362 ExInitializeFastMutex(
13363 OUT PFAST_MUTEX FastMutex)
13364 {
13365 FastMutex->Count = FM_LOCK_BIT;
13366 FastMutex->Owner = NULL;
13367 FastMutex->Contention = 0;
13368 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
13369 return;
13370 }
13371
13372 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13373
13374 NTKERNELAPI
13375 VOID
13376 FASTCALL
13377 ExAcquireFastMutexUnsafe(
13378 IN OUT PFAST_MUTEX FastMutex);
13379
13380 NTKERNELAPI
13381 VOID
13382 FASTCALL
13383 ExReleaseFastMutexUnsafe(
13384 IN OUT PFAST_MUTEX FastMutex);
13385
13386 NTKERNELAPI
13387 BOOLEAN
13388 NTAPI
13389 ExAcquireResourceExclusiveLite(
13390 IN OUT PERESOURCE Resource,
13391 IN BOOLEAN Wait);
13392
13393 NTKERNELAPI
13394 BOOLEAN
13395 NTAPI
13396 ExAcquireResourceSharedLite(
13397 IN OUT PERESOURCE Resource,
13398 IN BOOLEAN Wait);
13399
13400 NTKERNELAPI
13401 BOOLEAN
13402 NTAPI
13403 ExAcquireSharedStarveExclusive(
13404 IN OUT PERESOURCE Resource,
13405 IN BOOLEAN Wait);
13406
13407 NTKERNELAPI
13408 BOOLEAN
13409 NTAPI
13410 ExAcquireSharedWaitForExclusive(
13411 IN OUT PERESOURCE Resource,
13412 IN BOOLEAN Wait);
13413
13414 NTKERNELAPI
13415 PVOID
13416 NTAPI
13417 ExAllocatePool(
13418 IN POOL_TYPE PoolType,
13419 IN SIZE_T NumberOfBytes);
13420
13421 NTKERNELAPI
13422 PVOID
13423 NTAPI
13424 ExAllocatePoolWithQuota(
13425 IN POOL_TYPE PoolType,
13426 IN SIZE_T NumberOfBytes);
13427
13428 NTKERNELAPI
13429 PVOID
13430 NTAPI
13431 ExAllocatePoolWithQuotaTag(
13432 IN POOL_TYPE PoolType,
13433 IN SIZE_T NumberOfBytes,
13434 IN ULONG Tag);
13435
13436 #ifndef POOL_TAGGING
13437 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
13438 #endif
13439
13440 NTKERNELAPI
13441 PVOID
13442 NTAPI
13443 ExAllocatePoolWithTag(
13444 IN POOL_TYPE PoolType,
13445 IN SIZE_T NumberOfBytes,
13446 IN ULONG Tag);
13447
13448 #ifndef POOL_TAGGING
13449 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
13450 #endif
13451
13452 NTKERNELAPI
13453 PVOID
13454 NTAPI
13455 ExAllocatePoolWithTagPriority(
13456 IN POOL_TYPE PoolType,
13457 IN SIZE_T NumberOfBytes,
13458 IN ULONG Tag,
13459 IN EX_POOL_PRIORITY Priority);
13460
13461 NTKERNELAPI
13462 VOID
13463 NTAPI
13464 ExConvertExclusiveToSharedLite(
13465 IN OUT PERESOURCE Resource);
13466
13467 NTKERNELAPI
13468 NTSTATUS
13469 NTAPI
13470 ExCreateCallback(
13471 OUT PCALLBACK_OBJECT *CallbackObject,
13472 IN POBJECT_ATTRIBUTES ObjectAttributes,
13473 IN BOOLEAN Create,
13474 IN BOOLEAN AllowMultipleCallbacks);
13475
13476 NTKERNELAPI
13477 VOID
13478 NTAPI
13479 ExDeleteNPagedLookasideList(
13480 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
13481
13482 NTKERNELAPI
13483 VOID
13484 NTAPI
13485 ExDeletePagedLookasideList(
13486 IN PPAGED_LOOKASIDE_LIST Lookaside);
13487
13488 NTKERNELAPI
13489 NTSTATUS
13490 NTAPI
13491 ExDeleteResourceLite(
13492 IN OUT PERESOURCE Resource);
13493
13494 NTKERNELAPI
13495 VOID
13496 NTAPI
13497 ExFreePool(
13498 IN PVOID P);
13499
13500 NTKERNELAPI
13501 VOID
13502 NTAPI
13503 ExFreePoolWithTag(
13504 IN PVOID P,
13505 IN ULONG Tag);
13506
13507 NTKERNELAPI
13508 ULONG
13509 NTAPI
13510 ExGetExclusiveWaiterCount(
13511 IN PERESOURCE Resource);
13512
13513 NTKERNELAPI
13514 KPROCESSOR_MODE
13515 NTAPI
13516 ExGetPreviousMode(VOID);
13517
13518 NTKERNELAPI
13519 ULONG
13520 NTAPI
13521 ExGetSharedWaiterCount(
13522 IN PERESOURCE Resource);
13523
13524 NTKERNELAPI
13525 VOID
13526 NTAPI
13527 ExInitializeNPagedLookasideList(
13528 IN PNPAGED_LOOKASIDE_LIST Lookaside,
13529 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13530 IN PFREE_FUNCTION Free OPTIONAL,
13531 IN ULONG Flags,
13532 IN SIZE_T Size,
13533 IN ULONG Tag,
13534 IN USHORT Depth);
13535
13536 NTKERNELAPI
13537 VOID
13538 NTAPI
13539 ExInitializePagedLookasideList(
13540 IN PPAGED_LOOKASIDE_LIST Lookaside,
13541 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13542 IN PFREE_FUNCTION Free OPTIONAL,
13543 IN ULONG Flags,
13544 IN SIZE_T Size,
13545 IN ULONG Tag,
13546 IN USHORT Depth);
13547
13548 NTKERNELAPI
13549 NTSTATUS
13550 NTAPI
13551 ExInitializeResourceLite(
13552 OUT PERESOURCE Resource);
13553
13554 NTKERNELAPI
13555 LARGE_INTEGER
13556 NTAPI
13557 ExInterlockedAddLargeInteger(
13558 IN PLARGE_INTEGER Addend,
13559 IN LARGE_INTEGER Increment,
13560 IN PKSPIN_LOCK Lock);
13561
13562 #if defined(_WIN64)
13563 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13564 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
13565 #else
13566 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13567 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
13568 #endif
13569
13570 NTKERNELAPI
13571 ULONG
13572 FASTCALL
13573 ExInterlockedAddUlong(
13574 IN PULONG Addend,
13575 IN ULONG Increment,
13576 IN OUT PKSPIN_LOCK Lock);
13577
13578 #if defined(_AMD64_) || defined(_IA64_)
13579
13580 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13581 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
13582
13583 #elif defined(_X86_)
13584
13585 NTKERNELAPI
13586 LONGLONG
13587 FASTCALL
13588 ExfInterlockedCompareExchange64(
13589 IN OUT LONGLONG volatile *Destination,
13590 IN PLONGLONG Exchange,
13591 IN PLONGLONG Comperand);
13592
13593 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13594 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
13595
13596 #else
13597
13598 NTKERNELAPI
13599 LONGLONG
13600 FASTCALL
13601 ExInterlockedCompareExchange64(
13602 IN OUT LONGLONG volatile *Destination,
13603 IN PLONGLONG Exchange,
13604 IN PLONGLONG Comparand,
13605 IN PKSPIN_LOCK Lock);
13606
13607 #endif /* defined(_AMD64_) || defined(_IA64_) */
13608
13609 NTKERNELAPI
13610 PLIST_ENTRY
13611 FASTCALL
13612 ExInterlockedInsertHeadList(
13613 IN OUT PLIST_ENTRY ListHead,
13614 IN OUT PLIST_ENTRY ListEntry,
13615 IN OUT PKSPIN_LOCK Lock);
13616
13617 NTKERNELAPI
13618 PLIST_ENTRY
13619 FASTCALL
13620 ExInterlockedInsertTailList(
13621 IN OUT PLIST_ENTRY ListHead,
13622 IN OUT PLIST_ENTRY ListEntry,
13623 IN OUT PKSPIN_LOCK Lock);
13624
13625 NTKERNELAPI
13626 PSINGLE_LIST_ENTRY
13627 FASTCALL
13628 ExInterlockedPopEntryList(
13629 IN OUT PSINGLE_LIST_ENTRY ListHead,
13630 IN OUT PKSPIN_LOCK Lock);
13631
13632 NTKERNELAPI
13633 PSINGLE_LIST_ENTRY
13634 FASTCALL
13635 ExInterlockedPushEntryList(
13636 IN OUT PSINGLE_LIST_ENTRY ListHead,
13637 IN OUT PSINGLE_LIST_ENTRY ListEntry,
13638 IN OUT PKSPIN_LOCK Lock);
13639
13640 NTKERNELAPI
13641 PLIST_ENTRY
13642 FASTCALL
13643 ExInterlockedRemoveHeadList(
13644 IN OUT PLIST_ENTRY ListHead,
13645 IN OUT PKSPIN_LOCK Lock);
13646
13647 NTKERNELAPI
13648 BOOLEAN
13649 NTAPI
13650 ExIsProcessorFeaturePresent(
13651 IN ULONG ProcessorFeature);
13652
13653 NTKERNELAPI
13654 BOOLEAN
13655 NTAPI
13656 ExIsResourceAcquiredExclusiveLite(
13657 IN PERESOURCE Resource);
13658
13659 NTKERNELAPI
13660 ULONG
13661 NTAPI
13662 ExIsResourceAcquiredSharedLite(
13663 IN PERESOURCE Resource);
13664
13665 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
13666
13667 NTKERNELAPI
13668 VOID
13669 NTAPI
13670 ExLocalTimeToSystemTime(
13671 IN PLARGE_INTEGER LocalTime,
13672 OUT PLARGE_INTEGER SystemTime);
13673
13674 NTKERNELAPI
13675 VOID
13676 NTAPI
13677 ExNotifyCallback(
13678 IN PCALLBACK_OBJECT CallbackObject,
13679 IN PVOID Argument1 OPTIONAL,
13680 IN PVOID Argument2 OPTIONAL);
13681
13682 NTKERNELAPI
13683 VOID
13684 NTAPI
13685 ExQueueWorkItem(
13686 IN OUT PWORK_QUEUE_ITEM WorkItem,
13687 IN WORK_QUEUE_TYPE QueueType);
13688
13689 NTKERNELAPI
13690 DECLSPEC_NORETURN
13691 VOID
13692 NTAPI
13693 ExRaiseStatus(
13694 IN NTSTATUS Status);
13695
13696 NTKERNELAPI
13697 PVOID
13698 NTAPI
13699 ExRegisterCallback(
13700 IN PCALLBACK_OBJECT CallbackObject,
13701 IN PCALLBACK_FUNCTION CallbackFunction,
13702 IN PVOID CallbackContext OPTIONAL);
13703
13704 NTKERNELAPI
13705 NTSTATUS
13706 NTAPI
13707 ExReinitializeResourceLite(
13708 IN OUT PERESOURCE Resource);
13709
13710 NTKERNELAPI
13711 VOID
13712 NTAPI
13713 ExReleaseResourceForThreadLite(
13714 IN OUT PERESOURCE Resource,
13715 IN ERESOURCE_THREAD ResourceThreadId);
13716
13717 NTKERNELAPI
13718 VOID
13719 FASTCALL
13720 ExReleaseResourceLite(
13721 IN OUT PERESOURCE Resource);
13722
13723 NTKERNELAPI
13724 VOID
13725 NTAPI
13726 ExSetResourceOwnerPointer(
13727 IN OUT PERESOURCE Resource,
13728 IN PVOID OwnerPointer);
13729
13730 NTKERNELAPI
13731 ULONG
13732 NTAPI
13733 ExSetTimerResolution(
13734 IN ULONG DesiredTime,
13735 IN BOOLEAN SetResolution);
13736
13737 NTKERNELAPI
13738 VOID
13739 NTAPI
13740 ExSystemTimeToLocalTime(
13741 IN PLARGE_INTEGER SystemTime,
13742 OUT PLARGE_INTEGER LocalTime);
13743
13744 NTKERNELAPI
13745 VOID
13746 NTAPI
13747 ExUnregisterCallback(
13748 IN OUT PVOID CbRegistration);
13749
13750 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13751
13752 #if (NTDDI_VERSION >= NTDDI_WINXP)
13753
13754 NTKERNELAPI
13755 BOOLEAN
13756 FASTCALL
13757 ExAcquireRundownProtection(
13758 IN OUT PEX_RUNDOWN_REF RunRef);
13759
13760 NTKERNELAPI
13761 VOID
13762 FASTCALL
13763 ExInitializeRundownProtection(
13764 OUT PEX_RUNDOWN_REF RunRef);
13765
13766 NTKERNELAPI
13767 VOID
13768 FASTCALL
13769 ExReInitializeRundownProtection(
13770 IN OUT PEX_RUNDOWN_REF RunRef);
13771
13772 NTKERNELAPI
13773 VOID
13774 FASTCALL
13775 ExReleaseRundownProtection(
13776 IN OUT PEX_RUNDOWN_REF RunRef);
13777
13778 NTKERNELAPI
13779 VOID
13780 FASTCALL
13781 ExRundownCompleted(
13782 OUT PEX_RUNDOWN_REF RunRef);
13783
13784 NTKERNELAPI
13785 BOOLEAN
13786 NTAPI
13787 ExVerifySuite(
13788 IN SUITE_TYPE SuiteType);
13789
13790 NTKERNELAPI
13791 VOID
13792 FASTCALL
13793 ExWaitForRundownProtectionRelease(
13794 IN OUT PEX_RUNDOWN_REF RunRef);
13795
13796 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13797
13798 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
13799
13800 NTKERNELAPI
13801 BOOLEAN
13802 FASTCALL
13803 ExAcquireRundownProtectionEx(
13804 IN OUT PEX_RUNDOWN_REF RunRef,
13805 IN ULONG Count);
13806
13807 NTKERNELAPI
13808 VOID
13809 FASTCALL
13810 ExReleaseRundownProtectionEx(
13811 IN OUT PEX_RUNDOWN_REF RunRef,
13812 IN ULONG Count);
13813
13814 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
13815
13816 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
13817
13818 NTKERNELAPI
13819 PEX_RUNDOWN_REF_CACHE_AWARE
13820 NTAPI
13821 ExAllocateCacheAwareRundownProtection(
13822 IN POOL_TYPE PoolType,
13823 IN ULONG PoolTag);
13824
13825 NTKERNELAPI
13826 SIZE_T
13827 NTAPI
13828 ExSizeOfRundownProtectionCacheAware(VOID);
13829
13830 NTKERNELAPI
13831 PVOID
13832 NTAPI
13833 ExEnterCriticalRegionAndAcquireResourceShared(
13834 IN OUT PERESOURCE Resource);
13835
13836 NTKERNELAPI
13837 PVOID
13838 NTAPI
13839 ExEnterCriticalRegionAndAcquireResourceExclusive(
13840 IN OUT PERESOURCE Resource);
13841
13842 NTKERNELAPI
13843 PVOID
13844 NTAPI
13845 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
13846 IN OUT PERESOURCE Resource);
13847
13848 NTKERNELAPI
13849 VOID
13850 FASTCALL
13851 ExReleaseResourceAndLeaveCriticalRegion(
13852 IN OUT PERESOURCE Resource);
13853
13854 NTKERNELAPI
13855 VOID
13856 NTAPI
13857 ExInitializeRundownProtectionCacheAware(
13858 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13859 IN SIZE_T RunRefSize);
13860
13861 NTKERNELAPI
13862 VOID
13863 NTAPI
13864 ExFreeCacheAwareRundownProtection(
13865 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13866
13867 NTKERNELAPI
13868 BOOLEAN
13869 FASTCALL
13870 ExAcquireRundownProtectionCacheAware(
13871 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13872
13873 NTKERNELAPI
13874 VOID
13875 FASTCALL
13876 ExReleaseRundownProtectionCacheAware(
13877 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13878
13879 NTKERNELAPI
13880 BOOLEAN
13881 FASTCALL
13882 ExAcquireRundownProtectionCacheAwareEx(
13883 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13884 IN ULONG Count);
13885
13886 NTKERNELAPI
13887 VOID
13888 FASTCALL
13889 ExReleaseRundownProtectionCacheAwareEx(
13890 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
13891 IN ULONG Count);
13892
13893 NTKERNELAPI
13894 VOID
13895 FASTCALL
13896 ExWaitForRundownProtectionReleaseCacheAware(
13897 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
13898
13899 NTKERNELAPI
13900 VOID
13901 FASTCALL
13902 ExReInitializeRundownProtectionCacheAware(
13903 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13904
13905 NTKERNELAPI
13906 VOID
13907 FASTCALL
13908 ExRundownCompletedCacheAware(
13909 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13910
13911 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
13912
13913 #if (NTDDI_VERSION >= NTDDI_VISTA)
13914
13915 NTKERNELAPI
13916 NTSTATUS
13917 NTAPI
13918 ExInitializeLookasideListEx(
13919 OUT PLOOKASIDE_LIST_EX Lookaside,
13920 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
13921 IN PFREE_FUNCTION_EX Free OPTIONAL,
13922 IN POOL_TYPE PoolType,
13923 IN ULONG Flags,
13924 IN SIZE_T Size,
13925 IN ULONG Tag,
13926 IN USHORT Depth);
13927
13928 NTKERNELAPI
13929 VOID
13930 NTAPI
13931 ExDeleteLookasideListEx(
13932 IN OUT PLOOKASIDE_LIST_EX Lookaside);
13933
13934 NTKERNELAPI
13935 VOID
13936 NTAPI
13937 ExFlushLookasideListEx(
13938 IN OUT PLOOKASIDE_LIST_EX Lookaside);
13939
13940 FORCEINLINE
13941 PVOID
13942 ExAllocateFromLookasideListEx(
13943 IN OUT PLOOKASIDE_LIST_EX Lookaside)
13944 {
13945 PVOID Entry;
13946
13947 Lookaside->L.TotalAllocates += 1;
13948 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
13949 if (Entry == NULL) {
13950 Lookaside->L.AllocateMisses += 1;
13951 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
13952 Lookaside->L.Size,
13953 Lookaside->L.Tag,
13954 Lookaside);
13955 }
13956 return Entry;
13957 }
13958
13959 FORCEINLINE
13960 VOID
13961 ExFreeToLookasideListEx(
13962 IN OUT PLOOKASIDE_LIST_EX Lookaside,
13963 IN PVOID Entry)
13964 {
13965 Lookaside->L.TotalFrees += 1;
13966 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
13967 Lookaside->L.FreeMisses += 1;
13968 (Lookaside->L.FreeEx)(Entry, Lookaside);
13969 } else {
13970 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
13971 }
13972 return;
13973 }
13974
13975 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13976
13977 #if (NTDDI_VERSION >= NTDDI_WIN7)
13978
13979 NTKERNELAPI
13980 VOID
13981 NTAPI
13982 ExSetResourceOwnerPointerEx(
13983 IN OUT PERESOURCE Resource,
13984 IN PVOID OwnerPointer,
13985 IN ULONG Flags);
13986
13987 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
13988
13989 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13990
13991 static __inline PVOID
13992 ExAllocateFromNPagedLookasideList(
13993 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
13994 {
13995 PVOID Entry;
13996
13997 Lookaside->L.TotalAllocates++;
13998 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
13999 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
14000 &Lookaside->Lock__ObsoleteButDoNotDelete);
14001 #else
14002 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14003 #endif
14004 if (Entry == NULL) {
14005 Lookaside->L.AllocateMisses++;
14006 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
14007 Lookaside->L.Size,
14008 Lookaside->L.Tag);
14009 }
14010 return Entry;
14011 }
14012
14013 static __inline VOID
14014 ExFreeToNPagedLookasideList(
14015 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
14016 IN PVOID Entry)
14017 {
14018 Lookaside->L.TotalFrees++;
14019 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14020 Lookaside->L.FreeMisses++;
14021 (Lookaside->L.Free)(Entry);
14022 } else {
14023 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14024 ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
14025 (PSLIST_ENTRY)Entry,
14026 &Lookaside->Lock__ObsoleteButDoNotDelete);
14027 #else
14028 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14029 #endif
14030 }
14031 }
14032
14033
14034 /******************************************************************************
14035 * Object Manager Functions *
14036 ******************************************************************************/
14037
14038 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14039
14040 NTKERNELAPI
14041 LONG_PTR
14042 FASTCALL
14043 ObfDereferenceObject(
14044 IN PVOID Object);
14045 #define ObDereferenceObject ObfDereferenceObject
14046
14047 NTKERNELAPI
14048 NTSTATUS
14049 NTAPI
14050 ObGetObjectSecurity(
14051 IN PVOID Object,
14052 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
14053 OUT PBOOLEAN MemoryAllocated);
14054
14055 NTKERNELAPI
14056 LONG_PTR
14057 FASTCALL
14058 ObfReferenceObject(
14059 IN PVOID Object);
14060 #define ObReferenceObject ObfReferenceObject
14061
14062 NTKERNELAPI
14063 NTSTATUS
14064 NTAPI
14065 ObReferenceObjectByHandle(
14066 IN HANDLE Handle,
14067 IN ACCESS_MASK DesiredAccess,
14068 IN POBJECT_TYPE ObjectType OPTIONAL,
14069 IN KPROCESSOR_MODE AccessMode,
14070 OUT PVOID *Object,
14071 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14072
14073 NTKERNELAPI
14074 NTSTATUS
14075 NTAPI
14076 ObReferenceObjectByPointer(
14077 IN PVOID Object,
14078 IN ACCESS_MASK DesiredAccess,
14079 IN POBJECT_TYPE ObjectType OPTIONAL,
14080 IN KPROCESSOR_MODE AccessMode);
14081
14082 NTKERNELAPI
14083 VOID
14084 NTAPI
14085 ObReleaseObjectSecurity(
14086 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
14087 IN BOOLEAN MemoryAllocated);
14088
14089 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14090
14091 #if (NTDDI_VERSION >= NTDDI_VISTA)
14092 NTKERNELAPI
14093 VOID
14094 NTAPI
14095 ObDereferenceObjectDeferDelete(
14096 IN PVOID Object);
14097 #endif
14098
14099 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
14100 NTKERNELAPI
14101 NTSTATUS
14102 NTAPI
14103 ObRegisterCallbacks(
14104 IN POB_CALLBACK_REGISTRATION CallbackRegistration,
14105 OUT PVOID *RegistrationHandle);
14106
14107 NTKERNELAPI
14108 VOID
14109 NTAPI
14110 ObUnRegisterCallbacks(
14111 IN PVOID RegistrationHandle);
14112
14113 NTKERNELAPI
14114 USHORT
14115 NTAPI
14116 ObGetFilterVersion(VOID);
14117
14118 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
14119
14120 #if (NTDDI_VERSION >= NTDDI_WIN7)
14121
14122 NTKERNELAPI
14123 NTSTATUS
14124 NTAPI
14125 ObReferenceObjectByHandleWithTag(
14126 IN HANDLE Handle,
14127 IN ACCESS_MASK DesiredAccess,
14128 IN POBJECT_TYPE ObjectType OPTIONAL,
14129 IN KPROCESSOR_MODE AccessMode,
14130 IN ULONG Tag,
14131 OUT PVOID *Object,
14132 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14133
14134 NTKERNELAPI
14135 LONG_PTR
14136 FASTCALL
14137 ObfReferenceObjectWithTag(
14138 IN PVOID Object,
14139 IN ULONG Tag);
14140
14141 NTKERNELAPI
14142 NTSTATUS
14143 NTAPI
14144 ObReferenceObjectByPointerWithTag(
14145 IN PVOID Object,
14146 IN ACCESS_MASK DesiredAccess,
14147 IN POBJECT_TYPE ObjectType OPTIONAL,
14148 IN KPROCESSOR_MODE AccessMode,
14149 IN ULONG Tag);
14150
14151 NTKERNELAPI
14152 LONG_PTR
14153 FASTCALL
14154 ObfDereferenceObjectWithTag(
14155 IN PVOID Object,
14156 IN ULONG Tag);
14157
14158 NTKERNELAPI
14159 VOID
14160 NTAPI
14161 ObDereferenceObjectDeferDeleteWithTag(
14162 IN PVOID Object,
14163 IN ULONG Tag);
14164
14165 #define ObDereferenceObject ObfDereferenceObject
14166 #define ObReferenceObject ObfReferenceObject
14167 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
14168 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
14169
14170 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14171
14172
14173 /******************************************************************************
14174 * Process Manager Functions *
14175 ******************************************************************************/
14176
14177 NTKERNELAPI
14178 NTSTATUS
14179 NTAPI
14180 PsWrapApcWow64Thread(
14181 IN OUT PVOID *ApcContext,
14182 IN OUT PVOID *ApcRoutine);
14183
14184 /*
14185 * PEPROCESS
14186 * PsGetCurrentProcess(VOID)
14187 */
14188 #define PsGetCurrentProcess IoGetCurrentProcess
14189
14190 #if !defined(_PSGETCURRENTTHREAD_)
14191 #define _PSGETCURRENTTHREAD_
14192 FORCEINLINE
14193 PETHREAD
14194 NTAPI
14195 PsGetCurrentThread(VOID)
14196 {
14197 return (PETHREAD)KeGetCurrentThread();
14198 }
14199 #endif /* !_PSGETCURRENTTHREAD_ */
14200
14201
14202 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14203
14204 NTKERNELAPI
14205 NTSTATUS
14206 NTAPI
14207 PsCreateSystemThread(
14208 OUT PHANDLE ThreadHandle,
14209 IN ULONG DesiredAccess,
14210 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14211 IN HANDLE ProcessHandle OPTIONAL,
14212 OUT PCLIENT_ID ClientId OPTIONAL,
14213 IN PKSTART_ROUTINE StartRoutine,
14214 IN PVOID StartContext OPTIONAL);
14215
14216 NTKERNELAPI
14217 NTSTATUS
14218 NTAPI
14219 PsTerminateSystemThread(
14220 IN NTSTATUS ExitStatus);
14221
14222
14223 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14224
14225 /******************************************************************************
14226 * WMI Library Support Functions *
14227 ******************************************************************************/
14228
14229 #ifdef RUN_WPP
14230 #if (NTDDI_VERSION >= NTDDI_WINXP)
14231 NTKERNELAPI
14232 NTSTATUS
14233 __cdecl
14234 WmiTraceMessage(
14235 IN TRACEHANDLE LoggerHandle,
14236 IN ULONG MessageFlags,
14237 IN LPGUID MessageGuid,
14238 IN USHORT MessageNumber,
14239 IN ...);
14240 #endif
14241 #endif /* RUN_WPP */
14242
14243 #if (NTDDI_VERSION >= NTDDI_WINXP)
14244
14245 NTKERNELAPI
14246 NTSTATUS
14247 NTAPI
14248 WmiQueryTraceInformation(
14249 IN TRACE_INFORMATION_CLASS TraceInformationClass,
14250 OUT PVOID TraceInformation,
14251 IN ULONG TraceInformationLength,
14252 OUT PULONG RequiredLength OPTIONAL,
14253 IN PVOID Buffer OPTIONAL);
14254
14255 #if 0
14256 /* FIXME: Get va_list from where? */
14257 NTKERNELAPI
14258 NTSTATUS
14259 __cdecl
14260 WmiTraceMessageVa(
14261 IN TRACEHANDLE LoggerHandle,
14262 IN ULONG MessageFlags,
14263 IN LPGUID MessageGuid,
14264 IN USHORT MessageNumber,
14265 IN va_list MessageArgList);
14266 #endif
14267
14268 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14269
14270 #ifndef TRACE_INFORMATION_CLASS_DEFINE
14271
14272 #if (NTDDI_VERSION >= NTDDI_WINXP)
14273 NTKERNELAPI
14274 NTSTATUS
14275 NTAPI
14276 WmiQueryTraceInformation(
14277 IN TRACE_INFORMATION_CLASS TraceInformationClass,
14278 OUT PVOID TraceInformation,
14279 IN ULONG TraceInformationLength,
14280 OUT PULONG RequiredLength OPTIONAL,
14281 IN PVOID Buffer OPTIONAL);
14282 #endif
14283
14284 #define TRACE_INFORMATION_CLASS_DEFINE
14285
14286 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
14287
14288 #if (NTDDI_VERSION >= NTDDI_VISTA)
14289
14290 NTSTATUS
14291 NTKERNELAPI
14292 NTAPI
14293 EtwRegister(
14294 IN LPCGUID ProviderId,
14295 IN PETWENABLECALLBACK EnableCallback OPTIONAL,
14296 IN PVOID CallbackContext OPTIONAL,
14297 OUT PREGHANDLE RegHandle);
14298
14299 NTSTATUS
14300 NTKERNELAPI
14301 NTAPI
14302 EtwUnregister(
14303 IN REGHANDLE RegHandle);
14304
14305 BOOLEAN
14306 NTKERNELAPI
14307 NTAPI
14308 EtwEventEnabled(
14309 IN REGHANDLE RegHandle,
14310 IN PCEVENT_DESCRIPTOR EventDescriptor);
14311
14312 BOOLEAN
14313 NTKERNELAPI
14314 NTAPI
14315 EtwProviderEnabled(
14316 IN REGHANDLE RegHandle,
14317 IN UCHAR Level,
14318 IN ULONGLONG Keyword);
14319
14320 NTSTATUS
14321 NTKERNELAPI
14322 NTAPI
14323 EtwActivityIdControl(
14324 IN ULONG ControlCode,
14325 IN OUT LPGUID ActivityId);
14326
14327 NTSTATUS
14328 NTKERNELAPI
14329 NTAPI
14330 EtwWrite(
14331 IN REGHANDLE RegHandle,
14332 IN PCEVENT_DESCRIPTOR EventDescriptor,
14333 IN LPCGUID ActivityId OPTIONAL,
14334 IN ULONG UserDataCount,
14335 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14336
14337 NTSTATUS
14338 NTKERNELAPI
14339 NTAPI
14340 EtwWriteTransfer(
14341 IN REGHANDLE RegHandle,
14342 IN PCEVENT_DESCRIPTOR EventDescriptor,
14343 IN LPCGUID ActivityId OPTIONAL,
14344 IN LPCGUID RelatedActivityId OPTIONAL,
14345 IN ULONG UserDataCount,
14346 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14347
14348 NTSTATUS
14349 NTKERNELAPI
14350 NTAPI
14351 EtwWriteString(
14352 IN REGHANDLE RegHandle,
14353 IN UCHAR Level,
14354 IN ULONGLONG Keyword,
14355 IN LPCGUID ActivityId OPTIONAL,
14356 IN PCWSTR String);
14357
14358 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14359
14360 #if (NTDDI_VERSION >= NTDDI_WIN7)
14361 NTSTATUS
14362 NTKERNELAPI
14363 NTAPI
14364 EtwWriteEx(
14365 IN REGHANDLE RegHandle,
14366 IN PCEVENT_DESCRIPTOR EventDescriptor,
14367 IN ULONG64 Filter,
14368 IN ULONG Flags,
14369 IN LPCGUID ActivityId OPTIONAL,
14370 IN LPCGUID RelatedActivityId OPTIONAL,
14371 IN ULONG UserDataCount,
14372 IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14373 #endif
14374
14375
14376
14377 /******************************************************************************
14378 * Kernel Debugger Functions *
14379 ******************************************************************************/
14380
14381 #ifndef _DBGNT_
14382
14383 ULONG
14384 __cdecl
14385 DbgPrint(
14386 IN PCSTR Format,
14387 IN ...);
14388
14389 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14390 NTSYSAPI
14391 ULONG
14392 __cdecl
14393 DbgPrintReturnControlC(
14394 IN PCCH Format,
14395 IN ...);
14396 #endif
14397
14398 #if (NTDDI_VERSION >= NTDDI_WINXP)
14399
14400 NTSYSAPI
14401 ULONG
14402 __cdecl
14403 DbgPrintEx(
14404 IN ULONG ComponentId,
14405 IN ULONG Level,
14406 IN PCSTR Format,
14407 IN ...);
14408
14409 #ifdef _VA_LIST_DEFINED
14410
14411 NTSYSAPI
14412 ULONG
14413 NTAPI
14414 vDbgPrintEx(
14415 IN ULONG ComponentId,
14416 IN ULONG Level,
14417 IN PCCH Format,
14418 IN va_list ap);
14419
14420 NTSYSAPI
14421 ULONG
14422 NTAPI
14423 vDbgPrintExWithPrefix(
14424 IN PCCH Prefix,
14425 IN ULONG ComponentId,
14426 IN ULONG Level,
14427 IN PCCH Format,
14428 IN va_list ap);
14429
14430 #endif /* _VA_LIST_DEFINED */
14431
14432 NTSYSAPI
14433 NTSTATUS
14434 NTAPI
14435 DbgQueryDebugFilterState(
14436 IN ULONG ComponentId,
14437 IN ULONG Level);
14438
14439 NTSYSAPI
14440 NTSTATUS
14441 NTAPI
14442 DbgSetDebugFilterState(
14443 IN ULONG ComponentId,
14444 IN ULONG Level,
14445 IN BOOLEAN State);
14446
14447 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14448
14449 #if (NTDDI_VERSION >= NTDDI_VISTA)
14450
14451 typedef VOID
14452 (*PDEBUG_PRINT_CALLBACK)(
14453 IN PSTRING Output,
14454 IN ULONG ComponentId,
14455 IN ULONG Level);
14456
14457 NTSYSAPI
14458 NTSTATUS
14459 NTAPI
14460 DbgSetDebugPrintCallback(
14461 IN PDEBUG_PRINT_CALLBACK DebugPrintCallback,
14462 IN BOOLEAN Enable);
14463
14464 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14465
14466 #endif /* _DBGNT_ */
14467
14468 #if DBG
14469
14470 #define KdPrint(_x_) DbgPrint _x_
14471 #define KdPrintEx(_x_) DbgPrintEx _x_
14472 #define vKdPrintEx(_x_) vDbgPrintEx _x_
14473 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
14474 #define KdBreakPoint() DbgBreakPoint()
14475 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
14476
14477 #else /* !DBG */
14478
14479 #define KdPrint(_x_)
14480 #define KdPrintEx(_x_)
14481 #define vKdPrintEx(_x_)
14482 #define vKdPrintExWithPrefix(_x_)
14483 #define KdBreakPoint()
14484 #define KdBreakPointWithStatus(s)
14485
14486 #endif /* !DBG */
14487
14488 #if defined(__GNUC__)
14489
14490 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
14491 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
14492 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14493 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14494
14495 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
14496
14497 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
14498 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
14499 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
14500 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
14501
14502 #else
14503
14504 extern BOOLEAN KdDebuggerNotPresent;
14505 extern BOOLEAN KdDebuggerEnabled;
14506 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14507 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14508
14509 #endif
14510
14511 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14512
14513 NTKERNELAPI
14514 NTSTATUS
14515 NTAPI
14516 KdDisableDebugger(VOID);
14517
14518 NTKERNELAPI
14519 NTSTATUS
14520 NTAPI
14521 KdEnableDebugger(VOID);
14522
14523 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
14524 #define DbgBreakPoint __debugbreak
14525 #else
14526 VOID
14527 NTAPI
14528 DbgBreakPoint(VOID);
14529 #endif
14530
14531 NTSYSAPI
14532 VOID
14533 NTAPI
14534 DbgBreakPointWithStatus(
14535 IN ULONG Status);
14536
14537 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14538
14539 #if (NTDDI_VERSION >= NTDDI_WS03)
14540 NTKERNELAPI
14541 BOOLEAN
14542 NTAPI
14543 KdRefreshDebuggerNotPresent(VOID);
14544 #endif
14545
14546 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
14547 NTKERNELAPI
14548 NTSTATUS
14549 NTAPI
14550 KdChangeOption(
14551 IN KD_OPTION Option,
14552 IN ULONG InBufferBytes OPTIONAL,
14553 IN PVOID InBuffer,
14554 IN ULONG OutBufferBytes OPTIONAL,
14555 OUT PVOID OutBuffer,
14556 OUT PULONG OutBufferNeeded OPTIONAL);
14557 #endif
14558 /* Hardware Abstraction Layer Functions */
14559
14560 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
14561
14562
14563 FORCEINLINE
14564 PVOID
14565 NTAPI
14566 HalAllocateCommonBuffer(
14567 IN PDMA_ADAPTER DmaAdapter,
14568 IN ULONG Length,
14569 OUT PPHYSICAL_ADDRESS LogicalAddress,
14570 IN BOOLEAN CacheEnabled)
14571 {
14572 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
14573 PVOID commonBuffer;
14574
14575 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
14576 ASSERT( allocateCommonBuffer != NULL );
14577 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
14578 return commonBuffer;
14579 }
14580
14581 FORCEINLINE
14582 VOID
14583 NTAPI
14584 HalFreeCommonBuffer(
14585 IN PDMA_ADAPTER DmaAdapter,
14586 IN ULONG Length,
14587 IN PHYSICAL_ADDRESS LogicalAddress,
14588 IN PVOID VirtualAddress,
14589 IN BOOLEAN CacheEnabled)
14590 {
14591 PFREE_COMMON_BUFFER freeCommonBuffer;
14592
14593 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
14594 ASSERT( freeCommonBuffer != NULL );
14595 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
14596 }
14597
14598 FORCEINLINE
14599 ULONG
14600 NTAPI
14601 HalReadDmaCounter(
14602 IN PDMA_ADAPTER DmaAdapter)
14603 {
14604 PREAD_DMA_COUNTER readDmaCounter;
14605 ULONG counter;
14606
14607 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
14608 ASSERT( readDmaCounter != NULL );
14609 counter = readDmaCounter( DmaAdapter );
14610 return counter;
14611 }
14612
14613 FORCEINLINE
14614 ULONG
14615 HalGetDmaAlignment(
14616 IN PDMA_ADAPTER DmaAdapter)
14617 {
14618 PGET_DMA_ALIGNMENT getDmaAlignment;
14619 ULONG alignment;
14620
14621 getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
14622 ASSERT( getDmaAlignment != NULL );
14623 alignment = getDmaAlignment( DmaAdapter );
14624 return alignment;
14625 }
14626
14627
14628
14629 #endif
14630
14631 #ifndef _NTTMAPI_
14632 #define _NTTMAPI_
14633
14634 #include <ktmtypes.h>
14635
14636 #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
14637 #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
14638 #define TRANSACTIONMANAGER_RECOVER (0x0004)
14639 #define TRANSACTIONMANAGER_RENAME (0x0008)
14640 #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
14641 #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
14642
14643 #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14644 TRANSACTIONMANAGER_QUERY_INFORMATION)
14645
14646 #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14647 TRANSACTIONMANAGER_SET_INFORMATION |\
14648 TRANSACTIONMANAGER_RECOVER |\
14649 TRANSACTIONMANAGER_RENAME |\
14650 TRANSACTIONMANAGER_CREATE_RM)
14651
14652 #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
14653
14654 #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14655 TRANSACTIONMANAGER_GENERIC_READ |\
14656 TRANSACTIONMANAGER_GENERIC_WRITE |\
14657 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
14658 TRANSACTIONMANAGER_BIND_TRANSACTION)
14659
14660 #define TRANSACTION_QUERY_INFORMATION (0x0001)
14661 #define TRANSACTION_SET_INFORMATION (0x0002)
14662 #define TRANSACTION_ENLIST (0x0004)
14663 #define TRANSACTION_COMMIT (0x0008)
14664 #define TRANSACTION_ROLLBACK (0x0010)
14665 #define TRANSACTION_PROPAGATE (0x0020)
14666 #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
14667
14668 #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
14669 TRANSACTION_QUERY_INFORMATION |\
14670 SYNCHRONIZE)
14671
14672 #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14673 TRANSACTION_SET_INFORMATION |\
14674 TRANSACTION_COMMIT |\
14675 TRANSACTION_ENLIST |\
14676 TRANSACTION_ROLLBACK |\
14677 TRANSACTION_PROPAGATE |\
14678 SYNCHRONIZE)
14679
14680 #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14681 TRANSACTION_COMMIT |\
14682 TRANSACTION_ROLLBACK |\
14683 SYNCHRONIZE)
14684
14685 #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14686 TRANSACTION_GENERIC_READ |\
14687 TRANSACTION_GENERIC_WRITE |\
14688 TRANSACTION_GENERIC_EXECUTE)
14689
14690 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
14691 STANDARD_RIGHTS_WRITE |\
14692 TRANSACTION_SET_INFORMATION |\
14693 TRANSACTION_ENLIST |\
14694 TRANSACTION_ROLLBACK |\
14695 TRANSACTION_PROPAGATE |\
14696 SYNCHRONIZE)
14697
14698 #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
14699 #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
14700 #define RESOURCEMANAGER_RECOVER (0x0004)
14701 #define RESOURCEMANAGER_ENLIST (0x0008)
14702 #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
14703 #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
14704 #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
14705
14706 #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14707 RESOURCEMANAGER_QUERY_INFORMATION |\
14708 SYNCHRONIZE)
14709
14710 #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14711 RESOURCEMANAGER_SET_INFORMATION |\
14712 RESOURCEMANAGER_RECOVER |\
14713 RESOURCEMANAGER_ENLIST |\
14714 RESOURCEMANAGER_GET_NOTIFICATION |\
14715 RESOURCEMANAGER_REGISTER_PROTOCOL |\
14716 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14717 SYNCHRONIZE)
14718
14719 #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14720 RESOURCEMANAGER_RECOVER |\
14721 RESOURCEMANAGER_ENLIST |\
14722 RESOURCEMANAGER_GET_NOTIFICATION |\
14723 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14724 SYNCHRONIZE)
14725
14726 #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14727 RESOURCEMANAGER_GENERIC_READ |\
14728 RESOURCEMANAGER_GENERIC_WRITE |\
14729 RESOURCEMANAGER_GENERIC_EXECUTE)
14730
14731 #define ENLISTMENT_QUERY_INFORMATION (0x0001)
14732 #define ENLISTMENT_SET_INFORMATION (0x0002)
14733 #define ENLISTMENT_RECOVER (0x0004)
14734 #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
14735 #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
14736
14737 #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
14738 ENLISTMENT_QUERY_INFORMATION)
14739
14740 #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14741 ENLISTMENT_SET_INFORMATION |\
14742 ENLISTMENT_RECOVER |\
14743 ENLISTMENT_SUBORDINATE_RIGHTS |\
14744 ENLISTMENT_SUPERIOR_RIGHTS)
14745
14746 #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14747 ENLISTMENT_RECOVER |\
14748 ENLISTMENT_SUBORDINATE_RIGHTS |\
14749 ENLISTMENT_SUPERIOR_RIGHTS)
14750
14751 #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14752 ENLISTMENT_GENERIC_READ |\
14753 ENLISTMENT_GENERIC_WRITE |\
14754 ENLISTMENT_GENERIC_EXECUTE)
14755
14756 typedef enum _TRANSACTION_OUTCOME {
14757 TransactionOutcomeUndetermined = 1,
14758 TransactionOutcomeCommitted,
14759 TransactionOutcomeAborted,
14760 } TRANSACTION_OUTCOME;
14761
14762
14763 typedef enum _TRANSACTION_STATE {
14764 TransactionStateNormal = 1,
14765 TransactionStateIndoubt,
14766 TransactionStateCommittedNotify,
14767 } TRANSACTION_STATE;
14768
14769
14770 typedef struct _TRANSACTION_BASIC_INFORMATION {
14771 GUID TransactionId;
14772 ULONG State;
14773 ULONG Outcome;
14774 } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
14775
14776 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
14777 GUID TmIdentity;
14778 LARGE_INTEGER VirtualClock;
14779 } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
14780
14781 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
14782 GUID LogIdentity;
14783 } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
14784
14785 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
14786 ULONG LogPathLength;
14787 WCHAR LogPath[1];
14788 } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
14789
14790 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
14791 ULONGLONG LastRecoveredLsn;
14792 } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
14793
14794 typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
14795 ULONG IsolationLevel;
14796 ULONG IsolationFlags;
14797 LARGE_INTEGER Timeout;
14798 ULONG Outcome;
14799 ULONG DescriptionLength;
14800 WCHAR Description[1];
14801 } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
14802
14803 typedef struct _TRANSACTION_BIND_INFORMATION {
14804 HANDLE TmHandle;
14805 } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
14806
14807 typedef struct _TRANSACTION_ENLISTMENT_PAIR {
14808 GUID EnlistmentId;
14809 GUID ResourceManagerId;
14810 } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
14811
14812 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
14813 ULONG NumberOfEnlistments;
14814 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
14815 } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
14816
14817 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
14818 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
14819 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
14820
14821 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
14822 GUID ResourceManagerId;
14823 ULONG DescriptionLength;
14824 WCHAR Description[1];
14825 } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
14826
14827 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
14828 HANDLE IoCompletionPortHandle;
14829 ULONG_PTR CompletionKey;
14830 } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
14831
14832 typedef enum _KTMOBJECT_TYPE {
14833 KTMOBJECT_TRANSACTION,
14834 KTMOBJECT_TRANSACTION_MANAGER,
14835 KTMOBJECT_RESOURCE_MANAGER,
14836 KTMOBJECT_ENLISTMENT,
14837 KTMOBJECT_INVALID
14838 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
14839
14840 typedef struct _KTMOBJECT_CURSOR {
14841 GUID LastQuery;
14842 ULONG ObjectIdCount;
14843 GUID ObjectIds[1];
14844 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
14845
14846 typedef enum _TRANSACTION_INFORMATION_CLASS {
14847 TransactionBasicInformation,
14848 TransactionPropertiesInformation,
14849 TransactionEnlistmentInformation,
14850 TransactionSuperiorEnlistmentInformation
14851 } TRANSACTION_INFORMATION_CLASS;
14852
14853 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
14854 TransactionManagerBasicInformation,
14855 TransactionManagerLogInformation,
14856 TransactionManagerLogPathInformation,
14857 TransactionManagerRecoveryInformation = 4
14858 } TRANSACTIONMANAGER_INFORMATION_CLASS;
14859
14860 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
14861 ResourceManagerBasicInformation,
14862 ResourceManagerCompletionInformation,
14863 } RESOURCEMANAGER_INFORMATION_CLASS;
14864
14865 typedef struct _ENLISTMENT_BASIC_INFORMATION {
14866 GUID EnlistmentId;
14867 GUID TransactionId;
14868 GUID ResourceManagerId;
14869 } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
14870
14871 typedef struct _ENLISTMENT_CRM_INFORMATION {
14872 GUID CrmTransactionManagerId;
14873 GUID CrmResourceManagerId;
14874 GUID CrmEnlistmentId;
14875 } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
14876
14877 typedef enum _ENLISTMENT_INFORMATION_CLASS {
14878 EnlistmentBasicInformation,
14879 EnlistmentRecoveryInformation,
14880 EnlistmentCrmInformation
14881 } ENLISTMENT_INFORMATION_CLASS;
14882
14883 typedef struct _TRANSACTION_LIST_ENTRY {
14884 #if defined(__cplusplus)
14885 ::UOW UOW;
14886 #else
14887 UOW UOW;
14888 #endif
14889 } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
14890
14891 typedef struct _TRANSACTION_LIST_INFORMATION {
14892 ULONG NumberOfTransactions;
14893 TRANSACTION_LIST_ENTRY TransactionInformation[1];
14894 } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
14895
14896 typedef NTSTATUS
14897 (NTAPI *PFN_NT_CREATE_TRANSACTION)(
14898 OUT PHANDLE TransactionHandle,
14899 IN ACCESS_MASK DesiredAccess,
14900 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14901 IN LPGUID Uow OPTIONAL,
14902 IN HANDLE TmHandle OPTIONAL,
14903 IN ULONG CreateOptions OPTIONAL,
14904 IN ULONG IsolationLevel OPTIONAL,
14905 IN ULONG IsolationFlags OPTIONAL,
14906 IN PLARGE_INTEGER Timeout OPTIONAL,
14907 IN PUNICODE_STRING Description OPTIONAL);
14908
14909 typedef NTSTATUS
14910 (NTAPI *PFN_NT_OPEN_TRANSACTION)(
14911 OUT PHANDLE TransactionHandle,
14912 IN ACCESS_MASK DesiredAccess,
14913 IN POBJECT_ATTRIBUTES ObjectAttributes,
14914 IN LPGUID Uow OPTIONAL,
14915 IN HANDLE TmHandle OPTIONAL);
14916
14917 typedef NTSTATUS
14918 (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
14919 IN HANDLE TransactionHandle,
14920 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
14921 OUT PVOID TransactionInformation,
14922 IN ULONG TransactionInformationLength,
14923 OUT PULONG ReturnLength OPTIONAL);
14924
14925 typedef NTSTATUS
14926 (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
14927 IN HANDLE TransactionHandle,
14928 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
14929 IN PVOID TransactionInformation,
14930 IN ULONG TransactionInformationLength);
14931
14932 typedef NTSTATUS
14933 (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
14934 IN HANDLE TransactionHandle,
14935 IN BOOLEAN Wait);
14936
14937 typedef NTSTATUS
14938 (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
14939 IN HANDLE TransactionHandle,
14940 IN BOOLEAN Wait);
14941
14942 #if (NTDDI_VERSION >= NTDDI_VISTA)
14943
14944 NTSYSCALLAPI
14945 NTSTATUS
14946 NTAPI
14947 NtCreateTransactionManager(
14948 OUT PHANDLE TmHandle,
14949 IN ACCESS_MASK DesiredAccess,
14950 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14951 IN PUNICODE_STRING LogFileName OPTIONAL,
14952 IN ULONG CreateOptions OPTIONAL,
14953 IN ULONG CommitStrength OPTIONAL);
14954
14955 NTSYSCALLAPI
14956 NTSTATUS
14957 NTAPI
14958 NtOpenTransactionManager(
14959 OUT PHANDLE TmHandle,
14960 IN ACCESS_MASK DesiredAccess,
14961 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14962 IN PUNICODE_STRING LogFileName OPTIONAL,
14963 IN LPGUID TmIdentity OPTIONAL,
14964 IN ULONG OpenOptions OPTIONAL);
14965
14966 NTSYSCALLAPI
14967 NTSTATUS
14968 NTAPI
14969 NtRenameTransactionManager(
14970 IN PUNICODE_STRING LogFileName,
14971 IN LPGUID ExistingTransactionManagerGuid);
14972
14973 NTSYSCALLAPI
14974 NTSTATUS
14975 NTAPI
14976 NtRollforwardTransactionManager(
14977 IN HANDLE TransactionManagerHandle,
14978 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
14979
14980 NTSYSCALLAPI
14981 NTSTATUS
14982 NTAPI
14983 NtRecoverTransactionManager(
14984 IN HANDLE TransactionManagerHandle);
14985
14986 NTSYSCALLAPI
14987 NTSTATUS
14988 NTAPI
14989 NtQueryInformationTransactionManager(
14990 IN HANDLE TransactionManagerHandle,
14991 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
14992 OUT PVOID TransactionManagerInformation,
14993 IN ULONG TransactionManagerInformationLength,
14994 OUT PULONG ReturnLength);
14995
14996 NTSYSCALLAPI
14997 NTSTATUS
14998 NTAPI
14999 NtSetInformationTransactionManager(
15000 IN HANDLE TmHandle OPTIONAL,
15001 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15002 IN PVOID TransactionManagerInformation,
15003 IN ULONG TransactionManagerInformationLength);
15004
15005 NTSYSCALLAPI
15006 NTSTATUS
15007 NTAPI
15008 NtEnumerateTransactionObject(
15009 IN HANDLE RootObjectHandle OPTIONAL,
15010 IN KTMOBJECT_TYPE QueryType,
15011 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15012 IN ULONG ObjectCursorLength,
15013 OUT PULONG ReturnLength);
15014
15015 NTSYSCALLAPI
15016 NTSTATUS
15017 NTAPI
15018 NtCreateTransaction(
15019 OUT PHANDLE TransactionHandle,
15020 IN ACCESS_MASK DesiredAccess,
15021 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15022 IN LPGUID Uow OPTIONAL,
15023 IN HANDLE TmHandle OPTIONAL,
15024 IN ULONG CreateOptions OPTIONAL,
15025 IN ULONG IsolationLevel OPTIONAL,
15026 IN ULONG IsolationFlags OPTIONAL,
15027 IN PLARGE_INTEGER Timeout OPTIONAL,
15028 IN PUNICODE_STRING Description OPTIONAL);
15029
15030 NTSYSCALLAPI
15031 NTSTATUS
15032 NTAPI
15033 NtOpenTransaction(
15034 OUT PHANDLE TransactionHandle,
15035 IN ACCESS_MASK DesiredAccess,
15036 IN POBJECT_ATTRIBUTES ObjectAttributes,
15037 IN LPGUID Uow,
15038 IN HANDLE TmHandle OPTIONAL);
15039
15040 NTSYSCALLAPI
15041 NTSTATUS
15042 NTAPI
15043 NtQueryInformationTransaction(
15044 IN HANDLE TransactionHandle,
15045 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15046 OUT PVOID TransactionInformation,
15047 IN ULONG TransactionInformationLength,
15048 OUT PULONG ReturnLength OPTIONAL);
15049
15050 NTSYSCALLAPI
15051 NTSTATUS
15052 NTAPI
15053 NtSetInformationTransaction(
15054 IN HANDLE TransactionHandle,
15055 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15056 IN PVOID TransactionInformation,
15057 IN ULONG TransactionInformationLength);
15058
15059 NTSYSCALLAPI
15060 NTSTATUS
15061 NTAPI
15062 NtCommitTransaction(
15063 IN HANDLE TransactionHandle,
15064 IN BOOLEAN Wait);
15065
15066 NTSYSCALLAPI
15067 NTSTATUS
15068 NTAPI
15069 NtRollbackTransaction(
15070 IN HANDLE TransactionHandle,
15071 IN BOOLEAN Wait);
15072
15073 NTSYSCALLAPI
15074 NTSTATUS
15075 NTAPI
15076 NtCreateEnlistment(
15077 OUT PHANDLE EnlistmentHandle,
15078 IN ACCESS_MASK DesiredAccess,
15079 IN HANDLE ResourceManagerHandle,
15080 IN HANDLE TransactionHandle,
15081 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15082 IN ULONG CreateOptions OPTIONAL,
15083 IN NOTIFICATION_MASK NotificationMask,
15084 IN PVOID EnlistmentKey OPTIONAL);
15085
15086 NTSYSCALLAPI
15087 NTSTATUS
15088 NTAPI
15089 NtOpenEnlistment(
15090 OUT PHANDLE EnlistmentHandle,
15091 IN ACCESS_MASK DesiredAccess,
15092 IN HANDLE ResourceManagerHandle,
15093 IN LPGUID EnlistmentGuid,
15094 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15095
15096 NTSYSCALLAPI
15097 NTSTATUS
15098 NTAPI
15099 NtQueryInformationEnlistment(
15100 IN HANDLE EnlistmentHandle,
15101 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15102 OUT PVOID EnlistmentInformation,
15103 IN ULONG EnlistmentInformationLength,
15104 OUT PULONG ReturnLength);
15105
15106 NTSYSCALLAPI
15107 NTSTATUS
15108 NTAPI
15109 NtSetInformationEnlistment(
15110 IN HANDLE EnlistmentHandle OPTIONAL,
15111 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15112 IN PVOID EnlistmentInformation,
15113 IN ULONG EnlistmentInformationLength);
15114
15115 NTSYSCALLAPI
15116 NTSTATUS
15117 NTAPI
15118 NtRecoverEnlistment(
15119 IN HANDLE EnlistmentHandle,
15120 IN PVOID EnlistmentKey OPTIONAL);
15121
15122 NTSYSCALLAPI
15123 NTSTATUS
15124 NTAPI
15125 NtPrePrepareEnlistment(
15126 IN HANDLE EnlistmentHandle,
15127 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15128
15129 NTSYSCALLAPI
15130 NTSTATUS
15131 NTAPI
15132 NtPrepareEnlistment(
15133 IN HANDLE EnlistmentHandle,
15134 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15135
15136 NTSYSCALLAPI
15137 NTSTATUS
15138 NTAPI
15139 NtCommitEnlistment(
15140 IN HANDLE EnlistmentHandle,
15141 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15142
15143 NTSYSCALLAPI
15144 NTSTATUS
15145 NTAPI
15146 NtRollbackEnlistment(
15147 IN HANDLE EnlistmentHandle,
15148 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15149
15150 NTSYSCALLAPI
15151 NTSTATUS
15152 NTAPI
15153 NtPrePrepareComplete(
15154 IN HANDLE EnlistmentHandle,
15155 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15156
15157 NTSYSCALLAPI
15158 NTSTATUS
15159 NTAPI
15160 NtPrepareComplete(
15161 IN HANDLE EnlistmentHandle,
15162 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15163
15164 NTSYSCALLAPI
15165 NTSTATUS
15166 NTAPI
15167 NtCommitComplete(
15168 IN HANDLE EnlistmentHandle,
15169 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15170
15171 NTSYSCALLAPI
15172 NTSTATUS
15173 NTAPI
15174 NtReadOnlyEnlistment(
15175 IN HANDLE EnlistmentHandle,
15176 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15177
15178 NTSYSCALLAPI
15179 NTSTATUS
15180 NTAPI
15181 NtRollbackComplete(
15182 IN HANDLE EnlistmentHandle,
15183 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15184
15185 NTSYSCALLAPI
15186 NTSTATUS
15187 NTAPI
15188 NtSinglePhaseReject(
15189 IN HANDLE EnlistmentHandle,
15190 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15191
15192 NTSYSCALLAPI
15193 NTSTATUS
15194 NTAPI
15195 NtCreateResourceManager(
15196 OUT PHANDLE ResourceManagerHandle,
15197 IN ACCESS_MASK DesiredAccess,
15198 IN HANDLE TmHandle,
15199 IN LPGUID RmGuid,
15200 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15201 IN ULONG CreateOptions OPTIONAL,
15202 IN PUNICODE_STRING Description OPTIONAL);
15203
15204 NTSYSCALLAPI
15205 NTSTATUS
15206 NTAPI
15207 NtOpenResourceManager(
15208 OUT PHANDLE ResourceManagerHandle,
15209 IN ACCESS_MASK DesiredAccess,
15210 IN HANDLE TmHandle,
15211 IN LPGUID ResourceManagerGuid OPTIONAL,
15212 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15213
15214 NTSYSCALLAPI
15215 NTSTATUS
15216 NTAPI
15217 NtRecoverResourceManager(
15218 IN HANDLE ResourceManagerHandle);
15219
15220 NTSYSCALLAPI
15221 NTSTATUS
15222 NTAPI
15223 NtGetNotificationResourceManager(
15224 IN HANDLE ResourceManagerHandle,
15225 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15226 IN ULONG NotificationLength,
15227 IN PLARGE_INTEGER Timeout OPTIONAL,
15228 OUT PULONG ReturnLength OPTIONAL,
15229 IN ULONG Asynchronous,
15230 IN ULONG_PTR AsynchronousContext OPTIONAL);
15231
15232 NTSYSCALLAPI
15233 NTSTATUS
15234 NTAPI
15235 NtQueryInformationResourceManager(
15236 IN HANDLE ResourceManagerHandle,
15237 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15238 OUT PVOID ResourceManagerInformation,
15239 IN ULONG ResourceManagerInformationLength,
15240 OUT PULONG ReturnLength OPTIONAL);
15241
15242 NTSYSCALLAPI
15243 NTSTATUS
15244 NTAPI
15245 NtSetInformationResourceManager(
15246 IN HANDLE ResourceManagerHandle,
15247 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15248 IN PVOID ResourceManagerInformation,
15249 IN ULONG ResourceManagerInformationLength);
15250
15251 NTSYSCALLAPI
15252 NTSTATUS
15253 NTAPI
15254 NtRegisterProtocolAddressInformation(
15255 IN HANDLE ResourceManager,
15256 IN PCRM_PROTOCOL_ID ProtocolId,
15257 IN ULONG ProtocolInformationSize,
15258 IN PVOID ProtocolInformation,
15259 IN ULONG CreateOptions OPTIONAL);
15260
15261 NTSYSCALLAPI
15262 NTSTATUS
15263 NTAPI
15264 NtPropagationComplete(
15265 IN HANDLE ResourceManagerHandle,
15266 IN ULONG RequestCookie,
15267 IN ULONG BufferLength,
15268 IN PVOID Buffer);
15269
15270 NTSYSCALLAPI
15271 NTSTATUS
15272 NTAPI
15273 NtPropagationFailed(
15274 IN HANDLE ResourceManagerHandle,
15275 IN ULONG RequestCookie,
15276 IN NTSTATUS PropStatus);
15277
15278 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
15279
15280 #endif /* !_NTTMAPI_ */
15281 /******************************************************************************
15282 * ZwXxx Functions *
15283 ******************************************************************************/
15284
15285
15286 /* Constants */
15287 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
15288 #define ZwCurrentProcess() NtCurrentProcess()
15289 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
15290 #define ZwCurrentThread() NtCurrentThread()
15291
15292
15293
15294 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15295
15296
15297
15298 NTSYSAPI
15299 NTSTATUS
15300 NTAPI
15301 ZwClose(
15302 IN HANDLE Handle);
15303
15304 NTSYSAPI
15305 NTSTATUS
15306 NTAPI
15307 ZwCreateDirectoryObject(
15308 OUT PHANDLE DirectoryHandle,
15309 IN ACCESS_MASK DesiredAccess,
15310 IN POBJECT_ATTRIBUTES ObjectAttributes);
15311
15312 NTSYSAPI
15313 NTSTATUS
15314 NTAPI
15315 ZwCreateFile(
15316 OUT PHANDLE FileHandle,
15317 IN ACCESS_MASK DesiredAccess,
15318 IN POBJECT_ATTRIBUTES ObjectAttributes,
15319 OUT PIO_STATUS_BLOCK IoStatusBlock,
15320 IN PLARGE_INTEGER AllocationSize OPTIONAL,
15321 IN ULONG FileAttributes,
15322 IN ULONG ShareAccess,
15323 IN ULONG CreateDisposition,
15324 IN ULONG CreateOptions,
15325 IN PVOID EaBuffer OPTIONAL,
15326 IN ULONG EaLength);
15327
15328 NTSYSAPI
15329 NTSTATUS
15330 NTAPI
15331 ZwCreateKey(
15332 OUT PHANDLE KeyHandle,
15333 IN ACCESS_MASK DesiredAccess,
15334 IN POBJECT_ATTRIBUTES ObjectAttributes,
15335 IN ULONG TitleIndex,
15336 IN PUNICODE_STRING Class OPTIONAL,
15337 IN ULONG CreateOptions,
15338 OUT PULONG Disposition OPTIONAL);
15339
15340 NTSYSAPI
15341 NTSTATUS
15342 NTAPI
15343 ZwCreateSection(
15344 OUT PHANDLE SectionHandle,
15345 IN ACCESS_MASK DesiredAccess,
15346 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15347 IN PLARGE_INTEGER MaximumSize OPTIONAL,
15348 IN ULONG SectionPageProtection,
15349 IN ULONG AllocationAttributes,
15350 IN HANDLE FileHandle OPTIONAL);
15351
15352 NTSYSAPI
15353 NTSTATUS
15354 NTAPI
15355 ZwDeleteKey(
15356 IN HANDLE KeyHandle);
15357
15358 NTSYSAPI
15359 NTSTATUS
15360 NTAPI
15361 ZwDeleteValueKey(
15362 IN HANDLE KeyHandle,
15363 IN PUNICODE_STRING ValueName);
15364
15365 NTSYSAPI
15366 NTSTATUS
15367 NTAPI
15368 ZwEnumerateKey(
15369 IN HANDLE KeyHandle,
15370 IN ULONG Index,
15371 IN KEY_INFORMATION_CLASS KeyInformationClass,
15372 OUT PVOID KeyInformation OPTIONAL,
15373 IN ULONG Length,
15374 OUT PULONG ResultLength);
15375
15376 NTSYSAPI
15377 NTSTATUS
15378 NTAPI
15379 ZwEnumerateValueKey(
15380 IN HANDLE KeyHandle,
15381 IN ULONG Index,
15382 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15383 OUT PVOID KeyValueInformation OPTIONAL,
15384 IN ULONG Length,
15385 OUT PULONG ResultLength);
15386
15387 NTSYSAPI
15388 NTSTATUS
15389 NTAPI
15390 ZwFlushKey(
15391 IN HANDLE KeyHandle);
15392
15393 NTSYSAPI
15394 NTSTATUS
15395 NTAPI
15396 ZwLoadDriver(
15397 IN PUNICODE_STRING DriverServiceName);
15398
15399 NTSYSAPI
15400 NTSTATUS
15401 NTAPI
15402 ZwMakeTemporaryObject(
15403 IN HANDLE Handle);
15404
15405 NTSYSAPI
15406 NTSTATUS
15407 NTAPI
15408 ZwMapViewOfSection(
15409 IN HANDLE SectionHandle,
15410 IN HANDLE ProcessHandle,
15411 IN OUT PVOID *BaseAddress,
15412 IN ULONG_PTR ZeroBits,
15413 IN SIZE_T CommitSize,
15414 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
15415 IN OUT PSIZE_T ViewSize,
15416 IN SECTION_INHERIT InheritDisposition,
15417 IN ULONG AllocationType,
15418 IN ULONG Protect);
15419
15420 NTSYSAPI
15421 NTSTATUS
15422 NTAPI
15423 ZwOpenFile(
15424 OUT PHANDLE FileHandle,
15425 IN ACCESS_MASK DesiredAccess,
15426 IN POBJECT_ATTRIBUTES ObjectAttributes,
15427 OUT PIO_STATUS_BLOCK IoStatusBlock,
15428 IN ULONG ShareAccess,
15429 IN ULONG OpenOptions);
15430
15431 NTSYSAPI
15432 NTSTATUS
15433 NTAPI
15434 ZwOpenKey(
15435 OUT PHANDLE KeyHandle,
15436 IN ACCESS_MASK DesiredAccess,
15437 IN POBJECT_ATTRIBUTES ObjectAttributes);
15438
15439 NTSYSAPI
15440 NTSTATUS
15441 NTAPI
15442 ZwOpenSection(
15443 OUT PHANDLE SectionHandle,
15444 IN ACCESS_MASK DesiredAccess,
15445 IN POBJECT_ATTRIBUTES ObjectAttributes);
15446
15447 NTSYSAPI
15448 NTSTATUS
15449 NTAPI
15450 ZwOpenSymbolicLinkObject(
15451 OUT PHANDLE LinkHandle,
15452 IN ACCESS_MASK DesiredAccess,
15453 IN POBJECT_ATTRIBUTES ObjectAttributes);
15454
15455 NTSYSAPI
15456 NTSTATUS
15457 NTAPI
15458 ZwQueryInformationFile(
15459 IN HANDLE FileHandle,
15460 OUT PIO_STATUS_BLOCK IoStatusBlock,
15461 OUT PVOID FileInformation,
15462 IN ULONG Length,
15463 IN FILE_INFORMATION_CLASS FileInformationClass);
15464
15465 NTSYSAPI
15466 NTSTATUS
15467 NTAPI
15468 ZwQueryKey(
15469 IN HANDLE KeyHandle,
15470 IN KEY_INFORMATION_CLASS KeyInformationClass,
15471 OUT PVOID KeyInformation OPTIONAL,
15472 IN ULONG Length,
15473 OUT PULONG ResultLength);
15474
15475 NTSYSAPI
15476 NTSTATUS
15477 NTAPI
15478 ZwQuerySymbolicLinkObject(
15479 IN HANDLE LinkHandle,
15480 IN OUT PUNICODE_STRING LinkTarget,
15481 OUT PULONG ReturnedLength OPTIONAL);
15482
15483 NTSYSAPI
15484 NTSTATUS
15485 NTAPI
15486 ZwQueryValueKey(
15487 IN HANDLE KeyHandle,
15488 IN PUNICODE_STRING ValueName,
15489 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15490 OUT PVOID KeyValueInformation OPTIONAL,
15491 IN ULONG Length,
15492 OUT PULONG ResultLength);
15493
15494 NTSYSAPI
15495 NTSTATUS
15496 NTAPI
15497 ZwReadFile(
15498 IN HANDLE FileHandle,
15499 IN HANDLE Event OPTIONAL,
15500 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15501 IN PVOID ApcContext OPTIONAL,
15502 OUT PIO_STATUS_BLOCK IoStatusBlock,
15503 OUT PVOID Buffer,
15504 IN ULONG Length,
15505 IN PLARGE_INTEGER ByteOffset OPTIONAL,
15506 IN PULONG Key OPTIONAL);
15507
15508 NTSYSAPI
15509 NTSTATUS
15510 NTAPI
15511 ZwSetInformationFile(
15512 IN HANDLE FileHandle,
15513 OUT PIO_STATUS_BLOCK IoStatusBlock,
15514 IN PVOID FileInformation,
15515 IN ULONG Length,
15516 IN FILE_INFORMATION_CLASS FileInformationClass);
15517
15518 NTSYSAPI
15519 NTSTATUS
15520 NTAPI
15521 ZwSetValueKey(
15522 IN HANDLE KeyHandle,
15523 IN PUNICODE_STRING ValueName,
15524 IN ULONG TitleIndex OPTIONAL,
15525 IN ULONG Type,
15526 IN PVOID Data OPTIONAL,
15527 IN ULONG DataSize);
15528
15529 NTSYSAPI
15530 NTSTATUS
15531 NTAPI
15532 ZwUnloadDriver(
15533 IN PUNICODE_STRING DriverServiceName);
15534
15535 NTSYSAPI
15536 NTSTATUS
15537 NTAPI
15538 ZwUnmapViewOfSection(
15539 IN HANDLE ProcessHandle,
15540 IN PVOID BaseAddress OPTIONAL);
15541
15542 NTSYSAPI
15543 NTSTATUS
15544 NTAPI
15545 ZwWriteFile(
15546 IN HANDLE FileHandle,
15547 IN HANDLE Event OPTIONAL,
15548 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15549 IN PVOID ApcContext OPTIONAL,
15550 OUT PIO_STATUS_BLOCK IoStatusBlock,
15551 IN PVOID Buffer,
15552 IN ULONG Length,
15553 IN PLARGE_INTEGER ByteOffset OPTIONAL,
15554 IN PULONG Key OPTIONAL);
15555
15556 NTSYSAPI
15557 NTSTATUS
15558 NTAPI
15559 ZwQueryFullAttributesFile(
15560 IN POBJECT_ATTRIBUTES ObjectAttributes,
15561 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
15562
15563
15564 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15565
15566
15567 #if (NTDDI_VERSION >= NTDDI_WS03)
15568 NTSYSCALLAPI
15569 NTSTATUS
15570 NTAPI
15571 ZwOpenEvent(
15572 OUT PHANDLE EventHandle,
15573 IN ACCESS_MASK DesiredAccess,
15574 IN POBJECT_ATTRIBUTES ObjectAttributes);
15575 #endif
15576
15577 #if (NTDDI_VERSION >= NTDDI_VISTA)
15578
15579 NTSYSAPI
15580 NTSTATUS
15581 ZwCreateKeyTransacted(
15582 OUT PHANDLE KeyHandle,
15583 IN ACCESS_MASK DesiredAccess,
15584 IN POBJECT_ATTRIBUTES ObjectAttributes,
15585 IN ULONG TitleIndex,
15586 IN PUNICODE_STRING Class OPTIONAL,
15587 IN ULONG CreateOptions,
15588 IN HANDLE TransactionHandle,
15589 OUT PULONG Disposition OPTIONAL);
15590
15591 NTSYSAPI
15592 NTSTATUS
15593 NTAPI
15594 ZwOpenKeyTransacted(
15595 OUT PHANDLE KeyHandle,
15596 IN ACCESS_MASK DesiredAccess,
15597 IN POBJECT_ATTRIBUTES ObjectAttributes,
15598 IN HANDLE TransactionHandle);
15599
15600 NTSYSCALLAPI
15601 NTSTATUS
15602 NTAPI
15603 ZwCreateTransactionManager(
15604 OUT PHANDLE TmHandle,
15605 IN ACCESS_MASK DesiredAccess,
15606 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15607 IN PUNICODE_STRING LogFileName OPTIONAL,
15608 IN ULONG CreateOptions OPTIONAL,
15609 IN ULONG CommitStrength OPTIONAL);
15610
15611 NTSYSCALLAPI
15612 NTSTATUS
15613 NTAPI
15614 ZwOpenTransactionManager(
15615 OUT PHANDLE TmHandle,
15616 IN ACCESS_MASK DesiredAccess,
15617 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15618 IN PUNICODE_STRING LogFileName OPTIONAL,
15619 IN LPGUID TmIdentity OPTIONAL,
15620 IN ULONG OpenOptions OPTIONAL);
15621
15622 NTSYSCALLAPI
15623 NTSTATUS
15624 NTAPI
15625 ZwRollforwardTransactionManager(
15626 IN HANDLE TransactionManagerHandle,
15627 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15628
15629 NTSYSCALLAPI
15630 NTSTATUS
15631 NTAPI
15632 ZwRecoverTransactionManager(
15633 IN HANDLE TransactionManagerHandle);
15634
15635 NTSYSCALLAPI
15636 NTSTATUS
15637 NTAPI
15638 ZwQueryInformationTransactionManager(
15639 IN HANDLE TransactionManagerHandle,
15640 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15641 OUT PVOID TransactionManagerInformation,
15642 IN ULONG TransactionManagerInformationLength,
15643 OUT PULONG ReturnLength OPTIONAL);
15644
15645 NTSYSCALLAPI
15646 NTSTATUS
15647 NTAPI
15648 ZwSetInformationTransactionManager(
15649 IN HANDLE TmHandle,
15650 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15651 IN PVOID TransactionManagerInformation,
15652 IN ULONG TransactionManagerInformationLength);
15653
15654 NTSYSCALLAPI
15655 NTSTATUS
15656 NTAPI
15657 ZwEnumerateTransactionObject(
15658 IN HANDLE RootObjectHandle OPTIONAL,
15659 IN KTMOBJECT_TYPE QueryType,
15660 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15661 IN ULONG ObjectCursorLength,
15662 OUT PULONG ReturnLength);
15663
15664 NTSYSCALLAPI
15665 NTSTATUS
15666 NTAPI
15667 ZwCreateTransaction(
15668 OUT PHANDLE TransactionHandle,
15669 IN ACCESS_MASK DesiredAccess,
15670 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15671 IN LPGUID Uow OPTIONAL,
15672 IN HANDLE TmHandle OPTIONAL,
15673 IN ULONG CreateOptions OPTIONAL,
15674 IN ULONG IsolationLevel OPTIONAL,
15675 IN ULONG IsolationFlags OPTIONAL,
15676 IN PLARGE_INTEGER Timeout OPTIONAL,
15677 IN PUNICODE_STRING Description OPTIONAL);
15678
15679 NTSYSCALLAPI
15680 NTSTATUS
15681 NTAPI
15682 ZwOpenTransaction(
15683 OUT PHANDLE TransactionHandle,
15684 IN ACCESS_MASK DesiredAccess,
15685 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15686 IN LPGUID Uow,
15687 IN HANDLE TmHandle OPTIONAL);
15688
15689 NTSYSCALLAPI
15690 NTSTATUS
15691 NTAPI
15692 ZwQueryInformationTransaction(
15693 IN HANDLE TransactionHandle,
15694 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15695 OUT PVOID TransactionInformation,
15696 IN ULONG TransactionInformationLength,
15697 OUT PULONG ReturnLength OPTIONAL);
15698
15699 NTSYSCALLAPI
15700 NTSTATUS
15701 NTAPI
15702 ZwSetInformationTransaction(
15703 IN HANDLE TransactionHandle,
15704 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15705 IN PVOID TransactionInformation,
15706 IN ULONG TransactionInformationLength);
15707
15708 NTSYSCALLAPI
15709 NTSTATUS
15710 NTAPI
15711 ZwCommitTransaction(
15712 IN HANDLE TransactionHandle,
15713 IN BOOLEAN Wait);
15714
15715 NTSYSCALLAPI
15716 NTSTATUS
15717 NTAPI
15718 ZwRollbackTransaction(
15719 IN HANDLE TransactionHandle,
15720 IN BOOLEAN Wait);
15721
15722 NTSYSCALLAPI
15723 NTSTATUS
15724 NTAPI
15725 ZwCreateResourceManager(
15726 OUT PHANDLE ResourceManagerHandle,
15727 IN ACCESS_MASK DesiredAccess,
15728 IN HANDLE TmHandle,
15729 IN LPGUID ResourceManagerGuid OPTIONAL,
15730 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15731 IN ULONG CreateOptions OPTIONAL,
15732 IN PUNICODE_STRING Description OPTIONAL);
15733
15734 NTSYSCALLAPI
15735 NTSTATUS
15736 NTAPI
15737 ZwOpenResourceManager(
15738 OUT PHANDLE ResourceManagerHandle,
15739 IN ACCESS_MASK DesiredAccess,
15740 IN HANDLE TmHandle,
15741 IN LPGUID ResourceManagerGuid,
15742 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15743
15744 NTSYSCALLAPI
15745 NTSTATUS
15746 NTAPI
15747 ZwRecoverResourceManager(
15748 IN HANDLE ResourceManagerHandle);
15749
15750 NTSYSCALLAPI
15751 NTSTATUS
15752 NTAPI
15753 ZwGetNotificationResourceManager(
15754 IN HANDLE ResourceManagerHandle,
15755 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15756 IN ULONG NotificationLength,
15757 IN PLARGE_INTEGER Timeout,
15758 IN PULONG ReturnLength OPTIONAL,
15759 IN ULONG Asynchronous,
15760 IN ULONG_PTR AsynchronousContext OPTIONAL);
15761
15762 NTSYSCALLAPI
15763 NTSTATUS
15764 NTAPI
15765 ZwQueryInformationResourceManager(
15766 IN HANDLE ResourceManagerHandle,
15767 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15768 OUT PVOID ResourceManagerInformation,
15769 IN ULONG ResourceManagerInformationLength,
15770 IN PULONG ReturnLength OPTIONAL);
15771
15772 NTSYSCALLAPI
15773 NTSTATUS
15774 NTAPI
15775 ZwSetInformationResourceManager(
15776 IN HANDLE ResourceManagerHandle,
15777 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15778 IN PVOID ResourceManagerInformation,
15779 IN ULONG ResourceManagerInformationLength);
15780
15781 NTSYSCALLAPI
15782 NTSTATUS
15783 NTAPI
15784 ZwCreateEnlistment(
15785 OUT PHANDLE EnlistmentHandle,
15786 IN ACCESS_MASK DesiredAccess,
15787 IN HANDLE ResourceManagerHandle,
15788 IN HANDLE TransactionHandle,
15789 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15790 IN ULONG CreateOptions OPTIONAL,
15791 IN NOTIFICATION_MASK NotificationMask,
15792 IN PVOID EnlistmentKey OPTIONAL);
15793
15794 NTSYSCALLAPI
15795 NTSTATUS
15796 NTAPI
15797 ZwOpenEnlistment(
15798 OUT PHANDLE EnlistmentHandle,
15799 IN ACCESS_MASK DesiredAccess,
15800 IN HANDLE RmHandle,
15801 IN LPGUID EnlistmentGuid,
15802 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15803
15804 NTSYSCALLAPI
15805 NTSTATUS
15806 NTAPI
15807 ZwQueryInformationEnlistment(
15808 IN HANDLE EnlistmentHandle,
15809 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15810 OUT PVOID EnlistmentInformation,
15811 IN ULONG EnlistmentInformationLength,
15812 IN PULONG ReturnLength OPTIONAL);
15813
15814 NTSYSCALLAPI
15815 NTSTATUS
15816 NTAPI
15817 ZwSetInformationEnlistment(
15818 IN HANDLE EnlistmentHandle,
15819 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15820 IN PVOID EnlistmentInformation,
15821 IN ULONG EnlistmentInformationLength);
15822
15823 NTSYSCALLAPI
15824 NTSTATUS
15825 NTAPI
15826 ZwRecoverEnlistment(
15827 IN HANDLE EnlistmentHandle,
15828 IN PVOID EnlistmentKey OPTIONAL);
15829
15830 NTSYSCALLAPI
15831 NTSTATUS
15832 NTAPI
15833 ZwPrePrepareEnlistment(
15834 IN HANDLE EnlistmentHandle,
15835 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15836
15837 NTSYSCALLAPI
15838 NTSTATUS
15839 NTAPI
15840 ZwPrepareEnlistment(
15841 IN HANDLE EnlistmentHandle,
15842 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15843
15844 NTSYSCALLAPI
15845 NTSTATUS
15846 NTAPI
15847 ZwCommitEnlistment(
15848 IN HANDLE EnlistmentHandle,
15849 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15850
15851 NTSYSCALLAPI
15852 NTSTATUS
15853 NTAPI
15854 ZwRollbackEnlistment(
15855 IN HANDLE EnlistmentHandle,
15856 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15857
15858 NTSYSCALLAPI
15859 NTSTATUS
15860 NTAPI
15861 ZwPrePrepareComplete(
15862 IN HANDLE EnlistmentHandle,
15863 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15864
15865 NTSYSCALLAPI
15866 NTSTATUS
15867 NTAPI
15868 ZwPrepareComplete(
15869 IN HANDLE EnlistmentHandle,
15870 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15871
15872 NTSYSCALLAPI
15873 NTSTATUS
15874 NTAPI
15875 ZwCommitComplete(
15876 IN HANDLE EnlistmentHandle,
15877 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15878
15879 NTSYSCALLAPI
15880 NTSTATUS
15881 NTAPI
15882 ZwReadOnlyEnlistment(
15883 IN HANDLE EnlistmentHandle,
15884 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15885
15886 NTSYSCALLAPI
15887 NTSTATUS
15888 NTAPI
15889 ZwRollbackComplete(
15890 IN HANDLE EnlistmentHandle,
15891 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15892
15893 NTSYSCALLAPI
15894 NTSTATUS
15895 NTAPI
15896 ZwSinglePhaseReject(
15897 IN HANDLE EnlistmentHandle,
15898 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15899
15900
15901 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15902
15903
15904 #if (NTDDI_VERSION >= NTDDI_WIN7)
15905
15906
15907
15908 NTSYSAPI
15909 NTSTATUS
15910 NTAPI
15911 ZwOpenKeyEx(
15912 OUT PHANDLE KeyHandle,
15913 IN ACCESS_MASK DesiredAccess,
15914 IN POBJECT_ATTRIBUTES ObjectAttributes,
15915 IN ULONG OpenOptions);
15916
15917 NTSYSAPI
15918 NTSTATUS
15919 NTAPI
15920 ZwOpenKeyTransactedEx(
15921 OUT PHANDLE KeyHandle,
15922 IN ACCESS_MASK DesiredAccess,
15923 IN POBJECT_ATTRIBUTES ObjectAttributes,
15924 IN ULONG OpenOptions,
15925 IN HANDLE TransactionHandle);
15926
15927 NTSYSAPI
15928 NTSTATUS
15929 NTAPI
15930 ZwNotifyChangeMultipleKeys(
15931 IN HANDLE MasterKeyHandle,
15932 IN ULONG Count OPTIONAL,
15933 IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
15934 IN HANDLE Event OPTIONAL,
15935 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15936 IN PVOID ApcContext OPTIONAL,
15937 OUT PIO_STATUS_BLOCK IoStatusBlock,
15938 IN ULONG CompletionFilter,
15939 IN BOOLEAN WatchTree,
15940 OUT PVOID Buffer OPTIONAL,
15941 IN ULONG BufferSize,
15942 IN BOOLEAN Asynchronous);
15943
15944 NTSYSAPI
15945 NTSTATUS
15946 NTAPI
15947 ZwQueryMultipleValueKey(
15948 IN HANDLE KeyHandle,
15949 IN OUT PKEY_VALUE_ENTRY ValueEntries,
15950 IN ULONG EntryCount,
15951 OUT PVOID ValueBuffer,
15952 IN OUT PULONG BufferLength,
15953 OUT PULONG RequiredBufferLength OPTIONAL);
15954
15955 NTSYSAPI
15956 NTSTATUS
15957 NTAPI
15958 ZwRenameKey(
15959 IN HANDLE KeyHandle,
15960 IN PUNICODE_STRING NewName);
15961
15962 NTSYSAPI
15963 NTSTATUS
15964 NTAPI
15965 ZwSetInformationKey(
15966 IN HANDLE KeyHandle,
15967 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
15968 IN PVOID KeySetInformation,
15969 IN ULONG KeySetInformationLength);
15970
15971
15972 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15973
15974
15975 #ifdef __cplusplus
15976 }
15977 #endif
15978
15979 #endif /* !_WDMDDK_ */