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