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