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