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