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