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