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