285d21650081ca23deca8635d823ea5d188dd91d
[reactos.git] / reactos / 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
42 #ifndef GUID_DEFINED
43 #include <guiddef.h>
44 #endif
45
46 #ifndef _KTMTYPES_
47 typedef GUID UOW, *PUOW;
48 #endif
49
50 #if (NTDDI_VERSION >= NTDDI_WINXP)
51 #include <dpfilter.h>
52 #endif
53
54 #include "intrin.h"
55
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
59
60 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
61 #define NTHALAPI DECLSPEC_IMPORT
62 #else
63 #define NTHALAPI
64 #endif
65
66 /* For ReactOS */
67 #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
68 #define NTKERNELAPI DECLSPEC_IMPORT
69 #else
70 #define NTKERNELAPI
71 #endif
72
73 #if defined(_X86_) && !defined(_NTHAL_)
74 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT
75 #elif defined(_X86_)
76 #define _DECL_HAL_KE_IMPORT
77 #else
78 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
79 #endif
80
81 #if defined(_WIN64)
82 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
83 #else
84 #define POINTER_ALIGNMENT
85 #endif
86
87 /* Helper macro to enable gcc's extension. */
88 #ifndef __GNU_EXTENSION
89 #ifdef __GNUC__
90 #define __GNU_EXTENSION __extension__
91 #else
92 #define __GNU_EXTENSION
93 #endif
94 #endif
95
96 #if defined(_MSC_VER)
97
98 /* Disable some warnings */
99 #pragma warning(disable:4115) /* Named type definition in parentheses */
100 #pragma warning(disable:4201) /* Nameless unions and structs */
101 #pragma warning(disable:4214) /* Bit fields of other types than int */
102 #pragma warning(disable:4820) /* Padding added, due to alignemnet requirement */
103
104 /* Indicate if #pragma alloc_text() is supported */
105 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
106 #define ALLOC_PRAGMA 1
107 #endif
108
109 /* Indicate if #pragma data_seg() is supported */
110 #if defined(_M_IX86) || defined(_M_AMD64)
111 #define ALLOC_DATA_PRAGMA 1
112 #endif
113
114 #endif
115
116 /* Forward declarations */
117 struct _IRP;
118 struct _MDL;
119 struct _KAPC;
120 struct _KDPC;
121 struct _FILE_OBJECT;
122 struct _DMA_ADAPTER;
123 struct _DEVICE_OBJECT;
124 struct _DRIVER_OBJECT;
125 struct _IO_STATUS_BLOCK;
126 struct _DEVICE_DESCRIPTION;
127 struct _SCATTER_GATHER_LIST;
128 struct _DRIVE_LAYOUT_INFORMATION;
129 struct _COMPRESSED_DATA_INFO;
130 struct _IO_RESOURCE_DESCRIPTOR;
131
132 /* Structures not exposed to drivers */
133 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
134 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
135 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
136 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
137 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
138 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
139 typedef struct _EPROCESS *PEPROCESS;
140 typedef struct _ETHREAD *PETHREAD;
141 typedef struct _IO_TIMER *PIO_TIMER;
142 typedef struct _KINTERRUPT *PKINTERRUPT;
143 typedef struct _KPROCESS *PKPROCESS;
144 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
145 typedef struct _CONTEXT *PCONTEXT;
146
147
148 /******************************************************************************
149 * INTERLOCKED Functions *
150 ******************************************************************************/
151 //
152 // Intrinsics (note: taken from our winnt.h)
153 // FIXME: 64-bit
154 //
155 #if defined(__GNUC__)
156
157 static __inline__ BOOLEAN
158 InterlockedBitTestAndSet(
159 IN LONG volatile *Base,
160 IN LONG Bit)
161 {
162 #if defined(_M_IX86)
163 LONG OldBit;
164 __asm__ __volatile__("lock "
165 "btsl %2,%1\n\t"
166 "sbbl %0,%0\n\t"
167 :"=r" (OldBit),"+m" (*Base)
168 :"Ir" (Bit)
169 : "memory");
170 return OldBit;
171 #else
172 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
173 #endif
174 }
175
176 static __inline__ BOOLEAN
177 InterlockedBitTestAndReset(
178 IN LONG volatile *Base,
179 IN LONG Bit)
180 {
181 #if defined(_M_IX86)
182 LONG OldBit;
183 __asm__ __volatile__("lock "
184 "btrl %2,%1\n\t"
185 "sbbl %0,%0\n\t"
186 :"=r" (OldBit),"+m" (*Base)
187 :"Ir" (Bit)
188 : "memory");
189 return OldBit;
190 #else
191 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
192 #endif
193 }
194
195 #endif /* defined(__GNUC__) */
196
197 #define BitScanForward _BitScanForward
198 #define BitScanReverse _BitScanReverse
199 #define BitTest _bittest
200 #define BitTestAndComplement _bittestandcomplement
201 #define BitTestAndSet _bittestandset
202 #define BitTestAndReset _bittestandreset
203 #define InterlockedBitTestAndSet _interlockedbittestandset
204 #define InterlockedBitTestAndReset _interlockedbittestandreset
205
206 #ifdef _M_AMD64
207 #define BitTest64 _bittest64
208 #define BitTestAndComplement64 _bittestandcomplement64
209 #define BitTestAndSet64 _bittestandset64
210 #define BitTestAndReset64 _bittestandreset64
211 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
212 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
213 #endif
214
215 #if !defined(__INTERLOCKED_DECLARED)
216 #define __INTERLOCKED_DECLARED
217
218 #if defined (_X86_)
219 #if defined(NO_INTERLOCKED_INTRINSICS)
220 NTKERNELAPI
221 LONG
222 FASTCALL
223 InterlockedIncrement(
224 IN OUT LONG volatile *Addend);
225
226 NTKERNELAPI
227 LONG
228 FASTCALL
229 InterlockedDecrement(
230 IN OUT LONG volatile *Addend);
231
232 NTKERNELAPI
233 LONG
234 FASTCALL
235 InterlockedCompareExchange(
236 IN OUT LONG volatile *Destination,
237 IN LONG Exchange,
238 IN LONG Comparand);
239
240 NTKERNELAPI
241 LONG
242 FASTCALL
243 InterlockedExchange(
244 IN OUT LONG volatile *Destination,
245 IN LONG Value);
246
247 NTKERNELAPI
248 LONG
249 FASTCALL
250 InterlockedExchangeAdd(
251 IN OUT LONG volatile *Addend,
252 IN LONG Value);
253
254 #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
255
256 #define InterlockedExchange _InterlockedExchange
257 #define InterlockedIncrement _InterlockedIncrement
258 #define InterlockedDecrement _InterlockedDecrement
259 #define InterlockedExchangeAdd _InterlockedExchangeAdd
260 #define InterlockedCompareExchange _InterlockedCompareExchange
261 #define InterlockedOr _InterlockedOr
262 #define InterlockedAnd _InterlockedAnd
263 #define InterlockedXor _InterlockedXor
264
265 #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
266
267 #endif /* defined (_X86_) */
268
269 #if !defined (_WIN64)
270 /*
271 * PVOID
272 * InterlockedExchangePointer(
273 * IN OUT PVOID volatile *Target,
274 * IN PVOID Value)
275 */
276 #define InterlockedExchangePointer(Target, Value) \
277 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
278
279 /*
280 * PVOID
281 * InterlockedCompareExchangePointer(
282 * IN OUT PVOID *Destination,
283 * IN PVOID Exchange,
284 * IN PVOID Comparand)
285 */
286 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
287 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
288
289 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
290 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
291 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
292
293 #endif // !defined (_WIN64)
294
295 #if defined (_M_AMD64)
296
297 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
298 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
299 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
300 #define InterlockedAnd _InterlockedAnd
301 #define InterlockedOr _InterlockedOr
302 #define InterlockedXor _InterlockedXor
303 #define InterlockedIncrement _InterlockedIncrement
304 #define InterlockedDecrement _InterlockedDecrement
305 #define InterlockedAdd _InterlockedAdd
306 #define InterlockedExchange _InterlockedExchange
307 #define InterlockedExchangeAdd _InterlockedExchangeAdd
308 #define InterlockedCompareExchange _InterlockedCompareExchange
309 #define InterlockedAnd64 _InterlockedAnd64
310 #define InterlockedOr64 _InterlockedOr64
311 #define InterlockedXor64 _InterlockedXor64
312 #define InterlockedIncrement64 _InterlockedIncrement64
313 #define InterlockedDecrement64 _InterlockedDecrement64
314 #define InterlockedAdd64 _InterlockedAdd64
315 #define InterlockedExchange64 _InterlockedExchange64
316 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
317 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
318 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
319 #define InterlockedExchangePointer _InterlockedExchangePointer
320 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
321 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
322
323 #endif // _M_AMD64
324
325 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
326 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
327 FORCEINLINE
328 LONG64
329 InterlockedAdd64(
330 IN OUT LONG64 volatile *Addend,
331 IN LONG64 Value)
332 {
333 return InterlockedExchangeAdd64(Addend, Value) + Value;
334 }
335 //#endif
336 #endif
337
338 #endif /* !__INTERLOCKED_DECLARED */
339
340
341 /******************************************************************************
342 * Runtime Library Types *
343 ******************************************************************************/
344
345 #define RTL_REGISTRY_ABSOLUTE 0
346 #define RTL_REGISTRY_SERVICES 1
347 #define RTL_REGISTRY_CONTROL 2
348 #define RTL_REGISTRY_WINDOWS_NT 3
349 #define RTL_REGISTRY_DEVICEMAP 4
350 #define RTL_REGISTRY_USER 5
351 #define RTL_REGISTRY_MAXIMUM 6
352 #define RTL_REGISTRY_HANDLE 0x40000000
353 #define RTL_REGISTRY_OPTIONAL 0x80000000
354
355 /* RTL_QUERY_REGISTRY_TABLE.Flags */
356 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
357 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
358 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
359 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
360 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
361 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
362 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
363
364 #define HASH_STRING_ALGORITHM_DEFAULT 0
365 #define HASH_STRING_ALGORITHM_X65599 1
366 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
367
368 typedef struct _RTL_BITMAP {
369 ULONG SizeOfBitMap;
370 PULONG Buffer;
371 } RTL_BITMAP, *PRTL_BITMAP;
372
373 typedef struct _RTL_BITMAP_RUN {
374 ULONG StartingIndex;
375 ULONG NumberOfBits;
376 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
377
378 typedef NTSTATUS
379 (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
380 IN PWSTR ValueName,
381 IN ULONG ValueType,
382 IN PVOID ValueData,
383 IN ULONG ValueLength,
384 IN PVOID Context,
385 IN PVOID EntryContext);
386
387 typedef struct _RTL_QUERY_REGISTRY_TABLE {
388 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
389 ULONG Flags;
390 PCWSTR Name;
391 PVOID EntryContext;
392 ULONG DefaultType;
393 PVOID DefaultData;
394 ULONG DefaultLength;
395 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
396
397 typedef struct _TIME_FIELDS {
398 CSHORT Year;
399 CSHORT Month;
400 CSHORT Day;
401 CSHORT Hour;
402 CSHORT Minute;
403 CSHORT Second;
404 CSHORT Milliseconds;
405 CSHORT Weekday;
406 } TIME_FIELDS, *PTIME_FIELDS;
407
408 /* Slist Header */
409 #ifndef _SLIST_HEADER_
410 #define _SLIST_HEADER_
411
412 #if defined(_WIN64)
413
414 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
415 struct _SLIST_ENTRY *Next;
416 } SLIST_ENTRY, *PSLIST_ENTRY;
417
418 typedef struct _SLIST_ENTRY32 {
419 ULONG Next;
420 } SLIST_ENTRY32, *PSLIST_ENTRY32;
421
422 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
423 struct {
424 ULONGLONG Alignment;
425 ULONGLONG Region;
426 } DUMMYSTRUCTNAME;
427 struct {
428 ULONGLONG Depth:16;
429 ULONGLONG Sequence:9;
430 ULONGLONG NextEntry:39;
431 ULONGLONG HeaderType:1;
432 ULONGLONG Init:1;
433 ULONGLONG Reserved:59;
434 ULONGLONG Region:3;
435 } Header8;
436 struct {
437 ULONGLONG Depth:16;
438 ULONGLONG Sequence:48;
439 ULONGLONG HeaderType:1;
440 ULONGLONG Init:1;
441 ULONGLONG Reserved:2;
442 ULONGLONG NextEntry:60;
443 } Header16;
444 struct {
445 ULONGLONG Depth:16;
446 ULONGLONG Sequence:48;
447 ULONGLONG HeaderType:1;
448 ULONGLONG Reserved:3;
449 ULONGLONG NextEntry:60;
450 } HeaderX64;
451 } SLIST_HEADER, *PSLIST_HEADER;
452
453 typedef union _SLIST_HEADER32 {
454 ULONGLONG Alignment;
455 struct {
456 SLIST_ENTRY32 Next;
457 USHORT Depth;
458 USHORT Sequence;
459 } DUMMYSTRUCTNAME;
460 } SLIST_HEADER32, *PSLIST_HEADER32;
461
462 #else
463
464 #define SLIST_ENTRY SINGLE_LIST_ENTRY
465 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
466 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
467
468 typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
469
470 typedef union _SLIST_HEADER {
471 ULONGLONG Alignment;
472 struct {
473 SLIST_ENTRY Next;
474 USHORT Depth;
475 USHORT Sequence;
476 } DUMMYSTRUCTNAME;
477 } SLIST_HEADER, *PSLIST_HEADER;
478
479 typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
480
481 #endif /* defined(_WIN64) */
482
483 #endif /* _SLIST_HEADER_ */
484
485
486 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
487 #if defined(_NTSYSTEM_) || defined(__GNUC__)
488 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
489 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
490 #else
491 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
492 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
493 #endif /* _NT_SYSTEM */
494 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
495 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
496
497
498 /******************************************************************************
499 * Kernel Types *
500 ******************************************************************************/
501
502 typedef UCHAR KIRQL, *PKIRQL;
503 typedef CCHAR KPROCESSOR_MODE;
504 typedef LONG KPRIORITY;
505
506 typedef ULONG EXECUTION_STATE;
507
508 typedef enum _MODE {
509 KernelMode,
510 UserMode,
511 MaximumMode
512 } MODE;
513
514 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
515 #define SINGLE_GROUP_LEGACY_API 1
516 #endif
517
518 #define SEMAPHORE_QUERY_STATE (0x0001)
519 #define SEMAPHORE_MODIFY_STATE (0x0002)
520 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
521
522 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
523 RelationProcessorCore,
524 RelationNumaNode,
525 RelationCache,
526 RelationProcessorPackage,
527 RelationGroup,
528 RelationAll = 0xffff
529 } LOGICAL_PROCESSOR_RELATIONSHIP;
530
531 typedef enum _PROCESSOR_CACHE_TYPE {
532 CacheUnified,
533 CacheInstruction,
534 CacheData,
535 CacheTrace
536 } PROCESSOR_CACHE_TYPE;
537
538 typedef struct _CACHE_DESCRIPTOR {
539 UCHAR Level;
540 UCHAR Associativity;
541 USHORT LineSize;
542 ULONG Size;
543 PROCESSOR_CACHE_TYPE Type;
544 } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
545
546 /* Processor features */
547 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
548 #define PF_FLOATING_POINT_EMULATED 1
549 #define PF_COMPARE_EXCHANGE_DOUBLE 2
550 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
551 #define PF_PPC_MOVEMEM_64BIT_OK 4
552 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
553 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
554 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
555 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
556 #define PF_PAE_ENABLED 9
557 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
558 #define PF_SSE_DAZ_MODE_AVAILABLE 11
559 #define PF_NX_ENABLED 12
560 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
561 #define PF_COMPARE_EXCHANGE128 14
562 #define PF_COMPARE64_EXCHANGE128 15
563 #define PF_CHANNELS_ENABLED 16
564 #define PF_XSAVE_ENABLED 17
565
566 #define MAXIMUM_SUPPORTED_EXTENSION 512
567 #define MAXIMUM_WAIT_OBJECTS 64
568
569 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
570
571 #define ASSERT_DPC(Object) \
572 ASSERT(((Object)->Type == 0) || \
573 ((Object)->Type == DpcObject) || \
574 ((Object)->Type == ThreadedDpcObject))
575
576 #define ASSERT_GATE(object) \
577 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
578 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
579
580 #define ASSERT_DEVICE_QUEUE(Object) \
581 NT_ASSERT((Object)->Type == DeviceQueueObject)
582
583 #define ASSERT_TIMER(E) \
584 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
585 ((E)->Header.Type == TimerSynchronizationObject))
586
587 #define ASSERT_MUTANT(E) \
588 NT_ASSERT((E)->Header.Type == MutantObject)
589
590 #define ASSERT_SEMAPHORE(E) \
591 NT_ASSERT((E)->Header.Type == SemaphoreObject)
592
593 #define ASSERT_EVENT(E) \
594 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
595 ((E)->Header.Type == SynchronizationEvent))
596
597 #define DPC_NORMAL 0
598 #define DPC_THREADED 1
599
600 #define GM_LOCK_BIT 0x1
601 #define GM_LOCK_BIT_V 0x0
602 #define GM_LOCK_WAITER_WOKEN 0x2
603 #define GM_LOCK_WAITER_INC 0x4
604
605 #define LOCK_QUEUE_WAIT_BIT 0
606 #define LOCK_QUEUE_OWNER_BIT 1
607
608 #define LOCK_QUEUE_WAIT 1
609 #define LOCK_QUEUE_OWNER 2
610 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
611 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
612
613 #define PROCESSOR_FEATURE_MAX 64
614
615 #define DBG_STATUS_CONTROL_C 1
616 #define DBG_STATUS_SYSRQ 2
617 #define DBG_STATUS_BUGCHECK_FIRST 3
618 #define DBG_STATUS_BUGCHECK_SECOND 4
619 #define DBG_STATUS_FATAL 5
620 #define DBG_STATUS_DEBUG_CONTROL 6
621 #define DBG_STATUS_WORKER 7
622
623 #if defined(_WIN64)
624 #define MAXIMUM_PROC_PER_GROUP 64
625 #else
626 #define MAXIMUM_PROC_PER_GROUP 32
627 #endif
628 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
629
630 /* Exception Records */
631 #define EXCEPTION_NONCONTINUABLE 1
632 #define EXCEPTION_MAXIMUM_PARAMETERS 15
633
634 typedef struct _EXCEPTION_RECORD {
635 NTSTATUS ExceptionCode;
636 ULONG ExceptionFlags;
637 struct _EXCEPTION_RECORD *ExceptionRecord;
638 PVOID ExceptionAddress;
639 ULONG NumberParameters;
640 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
641 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
642
643 typedef struct _EXCEPTION_RECORD32 {
644 NTSTATUS ExceptionCode;
645 ULONG ExceptionFlags;
646 ULONG ExceptionRecord;
647 ULONG ExceptionAddress;
648 ULONG NumberParameters;
649 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
650 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
651
652 typedef struct _EXCEPTION_RECORD64 {
653 NTSTATUS ExceptionCode;
654 ULONG ExceptionFlags;
655 ULONG64 ExceptionRecord;
656 ULONG64 ExceptionAddress;
657 ULONG NumberParameters;
658 ULONG __unusedAlignment;
659 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
660 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
661
662 typedef struct _EXCEPTION_POINTERS {
663 PEXCEPTION_RECORD ExceptionRecord;
664 PCONTEXT ContextRecord;
665 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
666
667 typedef enum _KBUGCHECK_CALLBACK_REASON {
668 KbCallbackInvalid,
669 KbCallbackReserved1,
670 KbCallbackSecondaryDumpData,
671 KbCallbackDumpIo,
672 KbCallbackAddPages
673 } KBUGCHECK_CALLBACK_REASON;
674
675 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
676
677 typedef VOID
678 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)(
679 IN KBUGCHECK_CALLBACK_REASON Reason,
680 IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
681 IN OUT PVOID ReasonSpecificData,
682 IN ULONG ReasonSpecificDataLength);
683 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE;
684
685 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
686 LIST_ENTRY Entry;
687 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
688 PUCHAR Component;
689 ULONG_PTR Checksum;
690 KBUGCHECK_CALLBACK_REASON Reason;
691 UCHAR State;
692 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
693
694 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
695 BufferEmpty,
696 BufferInserted,
697 BufferStarted,
698 BufferFinished,
699 BufferIncomplete
700 } KBUGCHECK_BUFFER_DUMP_STATE;
701
702 typedef VOID
703 (NTAPI KBUGCHECK_CALLBACK_ROUTINE)(
704 IN PVOID Buffer,
705 IN ULONG Length);
706 typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE;
707
708 typedef struct _KBUGCHECK_CALLBACK_RECORD {
709 LIST_ENTRY Entry;
710 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
711 PVOID Buffer;
712 ULONG Length;
713 PUCHAR Component;
714 ULONG_PTR Checksum;
715 UCHAR State;
716 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
717
718 typedef BOOLEAN
719 (NTAPI NMI_CALLBACK)(
720 IN PVOID Context,
721 IN BOOLEAN Handled);
722 typedef NMI_CALLBACK *PNMI_CALLBACK;
723
724 typedef enum _TRACE_INFORMATION_CLASS {
725 TraceIdClass,
726 TraceHandleClass,
727 TraceEnableFlagsClass,
728 TraceEnableLevelClass,
729 GlobalLoggerHandleClass,
730 EventLoggerHandleClass,
731 AllLoggerHandlesClass,
732 TraceHandleByNameClass,
733 LoggerEventsLostClass,
734 TraceSessionSettingsClass,
735 LoggerEventsLoggedClass,
736 MaxTraceInformationClass
737 } TRACE_INFORMATION_CLASS;
738
739 typedef enum _KINTERRUPT_POLARITY {
740 InterruptPolarityUnknown,
741 InterruptActiveHigh,
742 InterruptActiveLow
743 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
744
745 typedef enum _KPROFILE_SOURCE {
746 ProfileTime,
747 ProfileAlignmentFixup,
748 ProfileTotalIssues,
749 ProfilePipelineDry,
750 ProfileLoadInstructions,
751 ProfilePipelineFrozen,
752 ProfileBranchInstructions,
753 ProfileTotalNonissues,
754 ProfileDcacheMisses,
755 ProfileIcacheMisses,
756 ProfileCacheMisses,
757 ProfileBranchMispredictions,
758 ProfileStoreInstructions,
759 ProfileFpInstructions,
760 ProfileIntegerInstructions,
761 Profile2Issue,
762 Profile3Issue,
763 Profile4Issue,
764 ProfileSpecialInstructions,
765 ProfileTotalCycles,
766 ProfileIcacheIssues,
767 ProfileDcacheAccesses,
768 ProfileMemoryBarrierCycles,
769 ProfileLoadLinkedIssues,
770 ProfileMaximum
771 } KPROFILE_SOURCE;
772
773 typedef enum _KWAIT_REASON {
774 Executive,
775 FreePage,
776 PageIn,
777 PoolAllocation,
778 DelayExecution,
779 Suspended,
780 UserRequest,
781 WrExecutive,
782 WrFreePage,
783 WrPageIn,
784 WrPoolAllocation,
785 WrDelayExecution,
786 WrSuspended,
787 WrUserRequest,
788 WrEventPair,
789 WrQueue,
790 WrLpcReceive,
791 WrLpcReply,
792 WrVirtualMemory,
793 WrPageOut,
794 WrRendezvous,
795 WrKeyedEvent,
796 WrTerminated,
797 WrProcessInSwap,
798 WrCpuRateControl,
799 WrCalloutStack,
800 WrKernel,
801 WrResource,
802 WrPushLock,
803 WrMutex,
804 WrQuantumEnd,
805 WrDispatchInt,
806 WrPreempted,
807 WrYieldExecution,
808 WrFastMutex,
809 WrGuardedMutex,
810 WrRundown,
811 MaximumWaitReason
812 } KWAIT_REASON;
813
814 typedef struct _KWAIT_BLOCK {
815 LIST_ENTRY WaitListEntry;
816 struct _KTHREAD *Thread;
817 PVOID Object;
818 struct _KWAIT_BLOCK *NextWaitBlock;
819 USHORT WaitKey;
820 UCHAR WaitType;
821 volatile UCHAR BlockState;
822 #if defined(_WIN64)
823 LONG SpareLong;
824 #endif
825 } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
826
827 typedef enum _KINTERRUPT_MODE {
828 LevelSensitive,
829 Latched
830 } KINTERRUPT_MODE;
831
832 #define THREAD_WAIT_OBJECTS 3
833
834 typedef VOID
835 (NTAPI *PKINTERRUPT_ROUTINE)(
836 VOID);
837
838 typedef enum _KD_OPTION {
839 KD_OPTION_SET_BLOCK_ENABLE,
840 } KD_OPTION;
841
842 typedef enum _INTERFACE_TYPE {
843 InterfaceTypeUndefined = -1,
844 Internal,
845 Isa,
846 Eisa,
847 MicroChannel,
848 TurboChannel,
849 PCIBus,
850 VMEBus,
851 NuBus,
852 PCMCIABus,
853 CBus,
854 MPIBus,
855 MPSABus,
856 ProcessorInternal,
857 InternalPowerBus,
858 PNPISABus,
859 PNPBus,
860 Vmcs,
861 MaximumInterfaceType
862 } INTERFACE_TYPE, *PINTERFACE_TYPE;
863
864 typedef VOID
865 (NTAPI *PKNORMAL_ROUTINE)(
866 IN PVOID NormalContext OPTIONAL,
867 IN PVOID SystemArgument1 OPTIONAL,
868 IN PVOID SystemArgument2 OPTIONAL);
869
870 typedef VOID
871 (NTAPI *PKRUNDOWN_ROUTINE)(
872 IN struct _KAPC *Apc);
873
874 typedef VOID
875 (NTAPI *PKKERNEL_ROUTINE)(
876 IN struct _KAPC *Apc,
877 IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
878 IN OUT PVOID *NormalContext OPTIONAL,
879 IN OUT PVOID *SystemArgument1 OPTIONAL,
880 IN OUT PVOID *SystemArgument2 OPTIONAL);
881
882 typedef struct _KAPC {
883 UCHAR Type;
884 UCHAR SpareByte0;
885 UCHAR Size;
886 UCHAR SpareByte1;
887 ULONG SpareLong0;
888 struct _KTHREAD *Thread;
889 LIST_ENTRY ApcListEntry;
890 PKKERNEL_ROUTINE KernelRoutine;
891 PKRUNDOWN_ROUTINE RundownRoutine;
892 PKNORMAL_ROUTINE NormalRoutine;
893 PVOID NormalContext;
894 PVOID SystemArgument1;
895 PVOID SystemArgument2;
896 CCHAR ApcStateIndex;
897 KPROCESSOR_MODE ApcMode;
898 BOOLEAN Inserted;
899 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
900
901 typedef struct _KDEVICE_QUEUE_ENTRY {
902 LIST_ENTRY DeviceListEntry;
903 ULONG SortKey;
904 BOOLEAN Inserted;
905 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
906 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
907
908 typedef PVOID PKIPI_CONTEXT;
909
910 typedef VOID
911 (NTAPI *PKIPI_WORKER)(
912 IN OUT PKIPI_CONTEXT PacketContext,
913 IN PVOID Parameter1 OPTIONAL,
914 IN PVOID Parameter2 OPTIONAL,
915 IN PVOID Parameter3 OPTIONAL);
916
917 typedef
918 ULONG_PTR
919 (NTAPI *PKIPI_BROADCAST_WORKER)(
920 IN ULONG_PTR Argument);
921
922 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
923
924 typedef struct _KSPIN_LOCK_QUEUE {
925 struct _KSPIN_LOCK_QUEUE *volatile Next;
926 PKSPIN_LOCK volatile Lock;
927 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
928
929 typedef struct _KLOCK_QUEUE_HANDLE {
930 KSPIN_LOCK_QUEUE LockQueue;
931 KIRQL OldIrql;
932 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
933
934 #if defined(_AMD64_)
935
936 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
937
938 #define LockQueueDispatcherLock 0
939 #define LockQueueExpansionLock 1
940 #define LockQueuePfnLock 2
941 #define LockQueueSystemSpaceLock 3
942 #define LockQueueVacbLock 4
943 #define LockQueueMasterLock 5
944 #define LockQueueNonPagedPoolLock 6
945 #define LockQueueIoCancelLock 7
946 #define LockQueueWorkQueueLock 8
947 #define LockQueueIoVpbLock 9
948 #define LockQueueIoDatabaseLock 10
949 #define LockQueueIoCompletionLock 11
950 #define LockQueueNtfsStructLock 12
951 #define LockQueueAfdWorkQueueLock 13
952 #define LockQueueBcbLock 14
953 #define LockQueueMmNonPagedPoolLock 15
954 #define LockQueueUnusedSpare16 16
955 #define LockQueueTimerTableLock 17
956 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
957
958 #else
959
960 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
961 LockQueueDispatcherLock,
962 LockQueueExpansionLock,
963 LockQueuePfnLock,
964 LockQueueSystemSpaceLock,
965 LockQueueVacbLock,
966 LockQueueMasterLock,
967 LockQueueNonPagedPoolLock,
968 LockQueueIoCancelLock,
969 LockQueueWorkQueueLock,
970 LockQueueIoVpbLock,
971 LockQueueIoDatabaseLock,
972 LockQueueIoCompletionLock,
973 LockQueueNtfsStructLock,
974 LockQueueAfdWorkQueueLock,
975 LockQueueBcbLock,
976 LockQueueMmNonPagedPoolLock,
977 LockQueueUnusedSpare16,
978 LockQueueTimerTableLock,
979 LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
980 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
981
982 #endif /* defined(_AMD64_) */
983
984 typedef VOID
985 (NTAPI *PKDEFERRED_ROUTINE)(
986 IN struct _KDPC *Dpc,
987 IN PVOID DeferredContext OPTIONAL,
988 IN PVOID SystemArgument1 OPTIONAL,
989 IN PVOID SystemArgument2 OPTIONAL);
990
991 typedef enum _KDPC_IMPORTANCE {
992 LowImportance,
993 MediumImportance,
994 HighImportance,
995 MediumHighImportance
996 } KDPC_IMPORTANCE;
997
998 typedef struct _KDPC {
999 UCHAR Type;
1000 UCHAR Importance;
1001 volatile USHORT Number;
1002 LIST_ENTRY DpcListEntry;
1003 PKDEFERRED_ROUTINE DeferredRoutine;
1004 PVOID DeferredContext;
1005 PVOID SystemArgument1;
1006 PVOID SystemArgument2;
1007 volatile PVOID DpcData;
1008 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
1009
1010 typedef struct _KDPC_WATCHDOG_INFORMATION {
1011 ULONG DpcTimeLimit;
1012 ULONG DpcTimeCount;
1013 ULONG DpcWatchdogLimit;
1014 ULONG DpcWatchdogCount;
1015 ULONG Reserved;
1016 } KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
1017
1018 typedef struct _KDEVICE_QUEUE {
1019 CSHORT Type;
1020 CSHORT Size;
1021 LIST_ENTRY DeviceListHead;
1022 KSPIN_LOCK Lock;
1023 #if defined(_AMD64_)
1024 union {
1025 BOOLEAN Busy;
1026 struct {
1027 LONG64 Reserved : 8;
1028 LONG64 Hint : 56;
1029 };
1030 };
1031 #else
1032 BOOLEAN Busy;
1033 #endif
1034 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
1035
1036 #define TIMER_EXPIRED_INDEX_BITS 6
1037 #define TIMER_PROCESSOR_INDEX_BITS 5
1038
1039 typedef struct _DISPATCHER_HEADER {
1040 _ANONYMOUS_UNION union {
1041 _ANONYMOUS_STRUCT struct {
1042 UCHAR Type;
1043 _ANONYMOUS_UNION union {
1044 _ANONYMOUS_UNION union {
1045 UCHAR TimerControlFlags;
1046 _ANONYMOUS_STRUCT struct {
1047 UCHAR Absolute:1;
1048 UCHAR Coalescable:1;
1049 UCHAR KeepShifting:1;
1050 UCHAR EncodedTolerableDelay:5;
1051 } DUMMYSTRUCTNAME;
1052 } DUMMYUNIONNAME;
1053 UCHAR Abandoned;
1054 #if (NTDDI_VERSION < NTDDI_WIN7)
1055 UCHAR NpxIrql;
1056 #endif
1057 BOOLEAN Signalling;
1058 } DUMMYUNIONNAME;
1059 _ANONYMOUS_UNION union {
1060 _ANONYMOUS_UNION union {
1061 UCHAR ThreadControlFlags;
1062 _ANONYMOUS_STRUCT struct {
1063 UCHAR CpuThrottled:1;
1064 UCHAR CycleProfiling:1;
1065 UCHAR CounterProfiling:1;
1066 UCHAR Reserved:5;
1067 } DUMMYSTRUCTNAME;
1068 } DUMMYUNIONNAME;
1069 UCHAR Size;
1070 UCHAR Hand;
1071 } DUMMYUNIONNAME2;
1072 _ANONYMOUS_UNION union {
1073 #if (NTDDI_VERSION >= NTDDI_WIN7)
1074 _ANONYMOUS_UNION union {
1075 UCHAR TimerMiscFlags;
1076 _ANONYMOUS_STRUCT struct {
1077 #if !defined(_X86_)
1078 UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
1079 #else
1080 UCHAR Index:1;
1081 UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
1082 #endif
1083 UCHAR Inserted:1;
1084 volatile UCHAR Expired:1;
1085 } DUMMYSTRUCTNAME;
1086 } DUMMYUNIONNAME;
1087 #else
1088 /* Pre Win7 compatibility fix to latest WDK */
1089 UCHAR Inserted;
1090 #endif
1091 _ANONYMOUS_UNION union {
1092 BOOLEAN DebugActive;
1093 _ANONYMOUS_STRUCT struct {
1094 BOOLEAN ActiveDR7:1;
1095 BOOLEAN Instrumented:1;
1096 BOOLEAN Reserved2:4;
1097 BOOLEAN UmsScheduled:1;
1098 BOOLEAN UmsPrimary:1;
1099 } DUMMYSTRUCTNAME;
1100 } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
1101 BOOLEAN DpcActive;
1102 } DUMMYUNIONNAME3;
1103 } DUMMYSTRUCTNAME;
1104 volatile LONG Lock;
1105 } DUMMYUNIONNAME;
1106 LONG SignalState;
1107 LIST_ENTRY WaitListHead;
1108 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
1109
1110 typedef struct _KEVENT {
1111 DISPATCHER_HEADER Header;
1112 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1113
1114 typedef struct _KSEMAPHORE {
1115 DISPATCHER_HEADER Header;
1116 LONG Limit;
1117 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1118
1119 typedef struct _KGATE {
1120 DISPATCHER_HEADER Header;
1121 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
1122
1123 typedef struct _KGUARDED_MUTEX {
1124 volatile LONG Count;
1125 PKTHREAD Owner;
1126 ULONG Contention;
1127 KGATE Gate;
1128 __GNU_EXTENSION union {
1129 __GNU_EXTENSION struct {
1130 SHORT KernelApcDisable;
1131 SHORT SpecialApcDisable;
1132 };
1133 ULONG CombinedApcDisable;
1134 };
1135 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
1136
1137 typedef struct _KMUTANT {
1138 DISPATCHER_HEADER Header;
1139 LIST_ENTRY MutantListEntry;
1140 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
1141 BOOLEAN Abandoned;
1142 UCHAR ApcDisable;
1143 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
1144
1145 #define TIMER_TABLE_SIZE 512
1146 #define TIMER_TABLE_SHIFT 9
1147
1148 typedef struct _KTIMER {
1149 DISPATCHER_HEADER Header;
1150 ULARGE_INTEGER DueTime;
1151 LIST_ENTRY TimerListEntry;
1152 struct _KDPC *Dpc;
1153 #if !defined(_X86_)
1154 ULONG Processor;
1155 #endif
1156 ULONG Period;
1157 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
1158
1159 typedef BOOLEAN
1160 (NTAPI *PKSYNCHRONIZE_ROUTINE)(
1161 IN PVOID SynchronizeContext);
1162
1163 typedef enum _POOL_TYPE {
1164 NonPagedPool,
1165 PagedPool,
1166 NonPagedPoolMustSucceed,
1167 DontUseThisType,
1168 NonPagedPoolCacheAligned,
1169 PagedPoolCacheAligned,
1170 NonPagedPoolCacheAlignedMustS,
1171 MaxPoolType,
1172 NonPagedPoolSession = 32,
1173 PagedPoolSession,
1174 NonPagedPoolMustSucceedSession,
1175 DontUseThisTypeSession,
1176 NonPagedPoolCacheAlignedSession,
1177 PagedPoolCacheAlignedSession,
1178 NonPagedPoolCacheAlignedMustSSession
1179 } POOL_TYPE;
1180
1181 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
1182 StandardDesign,
1183 NEC98x86,
1184 EndAlternatives
1185 } ALTERNATIVE_ARCHITECTURE_TYPE;
1186
1187 typedef struct _KSYSTEM_TIME
1188 {
1189 ULONG LowPart;
1190 LONG High1Time;
1191 LONG High2Time;
1192 } KSYSTEM_TIME, *PKSYSTEM_TIME;
1193
1194 typedef struct _PNP_BUS_INFORMATION {
1195 GUID BusTypeGuid;
1196 INTERFACE_TYPE LegacyBusType;
1197 ULONG BusNumber;
1198 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
1199
1200 typedef struct DECLSPEC_ALIGN(16) _M128A {
1201 ULONGLONG Low;
1202 LONGLONG High;
1203 } M128A, *PM128A;
1204
1205 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
1206 USHORT ControlWord;
1207 USHORT StatusWord;
1208 UCHAR TagWord;
1209 UCHAR Reserved1;
1210 USHORT ErrorOpcode;
1211 ULONG ErrorOffset;
1212 USHORT ErrorSelector;
1213 USHORT Reserved2;
1214 ULONG DataOffset;
1215 USHORT DataSelector;
1216 USHORT Reserved3;
1217 ULONG MxCsr;
1218 ULONG MxCsr_Mask;
1219 M128A FloatRegisters[8];
1220 #if defined(_WIN64)
1221 M128A XmmRegisters[16];
1222 UCHAR Reserved4[96];
1223 #else
1224 M128A XmmRegisters[8];
1225 UCHAR Reserved4[192];
1226 ULONG StackControl[7];
1227 ULONG Cr0NpxState;
1228 #endif
1229 } XSAVE_FORMAT, *PXSAVE_FORMAT;
1230
1231
1232
1233 /******************************************************************************
1234 * Memory manager Types *
1235 ******************************************************************************/
1236
1237 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1238 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1239 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1240 #define MM_ALLOCATE_NO_WAIT 0x00000008
1241 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1242 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
1243
1244 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1245 #define MDL_PAGES_LOCKED 0x0002
1246 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1247 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1248 #define MDL_PARTIAL 0x0010
1249 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1250 #define MDL_IO_PAGE_READ 0x0040
1251 #define MDL_WRITE_OPERATION 0x0080
1252 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1253 #define MDL_FREE_EXTRA_PTES 0x0200
1254 #define MDL_DESCRIBES_AWE 0x0400
1255 #define MDL_IO_SPACE 0x0800
1256 #define MDL_NETWORK_HEADER 0x1000
1257 #define MDL_MAPPING_CAN_FAIL 0x2000
1258 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1259 #define MDL_INTERNAL 0x8000
1260
1261 #define MDL_MAPPING_FLAGS ( \
1262 MDL_MAPPED_TO_SYSTEM_VA | \
1263 MDL_PAGES_LOCKED | \
1264 MDL_SOURCE_IS_NONPAGED_POOL | \
1265 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1266 MDL_PARENT_MAPPED_SYSTEM_VA | \
1267 MDL_SYSTEM_VA | \
1268 MDL_IO_SPACE)
1269
1270 #define FLUSH_MULTIPLE_MAXIMUM 32
1271
1272 /* Section access rights */
1273 #define SECTION_QUERY 0x0001
1274 #define SECTION_MAP_WRITE 0x0002
1275 #define SECTION_MAP_READ 0x0004
1276 #define SECTION_MAP_EXECUTE 0x0008
1277 #define SECTION_EXTEND_SIZE 0x0010
1278 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1279
1280 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
1281 SECTION_MAP_WRITE | \
1282 SECTION_MAP_READ | \
1283 SECTION_MAP_EXECUTE | \
1284 SECTION_EXTEND_SIZE)
1285
1286 #define SESSION_QUERY_ACCESS 0x0001
1287 #define SESSION_MODIFY_ACCESS 0x0002
1288
1289 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
1290 SESSION_QUERY_ACCESS | \
1291 SESSION_MODIFY_ACCESS)
1292
1293 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1294
1295 #define PAGE_NOACCESS 0x01
1296 #define PAGE_READONLY 0x02
1297 #define PAGE_READWRITE 0x04
1298 #define PAGE_WRITECOPY 0x08
1299 #define PAGE_EXECUTE 0x10
1300 #define PAGE_EXECUTE_READ 0x20
1301 #define PAGE_EXECUTE_READWRITE 0x40
1302 #define PAGE_EXECUTE_WRITECOPY 0x80
1303 #define PAGE_GUARD 0x100
1304 #define PAGE_NOCACHE 0x200
1305 #define PAGE_WRITECOMBINE 0x400
1306
1307 #define MEM_COMMIT 0x1000
1308 #define MEM_RESERVE 0x2000
1309 #define MEM_DECOMMIT 0x4000
1310 #define MEM_RELEASE 0x8000
1311 #define MEM_FREE 0x10000
1312 #define MEM_PRIVATE 0x20000
1313 #define MEM_MAPPED 0x40000
1314 #define MEM_RESET 0x80000
1315 #define MEM_TOP_DOWN 0x100000
1316 #define MEM_LARGE_PAGES 0x20000000
1317 #define MEM_4MB_PAGES 0x80000000
1318
1319 #define SEC_RESERVE 0x4000000
1320 #define SEC_COMMIT 0x8000000
1321 #define SEC_LARGE_PAGES 0x80000000
1322
1323 /* Section map options */
1324 typedef enum _SECTION_INHERIT {
1325 ViewShare = 1,
1326 ViewUnmap = 2
1327 } SECTION_INHERIT;
1328
1329 typedef ULONG PFN_COUNT;
1330 typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
1331 typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
1332
1333 typedef struct _MDL {
1334 struct _MDL *Next;
1335 CSHORT Size;
1336 CSHORT MdlFlags;
1337 struct _EPROCESS *Process;
1338 PVOID MappedSystemVa;
1339 PVOID StartVa;
1340 ULONG ByteCount;
1341 ULONG ByteOffset;
1342 } MDL, *PMDL;
1343 typedef MDL *PMDLX;
1344
1345 typedef enum _MEMORY_CACHING_TYPE_ORIG {
1346 MmFrameBufferCached = 2
1347 } MEMORY_CACHING_TYPE_ORIG;
1348
1349 typedef enum _MEMORY_CACHING_TYPE {
1350 MmNonCached = FALSE,
1351 MmCached = TRUE,
1352 MmWriteCombined = MmFrameBufferCached,
1353 MmHardwareCoherentCached,
1354 MmNonCachedUnordered,
1355 MmUSWCCached,
1356 MmMaximumCacheType
1357 } MEMORY_CACHING_TYPE;
1358
1359 typedef enum _MM_PAGE_PRIORITY {
1360 LowPagePriority,
1361 NormalPagePriority = 16,
1362 HighPagePriority = 32
1363 } MM_PAGE_PRIORITY;
1364
1365 typedef enum _LOCK_OPERATION {
1366 IoReadAccess,
1367 IoWriteAccess,
1368 IoModifyAccess
1369 } LOCK_OPERATION;
1370
1371 typedef enum _MM_SYSTEM_SIZE {
1372 MmSmallSystem,
1373 MmMediumSystem,
1374 MmLargeSystem
1375 } MM_SYSTEMSIZE;
1376
1377 extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress;
1378 extern PVOID MmBadPointer;
1379
1380
1381 /******************************************************************************
1382 * Executive Types *
1383 ******************************************************************************/
1384
1385 #define EX_RUNDOWN_ACTIVE 0x1
1386 #define EX_RUNDOWN_COUNT_SHIFT 0x1
1387 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
1388
1389 #ifdef _WIN64
1390 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
1391 #else
1392 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
1393 #endif
1394
1395 typedef struct _FAST_MUTEX {
1396 volatile LONG Count;
1397 PKTHREAD Owner;
1398 ULONG Contention;
1399 KEVENT Event;
1400 ULONG OldIrql;
1401 } FAST_MUTEX, *PFAST_MUTEX;
1402
1403 typedef enum _SUITE_TYPE {
1404 SmallBusiness,
1405 Enterprise,
1406 BackOffice,
1407 CommunicationServer,
1408 TerminalServer,
1409 SmallBusinessRestricted,
1410 EmbeddedNT,
1411 DataCenter,
1412 SingleUserTS,
1413 Personal,
1414 Blade,
1415 EmbeddedRestricted,
1416 SecurityAppliance,
1417 StorageServer,
1418 ComputeServer,
1419 WHServer,
1420 MaxSuiteType
1421 } SUITE_TYPE;
1422
1423 typedef enum _EX_POOL_PRIORITY {
1424 LowPoolPriority,
1425 LowPoolPrioritySpecialPoolOverrun = 8,
1426 LowPoolPrioritySpecialPoolUnderrun = 9,
1427 NormalPoolPriority = 16,
1428 NormalPoolPrioritySpecialPoolOverrun = 24,
1429 NormalPoolPrioritySpecialPoolUnderrun = 25,
1430 HighPoolPriority = 32,
1431 HighPoolPrioritySpecialPoolOverrun = 40,
1432 HighPoolPrioritySpecialPoolUnderrun = 41
1433 } EX_POOL_PRIORITY;
1434
1435 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
1436 #define LOOKASIDE_ALIGN
1437 #else
1438 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
1439 #endif
1440
1441 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
1442
1443 typedef PVOID
1444 (NTAPI *PALLOCATE_FUNCTION)(
1445 IN POOL_TYPE PoolType,
1446 IN SIZE_T NumberOfBytes,
1447 IN ULONG Tag);
1448
1449 typedef PVOID
1450 (NTAPI *PALLOCATE_FUNCTION_EX)(
1451 IN POOL_TYPE PoolType,
1452 IN SIZE_T NumberOfBytes,
1453 IN ULONG Tag,
1454 IN OUT PLOOKASIDE_LIST_EX Lookaside);
1455
1456 typedef VOID
1457 (NTAPI *PFREE_FUNCTION)(
1458 IN PVOID Buffer);
1459
1460 typedef VOID
1461 (NTAPI *PFREE_FUNCTION_EX)(
1462 IN PVOID Buffer,
1463 IN OUT PLOOKASIDE_LIST_EX Lookaside);
1464
1465 typedef VOID
1466 (NTAPI CALLBACK_FUNCTION)(
1467 IN PVOID CallbackContext OPTIONAL,
1468 IN PVOID Argument1 OPTIONAL,
1469 IN PVOID Argument2 OPTIONAL);
1470 typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
1471
1472 #define GENERAL_LOOKASIDE_LAYOUT \
1473 union { \
1474 SLIST_HEADER ListHead; \
1475 SINGLE_LIST_ENTRY SingleListHead; \
1476 } DUMMYUNIONNAME; \
1477 USHORT Depth; \
1478 USHORT MaximumDepth; \
1479 ULONG TotalAllocates; \
1480 union { \
1481 ULONG AllocateMisses; \
1482 ULONG AllocateHits; \
1483 } DUMMYUNIONNAME2; \
1484 \
1485 ULONG TotalFrees; \
1486 union { \
1487 ULONG FreeMisses; \
1488 ULONG FreeHits; \
1489 } DUMMYUNIONNAME3; \
1490 \
1491 POOL_TYPE Type; \
1492 ULONG Tag; \
1493 ULONG Size; \
1494 union { \
1495 PALLOCATE_FUNCTION_EX AllocateEx; \
1496 PALLOCATE_FUNCTION Allocate; \
1497 } DUMMYUNIONNAME4; \
1498 \
1499 union { \
1500 PFREE_FUNCTION_EX FreeEx; \
1501 PFREE_FUNCTION Free; \
1502 } DUMMYUNIONNAME5; \
1503 \
1504 LIST_ENTRY ListEntry; \
1505 ULONG LastTotalAllocates; \
1506 union { \
1507 ULONG LastAllocateMisses; \
1508 ULONG LastAllocateHits; \
1509 } DUMMYUNIONNAME6; \
1510 ULONG Future[2];
1511
1512 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
1513 GENERAL_LOOKASIDE_LAYOUT
1514 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
1515
1516 typedef struct _GENERAL_LOOKASIDE_POOL {
1517 GENERAL_LOOKASIDE_LAYOUT
1518 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
1519
1520 #define LOOKASIDE_CHECK(f) \
1521 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
1522
1523 LOOKASIDE_CHECK(TotalFrees);
1524 LOOKASIDE_CHECK(Tag);
1525 LOOKASIDE_CHECK(Future);
1526
1527 typedef struct _PAGED_LOOKASIDE_LIST {
1528 GENERAL_LOOKASIDE L;
1529 #if !defined(_AMD64_) && !defined(_IA64_)
1530 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
1531 #endif
1532 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
1533
1534 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
1535 GENERAL_LOOKASIDE L;
1536 #if !defined(_AMD64_) && !defined(_IA64_)
1537 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
1538 #endif
1539 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
1540
1541 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
1542
1543 typedef struct _LOOKASIDE_LIST_EX {
1544 GENERAL_LOOKASIDE_POOL L;
1545 } LOOKASIDE_LIST_EX;
1546
1547 #if (NTDDI_VERSION >= NTDDI_VISTA)
1548
1549 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
1550 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
1551
1552 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
1553 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
1554
1555 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1556
1557 typedef struct _EX_RUNDOWN_REF {
1558 __GNU_EXTENSION union {
1559 volatile ULONG_PTR Count;
1560 volatile PVOID Ptr;
1561 };
1562 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
1563
1564 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
1565
1566 typedef VOID
1567 (NTAPI WORKER_THREAD_ROUTINE)(
1568 IN PVOID Parameter);
1569 typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
1570
1571 typedef struct _WORK_QUEUE_ITEM {
1572 LIST_ENTRY List;
1573 PWORKER_THREAD_ROUTINE WorkerRoutine;
1574 volatile PVOID Parameter;
1575 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
1576
1577
1578 /******************************************************************************
1579 * Security Manager Types *
1580 ******************************************************************************/
1581
1582 /* Simple types */
1583 typedef PVOID PSECURITY_DESCRIPTOR;
1584 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
1585 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
1586 typedef PVOID PACCESS_TOKEN;
1587 typedef PVOID PSID;
1588
1589 #define DELETE 0x00010000L
1590 #define READ_CONTROL 0x00020000L
1591 #define WRITE_DAC 0x00040000L
1592 #define WRITE_OWNER 0x00080000L
1593 #define SYNCHRONIZE 0x00100000L
1594 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1595 #define STANDARD_RIGHTS_READ READ_CONTROL
1596 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1597 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1598 #define STANDARD_RIGHTS_ALL 0x001F0000L
1599 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1600 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1601 #define MAXIMUM_ALLOWED 0x02000000L
1602 #define GENERIC_READ 0x80000000L
1603 #define GENERIC_WRITE 0x40000000L
1604 #define GENERIC_EXECUTE 0x20000000L
1605 #define GENERIC_ALL 0x10000000L
1606
1607 typedef struct _GENERIC_MAPPING {
1608 ACCESS_MASK GenericRead;
1609 ACCESS_MASK GenericWrite;
1610 ACCESS_MASK GenericExecute;
1611 ACCESS_MASK GenericAll;
1612 } GENERIC_MAPPING, *PGENERIC_MAPPING;
1613
1614 #define ACL_REVISION 2
1615 #define ACL_REVISION_DS 4
1616
1617 #define ACL_REVISION1 1
1618 #define ACL_REVISION2 2
1619 #define ACL_REVISION3 3
1620 #define ACL_REVISION4 4
1621 #define MIN_ACL_REVISION ACL_REVISION2
1622 #define MAX_ACL_REVISION ACL_REVISION4
1623
1624 typedef struct _ACL {
1625 UCHAR AclRevision;
1626 UCHAR Sbz1;
1627 USHORT AclSize;
1628 USHORT AceCount;
1629 USHORT Sbz2;
1630 } ACL, *PACL;
1631
1632 /* Current security descriptor revision value */
1633 #define SECURITY_DESCRIPTOR_REVISION (1)
1634 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1635
1636 /* Privilege attributes */
1637 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1638 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1639 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1640 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1641
1642 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1643 SE_PRIVILEGE_ENABLED | \
1644 SE_PRIVILEGE_REMOVED | \
1645 SE_PRIVILEGE_USED_FOR_ACCESS)
1646
1647 #include <pshpack4.h>
1648 typedef struct _LUID_AND_ATTRIBUTES {
1649 LUID Luid;
1650 ULONG Attributes;
1651 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
1652 #include <poppack.h>
1653
1654 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
1655 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
1656
1657 /* Privilege sets */
1658 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1659
1660 typedef struct _PRIVILEGE_SET {
1661 ULONG PrivilegeCount;
1662 ULONG Control;
1663 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
1664 } PRIVILEGE_SET,*PPRIVILEGE_SET;
1665
1666 typedef enum _SECURITY_IMPERSONATION_LEVEL {
1667 SecurityAnonymous,
1668 SecurityIdentification,
1669 SecurityImpersonation,
1670 SecurityDelegation
1671 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
1672
1673 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1674 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1675 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1676 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1677
1678 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1679 #define SECURITY_STATIC_TRACKING (FALSE)
1680
1681 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
1682
1683 typedef struct _SECURITY_QUALITY_OF_SERVICE {
1684 ULONG Length;
1685 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
1686 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
1687 BOOLEAN EffectiveOnly;
1688 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
1689
1690 typedef struct _SE_IMPERSONATION_STATE {
1691 PACCESS_TOKEN Token;
1692 BOOLEAN CopyOnOpen;
1693 BOOLEAN EffectiveOnly;
1694 SECURITY_IMPERSONATION_LEVEL Level;
1695 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
1696
1697 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1698 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1699 #define DACL_SECURITY_INFORMATION (0x00000004L)
1700 #define SACL_SECURITY_INFORMATION (0x00000008L)
1701 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1702
1703 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1704 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1705 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1706 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1707
1708 typedef enum _SECURITY_OPERATION_CODE {
1709 SetSecurityDescriptor,
1710 QuerySecurityDescriptor,
1711 DeleteSecurityDescriptor,
1712 AssignSecurityDescriptor
1713 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
1714
1715 #define INITIAL_PRIVILEGE_COUNT 3
1716
1717 typedef struct _INITIAL_PRIVILEGE_SET {
1718 ULONG PrivilegeCount;
1719 ULONG Control;
1720 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
1721 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
1722
1723 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
1724 #define SE_CREATE_TOKEN_PRIVILEGE 2
1725 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
1726 #define SE_LOCK_MEMORY_PRIVILEGE 4
1727 #define SE_INCREASE_QUOTA_PRIVILEGE 5
1728 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
1729 #define SE_TCB_PRIVILEGE 7
1730 #define SE_SECURITY_PRIVILEGE 8
1731 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
1732 #define SE_LOAD_DRIVER_PRIVILEGE 10
1733 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
1734 #define SE_SYSTEMTIME_PRIVILEGE 12
1735 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
1736 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
1737 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
1738 #define SE_CREATE_PERMANENT_PRIVILEGE 16
1739 #define SE_BACKUP_PRIVILEGE 17
1740 #define SE_RESTORE_PRIVILEGE 18
1741 #define SE_SHUTDOWN_PRIVILEGE 19
1742 #define SE_DEBUG_PRIVILEGE 20
1743 #define SE_AUDIT_PRIVILEGE 21
1744 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
1745 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
1746 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
1747 #define SE_UNDOCK_PRIVILEGE 25
1748 #define SE_SYNC_AGENT_PRIVILEGE 26
1749 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
1750 #define SE_MANAGE_VOLUME_PRIVILEGE 28
1751 #define SE_IMPERSONATE_PRIVILEGE 29
1752 #define SE_CREATE_GLOBAL_PRIVILEGE 30
1753 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
1754 #define SE_RELABEL_PRIVILEGE 32
1755 #define SE_INC_WORKING_SET_PRIVILEGE 33
1756 #define SE_TIME_ZONE_PRIVILEGE 34
1757 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
1758 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
1759
1760 typedef struct _SECURITY_SUBJECT_CONTEXT {
1761 PACCESS_TOKEN ClientToken;
1762 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
1763 PACCESS_TOKEN PrimaryToken;
1764 PVOID ProcessAuditId;
1765 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
1766
1767 typedef struct _ACCESS_STATE {
1768 LUID OperationID;
1769 BOOLEAN SecurityEvaluated;
1770 BOOLEAN GenerateAudit;
1771 BOOLEAN GenerateOnClose;
1772 BOOLEAN PrivilegesAllocated;
1773 ULONG Flags;
1774 ACCESS_MASK RemainingDesiredAccess;
1775 ACCESS_MASK PreviouslyGrantedAccess;
1776 ACCESS_MASK OriginalDesiredAccess;
1777 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
1778 PSECURITY_DESCRIPTOR SecurityDescriptor;
1779 PVOID AuxData;
1780 union {
1781 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
1782 PRIVILEGE_SET PrivilegeSet;
1783 } Privileges;
1784 BOOLEAN AuditPrivileges;
1785 UNICODE_STRING ObjectName;
1786 UNICODE_STRING ObjectTypeName;
1787 } ACCESS_STATE, *PACCESS_STATE;
1788
1789 typedef VOID
1790 (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)(
1791 IN PVOID Vcb,
1792 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1793
1794 #ifndef _NTLSA_IFS_
1795
1796 #ifndef _NTLSA_AUDIT_
1797 #define _NTLSA_AUDIT_
1798
1799 #define SE_MAX_AUDIT_PARAMETERS 32
1800 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
1801
1802 #define SE_ADT_OBJECT_ONLY 0x1
1803
1804 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
1805 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
1806 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
1807 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
1808 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
1809
1810 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
1811 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
1812 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
1813
1814 typedef enum _SE_ADT_PARAMETER_TYPE {
1815 SeAdtParmTypeNone = 0,
1816 SeAdtParmTypeString,
1817 SeAdtParmTypeFileSpec,
1818 SeAdtParmTypeUlong,
1819 SeAdtParmTypeSid,
1820 SeAdtParmTypeLogonId,
1821 SeAdtParmTypeNoLogonId,
1822 SeAdtParmTypeAccessMask,
1823 SeAdtParmTypePrivs,
1824 SeAdtParmTypeObjectTypes,
1825 SeAdtParmTypeHexUlong,
1826 SeAdtParmTypePtr,
1827 SeAdtParmTypeTime,
1828 SeAdtParmTypeGuid,
1829 SeAdtParmTypeLuid,
1830 SeAdtParmTypeHexInt64,
1831 SeAdtParmTypeStringList,
1832 SeAdtParmTypeSidList,
1833 SeAdtParmTypeDuration,
1834 SeAdtParmTypeUserAccountControl,
1835 SeAdtParmTypeNoUac,
1836 SeAdtParmTypeMessage,
1837 SeAdtParmTypeDateTime,
1838 SeAdtParmTypeSockAddr,
1839 SeAdtParmTypeSD,
1840 SeAdtParmTypeLogonHours,
1841 SeAdtParmTypeLogonIdNoSid,
1842 SeAdtParmTypeUlongNoConv,
1843 SeAdtParmTypeSockAddrNoPort,
1844 SeAdtParmTypeAccessReason
1845 } SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
1846
1847 typedef struct _SE_ADT_OBJECT_TYPE {
1848 GUID ObjectType;
1849 USHORT Flags;
1850 USHORT Level;
1851 ACCESS_MASK AccessMask;
1852 } SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
1853
1854 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
1855 SE_ADT_PARAMETER_TYPE Type;
1856 ULONG Length;
1857 ULONG_PTR Data[2];
1858 PVOID Address;
1859 } SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
1860
1861 typedef struct _SE_ADT_ACCESS_REASON {
1862 ACCESS_MASK AccessMask;
1863 ULONG AccessReasons[32];
1864 ULONG ObjectTypeIndex;
1865 ULONG AccessGranted;
1866 PSECURITY_DESCRIPTOR SecurityDescriptor;
1867 } SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
1868
1869 typedef struct _SE_ADT_PARAMETER_ARRAY {
1870 ULONG CategoryId;
1871 ULONG AuditId;
1872 ULONG ParameterCount;
1873 ULONG Length;
1874 USHORT FlatSubCategoryId;
1875 USHORT Type;
1876 ULONG Flags;
1877 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
1878 } SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
1879
1880 #endif /* !_NTLSA_AUDIT_ */
1881 #endif /* !_NTLSA_IFS_ */
1882
1883 /******************************************************************************
1884 * Power Management Support Types *
1885 ******************************************************************************/
1886
1887 #ifndef _PO_DDK_
1888 #define _PO_DDK_
1889
1890 #define PO_CB_SYSTEM_POWER_POLICY 0
1891 #define PO_CB_AC_STATUS 1
1892 #define PO_CB_BUTTON_COLLISION 2
1893 #define PO_CB_SYSTEM_STATE_LOCK 3
1894 #define PO_CB_LID_SWITCH_STATE 4
1895 #define PO_CB_PROCESSOR_POWER_POLICY 5
1896
1897 /* Power States/Levels */
1898 typedef enum _SYSTEM_POWER_STATE {
1899 PowerSystemUnspecified = 0,
1900 PowerSystemWorking,
1901 PowerSystemSleeping1,
1902 PowerSystemSleeping2,
1903 PowerSystemSleeping3,
1904 PowerSystemHibernate,
1905 PowerSystemShutdown,
1906 PowerSystemMaximum
1907 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
1908
1909 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
1910
1911 typedef enum _POWER_INFORMATION_LEVEL {
1912 SystemPowerPolicyAc,
1913 SystemPowerPolicyDc,
1914 VerifySystemPolicyAc,
1915 VerifySystemPolicyDc,
1916 SystemPowerCapabilities,
1917 SystemBatteryState,
1918 SystemPowerStateHandler,
1919 ProcessorStateHandler,
1920 SystemPowerPolicyCurrent,
1921 AdministratorPowerPolicy,
1922 SystemReserveHiberFile,
1923 ProcessorInformation,
1924 SystemPowerInformation,
1925 ProcessorStateHandler2,
1926 LastWakeTime,
1927 LastSleepTime,
1928 SystemExecutionState,
1929 SystemPowerStateNotifyHandler,
1930 ProcessorPowerPolicyAc,
1931 ProcessorPowerPolicyDc,
1932 VerifyProcessorPowerPolicyAc,
1933 VerifyProcessorPowerPolicyDc,
1934 ProcessorPowerPolicyCurrent,
1935 SystemPowerStateLogging,
1936 SystemPowerLoggingEntry,
1937 SetPowerSettingValue,
1938 NotifyUserPowerSetting,
1939 PowerInformationLevelUnused0,
1940 PowerInformationLevelUnused1,
1941 SystemVideoState,
1942 TraceApplicationPowerMessage,
1943 TraceApplicationPowerMessageEnd,
1944 ProcessorPerfStates,
1945 ProcessorIdleStates,
1946 ProcessorCap,
1947 SystemWakeSource,
1948 SystemHiberFileInformation,
1949 TraceServicePowerMessage,
1950 ProcessorLoad,
1951 PowerShutdownNotification,
1952 MonitorCapabilities,
1953 SessionPowerInit,
1954 SessionDisplayState,
1955 PowerRequestCreate,
1956 PowerRequestAction,
1957 GetPowerRequestList,
1958 ProcessorInformationEx,
1959 NotifyUserModeLegacyPowerEvent,
1960 GroupPark,
1961 ProcessorIdleDomains,
1962 WakeTimerList,
1963 SystemHiberFileSize,
1964 PowerInformationLevelMaximum
1965 } POWER_INFORMATION_LEVEL;
1966
1967 typedef enum {
1968 PowerActionNone = 0,
1969 PowerActionReserved,
1970 PowerActionSleep,
1971 PowerActionHibernate,
1972 PowerActionShutdown,
1973 PowerActionShutdownReset,
1974 PowerActionShutdownOff,
1975 PowerActionWarmEject
1976 } POWER_ACTION, *PPOWER_ACTION;
1977
1978 typedef enum _DEVICE_POWER_STATE {
1979 PowerDeviceUnspecified = 0,
1980 PowerDeviceD0,
1981 PowerDeviceD1,
1982 PowerDeviceD2,
1983 PowerDeviceD3,
1984 PowerDeviceMaximum
1985 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
1986
1987 typedef enum _MONITOR_DISPLAY_STATE {
1988 PowerMonitorOff = 0,
1989 PowerMonitorOn,
1990 PowerMonitorDim
1991 } MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
1992
1993 typedef union _POWER_STATE {
1994 SYSTEM_POWER_STATE SystemState;
1995 DEVICE_POWER_STATE DeviceState;
1996 } POWER_STATE, *PPOWER_STATE;
1997
1998 typedef enum _POWER_STATE_TYPE {
1999 SystemPowerState = 0,
2000 DevicePowerState
2001 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
2002
2003 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
2004 typedef struct {
2005 ULONG Granularity;
2006 ULONG Capacity;
2007 } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
2008 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
2009
2010 #endif /* !_PO_DDK_ */
2011
2012 #define CORE_PARKING_POLICY_CHANGE_IDEAL 0
2013 #define CORE_PARKING_POLICY_CHANGE_SINGLE 1
2014 #define CORE_PARKING_POLICY_CHANGE_ROCKET 2
2015 #define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
2016
2017 DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A );
2018 DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C );
2019 DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E );
2020 DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94 );
2021 DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0 );
2022 DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7 );
2023 DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63 );
2024 DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99 );
2025 DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E );
2026 DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63 );
2027 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64 );
2028 DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
2029 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B );
2030 DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA );
2031 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
2032 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
2033 DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
2034 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
2035 DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67 );
2036 DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
2037 DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23 );
2038 DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42 );
2039 DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E );
2040 DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63 );
2041 DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67 );
2042 DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20 );
2043 DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70 );
2044 DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA );
2045 DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0 );
2046 DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64 );
2047 DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E );
2048 DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
2049 DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0 );
2050 DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87 );
2051 DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab );
2052 DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D );
2053 DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2 );
2054 DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47 );
2055 DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80 );
2056 DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78 );
2057 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB );
2058 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93 );
2059 DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5 );
2060 DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36 );
2061 DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B );
2062 DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4 );
2063 DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F );
2064 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46 );
2065 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69 );
2066 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f );
2067 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06 );
2068 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A );
2069 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58 );
2070 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4 );
2071 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA );
2072 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82 );
2073 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8 );
2074 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65 );
2075 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3 );
2076 DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00 );
2077 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36 );
2078 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC );
2079 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C );
2080 DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb );
2081 DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
2082 DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
2083 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d );
2084 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6 );
2085 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
2086 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
2087 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
2088 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
2089 DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
2090 DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
2091 DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
2092 DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
2093 DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
2094 DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
2095 DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
2096 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1 );
2097 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
2098 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
2099 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
2100 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
2101 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
2102 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
2103 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
2104 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
2105 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
2106 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
2107 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
2108 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
2109 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
2110 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
2111 DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
2112 DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
2113 DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
2114 DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
2115 DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51 );
2116 DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19 );
2117 DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48 );
2118 DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3 );
2119 DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1 );
2120 DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1 );
2121 DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E );
2122 DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA );
2123 DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20 );
2124 DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5 );
2125 DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6 );
2126
2127 #define PERFSTATE_POLICY_CHANGE_IDEAL 0
2128 #define PERFSTATE_POLICY_CHANGE_SINGLE 1
2129 #define PERFSTATE_POLICY_CHANGE_ROCKET 2
2130 #define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
2131
2132 #define PROCESSOR_PERF_BOOST_POLICY_DISABLED 0
2133 #define PROCESSOR_PERF_BOOST_POLICY_MAX 100
2134
2135 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0
2136 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1
2137
2138 typedef VOID
2139 (NTAPI REQUEST_POWER_COMPLETE)(
2140 IN struct _DEVICE_OBJECT *DeviceObject,
2141 IN UCHAR MinorFunction,
2142 IN POWER_STATE PowerState,
2143 IN PVOID Context,
2144 IN struct _IO_STATUS_BLOCK *IoStatus);
2145 typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE;
2146
2147 typedef
2148 NTSTATUS
2149 (NTAPI POWER_SETTING_CALLBACK)(
2150 IN LPCGUID SettingGuid,
2151 IN PVOID Value,
2152 IN ULONG ValueLength,
2153 IN OUT PVOID Context OPTIONAL);
2154 typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
2155
2156 #define PO_CB_SYSTEM_POWER_POLICY 0
2157 #define PO_CB_AC_STATUS 1
2158 #define PO_CB_BUTTON_COLLISION 2
2159 #define PO_CB_SYSTEM_STATE_LOCK 3
2160 #define PO_CB_LID_SWITCH_STATE 4
2161 #define PO_CB_PROCESSOR_POWER_POLICY 5
2162
2163 /******************************************************************************
2164 * Configuration Manager Types *
2165 ******************************************************************************/
2166
2167 /* Resource list definitions */
2168 typedef int CM_RESOURCE_TYPE;
2169
2170 #define CmResourceTypeNull 0
2171 #define CmResourceTypePort 1
2172 #define CmResourceTypeInterrupt 2
2173 #define CmResourceTypeMemory 3
2174 #define CmResourceTypeDma 4
2175 #define CmResourceTypeDeviceSpecific 5
2176 #define CmResourceTypeBusNumber 6
2177 #define CmResourceTypeNonArbitrated 128
2178 #define CmResourceTypeConfigData 128
2179 #define CmResourceTypeDevicePrivate 129
2180 #define CmResourceTypePcCardConfig 130
2181 #define CmResourceTypeMfCardConfig 131
2182
2183 /* KEY_VALUE_Xxx.Type */
2184 #define REG_NONE 0
2185 #define REG_SZ 1
2186 #define REG_EXPAND_SZ 2
2187 #define REG_BINARY 3
2188 #define REG_DWORD 4
2189 #define REG_DWORD_LITTLE_ENDIAN 4
2190 #define REG_DWORD_BIG_ENDIAN 5
2191 #define REG_LINK 6
2192 #define REG_MULTI_SZ 7
2193 #define REG_RESOURCE_LIST 8
2194 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2195 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2196 #define REG_QWORD 11
2197 #define REG_QWORD_LITTLE_ENDIAN 11
2198
2199 /* Registry Access Rights */
2200 #define KEY_QUERY_VALUE (0x0001)
2201 #define KEY_SET_VALUE (0x0002)
2202 #define KEY_CREATE_SUB_KEY (0x0004)
2203 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
2204 #define KEY_NOTIFY (0x0010)
2205 #define KEY_CREATE_LINK (0x0020)
2206 #define KEY_WOW64_32KEY (0x0200)
2207 #define KEY_WOW64_64KEY (0x0100)
2208 #define KEY_WOW64_RES (0x0300)
2209
2210 #define KEY_READ ((STANDARD_RIGHTS_READ |\
2211 KEY_QUERY_VALUE |\
2212 KEY_ENUMERATE_SUB_KEYS |\
2213 KEY_NOTIFY) \
2214 & \
2215 (~SYNCHRONIZE))
2216
2217 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
2218 KEY_SET_VALUE |\
2219 KEY_CREATE_SUB_KEY) \
2220 & \
2221 (~SYNCHRONIZE))
2222
2223 #define KEY_EXECUTE ((KEY_READ) \
2224 & \
2225 (~SYNCHRONIZE))
2226
2227 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
2228 KEY_QUERY_VALUE |\
2229 KEY_SET_VALUE |\
2230 KEY_CREATE_SUB_KEY |\
2231 KEY_ENUMERATE_SUB_KEYS |\
2232 KEY_NOTIFY |\
2233 KEY_CREATE_LINK) \
2234 & \
2235 (~SYNCHRONIZE))
2236
2237 /* Registry Open/Create Options */
2238 #define REG_OPTION_RESERVED (0x00000000L)
2239 #define REG_OPTION_NON_VOLATILE (0x00000000L)
2240 #define REG_OPTION_VOLATILE (0x00000001L)
2241 #define REG_OPTION_CREATE_LINK (0x00000002L)
2242 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
2243 #define REG_OPTION_OPEN_LINK (0x00000008L)
2244
2245 #define REG_LEGAL_OPTION \
2246 (REG_OPTION_RESERVED |\
2247 REG_OPTION_NON_VOLATILE |\
2248 REG_OPTION_VOLATILE |\
2249 REG_OPTION_CREATE_LINK |\
2250 REG_OPTION_BACKUP_RESTORE |\
2251 REG_OPTION_OPEN_LINK)
2252
2253 /* Key creation/open disposition */
2254 #define REG_CREATED_NEW_KEY (0x00000001L)
2255 #define REG_OPENED_EXISTING_KEY (0x00000002L)
2256
2257 /* Key restore & hive load flags */
2258 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
2259 #define REG_REFRESH_HIVE (0x00000002L)
2260 #define REG_NO_LAZY_FLUSH (0x00000004L)
2261 #define REG_FORCE_RESTORE (0x00000008L)
2262 #define REG_APP_HIVE (0x00000010L)
2263 #define REG_PROCESS_PRIVATE (0x00000020L)
2264 #define REG_START_JOURNAL (0x00000040L)
2265 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
2266 #define REG_HIVE_NO_RM (0x00000100L)
2267 #define REG_HIVE_SINGLE_LOG (0x00000200L)
2268 #define REG_BOOT_HIVE (0x00000400L)
2269
2270 /* Unload Flags */
2271 #define REG_FORCE_UNLOAD 1
2272
2273 /* Notify Filter Values */
2274 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
2275 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
2276 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
2277 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
2278
2279 #define REG_LEGAL_CHANGE_FILTER \
2280 (REG_NOTIFY_CHANGE_NAME |\
2281 REG_NOTIFY_CHANGE_ATTRIBUTES |\
2282 REG_NOTIFY_CHANGE_LAST_SET |\
2283 REG_NOTIFY_CHANGE_SECURITY)
2284
2285 typedef struct _CM_FLOPPY_DEVICE_DATA {
2286 USHORT Version;
2287 USHORT Revision;
2288 CHAR Size[8];
2289 ULONG MaxDensity;
2290 ULONG MountDensity;
2291 UCHAR StepRateHeadUnloadTime;
2292 UCHAR HeadLoadTime;
2293 UCHAR MotorOffTime;
2294 UCHAR SectorLengthCode;
2295 UCHAR SectorPerTrack;
2296 UCHAR ReadWriteGapLength;
2297 UCHAR DataTransferLength;
2298 UCHAR FormatGapLength;
2299 UCHAR FormatFillCharacter;
2300 UCHAR HeadSettleTime;
2301 UCHAR MotorSettleTime;
2302 UCHAR MaximumTrackValue;
2303 UCHAR DataTransferRate;
2304 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
2305
2306 #include <pshpack4.h>
2307 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
2308 UCHAR Type;
2309 UCHAR ShareDisposition;
2310 USHORT Flags;
2311 union {
2312 struct {
2313 PHYSICAL_ADDRESS Start;
2314 ULONG Length;
2315 } Generic;
2316 struct {
2317 PHYSICAL_ADDRESS Start;
2318 ULONG Length;
2319 } Port;
2320 struct {
2321 #if defined(NT_PROCESSOR_GROUPS)
2322 USHORT Level;
2323 USHORT Group;
2324 #else
2325 ULONG Level;
2326 #endif
2327 ULONG Vector;
2328 KAFFINITY Affinity;
2329 } Interrupt;
2330 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2331 struct {
2332 __GNU_EXTENSION union {
2333 struct {
2334 #if defined(NT_PROCESSOR_GROUPS)
2335 USHORT Group;
2336 #else
2337 USHORT Reserved;
2338 #endif
2339 USHORT MessageCount;
2340 ULONG Vector;
2341 KAFFINITY Affinity;
2342 } Raw;
2343 struct {
2344 #if defined(NT_PROCESSOR_GROUPS)
2345 USHORT Level;
2346 USHORT Group;
2347 #else
2348 ULONG Level;
2349 #endif
2350 ULONG Vector;
2351 KAFFINITY Affinity;
2352 } Translated;
2353 } DUMMYUNIONNAME;
2354 } MessageInterrupt;
2355 #endif
2356 struct {
2357 PHYSICAL_ADDRESS Start;
2358 ULONG Length;
2359 } Memory;
2360 struct {
2361 ULONG Channel;
2362 ULONG Port;
2363 ULONG Reserved1;
2364 } Dma;
2365 struct {
2366 ULONG Data[3];
2367 } DevicePrivate;
2368 struct {
2369 ULONG Start;
2370 ULONG Length;
2371 ULONG Reserved;
2372 } BusNumber;
2373 struct {
2374 ULONG DataSize;
2375 ULONG Reserved1;
2376 ULONG Reserved2;
2377 } DeviceSpecificData;
2378 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2379 struct {
2380 PHYSICAL_ADDRESS Start;
2381 ULONG Length40;
2382 } Memory40;
2383 struct {
2384 PHYSICAL_ADDRESS Start;
2385 ULONG Length48;
2386 } Memory48;
2387 struct {
2388 PHYSICAL_ADDRESS Start;
2389 ULONG Length64;
2390 } Memory64;
2391 #endif
2392 } u;
2393 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
2394 #include <poppack.h>
2395
2396 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
2397 #define CmResourceTypeNull 0
2398 #define CmResourceTypePort 1
2399 #define CmResourceTypeInterrupt 2
2400 #define CmResourceTypeMemory 3
2401 #define CmResourceTypeDma 4
2402 #define CmResourceTypeDeviceSpecific 5
2403 #define CmResourceTypeBusNumber 6
2404 #define CmResourceTypeMemoryLarge 7
2405 #define CmResourceTypeNonArbitrated 128
2406 #define CmResourceTypeConfigData 128
2407 #define CmResourceTypeDevicePrivate 129
2408 #define CmResourceTypePcCardConfig 130
2409 #define CmResourceTypeMfCardConfig 131
2410
2411 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
2412 typedef enum _CM_SHARE_DISPOSITION {
2413 CmResourceShareUndetermined = 0,
2414 CmResourceShareDeviceExclusive,
2415 CmResourceShareDriverExclusive,
2416 CmResourceShareShared
2417 } CM_SHARE_DISPOSITION;
2418
2419 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
2420 #define CM_RESOURCE_PORT_MEMORY 0x0000
2421 #define CM_RESOURCE_PORT_IO 0x0001
2422 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
2423 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
2424 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
2425 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
2426 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
2427 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
2428 #define CM_RESOURCE_PORT_BAR 0x0100
2429
2430 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
2431 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
2432 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
2433 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
2434 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
2435
2436 #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
2437
2438 #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN ((ULONG)-2)
2439
2440 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
2441 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
2442 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
2443 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
2444 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
2445 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
2446 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
2447 #define CM_RESOURCE_MEMORY_24 0x0010
2448 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
2449 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
2450 #define CM_RESOURCE_MEMORY_BAR 0x0080
2451 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
2452
2453 #define CM_RESOURCE_MEMORY_LARGE 0x0E00
2454 #define CM_RESOURCE_MEMORY_LARGE_40 0x0200
2455 #define CM_RESOURCE_MEMORY_LARGE_48 0x0400
2456 #define CM_RESOURCE_MEMORY_LARGE_64 0x0800
2457
2458 #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN 0x000000FFFFFFFF00
2459 #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN 0x0000FFFFFFFF0000
2460 #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN 0xFFFFFFFF00000000
2461
2462 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
2463 #define CM_RESOURCE_DMA_8 0x0000
2464 #define CM_RESOURCE_DMA_16 0x0001
2465 #define CM_RESOURCE_DMA_32 0x0002
2466 #define CM_RESOURCE_DMA_8_AND_16 0x0004
2467 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
2468 #define CM_RESOURCE_DMA_TYPE_A 0x0010
2469 #define CM_RESOURCE_DMA_TYPE_B 0x0020
2470 #define CM_RESOURCE_DMA_TYPE_F 0x0040
2471
2472 typedef struct _CM_PARTIAL_RESOURCE_LIST {
2473 USHORT Version;
2474 USHORT Revision;
2475 ULONG Count;
2476 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
2477 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
2478
2479 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
2480 INTERFACE_TYPE InterfaceType;
2481 ULONG BusNumber;
2482 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
2483 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
2484
2485 typedef struct _CM_RESOURCE_LIST {
2486 ULONG Count;
2487 CM_FULL_RESOURCE_DESCRIPTOR List[1];
2488 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
2489
2490 #include <pshpack1.h>
2491
2492 typedef struct _CM_INT13_DRIVE_PARAMETER {
2493 USHORT DriveSelect;
2494 ULONG MaxCylinders;
2495 USHORT SectorsPerTrack;
2496 USHORT MaxHeads;
2497 USHORT NumberDrives;
2498 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
2499
2500 typedef struct _CM_PNP_BIOS_DEVICE_NODE {
2501 USHORT Size;
2502 UCHAR Node;
2503 ULONG ProductId;
2504 UCHAR DeviceType[3];
2505 USHORT DeviceAttributes;
2506 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
2507
2508 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
2509 UCHAR Signature[4];
2510 UCHAR Revision;
2511 UCHAR Length;
2512 USHORT ControlField;
2513 UCHAR Checksum;
2514 ULONG EventFlagAddress;
2515 USHORT RealModeEntryOffset;
2516 USHORT RealModeEntrySegment;
2517 USHORT ProtectedModeEntryOffset;
2518 ULONG ProtectedModeCodeBaseAddress;
2519 ULONG OemDeviceId;
2520 USHORT RealModeDataBaseAddress;
2521 ULONG ProtectedModeDataBaseAddress;
2522 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
2523
2524 #include <poppack.h>
2525
2526 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
2527 ULONG BytesPerSector;
2528 ULONG NumberOfCylinders;
2529 ULONG SectorsPerTrack;
2530 ULONG NumberOfHeads;
2531 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
2532
2533 typedef struct _CM_KEYBOARD_DEVICE_DATA {
2534 USHORT Version;
2535 USHORT Revision;
2536 UCHAR Type;
2537 UCHAR Subtype;
2538 USHORT KeyboardFlags;
2539 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
2540
2541 typedef struct _CM_MCA_POS_DATA {
2542 USHORT AdapterId;
2543 UCHAR PosData1;
2544 UCHAR PosData2;
2545 UCHAR PosData3;
2546 UCHAR PosData4;
2547 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
2548
2549 #if (NTDDI_VERSION >= NTDDI_WINXP)
2550 typedef struct CM_Power_Data_s {
2551 ULONG PD_Size;
2552 DEVICE_POWER_STATE PD_MostRecentPowerState;
2553 ULONG PD_Capabilities;
2554 ULONG PD_D1Latency;
2555 ULONG PD_D2Latency;
2556 ULONG PD_D3Latency;
2557 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
2558 SYSTEM_POWER_STATE PD_DeepestSystemWake;
2559 } CM_POWER_DATA, *PCM_POWER_DATA;
2560
2561 #define PDCAP_D0_SUPPORTED 0x00000001
2562 #define PDCAP_D1_SUPPORTED 0x00000002
2563 #define PDCAP_D2_SUPPORTED 0x00000004
2564 #define PDCAP_D3_SUPPORTED 0x00000008
2565 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2566 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2567 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2568 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2569 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2570
2571 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2572
2573 typedef struct _CM_SCSI_DEVICE_DATA {
2574 USHORT Version;
2575 USHORT Revision;
2576 UCHAR HostIdentifier;
2577 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
2578
2579 typedef struct _CM_SERIAL_DEVICE_DATA {
2580 USHORT Version;
2581 USHORT Revision;
2582 ULONG BaudClock;
2583 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
2584
2585 typedef enum _KEY_INFORMATION_CLASS {
2586 KeyBasicInformation,
2587 KeyNodeInformation,
2588 KeyFullInformation,
2589 KeyNameInformation,
2590 KeyCachedInformation,
2591 KeyFlagsInformation,
2592 KeyVirtualizationInformation,
2593 KeyHandleTagsInformation,
2594 MaxKeyInfoClass
2595 } KEY_INFORMATION_CLASS;
2596
2597 typedef struct _KEY_BASIC_INFORMATION {
2598 LARGE_INTEGER LastWriteTime;
2599 ULONG TitleIndex;
2600 ULONG NameLength;
2601 WCHAR Name[1];
2602 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2603
2604 typedef struct _KEY_FULL_INFORMATION {
2605 LARGE_INTEGER LastWriteTime;
2606 ULONG TitleIndex;
2607 ULONG ClassOffset;
2608 ULONG ClassLength;
2609 ULONG SubKeys;
2610 ULONG MaxNameLen;
2611 ULONG MaxClassLen;
2612 ULONG Values;
2613 ULONG MaxValueNameLen;
2614 ULONG MaxValueDataLen;
2615 WCHAR Class[1];
2616 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2617
2618 typedef struct _KEY_NODE_INFORMATION {
2619 LARGE_INTEGER LastWriteTime;
2620 ULONG TitleIndex;
2621 ULONG ClassOffset;
2622 ULONG ClassLength;
2623 ULONG NameLength;
2624 WCHAR Name[1];
2625 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2626
2627 typedef struct _KEY_VALUE_BASIC_INFORMATION {
2628 ULONG TitleIndex;
2629 ULONG Type;
2630 ULONG NameLength;
2631 WCHAR Name[1];
2632 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2633
2634 typedef struct _KEY_VALUE_FULL_INFORMATION {
2635 ULONG TitleIndex;
2636 ULONG Type;
2637 ULONG DataOffset;
2638 ULONG DataLength;
2639 ULONG NameLength;
2640 WCHAR Name[1];
2641 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2642
2643 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2644 ULONG TitleIndex;
2645 ULONG Type;
2646 ULONG DataLength;
2647 UCHAR Data[1];
2648 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2649
2650 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2651 ULONG Type;
2652 ULONG DataLength;
2653 UCHAR Data[1];
2654 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2655
2656 typedef struct _KEY_VALUE_ENTRY {
2657 PUNICODE_STRING ValueName;
2658 ULONG DataLength;
2659 ULONG DataOffset;
2660 ULONG Type;
2661 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2662
2663 typedef enum _KEY_VALUE_INFORMATION_CLASS {
2664 KeyValueBasicInformation,
2665 KeyValueFullInformation,
2666 KeyValuePartialInformation,
2667 KeyValueFullInformationAlign64,
2668 KeyValuePartialInformationAlign64
2669 } KEY_VALUE_INFORMATION_CLASS;
2670
2671 typedef struct _KEY_WRITE_TIME_INFORMATION {
2672 LARGE_INTEGER LastWriteTime;
2673 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
2674
2675 typedef enum _KEY_SET_INFORMATION_CLASS {
2676 KeyWriteTimeInformation,
2677 KeyWow64FlagsInformation,
2678 KeyControlFlagsInformation,
2679 KeySetVirtualizationInformation,
2680 KeySetDebugInformation,
2681 KeySetHandleTagsInformation,
2682 MaxKeySetInfoClass
2683 } KEY_SET_INFORMATION_CLASS;
2684
2685 typedef enum _REG_NOTIFY_CLASS {
2686 RegNtDeleteKey,
2687 RegNtPreDeleteKey = RegNtDeleteKey,
2688 RegNtSetValueKey,
2689 RegNtPreSetValueKey = RegNtSetValueKey,
2690 RegNtDeleteValueKey,
2691 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
2692 RegNtSetInformationKey,
2693 RegNtPreSetInformationKey = RegNtSetInformationKey,
2694 RegNtRenameKey,
2695 RegNtPreRenameKey = RegNtRenameKey,
2696 RegNtEnumerateKey,
2697 RegNtPreEnumerateKey = RegNtEnumerateKey,
2698 RegNtEnumerateValueKey,
2699 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
2700 RegNtQueryKey,
2701 RegNtPreQueryKey = RegNtQueryKey,
2702 RegNtQueryValueKey,
2703 RegNtPreQueryValueKey = RegNtQueryValueKey,
2704 RegNtQueryMultipleValueKey,
2705 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
2706 RegNtPreCreateKey,
2707 RegNtPostCreateKey,
2708 RegNtPreOpenKey,
2709 RegNtPostOpenKey,
2710 RegNtKeyHandleClose,
2711 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
2712 RegNtPostDeleteKey,
2713 RegNtPostSetValueKey,
2714 RegNtPostDeleteValueKey,
2715 RegNtPostSetInformationKey,
2716 RegNtPostRenameKey,
2717 RegNtPostEnumerateKey,
2718 RegNtPostEnumerateValueKey,
2719 RegNtPostQueryKey,
2720 RegNtPostQueryValueKey,
2721 RegNtPostQueryMultipleValueKey,
2722 RegNtPostKeyHandleClose,
2723 RegNtPreCreateKeyEx,
2724 RegNtPostCreateKeyEx,
2725 RegNtPreOpenKeyEx,
2726 RegNtPostOpenKeyEx,
2727 RegNtPreFlushKey,
2728 RegNtPostFlushKey,
2729 RegNtPreLoadKey,
2730 RegNtPostLoadKey,
2731 RegNtPreUnLoadKey,
2732 RegNtPostUnLoadKey,
2733 RegNtPreQueryKeySecurity,
2734 RegNtPostQueryKeySecurity,
2735 RegNtPreSetKeySecurity,
2736 RegNtPostSetKeySecurity,
2737 RegNtCallbackObjectContextCleanup,
2738 RegNtPreRestoreKey,
2739 RegNtPostRestoreKey,
2740 RegNtPreSaveKey,
2741 RegNtPostSaveKey,
2742 RegNtPreReplaceKey,
2743 RegNtPostReplaceKey,
2744 MaxRegNtNotifyClass
2745 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
2746
2747 typedef NTSTATUS
2748 (NTAPI EX_CALLBACK_FUNCTION)(
2749 IN PVOID CallbackContext,
2750 IN PVOID Argument1,
2751 IN PVOID Argument2);
2752 typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION;
2753
2754 typedef struct _REG_DELETE_KEY_INFORMATION {
2755 PVOID Object;
2756 PVOID CallContext;
2757 PVOID ObjectContext;
2758 PVOID Reserved;
2759 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
2760 #if (NTDDI_VERSION >= NTDDI_VISTA)
2761 , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
2762 #endif
2763 ;
2764
2765 typedef struct _REG_SET_VALUE_KEY_INFORMATION {
2766 PVOID Object;
2767 PUNICODE_STRING ValueName;
2768 ULONG TitleIndex;
2769 ULONG Type;
2770 PVOID Data;
2771 ULONG DataSize;
2772 PVOID CallContext;
2773 PVOID ObjectContext;
2774 PVOID Reserved;
2775 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
2776
2777 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
2778 PVOID Object;
2779 PUNICODE_STRING ValueName;
2780 PVOID CallContext;
2781 PVOID ObjectContext;
2782 PVOID Reserved;
2783 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
2784
2785 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
2786 PVOID Object;
2787 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
2788 PVOID KeySetInformation;
2789 ULONG KeySetInformationLength;
2790 PVOID CallContext;
2791 PVOID ObjectContext;
2792 PVOID Reserved;
2793 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
2794
2795 typedef struct _REG_ENUMERATE_KEY_INFORMATION {
2796 PVOID Object;
2797 ULONG Index;
2798 KEY_INFORMATION_CLASS KeyInformationClass;
2799 PVOID KeyInformation;
2800 ULONG Length;
2801 PULONG ResultLength;
2802 PVOID CallContext;
2803 PVOID ObjectContext;
2804 PVOID Reserved;
2805 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
2806
2807 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
2808 PVOID Object;
2809 ULONG Index;
2810 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
2811 PVOID KeyValueInformation;
2812 ULONG Length;
2813 PULONG ResultLength;
2814 PVOID CallContext;
2815 PVOID ObjectContext;
2816 PVOID Reserved;
2817 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
2818
2819 typedef struct _REG_QUERY_KEY_INFORMATION {
2820 PVOID Object;
2821 KEY_INFORMATION_CLASS KeyInformationClass;
2822 PVOID KeyInformation;
2823 ULONG Length;
2824 PULONG ResultLength;
2825 PVOID CallContext;
2826 PVOID ObjectContext;
2827 PVOID Reserved;
2828 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
2829
2830 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
2831 PVOID Object;
2832 PUNICODE_STRING ValueName;
2833 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
2834 PVOID KeyValueInformation;
2835 ULONG Length;
2836 PULONG ResultLength;
2837 PVOID CallContext;
2838 PVOID ObjectContext;
2839 PVOID Reserved;
2840 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
2841
2842 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
2843 PVOID Object;
2844 PKEY_VALUE_ENTRY ValueEntries;
2845 ULONG EntryCount;
2846 PVOID ValueBuffer;
2847 PULONG BufferLength;
2848 PULONG RequiredBufferLength;
2849 PVOID CallContext;
2850 PVOID ObjectContext;
2851 PVOID Reserved;
2852 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
2853
2854 typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
2855 PUNICODE_STRING CompleteName;
2856 } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
2857
2858 typedef struct _REG_POST_CREATE_KEY_INFORMATION {
2859 PUNICODE_STRING CompleteName;
2860 PVOID Object;
2861 NTSTATUS Status;
2862 } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
2863
2864 typedef struct _REG_POST_OPERATION_INFORMATION {
2865 PVOID Object;
2866 NTSTATUS Status;
2867 PVOID PreInformation;
2868 NTSTATUS ReturnStatus;
2869 PVOID CallContext;
2870 PVOID ObjectContext;
2871 PVOID Reserved;
2872 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
2873
2874 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
2875 PVOID Object;
2876 PVOID CallContext;
2877 PVOID ObjectContext;
2878 PVOID Reserved;
2879 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
2880
2881 /******************************************************************************
2882 * I/O Manager Types *
2883 ******************************************************************************/
2884
2885 /* PCI_COMMON_CONFIG.Command */
2886 #define PCI_ENABLE_IO_SPACE 0x0001
2887 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2888 #define PCI_ENABLE_BUS_MASTER 0x0004
2889 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2890 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2891 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2892 #define PCI_ENABLE_PARITY 0x0040
2893 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2894 #define PCI_ENABLE_SERR 0x0100
2895 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2896 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
2897
2898 /* PCI_COMMON_CONFIG.Status */
2899 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
2900 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2901 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2902 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2903 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2904 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2905 #define PCI_STATUS_DEVSEL 0x0600
2906 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2907 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2908 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2909 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2910 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2911
2912 /* PCI_COMMON_CONFIG.HeaderType */
2913 #define PCI_MULTIFUNCTION 0x80
2914 #define PCI_DEVICE_TYPE 0x00
2915 #define PCI_BRIDGE_TYPE 0x01
2916 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2917
2918 #define PCI_CONFIGURATION_TYPE(PciData) \
2919 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2920
2921 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2922 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2923
2924 /* PCI device classes */
2925 #define PCI_CLASS_PRE_20 0x00
2926 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
2927 #define PCI_CLASS_NETWORK_CTLR 0x02
2928 #define PCI_CLASS_DISPLAY_CTLR 0x03
2929 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
2930 #define PCI_CLASS_MEMORY_CTLR 0x05
2931 #define PCI_CLASS_BRIDGE_DEV 0x06
2932 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
2933 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
2934 #define PCI_CLASS_INPUT_DEV 0x09
2935 #define PCI_CLASS_DOCKING_STATION 0x0a
2936 #define PCI_CLASS_PROCESSOR 0x0b
2937 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
2938 #define PCI_CLASS_WIRELESS_CTLR 0x0d
2939 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
2940 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
2941 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
2942 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
2943
2944 /* PCI device subclasses for class 0 */
2945 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
2946 #define PCI_SUBCLASS_PRE_20_VGA 0x01
2947
2948 /* PCI device subclasses for class 1 (mass storage controllers)*/
2949 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
2950 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
2951 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
2952 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
2953 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
2954 #define PCI_SUBCLASS_MSC_OTHER 0x80
2955
2956 /* PCI device subclasses for class 2 (network controllers)*/
2957 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
2958 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
2959 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
2960 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
2961 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
2962 #define PCI_SUBCLASS_NET_OTHER 0x80
2963
2964 /* PCI device subclasses for class 3 (display controllers)*/
2965 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
2966 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
2967 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
2968 #define PCI_SUBCLASS_VID_OTHER 0x80
2969
2970 /* PCI device subclasses for class 4 (multimedia device)*/
2971 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
2972 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
2973 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
2974 #define PCI_SUBCLASS_MM_OTHER 0x80
2975
2976 /* PCI device subclasses for class 5 (memory controller)*/
2977 #define PCI_SUBCLASS_MEM_RAM 0x00
2978 #define PCI_SUBCLASS_MEM_FLASH 0x01
2979 #define PCI_SUBCLASS_MEM_OTHER 0x80
2980
2981 /* PCI device subclasses for class 6 (bridge device)*/
2982 #define PCI_SUBCLASS_BR_HOST 0x00
2983 #define PCI_SUBCLASS_BR_ISA 0x01
2984 #define PCI_SUBCLASS_BR_EISA 0x02
2985 #define PCI_SUBCLASS_BR_MCA 0x03
2986 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
2987 #define PCI_SUBCLASS_BR_PCMCIA 0x05
2988 #define PCI_SUBCLASS_BR_NUBUS 0x06
2989 #define PCI_SUBCLASS_BR_CARDBUS 0x07
2990 #define PCI_SUBCLASS_BR_RACEWAY 0x08
2991 #define PCI_SUBCLASS_BR_OTHER 0x80
2992
2993 /* PCI device subclasses for class C (serial bus controller)*/
2994 #define PCI_SUBCLASS_SB_IEEE1394 0x00
2995 #define PCI_SUBCLASS_SB_ACCESS 0x01
2996 #define PCI_SUBCLASS_SB_SSA 0x02
2997 #define PCI_SUBCLASS_SB_USB 0x03
2998 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
2999 #define PCI_SUBCLASS_SB_SMBUS 0x05
3000
3001 #define PCI_MAX_DEVICES 32
3002 #define PCI_MAX_FUNCTION 8
3003 #define PCI_MAX_BRIDGE_NUMBER 0xFF
3004 #define PCI_INVALID_VENDORID 0xFFFF
3005 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
3006
3007 #define PCI_ADDRESS_IO_SPACE 0x00000001
3008 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
3009 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
3010 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
3011 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
3012 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
3013
3014 #define PCI_TYPE_32BIT 0
3015 #define PCI_TYPE_20BIT 2
3016 #define PCI_TYPE_64BIT 4
3017
3018 #define SERVICE_KERNEL_DRIVER 0x00000001
3019 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
3020 #define SERVICE_ADAPTER 0x00000004
3021 #define SERVICE_RECOGNIZER_DRIVER 0x00000008
3022
3023 #define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
3024 SERVICE_FILE_SYSTEM_DRIVER | \
3025 SERVICE_RECOGNIZER_DRIVER)
3026
3027 #define SERVICE_WIN32_OWN_PROCESS 0x00000010
3028 #define SERVICE_WIN32_SHARE_PROCESS 0x00000020
3029 #define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
3030 SERVICE_WIN32_SHARE_PROCESS)
3031
3032 #define SERVICE_INTERACTIVE_PROCESS 0x00000100
3033
3034 #define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
3035 SERVICE_ADAPTER | \
3036 SERVICE_DRIVER | \
3037 SERVICE_INTERACTIVE_PROCESS)
3038
3039 /* Service Start Types */
3040 #define SERVICE_BOOT_START 0x00000000
3041 #define SERVICE_SYSTEM_START 0x00000001
3042 #define SERVICE_AUTO_START 0x00000002
3043 #define SERVICE_DEMAND_START 0x00000003
3044 #define SERVICE_DISABLED 0x00000004
3045
3046 #define SERVICE_ERROR_IGNORE 0x00000000
3047 #define SERVICE_ERROR_NORMAL 0x00000001
3048 #define SERVICE_ERROR_SEVERE 0x00000002
3049 #define SERVICE_ERROR_CRITICAL 0x00000003
3050
3051 typedef enum _CM_SERVICE_NODE_TYPE {
3052 DriverType = SERVICE_KERNEL_DRIVER,
3053 FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
3054 Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
3055 Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
3056 AdapterType = SERVICE_ADAPTER,
3057 RecognizerType = SERVICE_RECOGNIZER_DRIVER
3058 } SERVICE_NODE_TYPE;
3059
3060 typedef enum _CM_SERVICE_LOAD_TYPE {
3061 BootLoad = SERVICE_BOOT_START,
3062 SystemLoad = SERVICE_SYSTEM_START,
3063 AutoLoad = SERVICE_AUTO_START,
3064 DemandLoad = SERVICE_DEMAND_START,
3065 DisableLoad = SERVICE_DISABLED
3066 } SERVICE_LOAD_TYPE;
3067
3068 typedef enum _CM_ERROR_CONTROL_TYPE {
3069 IgnoreError = SERVICE_ERROR_IGNORE,
3070 NormalError = SERVICE_ERROR_NORMAL,
3071 SevereError = SERVICE_ERROR_SEVERE,
3072 CriticalError = SERVICE_ERROR_CRITICAL
3073 } SERVICE_ERROR_TYPE;
3074
3075 #define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001
3076 #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
3077 #define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004
3078
3079 #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \
3080 CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
3081 CM_SERVICE_USB_DISK_BOOT_LOAD)
3082
3083 #define POOL_COLD_ALLOCATION 256
3084 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
3085 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
3086
3087 #define PCI_TYPE0_ADDRESSES 6
3088 #define PCI_TYPE1_ADDRESSES 2
3089 #define PCI_TYPE2_ADDRESSES 5
3090
3091 #define IO_TYPE_ADAPTER 1
3092 #define IO_TYPE_CONTROLLER 2
3093 #define IO_TYPE_DEVICE 3
3094 #define IO_TYPE_DRIVER 4
3095 #define IO_TYPE_FILE 5
3096 #define IO_TYPE_IRP 6
3097 #define IO_TYPE_MASTER_ADAPTER 7
3098 #define IO_TYPE_OPEN_PACKET 8
3099 #define IO_TYPE_TIMER 9
3100 #define IO_TYPE_VPB 10
3101 #define IO_TYPE_ERROR_LOG 11
3102 #define IO_TYPE_ERROR_MESSAGE 12
3103 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
3104
3105 #define IO_TYPE_CSQ_IRP_CONTEXT 1
3106 #define IO_TYPE_CSQ 2
3107 #define IO_TYPE_CSQ_EX 3
3108
3109 /* IO_RESOURCE_DESCRIPTOR.Option */
3110 #define IO_RESOURCE_PREFERRED 0x01
3111 #define IO_RESOURCE_DEFAULT 0x02
3112 #define IO_RESOURCE_ALTERNATIVE 0x08
3113
3114 /* DEVICE_OBJECT.Flags */
3115 #define DO_VERIFY_VOLUME 0x00000002
3116 #define DO_BUFFERED_IO 0x00000004
3117 #define DO_EXCLUSIVE 0x00000008
3118 #define DO_DIRECT_IO 0x00000010
3119 #define DO_MAP_IO_BUFFER 0x00000020
3120 #define DO_DEVICE_INITIALIZING 0x00000080
3121 #define DO_SHUTDOWN_REGISTERED 0x00000800
3122 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
3123 #define DO_POWER_PAGABLE 0x00002000
3124 #define DO_POWER_INRUSH 0x00004000
3125
3126 /* DEVICE_OBJECT.Characteristics */
3127 #define FILE_REMOVABLE_MEDIA 0x00000001
3128 #define FILE_READ_ONLY_DEVICE 0x00000002
3129 #define FILE_FLOPPY_DISKETTE 0x00000004
3130 #define FILE_WRITE_ONCE_MEDIA 0x00000008
3131 #define FILE_REMOTE_DEVICE 0x00000010
3132 #define FILE_DEVICE_IS_MOUNTED 0x00000020
3133 #define FILE_VIRTUAL_VOLUME 0x00000040
3134 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
3135 #define FILE_DEVICE_SECURE_OPEN 0x00000100
3136 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
3137 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
3138 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
3139
3140 /* DEVICE_OBJECT.AlignmentRequirement */
3141 #define FILE_BYTE_ALIGNMENT 0x00000000
3142 #define FILE_WORD_ALIGNMENT 0x00000001
3143 #define FILE_LONG_ALIGNMENT 0x00000003
3144 #define FILE_QUAD_ALIGNMENT 0x00000007
3145 #define FILE_OCTA_ALIGNMENT 0x0000000f
3146 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
3147 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
3148 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
3149 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
3150 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
3151
3152 /* DEVICE_OBJECT.DeviceType */
3153 #define DEVICE_TYPE ULONG
3154
3155 #define FILE_DEVICE_BEEP 0x00000001
3156 #define FILE_DEVICE_CD_ROM 0x00000002
3157 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
3158 #define FILE_DEVICE_CONTROLLER 0x00000004
3159 #define FILE_DEVICE_DATALINK 0x00000005
3160 #define FILE_DEVICE_DFS 0x00000006
3161 #define FILE_DEVICE_DISK 0x00000007
3162 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
3163 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
3164 #define FILE_DEVICE_INPORT_PORT 0x0000000a
3165 #define FILE_DEVICE_KEYBOARD 0x0000000b
3166 #define FILE_DEVICE_MAILSLOT 0x0000000c
3167 #define FILE_DEVICE_MIDI_IN 0x0000000d
3168 #define FILE_DEVICE_MIDI_OUT 0x0000000e
3169 #define FILE_DEVICE_MOUSE 0x0000000f
3170 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
3171 #define FILE_DEVICE_NAMED_PIPE 0x00000011
3172 #define FILE_DEVICE_NETWORK 0x00000012
3173 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
3174 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
3175 #define FILE_DEVICE_NULL 0x00000015
3176 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
3177 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
3178 #define FILE_DEVICE_PRINTER 0x00000018
3179 #define FILE_DEVICE_SCANNER 0x00000019
3180 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
3181 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
3182 #define FILE_DEVICE_SCREEN 0x0000001c
3183 #define FILE_DEVICE_SOUND 0x0000001d
3184 #define FILE_DEVICE_STREAMS 0x0000001e
3185 #define FILE_DEVICE_TAPE 0x0000001f
3186 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
3187 #define FILE_DEVICE_TRANSPORT 0x00000021
3188 #define FILE_DEVICE_UNKNOWN 0x00000022
3189 #define FILE_DEVICE_VIDEO 0x00000023
3190 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
3191 #define FILE_DEVICE_WAVE_IN 0x00000025
3192 #define FILE_DEVICE_WAVE_OUT 0x00000026
3193 #define FILE_DEVICE_8042_PORT 0x00000027
3194 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
3195 #define FILE_DEVICE_BATTERY 0x00000029
3196 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
3197 #define FILE_DEVICE_MODEM 0x0000002b
3198 #define FILE_DEVICE_VDM 0x0000002c
3199 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
3200 #define FILE_DEVICE_SMB 0x0000002e
3201 #define FILE_DEVICE_KS 0x0000002f
3202 #define FILE_DEVICE_CHANGER 0x00000030
3203 #define FILE_DEVICE_SMARTCARD 0x00000031
3204 #define FILE_DEVICE_ACPI 0x00000032
3205 #define FILE_DEVICE_DVD 0x00000033
3206 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
3207 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
3208 #define FILE_DEVICE_DFS_VOLUME 0x00000036
3209 #define FILE_DEVICE_SERENUM 0x00000037
3210 #define FILE_DEVICE_TERMSRV 0x00000038
3211 #define FILE_DEVICE_KSEC 0x00000039
3212 #define FILE_DEVICE_FIPS 0x0000003A
3213 #define FILE_DEVICE_INFINIBAND 0x0000003B
3214 #define FILE_DEVICE_VMBUS 0x0000003E
3215 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
3216 #define FILE_DEVICE_WPD 0x00000040
3217 #define FILE_DEVICE_BLUETOOTH 0x00000041
3218 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
3219 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
3220 #define FILE_DEVICE_BIOMETRIC 0x00000044
3221 #define FILE_DEVICE_PMI 0x00000045
3222
3223 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
3224
3225 typedef struct _OBJECT_HANDLE_INFORMATION {
3226 ULONG HandleAttributes;
3227 ACCESS_MASK GrantedAccess;
3228 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3229
3230 typedef struct _CLIENT_ID {
3231 HANDLE UniqueProcess;
3232 HANDLE UniqueThread;
3233 } CLIENT_ID, *PCLIENT_ID;
3234
3235 typedef VOID
3236 (NTAPI *PKSTART_ROUTINE)(
3237 IN PVOID StartContext);
3238
3239 typedef struct _VPB {
3240 CSHORT Type;
3241 CSHORT Size;
3242 USHORT Flags;
3243 USHORT VolumeLabelLength;
3244 struct _DEVICE_OBJECT *DeviceObject;
3245 struct _DEVICE_OBJECT *RealDevice;
3246 ULONG SerialNumber;
3247 ULONG ReferenceCount;
3248 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
3249 } VPB, *PVPB;
3250
3251 typedef enum _IO_ALLOCATION_ACTION {
3252 KeepObject = 1,
3253 DeallocateObject,
3254 DeallocateObjectKeepRegisters
3255 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
3256
3257 typedef IO_ALLOCATION_ACTION
3258 (NTAPI DRIVER_CONTROL)(
3259 IN struct _DEVICE_OBJECT *DeviceObject,
3260 IN struct _IRP *Irp,
3261 IN PVOID MapRegisterBase,
3262 IN PVOID Context);
3263 typedef DRIVER_CONTROL *PDRIVER_CONTROL;
3264
3265 typedef struct _WAIT_CONTEXT_BLOCK {
3266 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
3267 PDRIVER_CONTROL DeviceRoutine;
3268 PVOID DeviceContext;
3269 ULONG NumberOfMapRegisters;
3270 PVOID DeviceObject;
3271 PVOID CurrentIrp;
3272 PKDPC BufferChainingDpc;
3273 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
3274
3275 typedef struct _DEVICE_OBJECT {
3276 CSHORT Type;
3277 USHORT Size;
3278 LONG ReferenceCount;
3279 struct _DRIVER_OBJECT *DriverObject;
3280 struct _DEVICE_OBJECT *NextDevice;
3281 struct _DEVICE_OBJECT *AttachedDevice;
3282 struct _IRP *CurrentIrp;
3283 PIO_TIMER Timer;
3284 ULONG Flags;
3285 ULONG Characteristics;
3286 volatile PVPB Vpb;
3287 PVOID DeviceExtension;
3288 DEVICE_TYPE DeviceType;
3289 CCHAR StackSize;
3290 union {
3291 LIST_ENTRY ListEntry;
3292 WAIT_CONTEXT_BLOCK Wcb;
3293 } Queue;
3294 ULONG AlignmentRequirement;
3295 KDEVICE_QUEUE DeviceQueue;
3296 KDPC Dpc;
3297 ULONG ActiveThreadCount;
3298 PSECURITY_DESCRIPTOR SecurityDescriptor;
3299 KEVENT DeviceLock;
3300 USHORT SectorSize;
3301 USHORT Spare1;
3302 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
3303 PVOID Reserved;
3304 } DEVICE_OBJECT, *PDEVICE_OBJECT;
3305
3306 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
3307
3308 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
3309 BOOLEAN Removed;
3310 BOOLEAN Reserved[3];
3311 volatile LONG IoCount;
3312 KEVENT RemoveEvent;
3313 } IO_REMOVE_LOCK_COMMON_BLOCK;
3314
3315 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
3316 LONG Signature;
3317 LONG HighWatermark;
3318 LONGLONG MaxLockedTicks;
3319 LONG AllocateTag;
3320 LIST_ENTRY LockList;
3321 KSPIN_LOCK Spin;
3322 volatile LONG LowMemoryCount;
3323 ULONG Reserved1[4];
3324 PVOID Reserved2;
3325 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
3326 } IO_REMOVE_LOCK_DBG_BLOCK;
3327
3328 typedef struct _IO_REMOVE_LOCK {
3329 IO_REMOVE_LOCK_COMMON_BLOCK Common;
3330 #if DBG
3331 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
3332 #endif
3333 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
3334
3335 typedef struct _IO_WORKITEM *PIO_WORKITEM;
3336
3337 typedef VOID
3338 (NTAPI IO_WORKITEM_ROUTINE)(
3339 IN PDEVICE_OBJECT DeviceObject,
3340 IN PVOID Context);
3341 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
3342
3343 typedef VOID
3344 (NTAPI IO_WORKITEM_ROUTINE_EX)(
3345 IN PVOID IoObject,
3346 IN PVOID Context OPTIONAL,
3347 IN PIO_WORKITEM IoWorkItem);
3348 typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
3349
3350 typedef struct _SHARE_ACCESS {
3351 ULONG OpenCount;
3352 ULONG Readers;
3353 ULONG Writers;
3354 ULONG Deleters;
3355 ULONG SharedRead;
3356 ULONG SharedWrite;
3357 ULONG SharedDelete;
3358 } SHARE_ACCESS, *PSHARE_ACCESS;
3359
3360 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
3361 inheritance, even from a struct renders the type non-POD. So we use
3362 this hack */
3363 #define PCI_COMMON_HEADER_LAYOUT \
3364 USHORT VendorID; \
3365 USHORT DeviceID; \
3366 USHORT Command; \
3367 USHORT Status; \
3368 UCHAR RevisionID; \
3369 UCHAR ProgIf; \
3370 UCHAR SubClass; \
3371 UCHAR BaseClass; \
3372 UCHAR CacheLineSize; \
3373 UCHAR LatencyTimer; \
3374 UCHAR HeaderType; \
3375 UCHAR BIST; \
3376 union { \
3377 struct _PCI_HEADER_TYPE_0 { \
3378 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
3379 ULONG CIS; \
3380 USHORT SubVendorID; \
3381 USHORT SubSystemID; \
3382 ULONG ROMBaseAddress; \
3383 UCHAR CapabilitiesPtr; \
3384 UCHAR Reserved1[3]; \
3385 ULONG Reserved2; \
3386 UCHAR InterruptLine; \
3387 UCHAR InterruptPin; \
3388 UCHAR MinimumGrant; \
3389 UCHAR MaximumLatency; \
3390 } type0; \
3391 struct _PCI_HEADER_TYPE_1 { \
3392 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
3393 UCHAR PrimaryBus; \
3394 UCHAR SecondaryBus; \
3395 UCHAR SubordinateBus; \
3396 UCHAR SecondaryLatency; \
3397 UCHAR IOBase; \
3398 UCHAR IOLimit; \
3399 USHORT SecondaryStatus; \
3400 USHORT MemoryBase; \
3401 USHORT MemoryLimit; \
3402 USHORT PrefetchBase; \
3403 USHORT PrefetchLimit; \
3404 ULONG PrefetchBaseUpper32; \
3405 ULONG PrefetchLimitUpper32; \
3406 USHORT IOBaseUpper16; \
3407 USHORT IOLimitUpper16; \
3408 UCHAR CapabilitiesPtr; \
3409 UCHAR Reserved1[3]; \
3410 ULONG ROMBaseAddress; \
3411 UCHAR InterruptLine; \
3412 UCHAR InterruptPin; \
3413 USHORT BridgeControl; \
3414 } type1; \
3415 struct _PCI_HEADER_TYPE_2 { \
3416 ULONG SocketRegistersBaseAddress; \
3417 UCHAR CapabilitiesPtr; \
3418 UCHAR Reserved; \
3419 USHORT SecondaryStatus; \
3420 UCHAR PrimaryBus; \
3421 UCHAR SecondaryBus; \
3422 UCHAR SubordinateBus; \
3423 UCHAR SecondaryLatency; \
3424 struct { \
3425 ULONG Base; \
3426 ULONG Limit; \
3427 } Range[PCI_TYPE2_ADDRESSES-1]; \
3428 UCHAR InterruptLine; \
3429 UCHAR InterruptPin; \
3430 USHORT BridgeControl; \
3431 } type2; \
3432 } u;
3433
3434 typedef struct _PCI_COMMON_HEADER {
3435 PCI_COMMON_HEADER_LAYOUT
3436 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
3437
3438 #ifdef __cplusplus
3439 typedef struct _PCI_COMMON_CONFIG {
3440 PCI_COMMON_HEADER_LAYOUT
3441 UCHAR DeviceSpecific[192];
3442 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
3443 #else
3444 typedef struct _PCI_COMMON_CONFIG {
3445 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
3446 UCHAR DeviceSpecific[192];
3447 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
3448 #endif
3449
3450 typedef enum _CREATE_FILE_TYPE {
3451 CreateFileTypeNone,
3452 CreateFileTypeNamedPipe,
3453 CreateFileTypeMailslot
3454 } CREATE_FILE_TYPE;
3455
3456 #define IO_FORCE_ACCESS_CHECK 0x001
3457 #define IO_NO_PARAMETER_CHECKING 0x100
3458
3459 #define IO_REPARSE 0x0
3460 #define IO_REMOUNT 0x1
3461
3462 typedef struct _IO_STATUS_BLOCK {
3463 _ANONYMOUS_UNION union {
3464 NTSTATUS Status;
3465 PVOID Pointer;
3466 } DUMMYUNIONNAME;
3467 ULONG_PTR Information;
3468 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
3469
3470 typedef struct _PCI_SLOT_NUMBER {
3471 union {
3472 struct {
3473 ULONG DeviceNumber : 5;
3474 ULONG FunctionNumber : 3;
3475 ULONG Reserved : 24;
3476 } bits;
3477 ULONG AsULONG;
3478 } u;
3479 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
3480
3481 typedef VOID
3482 (NTAPI *PIO_APC_ROUTINE)(
3483 IN PVOID ApcContext,
3484 IN PIO_STATUS_BLOCK IoStatusBlock,
3485 IN ULONG Reserved);
3486
3487 typedef VOID
3488 (NTAPI *WMI_NOTIFICATION_CALLBACK)(
3489 PVOID Wnode,
3490 PVOID Context);
3491
3492 #define WMIREG_ACTION_REGISTER 1
3493 #define WMIREG_ACTION_DEREGISTER 2
3494 #define WMIREG_ACTION_REREGISTER 3
3495 #define WMIREG_ACTION_UPDATE_GUIDS 4
3496 #define WMIREG_ACTION_BLOCK_IRPS 5
3497
3498 #define EVENT_INCREMENT 1
3499 #define IO_NO_INCREMENT 0
3500 #define IO_CD_ROM_INCREMENT 1
3501 #define IO_DISK_INCREMENT 1
3502 #define IO_KEYBOARD_INCREMENT 6
3503 #define IO_MAILSLOT_INCREMENT 2
3504 #define IO_MOUSE_INCREMENT 6
3505 #define IO_NAMED_PIPE_INCREMENT 2
3506 #define IO_NETWORK_INCREMENT 2
3507 #define IO_PARALLEL_INCREMENT 1
3508 #define IO_SERIAL_INCREMENT 2
3509 #define IO_SOUND_INCREMENT 8
3510 #define IO_VIDEO_INCREMENT 1
3511 #define SEMAPHORE_INCREMENT 1
3512
3513 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
3514
3515 typedef struct _BOOTDISK_INFORMATION {
3516 LONGLONG BootPartitionOffset;
3517 LONGLONG SystemPartitionOffset;
3518 ULONG BootDeviceSignature;
3519 ULONG SystemDeviceSignature;
3520 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
3521
3522 typedef struct _BOOTDISK_INFORMATION_EX {
3523 LONGLONG BootPartitionOffset;
3524 LONGLONG SystemPartitionOffset;
3525 ULONG BootDeviceSignature;
3526 ULONG SystemDeviceSignature;
3527 GUID BootDeviceGuid;
3528 GUID SystemDeviceGuid;
3529 BOOLEAN BootDeviceIsGpt;
3530 BOOLEAN SystemDeviceIsGpt;
3531 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
3532
3533 #if (NTDDI_VERSION >= NTDDI_WIN7)
3534
3535 typedef struct _LOADER_PARTITION_INFORMATION_EX {
3536 ULONG PartitionStyle;
3537 ULONG PartitionNumber;
3538 union {
3539 ULONG Signature;
3540 GUID DeviceId;
3541 };
3542 ULONG Flags;
3543 } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
3544
3545 typedef struct _BOOTDISK_INFORMATION_LITE {
3546 ULONG NumberEntries;
3547 LOADER_PARTITION_INFORMATION_EX Entries[1];
3548 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
3549
3550 #else
3551
3552 #if (NTDDI_VERSION >= NTDDI_VISTA)
3553 typedef struct _BOOTDISK_INFORMATION_LITE {
3554 ULONG BootDeviceSignature;
3555 ULONG SystemDeviceSignature;
3556 GUID BootDeviceGuid;
3557 GUID SystemDeviceGuid;
3558 BOOLEAN BootDeviceIsGpt;
3559 BOOLEAN SystemDeviceIsGpt;
3560 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
3561 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
3562
3563 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
3564
3565
3566 typedef struct _EISA_MEMORY_TYPE {
3567 UCHAR ReadWrite : 1;
3568 UCHAR Cached : 1;
3569 UCHAR Reserved0 : 1;
3570 UCHAR Type : 2;
3571 UCHAR Shared : 1;
3572 UCHAR Reserved1 : 1;
3573 UCHAR MoreEntries : 1;
3574 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
3575
3576 #include <pshpack1.h>
3577 typedef struct _EISA_MEMORY_CONFIGURATION {
3578 EISA_MEMORY_TYPE ConfigurationByte;
3579 UCHAR DataSize;
3580 USHORT AddressLowWord;
3581 UCHAR AddressHighByte;
3582 USHORT MemorySize;
3583 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
3584 #include <poppack.h>
3585
3586 typedef struct _EISA_IRQ_DESCRIPTOR {
3587 UCHAR Interrupt : 4;
3588 UCHAR Reserved : 1;
3589 UCHAR LevelTriggered : 1;
3590 UCHAR Shared : 1;
3591 UCHAR MoreEntries : 1;
3592 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
3593
3594 typedef struct _EISA_IRQ_CONFIGURATION {
3595 EISA_IRQ_DESCRIPTOR ConfigurationByte;
3596 UCHAR Reserved;
3597 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
3598
3599 typedef struct _DMA_CONFIGURATION_BYTE0 {
3600 UCHAR Channel : 3;
3601 UCHAR Reserved : 3;
3602 UCHAR Shared : 1;
3603 UCHAR MoreEntries : 1;
3604 } DMA_CONFIGURATION_BYTE0;
3605
3606 typedef struct _DMA_CONFIGURATION_BYTE1 {
3607 UCHAR Reserved0 : 2;
3608 UCHAR TransferSize : 2;
3609 UCHAR Timing : 2;
3610 UCHAR Reserved1 : 2;
3611 } DMA_CONFIGURATION_BYTE1;
3612
3613 typedef struct _EISA_DMA_CONFIGURATION {
3614 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
3615 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
3616 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
3617
3618 #include <pshpack1.h>
3619 typedef struct _EISA_PORT_DESCRIPTOR {
3620 UCHAR NumberPorts : 5;
3621 UCHAR Reserved : 1;
3622 UCHAR Shared : 1;
3623 UCHAR MoreEntries : 1;
3624 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
3625
3626 typedef struct _EISA_PORT_CONFIGURATION {
3627 EISA_PORT_DESCRIPTOR Configuration;
3628 USHORT PortAddress;
3629 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
3630 #include <poppack.h>
3631
3632 typedef struct _CM_EISA_FUNCTION_INFORMATION {
3633 ULONG CompressedId;
3634 UCHAR IdSlotFlags1;
3635 UCHAR IdSlotFlags2;
3636 UCHAR MinorRevision;
3637 UCHAR MajorRevision;
3638 UCHAR Selections[26];
3639 UCHAR FunctionFlags;
3640 UCHAR TypeString[80];
3641 EISA_MEMORY_CONFIGURATION EisaMemory[9];
3642 EISA_IRQ_CONFIGURATION EisaIrq[7];
3643 EISA_DMA_CONFIGURATION EisaDma[4];
3644 EISA_PORT_CONFIGURATION EisaPort[20];
3645 UCHAR InitializationData[60];
3646 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
3647
3648 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
3649
3650 #define EISA_FUNCTION_ENABLED 0x80
3651 #define EISA_FREE_FORM_DATA 0x40
3652 #define EISA_HAS_PORT_INIT_ENTRY 0x20
3653 #define EISA_HAS_PORT_RANGE 0x10
3654 #define EISA_HAS_DMA_ENTRY 0x08
3655 #define EISA_HAS_IRQ_ENTRY 0x04
3656 #define EISA_HAS_MEMORY_ENTRY 0x02
3657 #define EISA_HAS_TYPE_ENTRY 0x01
3658 #define EISA_HAS_INFORMATION \
3659 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
3660 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
3661
3662 typedef struct _CM_EISA_SLOT_INFORMATION {
3663 UCHAR ReturnCode;
3664 UCHAR ReturnFlags;
3665 UCHAR MajorRevision;
3666 UCHAR MinorRevision;
3667 USHORT Checksum;
3668 UCHAR NumberFunctions;
3669 UCHAR FunctionInformation;
3670 ULONG CompressedId;
3671 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
3672
3673 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
3674
3675 #define EISA_INVALID_SLOT 0x80
3676 #define EISA_INVALID_FUNCTION 0x81
3677 #define EISA_INVALID_CONFIGURATION 0x82
3678 #define EISA_EMPTY_SLOT 0x83
3679 #define EISA_INVALID_BIOS_CALL 0x86
3680
3681 /*
3682 ** Plug and Play structures
3683 */
3684
3685 typedef VOID
3686 (NTAPI *PINTERFACE_REFERENCE)(
3687 PVOID Context);
3688
3689 typedef VOID
3690 (NTAPI *PINTERFACE_DEREFERENCE)(
3691 PVOID Context);
3692
3693 typedef BOOLEAN
3694 (NTAPI TRANSLATE_BUS_ADDRESS)(
3695 IN PVOID Context,
3696 IN PHYSICAL_ADDRESS BusAddress,
3697 IN ULONG Length,
3698 IN OUT PULONG AddressSpace,
3699 OUT PPHYSICAL_ADDRESS TranslatedAddress);
3700 typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
3701
3702 typedef struct _DMA_ADAPTER*
3703 (NTAPI GET_DMA_ADAPTER)(
3704 IN PVOID Context,
3705 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
3706 OUT PULONG NumberOfMapRegisters);
3707 typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
3708
3709 typedef ULONG
3710 (NTAPI GET_SET_DEVICE_DATA)(
3711 IN PVOID Context,
3712 IN ULONG DataType,
3713 IN PVOID Buffer,
3714 IN ULONG Offset,
3715 IN ULONG Length);
3716 typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
3717
3718 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
3719 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
3720 #define PCI_USE_REVISION 0x00000002
3721 #define PCI_USE_VENDEV_IDS 0x00000004
3722 #define PCI_USE_CLASS_SUBCLASS 0x00000008
3723 #define PCI_USE_PROGIF 0x00000010
3724 #define PCI_USE_LOCAL_BUS 0x00000020
3725 #define PCI_USE_LOCAL_DEVICE 0x00000040
3726
3727 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
3728 ULONG Size;
3729 ULONG Flags;
3730 USHORT VendorID;
3731 USHORT DeviceID;
3732 UCHAR RevisionID;
3733 USHORT SubVendorID;
3734 USHORT SubSystemID;
3735 UCHAR BaseClass;
3736 UCHAR SubClass;
3737 UCHAR ProgIf;
3738 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
3739
3740 typedef BOOLEAN
3741 (NTAPI PCI_IS_DEVICE_PRESENT)(
3742 IN USHORT VendorID,
3743 IN USHORT DeviceID,
3744 IN UCHAR RevisionID,
3745 IN USHORT SubVendorID,
3746 IN USHORT SubSystemID,
3747 IN ULONG Flags);
3748 typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
3749
3750 typedef BOOLEAN
3751 (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
3752 IN PVOID Context,
3753 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
3754 typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
3755
3756 typedef struct _BUS_INTERFACE_STANDARD {
3757 USHORT Size;
3758 USHORT Version;
3759 PVOID Context;
3760 PINTERFACE_REFERENCE InterfaceReference;
3761 PINTERFACE_DEREFERENCE InterfaceDereference;
3762 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
3763 PGET_DMA_ADAPTER GetDmaAdapter;
3764 PGET_SET_DEVICE_DATA SetBusData;
3765 PGET_SET_DEVICE_DATA GetBusData;
3766 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
3767
3768 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
3769 USHORT Size;
3770 USHORT Version;
3771 PVOID Context;
3772 PINTERFACE_REFERENCE InterfaceReference;
3773 PINTERFACE_DEREFERENCE InterfaceDereference;
3774 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
3775 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
3776 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
3777
3778 typedef
3779 BOOLEAN
3780 (*PGPE_SERVICE_ROUTINE2)(
3781 PVOID ObjectContext,
3782 PVOID ServiceContext
3783 );
3784
3785 typedef
3786 NTSTATUS
3787 (*PGPE_CONNECT_VECTOR2)(
3788 PVOID Context,
3789 ULONG GpeNumber,
3790 KINTERRUPT_MODE Mode,
3791 BOOLEAN Shareable,
3792 PGPE_SERVICE_ROUTINE2 ServiceRoutine,
3793 PVOID ServiceContext,
3794 PVOID *ObjectContext
3795 );
3796
3797 typedef
3798 NTSTATUS
3799 (*PGPE_DISCONNECT_VECTOR2)(
3800 PVOID Context,
3801 PVOID ObjectContext
3802 );
3803
3804 typedef
3805 NTSTATUS
3806 (*PGPE_ENABLE_EVENT2)(
3807 PVOID Context,
3808 PVOID ObjectContext
3809 );
3810
3811 typedef
3812 NTSTATUS
3813 (*PGPE_DISABLE_EVENT2)(
3814 PVOID Context,
3815 PVOID ObjectContext
3816 );
3817
3818 typedef
3819 NTSTATUS
3820 (*PGPE_CLEAR_STATUS2)(
3821 PVOID Context,
3822 PVOID ObjectContext
3823 );
3824
3825 typedef
3826 VOID
3827 (*PDEVICE_NOTIFY_CALLBACK2)(
3828 PVOID NotificationContext,
3829 ULONG NotifyCode
3830 );
3831
3832 typedef
3833 NTSTATUS
3834 (*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
3835 PVOID Context,
3836 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
3837 PVOID NotificationContext
3838 );
3839
3840 typedef
3841 VOID
3842 (*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
3843 PVOID Context
3844 );
3845
3846 typedef struct
3847 {
3848 USHORT Size;
3849 USHORT Version;
3850 PVOID Context;
3851 PINTERFACE_REFERENCE InterfaceReference;
3852 PINTERFACE_DEREFERENCE InterfaceDereference;
3853 PGPE_CONNECT_VECTOR2 GpeConnectVector;
3854 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
3855 PGPE_ENABLE_EVENT2 GpeEnableEvent;
3856 PGPE_DISABLE_EVENT2 GpeDisableEvent;
3857 PGPE_CLEAR_STATUS2 GpeClearStatus;
3858 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
3859 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
3860 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
3861
3862 typedef
3863 BOOLEAN
3864 (*PGPE_SERVICE_ROUTINE)(
3865 PDEVICE_OBJECT ObjectContext,
3866 PVOID ServiceContext
3867 );
3868
3869 typedef
3870 NTSTATUS
3871 (*PGPE_CONNECT_VECTOR)(
3872 PDEVICE_OBJECT Context,
3873 ULONG GpeNumber,
3874 KINTERRUPT_MODE Mode,
3875 BOOLEAN Shareable,
3876 PGPE_SERVICE_ROUTINE ServiceRoutine,
3877 PVOID ServiceContext,
3878 PVOID *ObjectContext
3879 );
3880
3881 typedef
3882 NTSTATUS
3883 (*PGPE_DISCONNECT_VECTOR)(
3884 PDEVICE_OBJECT Context,
3885 PVOID ObjectContext
3886 );
3887
3888 typedef
3889 NTSTATUS
3890 (*PGPE_ENABLE_EVENT)(
3891 PDEVICE_OBJECT Context,
3892 PVOID ObjectContext
3893 );
3894
3895 typedef
3896 NTSTATUS
3897 (*PGPE_DISABLE_EVENT)(
3898 PDEVICE_OBJECT Context,
3899 PVOID ObjectContext
3900 );
3901
3902 typedef
3903 NTSTATUS
3904 (*PGPE_CLEAR_STATUS)(
3905 PDEVICE_OBJECT Context,
3906 PVOID ObjectContext
3907 );
3908
3909 typedef
3910 VOID
3911 (*PDEVICE_NOTIFY_CALLBACK)(
3912 PVOID NotificationContext,
3913 ULONG NotifyCode
3914 );
3915
3916 typedef
3917 NTSTATUS
3918 (*PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
3919 PDEVICE_OBJECT Context,
3920 PDEVICE_NOTIFY_CALLBACK NotificationHandler,
3921 PVOID NotificationContext
3922 );
3923
3924 typedef
3925 VOID
3926 (*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
3927 PDEVICE_OBJECT Context,
3928 PDEVICE_NOTIFY_CALLBACK NotificationHandler
3929 );
3930
3931 typedef struct
3932 {
3933 USHORT Size;
3934 USHORT Version;
3935 PVOID Context;
3936 PINTERFACE_REFERENCE InterfaceReference;
3937 PINTERFACE_DEREFERENCE InterfaceDereference;
3938 PGPE_CONNECT_VECTOR GpeConnectVector;
3939 PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
3940 PGPE_ENABLE_EVENT GpeEnableEvent;
3941 PGPE_DISABLE_EVENT GpeDisableEvent;
3942 PGPE_CLEAR_STATUS GpeClearStatus;
3943 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
3944 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
3945 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
3946
3947 typedef struct _DEVICE_CAPABILITIES {
3948 USHORT Size;
3949 USHORT Version;
3950 ULONG DeviceD1 : 1;
3951 ULONG DeviceD2 : 1;
3952 ULONG LockSupported : 1;
3953 ULONG EjectSupported : 1;
3954 ULONG Removable : 1;
3955 ULONG DockDevice : 1;
3956 ULONG UniqueID : 1;
3957 ULONG SilentInstall : 1;
3958 ULONG RawDeviceOK : 1;
3959 ULONG SurpriseRemovalOK : 1;
3960 ULONG WakeFromD0 : 1;
3961 ULONG WakeFromD1 : 1;
3962 ULONG WakeFromD2 : 1;
3963 ULONG WakeFromD3 : 1;
3964 ULONG HardwareDisabled : 1;
3965 ULONG NonDynamic : 1;
3966 ULONG WarmEjectSupported : 1;
3967 ULONG NoDisplayInUI : 1;
3968 ULONG Reserved : 14;
3969 ULONG Address;
3970 ULONG UINumber;
3971 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
3972 SYSTEM_POWER_STATE SystemWake;
3973 DEVICE_POWER_STATE DeviceWake;
3974 ULONG D1Latency;
3975 ULONG D2Latency;
3976 ULONG D3Latency;
3977 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
3978
3979 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
3980 USHORT Version;
3981 USHORT Size;
3982 GUID Event;
3983 GUID InterfaceClassGuid;
3984 PUNICODE_STRING SymbolicLinkName;
3985 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
3986
3987 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
3988 USHORT Version;
3989 USHORT Size;
3990 GUID Event;
3991 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
3992
3993 #undef INTERFACE
3994
3995 typedef struct _INTERFACE {
3996 USHORT Size;
3997 USHORT Version;
3998 PVOID Context;
3999 PINTERFACE_REFERENCE InterfaceReference;
4000 PINTERFACE_DEREFERENCE InterfaceDereference;
4001 } INTERFACE, *PINTERFACE;
4002
4003 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
4004 USHORT Version;
4005 USHORT Size;
4006 GUID Event;
4007 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
4008
4009 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
4010
4011 /* PNP_DEVICE_STATE */
4012
4013 #define PNP_DEVICE_DISABLED 0x00000001
4014 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
4015 #define PNP_DEVICE_FAILED 0x00000004
4016 #define PNP_DEVICE_REMOVED 0x00000008
4017 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
4018 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
4019
4020 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
4021 USHORT Version;
4022 USHORT Size;
4023 GUID Event;
4024 struct _FILE_OBJECT *FileObject;
4025 LONG NameBufferOffset;
4026 UCHAR CustomDataBuffer[1];
4027 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
4028
4029 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
4030 USHORT Version;
4031 USHORT Size;
4032 GUID Event;
4033 struct _FILE_OBJECT *FileObject;
4034 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
4035
4036 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
4037 DeviceUsageTypeUndefined,
4038 DeviceUsageTypePaging,
4039 DeviceUsageTypeHibernation,
4040 DeviceUsageTypeDumpFile
4041 } DEVICE_USAGE_NOTIFICATION_TYPE;
4042
4043 typedef struct _POWER_SEQUENCE {
4044 ULONG SequenceD1;
4045 ULONG SequenceD2;
4046 ULONG SequenceD3;
4047 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
4048
4049 typedef enum {
4050 DevicePropertyDeviceDescription = 0x0,
4051 DevicePropertyHardwareID = 0x1,
4052 DevicePropertyCompatibleIDs = 0x2,
4053 DevicePropertyBootConfiguration = 0x3,
4054 DevicePropertyBootConfigurationTranslated = 0x4,
4055 DevicePropertyClassName = 0x5,
4056 DevicePropertyClassGuid = 0x6,
4057 DevicePropertyDriverKeyName = 0x7,
4058 DevicePropertyManufacturer = 0x8,
4059 DevicePropertyFriendlyName = 0x9,
4060 DevicePropertyLocationInformation = 0xa,
4061 DevicePropertyPhysicalDeviceObjectName = 0xb,
4062 DevicePropertyBusTypeGuid = 0xc,
4063 DevicePropertyLegacyBusType = 0xd,
4064 DevicePropertyBusNumber = 0xe,
4065 DevicePropertyEnumeratorName = 0xf,
4066 DevicePropertyAddress = 0x10,
4067 DevicePropertyUINumber = 0x11,
4068 DevicePropertyInstallState = 0x12,
4069 DevicePropertyRemovalPolicy = 0x13,
4070 DevicePropertyResourceRequirements = 0x14,
4071 DevicePropertyAllocatedResources = 0x15,
4072 DevicePropertyContainerID = 0x16
4073 } DEVICE_REGISTRY_PROPERTY;
4074
4075 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
4076 EventCategoryReserved,
4077 EventCategoryHardwareProfileChange,
4078 EventCategoryDeviceInterfaceChange,
4079 EventCategoryTargetDeviceChange
4080 } IO_NOTIFICATION_EVENT_CATEGORY;
4081
4082 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
4083
4084 typedef NTSTATUS
4085 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
4086 IN PVOID NotificationStructure,
4087 IN PVOID Context);
4088 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
4089
4090 typedef VOID
4091 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
4092 IN PVOID Context);
4093 typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
4094
4095 typedef enum _FILE_INFORMATION_CLASS {
4096 FileDirectoryInformation = 1,
4097 FileFullDirectoryInformation,
4098 FileBothDirectoryInformation,
4099 FileBasicInformation,
4100 FileStandardInformation,
4101 FileInternalInformation,
4102 FileEaInformation,
4103 FileAccessInformation,
4104 FileNameInformation,
4105 FileRenameInformation,
4106 FileLinkInformation,
4107 FileNamesInformation,
4108 FileDispositionInformation,
4109 FilePositionInformation,
4110 FileFullEaInformation,
4111 FileModeInformation,
4112 FileAlignmentInformation,
4113 FileAllInformation,
4114 FileAllocationInformation,
4115 FileEndOfFileInformation,
4116 FileAlternateNameInformation,
4117 FileStreamInformation,
4118 FilePipeInformation,
4119 FilePipeLocalInformation,
4120 FilePipeRemoteInformation,
4121 FileMailslotQueryInformation,
4122 FileMailslotSetInformation,
4123 FileCompressionInformation,
4124 FileObjectIdInformation,
4125 FileCompletionInformation,
4126 FileMoveClusterInformation,
4127 FileQuotaInformation,
4128 FileReparsePointInformation,
4129 FileNetworkOpenInformation,
4130 FileAttributeTagInformation,
4131 FileTrackingInformation,
4132 FileIdBothDirectoryInformation,
4133 FileIdFullDirectoryInformation,
4134 FileValidDataLengthInformation,
4135 FileShortNameInformation,
4136 FileIoCompletionNotificationInformation,
4137 FileIoStatusBlockRangeInformation,
4138 FileIoPriorityHintInformation,
4139 FileSfioReserveInformation,
4140 FileSfioVolumeInformation,
4141 FileHardLinkInformation,
4142 FileProcessIdsUsingFileInformation,
4143 FileNormalizedNameInformation,
4144 FileNetworkPhysicalNameInformation,
4145 FileIdGlobalTxDirectoryInformation,
4146 FileIsRemoteDeviceInformation,
4147 FileAttributeCacheInformation,
4148 FileNumaNodeInformation,
4149 FileStandardLinkInformation,
4150 FileRemoteProtocolInformation,
4151 FileMaximumInformation
4152 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
4153
4154 typedef struct _FILE_POSITION_INFORMATION {
4155 LARGE_INTEGER CurrentByteOffset;
4156 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
4157
4158 #include <pshpack8.h>
4159 typedef struct _FILE_BASIC_INFORMATION {
4160 LARGE_INTEGER CreationTime;
4161 LARGE_INTEGER LastAccessTime;
4162 LARGE_INTEGER LastWriteTime;
4163 LARGE_INTEGER ChangeTime;
4164 ULONG FileAttributes;
4165 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
4166 #include <poppack.h>
4167
4168 typedef struct _FILE_STANDARD_INFORMATION {
4169 LARGE_INTEGER AllocationSize;
4170 LARGE_INTEGER EndOfFile;
4171 ULONG NumberOfLinks;
4172 BOOLEAN DeletePending;
4173 BOOLEAN Directory;
4174 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
4175
4176 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
4177 LARGE_INTEGER CreationTime;
4178 LARGE_INTEGER LastAccessTime;
4179 LARGE_INTEGER LastWriteTime;
4180 LARGE_INTEGER ChangeTime;
4181 LARGE_INTEGER AllocationSize;
4182 LARGE_INTEGER EndOfFile;
4183 ULONG FileAttributes;
4184 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
4185
4186 typedef enum _FSINFOCLASS {
4187 FileFsVolumeInformation = 1,
4188 FileFsLabelInformation,
4189 FileFsSizeInformation,
4190 FileFsDeviceInformation,
4191 FileFsAttributeInformation,
4192 FileFsControlInformation,
4193 FileFsFullSizeInformation,
4194 FileFsObjectIdInformation,
4195 FileFsDriverPathInformation,
4196 FileFsVolumeFlagsInformation,
4197 FileFsMaximumInformation
4198 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
4199
4200 typedef struct _FILE_FS_DEVICE_INFORMATION {
4201 DEVICE_TYPE DeviceType;
4202 ULONG Characteristics;
4203 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
4204
4205 typedef struct _FILE_FULL_EA_INFORMATION {
4206 ULONG NextEntryOffset;
4207 UCHAR Flags;
4208 UCHAR EaNameLength;
4209 USHORT EaValueLength;
4210 CHAR EaName[1];
4211 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
4212
4213 #define FM_LOCK_BIT (0x1)
4214 #define FM_LOCK_BIT_V (0x0)
4215 #define FM_LOCK_WAITER_WOKEN (0x2)
4216 #define FM_LOCK_WAITER_INC (0x4)
4217
4218 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
4219
4220 typedef struct _OWNER_ENTRY {
4221 ERESOURCE_THREAD OwnerThread;
4222 _ANONYMOUS_UNION union {
4223 LONG OwnerCount;
4224 ULONG TableSize;
4225 } DUMMYUNIONNAME;
4226 } OWNER_ENTRY, *POWNER_ENTRY;
4227
4228 typedef struct _ERESOURCE
4229 {
4230 LIST_ENTRY SystemResourcesList;
4231 POWNER_ENTRY OwnerTable;
4232 SHORT ActiveCount;
4233 USHORT Flag;
4234 volatile PKSEMAPHORE SharedWaiters;
4235 volatile PKEVENT ExclusiveWaiters;
4236 OWNER_ENTRY OwnerEntry;
4237 ULONG ActiveEntries;
4238 ULONG ContentionCount;
4239 ULONG NumberOfSharedWaiters;
4240 ULONG NumberOfExclusiveWaiters;
4241 __GNU_EXTENSION union
4242 {
4243 PVOID Address;
4244 ULONG_PTR CreatorBackTraceIndex;
4245 };
4246 KSPIN_LOCK SpinLock;
4247 } ERESOURCE, *PERESOURCE;
4248
4249 /* ERESOURCE.Flag */
4250 #define ResourceNeverExclusive 0x0010
4251 #define ResourceReleaseByOtherThread 0x0020
4252 #define ResourceOwnedExclusive 0x0080
4253
4254 #define RESOURCE_HASH_TABLE_SIZE 64
4255
4256 typedef BOOLEAN
4257 (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
4258 IN struct _FILE_OBJECT *FileObject,
4259 IN PLARGE_INTEGER FileOffset,
4260 IN ULONG Length,
4261 IN BOOLEAN Wait,
4262 IN ULONG LockKey,
4263 IN BOOLEAN CheckForReadOperation,
4264 OUT PIO_STATUS_BLOCK IoStatus,
4265 IN struct _DEVICE_OBJECT *DeviceObject);
4266 typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
4267
4268 typedef BOOLEAN
4269 (NTAPI FAST_IO_READ)(
4270 IN struct _FILE_OBJECT *FileObject,
4271 IN PLARGE_INTEGER FileOffset,
4272 IN ULONG Length,
4273 IN BOOLEAN Wait,
4274 IN ULONG LockKey,
4275 OUT PVOID Buffer,
4276 OUT PIO_STATUS_BLOCK IoStatus,
4277 IN struct _DEVICE_OBJECT *DeviceObject);
4278 typedef FAST_IO_READ *PFAST_IO_READ;
4279
4280 typedef BOOLEAN
4281 (NTAPI FAST_IO_WRITE)(
4282 IN struct _FILE_OBJECT *FileObject,
4283 IN PLARGE_INTEGER FileOffset,
4284 IN ULONG Length,
4285 IN BOOLEAN Wait,
4286 IN ULONG LockKey,
4287 IN PVOID Buffer,
4288 OUT PIO_STATUS_BLOCK IoStatus,
4289 IN struct _DEVICE_OBJECT *DeviceObject);
4290 typedef FAST_IO_WRITE *PFAST_IO_WRITE;
4291
4292 typedef BOOLEAN
4293 (NTAPI FAST_IO_QUERY_BASIC_INFO)(
4294 IN struct _FILE_OBJECT *FileObject,
4295 IN BOOLEAN Wait,
4296 OUT PFILE_BASIC_INFORMATION Buffer,
4297 OUT PIO_STATUS_BLOCK IoStatus,
4298 IN struct _DEVICE_OBJECT *DeviceObject);
4299 typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
4300
4301 typedef BOOLEAN
4302 (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
4303 IN struct _FILE_OBJECT *FileObject,
4304 IN BOOLEAN Wait,
4305 OUT PFILE_STANDARD_INFORMATION Buffer,
4306 OUT PIO_STATUS_BLOCK IoStatus,
4307 IN struct _DEVICE_OBJECT *DeviceObject);
4308 typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
4309
4310 typedef BOOLEAN
4311 (NTAPI FAST_IO_LOCK)(
4312 IN struct _FILE_OBJECT *FileObject,
4313 IN PLARGE_INTEGER FileOffset,
4314 IN PLARGE_INTEGER Length,
4315 PEPROCESS ProcessId,
4316 ULONG Key,
4317 BOOLEAN FailImmediately,
4318 BOOLEAN ExclusiveLock,
4319 OUT PIO_STATUS_BLOCK IoStatus,
4320 IN struct _DEVICE_OBJECT *DeviceObject);
4321 typedef FAST_IO_LOCK *PFAST_IO_LOCK;
4322
4323 typedef BOOLEAN
4324 (NTAPI FAST_IO_UNLOCK_SINGLE)(
4325 IN struct _FILE_OBJECT *FileObject,
4326 IN PLARGE_INTEGER FileOffset,
4327 IN PLARGE_INTEGER Length,
4328 PEPROCESS ProcessId,
4329 ULONG Key,
4330 OUT PIO_STATUS_BLOCK IoStatus,
4331 IN struct _DEVICE_OBJECT *DeviceObject);
4332 typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
4333
4334 typedef BOOLEAN
4335 (NTAPI FAST_IO_UNLOCK_ALL)(
4336 IN struct _FILE_OBJECT *FileObject,
4337 PEPROCESS ProcessId,
4338 OUT PIO_STATUS_BLOCK IoStatus,
4339 IN struct _DEVICE_OBJECT *DeviceObject);
4340 typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
4341
4342 typedef BOOLEAN
4343 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
4344 IN struct _FILE_OBJECT *FileObject,
4345 PVOID ProcessId,
4346 ULONG Key,
4347 OUT PIO_STATUS_BLOCK IoStatus,
4348 IN struct _DEVICE_OBJECT *DeviceObject);
4349 typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
4350
4351 typedef BOOLEAN
4352 (NTAPI FAST_IO_DEVICE_CONTROL)(
4353 IN struct _FILE_OBJECT *FileObject,
4354 IN BOOLEAN Wait,
4355 IN PVOID InputBuffer OPTIONAL,
4356 IN ULONG InputBufferLength,
4357 OUT PVOID OutputBuffer OPTIONAL,
4358 IN ULONG OutputBufferLength,
4359 IN ULONG IoControlCode,
4360 OUT PIO_STATUS_BLOCK IoStatus,
4361 IN struct _DEVICE_OBJECT *DeviceObject);
4362 typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
4363
4364 typedef VOID
4365 (NTAPI FAST_IO_ACQUIRE_FILE)(
4366 IN struct _FILE_OBJECT *FileObject);
4367 typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
4368
4369 typedef VOID
4370 (NTAPI FAST_IO_RELEASE_FILE)(
4371 IN struct _FILE_OBJECT *FileObject);
4372 typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
4373
4374 typedef VOID
4375 (NTAPI FAST_IO_DETACH_DEVICE)(
4376 IN struct _DEVICE_OBJECT *SourceDevice,
4377 IN struct _DEVICE_OBJECT *TargetDevice);
4378 typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
4379
4380 typedef BOOLEAN
4381 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
4382 IN struct _FILE_OBJECT *FileObject,
4383 IN BOOLEAN Wait,
4384 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
4385 OUT struct _IO_STATUS_BLOCK *IoStatus,
4386 IN struct _DEVICE_OBJECT *DeviceObject);
4387 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
4388
4389 typedef NTSTATUS
4390 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
4391 IN struct _FILE_OBJECT *FileObject,
4392 IN PLARGE_INTEGER EndingOffset,
4393 OUT struct _ERESOURCE **ResourceToRelease,
4394 IN struct _DEVICE_OBJECT *DeviceObject);
4395 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
4396
4397 typedef BOOLEAN
4398 (NTAPI FAST_IO_MDL_READ)(
4399 IN struct _FILE_OBJECT *FileObject,
4400 IN PLARGE_INTEGER FileOffset,
4401 IN ULONG Length,
4402 IN ULONG LockKey,
4403 OUT PMDL *MdlChain,
4404 OUT PIO_STATUS_BLOCK IoStatus,
4405 IN struct _DEVICE_OBJECT *DeviceObject);
4406 typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
4407
4408 typedef BOOLEAN
4409 (NTAPI FAST_IO_MDL_READ_COMPLETE)(
4410 IN struct _FILE_OBJECT *FileObject,
4411 IN PMDL MdlChain,
4412 IN struct _DEVICE_OBJECT *DeviceObject);
4413 typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
4414
4415 typedef BOOLEAN
4416 (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
4417 IN struct _FILE_OBJECT *FileObject,
4418 IN PLARGE_INTEGER FileOffset,
4419 IN ULONG Length,
4420 IN ULONG LockKey,
4421 OUT PMDL *MdlChain,
4422 OUT PIO_STATUS_BLOCK IoStatus,
4423 IN struct _DEVICE_OBJECT *DeviceObject);
4424 typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
4425
4426 typedef BOOLEAN
4427 (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
4428 IN struct _FILE_OBJECT *FileObject,
4429 IN PLARGE_INTEGER FileOffset,
4430 IN PMDL MdlChain,
4431 IN struct _DEVICE_OBJECT *DeviceObject);
4432 typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
4433
4434 typedef BOOLEAN
4435 (NTAPI FAST_IO_READ_COMPRESSED)(
4436 IN struct _FILE_OBJECT *FileObject,
4437 IN PLARGE_INTEGER FileOffset,
4438 IN ULONG Length,
4439 IN ULONG LockKey,
4440 OUT PVOID Buffer,
4441 OUT PMDL *MdlChain,
4442 OUT PIO_STATUS_BLOCK IoStatus,
4443 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
4444 IN ULONG CompressedDataInfoLength,
4445 IN struct _DEVICE_OBJECT *DeviceObject);
4446 typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
4447
4448 typedef BOOLEAN
4449 (NTAPI FAST_IO_WRITE_COMPRESSED)(
4450 IN struct _FILE_OBJECT *FileObject,
4451 IN PLARGE_INTEGER FileOffset,
4452 IN ULONG Length,
4453 IN ULONG LockKey,
4454 IN PVOID Buffer,
4455 OUT PMDL *MdlChain,
4456 OUT PIO_STATUS_BLOCK IoStatus,
4457 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
4458 IN ULONG CompressedDataInfoLength,
4459 IN struct _DEVICE_OBJECT *DeviceObject);
4460 typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
4461
4462 typedef BOOLEAN
4463 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
4464 IN struct _FILE_OBJECT *FileObject,
4465 IN PMDL MdlChain,
4466 IN struct _DEVICE_OBJECT *DeviceObject);
4467 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
4468
4469 typedef BOOLEAN
4470 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
4471 IN struct _FILE_OBJECT *FileObject,
4472 IN PLARGE_INTEGER FileOffset,
4473 IN PMDL MdlChain,
4474 IN struct _DEVICE_OBJECT *DeviceObject);
4475 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
4476
4477 typedef BOOLEAN
4478 (NTAPI FAST_IO_QUERY_OPEN)(
4479 IN struct _IRP *Irp,
4480 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
4481 IN struct _DEVICE_OBJECT *DeviceObject);
4482 typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
4483
4484 typedef NTSTATUS
4485 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
4486 IN struct _FILE_OBJECT *FileObject,
4487 IN struct _ERESOURCE *ResourceToRelease,
4488 IN struct _DEVICE_OBJECT *DeviceObject);
4489 typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
4490
4491 typedef NTSTATUS
4492 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
4493 IN struct _FILE_OBJECT *FileObject,
4494 IN struct _DEVICE_OBJECT *DeviceObject);
4495 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
4496
4497 typedef NTSTATUS
4498 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
4499 IN struct _FILE_OBJECT *FileObject,
4500 IN struct _DEVICE_OBJECT *DeviceObject);
4501 typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
4502
4503 typedef struct _FAST_IO_DISPATCH {
4504 ULONG SizeOfFastIoDispatch;
4505 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
4506 PFAST_IO_READ FastIoRead;
4507 PFAST_IO_WRITE FastIoWrite;
4508 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
4509 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
4510 PFAST_IO_LOCK FastIoLock;
4511 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
4512 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
4513 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
4514 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
4515 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
4516 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
4517 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
4518 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
4519 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
4520 PFAST_IO_MDL_READ MdlRead;
4521 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
4522 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
4523 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
4524 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
4525 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
4526 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
4527 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
4528 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
4529 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
4530 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
4531 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
4532 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
4533
4534 typedef struct _SECTION_OBJECT_POINTERS {
4535 PVOID DataSectionObject;
4536 PVOID SharedCacheMap;
4537 PVOID ImageSectionObject;
4538 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
4539
4540 typedef struct _IO_COMPLETION_CONTEXT {
4541 PVOID Port;
4542 PVOID Key;
4543 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
4544
4545 /* FILE_OBJECT.Flags */
4546 #define FO_FILE_OPEN 0x00000001
4547 #define FO_SYNCHRONOUS_IO 0x00000002
4548 #define FO_ALERTABLE_IO 0x00000004
4549 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
4550 #define FO_WRITE_THROUGH 0x00000010
4551 #define FO_SEQUENTIAL_ONLY 0x00000020
4552 #define FO_CACHE_SUPPORTED 0x00000040
4553 #define FO_NAMED_PIPE 0x00000080
4554 #define FO_STREAM_FILE 0x00000100
4555 #define FO_MAILSLOT 0x00000200
4556 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
4557 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
4558 #define FO_DIRECT_DEVICE_OPEN 0x00000800
4559 #define FO_FILE_MODIFIED 0x00001000
4560 #define FO_FILE_SIZE_CHANGED 0x00002000
4561 #define FO_CLEANUP_COMPLETE 0x00004000
4562 #define FO_TEMPORARY_FILE 0x00008000
4563 #define FO_DELETE_ON_CLOSE 0x00010000
4564 #define FO_OPENED_CASE_SENSITIVE 0x00020000
4565 #define FO_HANDLE_CREATED 0x00040000
4566 #define FO_FILE_FAST_IO_READ 0x00080000
4567 #define FO_RANDOM_ACCESS 0x00100000
4568 #define FO_FILE_OPEN_CANCELLED 0x00200000
4569 #define FO_VOLUME_OPEN 0x00400000
4570 #define FO_REMOTE_ORIGIN 0x01000000
4571 #define FO_DISALLOW_EXCLUSIVE 0x02000000
4572 #define FO_SKIP_COMPLETION_PORT 0x02000000
4573 #define FO_SKIP_SET_EVENT 0x04000000
4574 #define FO_SKIP_SET_FAST_IO 0x08000000
4575 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
4576
4577 /* VPB.Flags */
4578 #define VPB_MOUNTED 0x0001
4579 #define VPB_LOCKED 0x0002
4580 #define VPB_PERSISTENT 0x0004
4581 #define VPB_REMOVE_PENDING 0x0008
4582 #define VPB_RAW_MOUNT 0x0010
4583 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
4584
4585 /* IRP.Flags */
4586
4587 #define SL_FORCE_ACCESS_CHECK 0x01
4588 #define SL_OPEN_PAGING_FILE 0x02
4589 #define SL_OPEN_TARGET_DIRECTORY 0x04
4590 #define SL_STOP_ON_SYMLINK 0x08
4591 #define SL_CASE_SENSITIVE 0x80
4592
4593 #define SL_KEY_SPECIFIED 0x01
4594 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
4595 #define SL_WRITE_THROUGH 0x04
4596 #define SL_FT_SEQUENTIAL_WRITE 0x08
4597 #define SL_FORCE_DIRECT_WRITE 0x10
4598 #define SL_REALTIME_STREAM 0x20
4599
4600 #define SL_READ_ACCESS_GRANTED 0x01
4601 #define SL_WRITE_ACCESS_GRANTED 0x04
4602
4603 #define SL_FAIL_IMMEDIATELY 0x01
4604 #define SL_EXCLUSIVE_LOCK 0x02
4605
4606 #define SL_RESTART_SCAN 0x01
4607 #define SL_RETURN_SINGLE_ENTRY 0x02
4608 #define SL_INDEX_SPECIFIED 0x04
4609
4610 #define SL_WATCH_TREE 0x01
4611
4612 #define SL_ALLOW_RAW_MOUNT 0x01
4613
4614 #define CTL_CODE(DeviceType, Function, Method, Access) \
4615 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
4616
4617 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
4618
4619 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
4620
4621 #define IRP_NOCACHE 0x00000001
4622 #define IRP_PAGING_IO 0x00000002
4623 #define IRP_MOUNT_COMPLETION 0x00000002
4624 #define IRP_SYNCHRONOUS_API 0x00000004
4625 #define IRP_ASSOCIATED_IRP 0x00000008
4626 #define IRP_BUFFERED_IO 0x00000010
4627 #define IRP_DEALLOCATE_BUFFER 0x00000020
4628 #define IRP_INPUT_OPERATION 0x00000040
4629 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
4630 #define IRP_CREATE_OPERATION 0x00000080
4631 #define IRP_READ_OPERATION 0x00000100
4632 #define IRP_WRITE_OPERATION 0x00000200
4633 #define IRP_CLOSE_OPERATION 0x00000400
4634 #define IRP_DEFER_IO_COMPLETION 0x00000800
4635 #define IRP_OB_QUERY_NAME 0x00001000
4636 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
4637
4638 #define IRP_QUOTA_CHARGED 0x01
4639 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
4640 #define IRP_ALLOCATED_FIXED_SIZE 0x04
4641 #define IRP_LOOKASIDE_ALLOCATION 0x08
4642
4643 /*
4644 ** IRP function codes
4645 */
4646
4647 #define IRP_MJ_CREATE 0x00
4648 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
4649 #define IRP_MJ_CLOSE 0x02
4650 #define IRP_MJ_READ 0x03
4651 #define IRP_MJ_WRITE 0x04
4652 #define IRP_MJ_QUERY_INFORMATION 0x05
4653 #define IRP_MJ_SET_INFORMATION 0x06
4654 #define IRP_MJ_QUERY_EA 0x07
4655 #define IRP_MJ_SET_EA 0x08
4656 #define IRP_MJ_FLUSH_BUFFERS 0x09
4657 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
4658 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
4659 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
4660 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
4661 #define IRP_MJ_DEVICE_CONTROL 0x0e
4662 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
4663 #define IRP_MJ_SCSI 0x0f
4664 #define IRP_MJ_SHUTDOWN 0x10
4665 #define IRP_MJ_LOCK_CONTROL 0x11
4666 #define IRP_MJ_CLEANUP 0x12
4667 #define IRP_MJ_CREATE_MAILSLOT 0x13
4668 #define IRP_MJ_QUERY_SECURITY 0x14
4669 #define IRP_MJ_SET_SECURITY 0x15
4670 #define IRP_MJ_POWER 0x16
4671 #define IRP_MJ_SYSTEM_CONTROL 0x17
4672 #define IRP_MJ_DEVICE_CHANGE 0x18
4673 #define IRP_MJ_QUERY_QUOTA 0x19
4674 #define IRP_MJ_SET_QUOTA 0x1a
4675 #define IRP_MJ_PNP 0x1b
4676 #define IRP_MJ_PNP_POWER 0x1b
4677 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
4678
4679 #define IRP_MN_SCSI_CLASS 0x01
4680
4681 #define IRP_MN_START_DEVICE 0x00
4682 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
4683 #define IRP_MN_REMOVE_DEVICE 0x02
4684 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
4685 #define IRP_MN_STOP_DEVICE 0x04
4686 #define IRP_MN_QUERY_STOP_DEVICE 0x05
4687 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
4688
4689 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
4690 #define IRP_MN_QUERY_INTERFACE 0x08
4691 #define IRP_MN_QUERY_CAPABILITIES 0x09
4692 #define IRP_MN_QUERY_RESOURCES 0x0A
4693 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
4694 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
4695 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
4696
4697 #define IRP_MN_READ_CONFIG 0x0F
4698 #define IRP_MN_WRITE_CONFIG 0x10
4699 #define IRP_MN_EJECT 0x11
4700 #define IRP_MN_SET_LOCK 0x12
4701 #define IRP_MN_QUERY_ID 0x13
4702 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
4703 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
4704 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
4705 #define IRP_MN_SURPRISE_REMOVAL 0x17
4706 #if (NTDDI_VERSION >= NTDDI_WIN7)
4707 #define IRP_MN_DEVICE_ENUMERATED 0x19
4708 #endif
4709
4710 #define IRP_MN_WAIT_WAKE 0x00
4711 #define IRP_MN_POWER_SEQUENCE 0x01
4712 #define IRP_MN_SET_POWER 0x02
4713 #define IRP_MN_QUERY_POWER 0x03
4714
4715 #define IRP_MN_QUERY_ALL_DATA 0x00
4716 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
4717 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
4718 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
4719 #define IRP_MN_ENABLE_EVENTS 0x04
4720 #define IRP_MN_DISABLE_EVENTS 0x05
4721 #define IRP_MN_ENABLE_COLLECTION 0x06
4722 #define IRP_MN_DISABLE_COLLECTION 0x07
4723 #define IRP_MN_REGINFO 0x08
4724 #define IRP_MN_EXECUTE_METHOD 0x09
4725
4726 #define IRP_MN_REGINFO_EX 0x0b
4727
4728 typedef struct _FILE_OBJECT {
4729 CSHORT Type;
4730 CSHORT Size;
4731 PDEVICE_OBJECT DeviceObject;
4732 PVPB Vpb;
4733 PVOID FsContext;
4734 PVOID FsContext2;
4735 PSECTION_OBJECT_POINTERS SectionObjectPointer;
4736 PVOID PrivateCacheMap;
4737 NTSTATUS FinalStatus;
4738 struct _FILE_OBJECT *RelatedFileObject;
4739 BOOLEAN LockOperation;
4740 BOOLEAN DeletePending;
4741 BOOLEAN ReadAccess;
4742 BOOLEAN WriteAccess;
4743 BOOLEAN DeleteAccess;
4744 BOOLEAN SharedRead;
4745 BOOLEAN SharedWrite;
4746 BOOLEAN SharedDelete;
4747 ULONG Flags;
4748 UNICODE_STRING FileName;
4749 LARGE_INTEGER CurrentByteOffset;
4750 volatile ULONG Waiters;
4751 volatile ULONG Busy;
4752 PVOID LastLock;
4753 KEVENT Lock;
4754 KEVENT Event;
4755 volatile PIO_COMPLETION_CONTEXT CompletionContext;
4756 KSPIN_LOCK IrpListLock;
4757 LIST_ENTRY IrpList;
4758 volatile PVOID FileObjectExtension;
4759 } FILE_OBJECT, *PFILE_OBJECT;
4760
4761 typedef struct _IO_ERROR_LOG_PACKET {
4762 UCHAR MajorFunctionCode;
4763 UCHAR RetryCount;
4764 USHORT DumpDataSize;
4765 USHORT NumberOfStrings;
4766 USHORT StringOffset;
4767 USHORT EventCategory;
4768 NTSTATUS ErrorCode;
4769 ULONG UniqueErrorValue;
4770 NTSTATUS FinalStatus;
4771 ULONG SequenceNumber;
4772 ULONG IoControlCode;
4773 LARGE_INTEGER DeviceOffset;
4774 ULONG DumpData[1];
4775 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
4776
4777 typedef struct _IO_ERROR_LOG_MESSAGE {
4778 USHORT Type;
4779 USHORT Size;
4780 USHORT DriverNameLength;
4781 LARGE_INTEGER TimeStamp;
4782 ULONG DriverNameOffset;
4783 IO_ERROR_LOG_PACKET EntryData;
4784 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
4785
4786 #define ERROR_LOG_LIMIT_SIZE 240
4787 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
4788 sizeof(IO_ERROR_LOG_PACKET) + \
4789 (sizeof(WCHAR) * 40))
4790 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
4791 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
4792 #define IO_ERROR_LOG_MESSAGE_LENGTH \
4793 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
4794 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
4795 PORT_MAXIMUM_MESSAGE_LENGTH)
4796 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
4797 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
4798
4799 typedef enum _DMA_WIDTH {
4800 Width8Bits,
4801 Width16Bits,
4802 Width32Bits,
4803 MaximumDmaWidth
4804 } DMA_WIDTH, *PDMA_WIDTH;
4805
4806 typedef enum _DMA_SPEED {
4807 Compatible,
4808 TypeA,
4809 TypeB,
4810 TypeC,
4811 TypeF,
4812 MaximumDmaSpeed
4813 } DMA_SPEED, *PDMA_SPEED;
4814
4815 /* DEVICE_DESCRIPTION.Version */
4816
4817 #define DEVICE_DESCRIPTION_VERSION 0x0000
4818 #define DEVICE_DESCRIPTION_VERSION1 0x0001
4819 #define DEVICE_DESCRIPTION_VERSION2 0x0002
4820
4821 typedef struct _DEVICE_DESCRIPTION {
4822 ULONG Version;
4823 BOOLEAN Master;
4824 BOOLEAN ScatterGather;
4825 BOOLEAN DemandMode;
4826 BOOLEAN AutoInitialize;
4827 BOOLEAN Dma32BitAddresses;
4828 BOOLEAN IgnoreCount;
4829 BOOLEAN Reserved1;
4830 BOOLEAN Dma64BitAddresses;
4831 ULONG BusNumber;
4832 ULONG DmaChannel;
4833 INTERFACE_TYPE InterfaceType;
4834 DMA_WIDTH DmaWidth;
4835 DMA_SPEED DmaSpeed;
4836 ULONG MaximumLength;
4837 ULONG DmaPort;
4838 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
4839
4840 typedef enum _DEVICE_RELATION_TYPE {
4841 BusRelations,
4842 EjectionRelations,
4843 PowerRelations,
4844 RemovalRelations,
4845 TargetDeviceRelation,
4846 SingleBusRelations,
4847 TransportRelations
4848 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
4849
4850 typedef struct _DEVICE_RELATIONS {
4851 ULONG Count;
4852 PDEVICE_OBJECT Objects[1];
4853 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
4854
4855 typedef struct _DEVOBJ_EXTENSION {
4856 CSHORT Type;
4857 USHORT Size;
4858 PDEVICE_OBJECT DeviceObject;
4859 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
4860
4861 typedef struct _SCATTER_GATHER_ELEMENT {
4862 PHYSICAL_ADDRESS Address;
4863 ULONG Length;
4864 ULONG_PTR Reserved;
4865 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
4866
4867 #if defined(_MSC_EXTENSIONS)
4868
4869 #if _MSC_VER >= 1200
4870 #pragma warning(push)
4871 #endif
4872 #pragma warning(disable:4200)
4873 typedef struct _SCATTER_GATHER_LIST {
4874 ULONG NumberOfElements;
4875 ULONG_PTR Reserved;
4876 SCATTER_GATHER_ELEMENT Elements[1];
4877 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
4878
4879 #if _MSC_VER >= 1200
4880 #pragma warning(pop)
4881 #else
4882 #pragma warning(default:4200)
4883 #endif
4884
4885 #else
4886
4887 struct _SCATTER_GATHER_LIST;
4888 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
4889
4890 #endif
4891
4892 typedef NTSTATUS
4893 (NTAPI DRIVER_ADD_DEVICE)(
4894 IN struct _DRIVER_OBJECT *DriverObject,
4895 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
4896 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
4897
4898 typedef struct _DRIVER_EXTENSION {
4899 struct _DRIVER_OBJECT *DriverObject;
4900 PDRIVER_ADD_DEVICE AddDevice;
4901 ULONG Count;
4902 UNICODE_STRING ServiceKeyName;
4903 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
4904
4905 #define DRVO_UNLOAD_INVOKED 0x00000001
4906 #define DRVO_LEGACY_DRIVER 0x00000002
4907 #define DRVO_BUILTIN_DRIVER 0x00000004
4908
4909 typedef NTSTATUS
4910 (NTAPI DRIVER_INITIALIZE)(
4911 IN struct _DRIVER_OBJECT *DriverObject,
4912 IN PUNICODE_STRING RegistryPath);
4913 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
4914
4915 typedef VOID
4916 (NTAPI DRIVER_STARTIO)(
4917 IN struct _DEVICE_OBJECT *DeviceObject,
4918 IN struct _IRP *Irp);
4919 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
4920
4921 typedef VOID
4922 (NTAPI DRIVER_UNLOAD)(
4923 IN struct _DRIVER_OBJECT *DriverObject);
4924 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
4925
4926 typedef NTSTATUS
4927 (NTAPI DRIVER_DISPATCH)(
4928 IN struct _DEVICE_OBJECT *DeviceObject,
4929 IN struct _IRP *Irp);
4930 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
4931
4932 typedef struct _DRIVER_OBJECT {
4933 CSHORT Type;
4934 CSHORT Size;
4935 PDEVICE_OBJECT DeviceObject;
4936 ULONG Flags;
4937 PVOID DriverStart;
4938 ULONG DriverSize;
4939 PVOID DriverSection;
4940 PDRIVER_EXTENSION DriverExtension;
4941 UNICODE_STRING DriverName;
4942 PUNICODE_STRING HardwareDatabase;
4943 struct _FAST_IO_DISPATCH *FastIoDispatch;
4944 PDRIVER_INITIALIZE DriverInit;
4945 PDRIVER_STARTIO DriverStartIo;
4946 PDRIVER_UNLOAD DriverUnload;
4947 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
4948 } DRIVER_OBJECT, *PDRIVER_OBJECT;
4949
4950 typedef struct _DMA_ADAPTER {
4951 USHORT Version;
4952 USHORT Size;
4953 struct _DMA_OPERATIONS* DmaOperations;
4954 } DMA_ADAPTER, *PDMA_ADAPTER;
4955
4956 typedef VOID
4957 (NTAPI *PPUT_DMA_ADAPTER)(
4958 IN PDMA_ADAPTER DmaAdapter);
4959
4960 typedef PVOID
4961 (NTAPI *PALLOCATE_COMMON_BUFFER)(
4962 IN PDMA_ADAPTER DmaAdapter,
4963 IN ULONG Length,
4964 OUT PPHYSICAL_ADDRESS LogicalAddress,
4965 IN BOOLEAN CacheEnabled);
4966
4967 typedef VOID
4968 (NTAPI *PFREE_COMMON_BUFFER)(
4969 IN PDMA_ADAPTER DmaAdapter,
4970 IN ULONG Length,
4971 IN PHYSICAL_ADDRESS LogicalAddress,
4972 IN PVOID VirtualAddress,
4973 IN BOOLEAN CacheEnabled);
4974
4975 typedef NTSTATUS
4976 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
4977 IN PDMA_ADAPTER DmaAdapter,
4978 IN PDEVICE_OBJECT DeviceObject,
4979 IN ULONG NumberOfMapRegisters,
4980 IN PDRIVER_CONTROL ExecutionRoutine,
4981 IN PVOID Context);
4982
4983 typedef BOOLEAN
4984 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
4985 IN PDMA_ADAPTER DmaAdapter,
4986 IN PMDL Mdl,
4987 IN PVOID MapRegisterBase,
4988 IN PVOID CurrentVa,
4989 IN ULONG Length,
4990 IN BOOLEAN WriteToDevice);
4991
4992 typedef VOID
4993 (NTAPI *PFREE_ADAPTER_CHANNEL)(
4994 IN PDMA_ADAPTER DmaAdapter);
4995
4996 typedef VOID
4997 (NTAPI *PFREE_MAP_REGISTERS)(
4998 IN PDMA_ADAPTER DmaAdapter,
4999 PVOID MapRegisterBase,
5000 ULONG NumberOfMapRegisters);
5001
5002 typedef PHYSICAL_ADDRESS
5003 (NTAPI *PMAP_TRANSFER)(
5004 IN PDMA_ADAPTER DmaAdapter,
5005 IN PMDL Mdl,
5006 IN PVOID MapRegisterBase,
5007 IN PVOID CurrentVa,
5008 IN OUT PULONG Length,
5009 IN BOOLEAN WriteToDevice);
5010
5011 typedef ULONG
5012 (NTAPI *PGET_DMA_ALIGNMENT)(
5013 IN PDMA_ADAPTER DmaAdapter);
5014
5015 typedef ULONG
5016 (NTAPI *PREAD_DMA_COUNTER)(
5017 IN PDMA_ADAPTER DmaAdapter);
5018
5019 typedef VOID
5020 (NTAPI DRIVER_LIST_CONTROL)(
5021 IN struct _DEVICE_OBJECT *DeviceObject,
5022 IN struct _IRP *Irp,
5023 IN struct _SCATTER_GATHER_LIST *ScatterGather,
5024 IN PVOID Context);
5025 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
5026
5027 typedef NTSTATUS
5028 (NTAPI *PGET_SCATTER_GATHER_LIST)(
5029 IN PDMA_ADAPTER DmaAdapter,
5030 IN PDEVICE_OBJECT DeviceObject,
5031 IN PMDL Mdl,
5032 IN PVOID CurrentVa,
5033 IN ULONG Length,
5034 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
5035 IN PVOID Context,
5036 IN BOOLEAN WriteToDevice);
5037
5038 typedef VOID
5039 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
5040 IN PDMA_ADAPTER DmaAdapter,
5041 IN PSCATTER_GATHER_LIST ScatterGather,
5042 IN BOOLEAN WriteToDevice);
5043
5044 typedef NTSTATUS
5045 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
5046 IN PDMA_ADAPTER DmaAdapter,
5047 IN PMDL Mdl OPTIONAL,
5048 IN PVOID CurrentVa,
5049 IN ULONG Length,
5050 OUT PULONG ScatterGatherListSize,
5051 OUT PULONG pNumberOfMapRegisters OPTIONAL);
5052
5053 typedef NTSTATUS
5054 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
5055 IN PDMA_ADAPTER DmaAdapter,
5056 IN PDEVICE_OBJECT DeviceObject,
5057 IN PMDL Mdl,
5058 IN PVOID CurrentVa,
5059 IN ULONG Length,
5060 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
5061 IN PVOID Context,
5062 IN BOOLEAN WriteToDevice,
5063 IN PVOID ScatterGatherBuffer,
5064 IN ULONG ScatterGatherLength);
5065
5066 typedef NTSTATUS
5067 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
5068 IN PDMA_ADAPTER DmaAdapter,
5069 IN PSCATTER_GATHER_LIST ScatterGather,
5070 IN PMDL OriginalMdl,
5071 OUT PMDL *TargetMdl);
5072
5073 typedef struct _DMA_OPERATIONS {
5074 ULONG Size;
5075 PPUT_DMA_ADAPTER PutDmaAdapter;
5076 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
5077 PFREE_COMMON_BUFFER FreeCommonBuffer;
5078 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
5079 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
5080 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
5081 PFREE_MAP_REGISTERS FreeMapRegisters;
5082 PMAP_TRANSFER MapTransfer;
5083 PGET_DMA_ALIGNMENT GetDmaAlignment;
5084 PREAD_DMA_COUNTER ReadDmaCounter;
5085 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
5086 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
5087 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
5088 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
5089 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
5090 } DMA_OPERATIONS, *PDMA_OPERATIONS;
5091
5092 typedef struct _IO_RESOURCE_DESCRIPTOR {
5093 UCHAR Option;
5094 UCHAR Type;
5095 UCHAR ShareDisposition;
5096 UCHAR Spare1;
5097 USHORT Flags;
5098 USHORT Spare2;
5099 union {
5100 struct {
5101 ULONG Length;
5102 ULONG Alignment;
5103 PHYSICAL_ADDRESS MinimumAddress;
5104 PHYSICAL_ADDRESS MaximumAddress;
5105 } Port;
5106 struct {
5107 ULONG Length;
5108 ULONG Alignment;
5109 PHYSICAL_ADDRESS MinimumAddress;
5110 PHYSICAL_ADDRESS MaximumAddress;
5111 } Memory;
5112 struct {
5113 ULONG MinimumVector;
5114 ULONG MaximumVector;
5115 } Interrupt;
5116 struct {
5117 ULONG MinimumChannel;
5118 ULONG MaximumChannel;
5119 } Dma;
5120 struct {
5121 ULONG Length;
5122 ULONG Alignment;
5123 PHYSICAL_ADDRESS MinimumAddress;
5124 PHYSICAL_ADDRESS MaximumAddress;
5125 } Generic;
5126 struct {
5127 ULONG Data[3];
5128 } DevicePrivate;
5129 struct {
5130 ULONG Length;
5131 ULONG MinBusNumber;
5132 ULONG MaxBusNumber;
5133 ULONG Reserved;
5134 } BusNumber;
5135 struct {
5136 ULONG Priority;
5137 ULONG Reserved1;
5138 ULONG Reserved2;
5139 } ConfigData;
5140 } u;
5141 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
5142
5143 typedef struct _IO_RESOURCE_LIST {
5144 USHORT Version;
5145 USHORT Revision;
5146 ULONG Count;
5147 IO_RESOURCE_DESCRIPTOR Descriptors[1];
5148 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
5149
5150 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
5151 ULONG ListSize;
5152 INTERFACE_TYPE InterfaceType;
5153 ULONG BusNumber;
5154 ULONG SlotNumber;
5155 ULONG Reserved[3];
5156 ULONG AlternativeLists;
5157 IO_RESOURCE_LIST List[1];
5158 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
5159
5160 typedef VOID
5161 (NTAPI DRIVER_CANCEL)(
5162 IN struct _DEVICE_OBJECT *DeviceObject,
5163 IN struct _IRP *Irp);
5164 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
5165
5166 typedef struct _IRP {
5167 CSHORT Type;
5168 USHORT Size;
5169 struct _MDL *MdlAddress;
5170 ULONG Flags;
5171 union {
5172 struct _IRP *MasterIrp;
5173 volatile LONG IrpCount;
5174 PVOID SystemBuffer;
5175 } AssociatedIrp;
5176 LIST_ENTRY ThreadListEntry;
5177 IO_STATUS_BLOCK IoStatus;
5178 KPROCESSOR_MODE RequestorMode;
5179 BOOLEAN PendingReturned;
5180 CHAR StackCount;
5181 CHAR CurrentLocation;
5182 BOOLEAN Cancel;
5183 KIRQL CancelIrql;
5184 CCHAR ApcEnvironment;
5185 UCHAR AllocationFlags;
5186 PIO_STATUS_BLOCK UserIosb;
5187 PKEVENT UserEvent;
5188 union {
5189 struct {
5190 _ANONYMOUS_UNION union {
5191 PIO_APC_ROUTINE UserApcRoutine;
5192 PVOID IssuingProcess;
5193 } DUMMYUNIONNAME;
5194 PVOID UserApcContext;
5195 } AsynchronousParameters;
5196 LARGE_INTEGER AllocationSize;
5197 } Overlay;
5198 volatile PDRIVER_CANCEL CancelRoutine;
5199 PVOID UserBuffer;
5200 union {
5201 struct {
5202 _ANONYMOUS_UNION union {
5203 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
5204 _ANONYMOUS_STRUCT struct {
5205 PVOID DriverContext[4];
5206 } DUMMYSTRUCTNAME;
5207 } DUMMYUNIONNAME;
5208 PETHREAD Thread;
5209 PCHAR AuxiliaryBuffer;
5210 _ANONYMOUS_STRUCT struct {
5211 LIST_ENTRY ListEntry;
5212 _ANONYMOUS_UNION union {
5213 struct _IO_STACK_LOCATION *CurrentStackLocation;
5214 ULONG PacketType;
5215 } DUMMYUNIONNAME;
5216 } DUMMYSTRUCTNAME;
5217 struct _FILE_OBJECT *OriginalFileObject;
5218 } Overlay;
5219 KAPC Apc;
5220 PVOID CompletionKey;
5221 } Tail;
5222 } IRP, *PIRP;
5223
5224 typedef enum _IO_PAGING_PRIORITY {
5225 IoPagingPriorityInvalid,
5226 IoPagingPriorityNormal,
5227 IoPagingPriorityHigh,
5228 IoPagingPriorityReserved1,
5229 IoPagingPriorityReserved2
5230 } IO_PAGING_PRIORITY;
5231
5232 typedef NTSTATUS
5233 (NTAPI IO_COMPLETION_ROUTINE)(
5234 IN struct _DEVICE_OBJECT *DeviceObject,
5235 IN struct _IRP *Irp,
5236 IN PVOID Context);
5237 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
5238
5239 typedef VOID
5240 (NTAPI IO_DPC_ROUTINE)(
5241 IN struct _KDPC *Dpc,
5242 IN struct _DEVICE_OBJECT *DeviceObject,
5243 IN struct _IRP *Irp,
5244 IN PVOID Context);
5245 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
5246
5247 typedef NTSTATUS
5248 (NTAPI *PMM_DLL_INITIALIZE)(
5249 IN PUNICODE_STRING RegistryPath);
5250
5251 typedef NTSTATUS
5252 (NTAPI *PMM_DLL_UNLOAD)(
5253 VOID);
5254
5255 typedef BOOLEAN
5256 (NTAPI KSERVICE_ROUTINE)(
5257 IN struct _KINTERRUPT *Interrupt,
5258 IN PVOID ServiceContext);
5259 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
5260
5261 typedef VOID
5262 (NTAPI IO_TIMER_ROUTINE)(
5263 IN struct _DEVICE_OBJECT *DeviceObject,
5264 IN PVOID Context);
5265 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
5266
5267 typedef struct _IO_SECURITY_CONTEXT {
5268 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
5269 PACCESS_STATE AccessState;
5270 ACCESS_MASK DesiredAccess;
5271 ULONG FullCreateOptions;
5272 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
5273
5274 struct _IO_CSQ;
5275
5276 typedef struct _IO_CSQ_IRP_CONTEXT {
5277 ULONG Type;
5278 struct _IRP *Irp;
5279 struct _IO_CSQ *Csq;
5280 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
5281
5282 typedef VOID
5283 (NTAPI *PIO_CSQ_INSERT_IRP)(
5284 IN struct _IO_CSQ *Csq,
5285 IN PIRP Irp);
5286
5287 typedef NTSTATUS
5288 (NTAPI IO_CSQ_INSERT_IRP_EX)(
5289 IN struct _IO_CSQ *Csq,
5290 IN PIRP Irp,
5291 IN PVOID InsertContext);
5292 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
5293
5294 typedef VOID
5295 (NTAPI *PIO_CSQ_REMOVE_IRP)(
5296 IN struct _IO_CSQ *Csq,
5297 IN PIRP Irp);
5298
5299 typedef PIRP
5300 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
5301 IN struct _IO_CSQ *Csq,
5302 IN PIRP Irp,
5303 IN PVOID PeekContext);
5304
5305 typedef VOID
5306 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
5307 IN struct _IO_CSQ *Csq,
5308 OUT PKIRQL Irql);
5309
5310 typedef VOID
5311 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
5312 IN struct _IO_CSQ *Csq,
5313 IN KIRQL Irql);
5314
5315 typedef VOID
5316 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
5317 IN struct _IO_CSQ *Csq,
5318 IN PIRP Irp);
5319
5320 typedef struct _IO_CSQ {
5321 ULONG Type;
5322 PIO_CSQ_INSERT_IRP CsqInsertIrp;
5323 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
5324 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
5325 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
5326 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
5327 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
5328 PVOID ReservePointer;
5329 } IO_CSQ, *PIO_CSQ;
5330
5331 typedef enum _BUS_QUERY_ID_TYPE {
5332 BusQueryDeviceID,
5333 BusQueryHardwareIDs,
5334 BusQueryCompatibleIDs,
5335 BusQueryInstanceID,
5336 BusQueryDeviceSerialNumber
5337 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
5338
5339 typedef enum _DEVICE_TEXT_TYPE {
5340 DeviceTextDescription,
5341 DeviceTextLocationInformation
5342 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
5343
5344 typedef enum _WORK_QUEUE_TYPE {
5345 CriticalWorkQueue,
5346 DelayedWorkQueue,
5347 HyperCriticalWorkQueue,
5348 MaximumWorkQueue
5349 } WORK_QUEUE_TYPE;
5350
5351 #if !defined(_AMD64_) && !defined(_IA64_)
5352 #include <pshpack4.h>
5353 #endif
5354 typedef struct _IO_STACK_LOCATION {
5355 UCHAR MajorFunction;
5356 UCHAR MinorFunction;
5357 UCHAR Flags;
5358 UCHAR Control;
5359 union {
5360 struct {
5361 PIO_SECURITY_CONTEXT SecurityContext;
5362 ULONG Options;
5363 USHORT POINTER_ALIGNMENT FileAttributes;
5364 USHORT ShareAccess;
5365 ULONG POINTER_ALIGNMENT EaLength;
5366 } Create;
5367 struct {
5368 ULONG Length;
5369 ULONG POINTER_ALIGNMENT Key;
5370 LARGE_INTEGER ByteOffset;
5371 } Read;
5372 struct {
5373 ULONG Length;
5374 ULONG POINTER_ALIGNMENT Key;
5375 LARGE_INTEGER ByteOffset;
5376 } Write;
5377 struct {
5378 ULONG Length;
5379 PUNICODE_STRING FileName;
5380 FILE_INFORMATION_CLASS FileInformationClass;
5381 ULONG FileIndex;
5382 } QueryDirectory;
5383 struct {
5384 ULONG Length;
5385 ULONG CompletionFilter;
5386 } NotifyDirectory;
5387 struct {
5388 ULONG Length;
5389 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
5390 } QueryFile;
5391 struct {
5392 ULONG Length;
5393 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
5394 PFILE_OBJECT FileObject;
5395 _ANONYMOUS_UNION union {
5396 _ANONYMOUS_STRUCT struct {
5397 BOOLEAN ReplaceIfExists;
5398 BOOLEAN AdvanceOnly;
5399 } DUMMYSTRUCTNAME;
5400 ULONG ClusterCount;
5401 HANDLE DeleteHandle;
5402 } DUMMYUNIONNAME;
5403 } SetFile;
5404 struct {
5405 ULONG Length;
5406 PVOID EaList;
5407 ULONG EaListLength;
5408 ULONG EaIndex;
5409 } QueryEa;
5410 struct {
5411 ULONG Length;
5412 } SetEa;
5413 struct {
5414 ULONG Length;
5415 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
5416 } QueryVolume;
5417 struct {
5418 ULONG Length;
5419 FS_INFORMATION_CLASS FsInformationClass;
5420 } SetVolume;
5421 struct {
5422 ULONG OutputBufferLength;
5423 ULONG InputBufferLength;
5424 ULONG FsControlCode;
5425 PVOID Type3InputBuffer;
5426 } FileSystemControl;
5427 struct {
5428 PLARGE_INTEGER Length;
5429 ULONG Key;
5430 LARGE_INTEGER ByteOffset;
5431 } LockControl;
5432 struct {
5433 ULONG OutputBufferLength;
5434 ULONG POINTER_ALIGNMENT InputBufferLength;
5435 ULONG POINTER_ALIGNMENT IoControlCode;
5436 PVOID Type3InputBuffer;
5437 } DeviceIoControl;
5438 struct {
5439 SECURITY_INFORMATION SecurityInformation;
5440 ULONG POINTER_ALIGNMENT Length;
5441 } QuerySecurity;
5442 struct {
5443 SECURITY_INFORMATION SecurityInformation;
5444 PSECURITY_DESCRIPTOR SecurityDescriptor;
5445 } SetSecurity;
5446 struct {
5447 PVPB Vpb;
5448 PDEVICE_OBJECT DeviceObject;
5449 } MountVolume;
5450 struct {
5451 PVPB Vpb;
5452 PDEVICE_OBJECT DeviceObject;
5453 } VerifyVolume;
5454 struct {
5455 struct _SCSI_REQUEST_BLOCK *Srb;
5456 } Scsi;
5457 struct {
5458 ULONG Length;
5459 PSID StartSid;
5460 struct _FILE_GET_QUOTA_INFORMATION *SidList;
5461 ULONG SidListLength;
5462 } QueryQuota;
5463 struct {
5464 ULONG Length;
5465 } SetQuota;
5466 struct {
5467 DEVICE_RELATION_TYPE Type;
5468 } QueryDeviceRelations;
5469 struct {
5470 CONST GUID *InterfaceType;
5471 USHORT Size;
5472 USHORT Version;
5473 PINTERFACE Interface;
5474 PVOID InterfaceSpecificData;
5475 } QueryInterface;
5476 struct {
5477 PDEVICE_CAPABILITIES Capabilities;
5478 } DeviceCapabilities;
5479 struct {
5480 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
5481 } FilterResourceRequirements;
5482 struct {
5483 ULONG WhichSpace;
5484 PVOID Buffer;
5485 ULONG Offset;
5486 ULONG POINTER_ALIGNMENT Length;
5487 } ReadWriteConfig;
5488 struct {
5489 BOOLEAN Lock;
5490 } SetLock;
5491 struct {
5492 BUS_QUERY_ID_TYPE IdType;
5493 } QueryId;
5494 struct {
5495 DEVICE_TEXT_TYPE DeviceTextType;
5496 LCID POINTER_ALIGNMENT LocaleId;
5497 } QueryDeviceText;
5498 struct {
5499 BOOLEAN InPath;
5500 BOOLEAN Reserved[3];
5501 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
5502 } UsageNotification;
5503 struct {
5504 SYSTEM_POWER_STATE PowerState;
5505 } WaitWake;
5506 struct {
5507 PPOWER_SEQUENCE PowerSequence;
5508 } PowerSequence;
5509 struct {
5510 ULONG SystemContext;
5511 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
5512 POWER_STATE POINTER_ALIGNMENT State;
5513 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
5514 } Power;
5515 struct {
5516 PCM_RESOURCE_LIST AllocatedResources;
5517 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
5518 } StartDevice;
5519 struct {
5520 ULONG_PTR ProviderId;
5521 PVOID DataPath;
5522 ULONG BufferSize;
5523 PVOID Buffer;
5524 } WMI;
5525 struct {
5526 PVOID Argument1;
5527 PVOID Argument2;
5528 PVOID Argument3;
5529 PVOID Argument4;
5530 } Others;
5531 } Parameters;
5532 PDEVICE_OBJECT DeviceObject;
5533 PFILE_OBJECT FileObject;
5534 PIO_COMPLETION_ROUTINE CompletionRoutine;
5535 PVOID Context;
5536 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
5537 #if !defined(_AMD64_) && !defined(_IA64_)
5538 #include <poppack.h>
5539 #endif
5540
5541 /* IO_STACK_LOCATION.Control */
5542
5543 #define SL_PENDING_RETURNED 0x01
5544 #define SL_ERROR_RETURNED 0x02
5545 #define SL_INVOKE_ON_CANCEL 0x20
5546 #define SL_INVOKE_ON_SUCCESS 0x40
5547 #define SL_INVOKE_ON_ERROR 0x80
5548
5549 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
5550
5551 #define PCI_WHICHSPACE_CONFIG 0x0
5552 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
5553
5554 #define METHOD_BUFFERED 0
5555 #define METHOD_IN_DIRECT 1
5556 #define METHOD_OUT_DIRECT 2
5557 #define METHOD_NEITHER 3
5558
5559 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
5560 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
5561
5562 #define FILE_SUPERSEDED 0x00000000
5563 #define FILE_OPENED 0x00000001
5564 #define FILE_CREATED 0x00000002
5565 #define FILE_OVERWRITTEN 0x00000003
5566 #define FILE_EXISTS 0x00000004
5567 #define FILE_DOES_NOT_EXIST 0x00000005
5568
5569 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
5570 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
5571
5572 /* also in winnt.h */
5573 #define FILE_LIST_DIRECTORY 0x00000001
5574 #define FILE_READ_DATA 0x00000001
5575 #define FILE_ADD_FILE 0x00000002
5576 #define FILE_WRITE_DATA 0x00000002
5577 #define FILE_ADD_SUBDIRECTORY 0x00000004
5578 #define FILE_APPEND_DATA 0x00000004
5579 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
5580 #define FILE_READ_EA 0x00000008
5581 #define FILE_WRITE_EA 0x00000010
5582 #define FILE_EXECUTE 0x00000020
5583 #define FILE_TRAVERSE 0x00000020
5584 #define FILE_DELETE_CHILD 0x00000040
5585 #define FILE_READ_ATTRIBUTES 0x00000080
5586 #define FILE_WRITE_ATTRIBUTES 0x00000100
5587
5588 #define FILE_SHARE_READ 0x00000001
5589 #define FILE_SHARE_WRITE 0x00000002
5590 #define FILE_SHARE_DELETE 0x00000004
5591 #define FILE_SHARE_VALID_FLAGS 0x00000007
5592
5593 #define FILE_ATTRIBUTE_READONLY 0x00000001
5594 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
5595 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
5596 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
5597 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
5598 #define FILE_ATTRIBUTE_DEVICE 0x00000040
5599 #define FILE_ATTRIBUTE_NORMAL 0x00000080
5600 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
5601 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
5602 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
5603 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
5604 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
5605 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
5606 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
5607 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
5608
5609 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
5610 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
5611
5612 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
5613 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
5614 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
5615 #define FILE_VALID_SET_FLAGS 0x00000036
5616
5617 #define FILE_SUPERSEDE 0x00000000
5618 #define FILE_OPEN 0x00000001
5619 #define FILE_CREATE 0x00000002
5620 #define FILE_OPEN_IF 0x00000003
5621 #define FILE_OVERWRITE 0x00000004
5622 #define FILE_OVERWRITE_IF 0x00000005
5623 #define FILE_MAXIMUM_DISPOSITION 0x00000005
5624
5625 #define FILE_DIRECTORY_FILE 0x00000001
5626 #define FILE_WRITE_THROUGH 0x00000002
5627 #define FILE_SEQUENTIAL_ONLY 0x00000004
5628 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
5629 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
5630 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
5631 #define FILE_NON_DIRECTORY_FILE 0x00000040
5632 #define FILE_CREATE_TREE_CONNECTION 0x00000080
5633 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
5634 #define FILE_NO_EA_KNOWLEDGE 0x00000200
5635 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
5636 #define FILE_RANDOM_ACCESS 0x00000800
5637 #define FILE_DELETE_ON_CLOSE 0x00001000
5638 #define FILE_OPEN_BY_FILE_ID 0x00002000
5639 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
5640 #define FILE_NO_COMPRESSION 0x00008000
5641 #if (NTDDI_VERSION >= NTDDI_WIN7)
5642 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
5643 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
5644 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5645 #define FILE_RESERVE_OPFILTER 0x00100000
5646 #define FILE_OPEN_REPARSE_POINT 0x00200000
5647 #define FILE_OPEN_NO_RECALL 0x00400000
5648 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
5649
5650 #define FILE_ANY_ACCESS 0x00000000
5651 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
5652 #define FILE_READ_ACCESS 0x00000001
5653 #define FILE_WRITE_ACCESS 0x00000002
5654
5655 #define FILE_ALL_ACCESS \
5656 (STANDARD_RIGHTS_REQUIRED | \
5657 SYNCHRONIZE | \
5658 0x1FF)
5659
5660 #define FILE_GENERIC_EXECUTE \
5661 (STANDARD_RIGHTS_EXECUTE | \
5662 FILE_READ_ATTRIBUTES | \
5663 FILE_EXECUTE | \
5664 SYNCHRONIZE)
5665
5666 #define FILE_GENERIC_READ \
5667 (STANDARD_RIGHTS_READ | \
5668 FILE_READ_DATA | \
5669 FILE_READ_ATTRIBUTES | \
5670 FILE_READ_EA | \
5671 SYNCHRONIZE)
5672
5673 #define FILE_GENERIC_WRITE \
5674 (STANDARD_RIGHTS_WRITE | \
5675 FILE_WRITE_DATA | \
5676 FILE_WRITE_ATTRIBUTES | \
5677 FILE_WRITE_EA | \
5678 FILE_APPEND_DATA | \
5679 SYNCHRONIZE)
5680
5681 /* end winnt.h */
5682
5683 /******************************************************************************
5684 * Object Manager Types *
5685 ******************************************************************************/
5686
5687 typedef struct _OBJECT_NAME_INFORMATION {
5688 UNICODE_STRING Name;
5689 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
5690
5691 /* Exported object types */
5692 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType;
5693 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
5694 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
5695 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
5696 extern POBJECT_TYPE NTSYSAPI PsThreadType;
5697 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
5698 extern POBJECT_TYPE NTSYSAPI PsProcessType;
5699
5700
5701 /******************************************************************************
5702 * Process Manager Types *
5703 ******************************************************************************/
5704
5705 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
5706 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
5707 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
5708 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
5709 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
5710
5711 /* Process Qoutas */
5712 typedef struct _QUOTA_LIMITS {
5713 SIZE_T PagedPoolLimit;
5714 SIZE_T NonPagedPoolLimit;
5715 SIZE_T MinimumWorkingSetSize;
5716 SIZE_T MaximumWorkingSetSize;
5717 SIZE_T PagefileLimit;
5718 LARGE_INTEGER TimeLimit;
5719 } QUOTA_LIMITS, *PQUOTA_LIMITS;
5720
5721 /* Thread Access Rights */
5722 #define THREAD_TERMINATE 0x0001
5723 #define THREAD_SUSPEND_RESUME 0x0002
5724 #define THREAD_ALERT 0x0004
5725 #define THREAD_GET_CONTEXT 0x0008
5726 #define THREAD_SET_CONTEXT 0x0010
5727 #define THREAD_SET_INFORMATION 0x0020
5728 #define THREAD_SET_LIMITED_INFORMATION 0x0400
5729 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
5730
5731 #define PROCESS_DUP_HANDLE (0x0040)
5732
5733 #if (NTDDI_VERSION >= NTDDI_VISTA)
5734 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
5735 #else
5736 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
5737 #endif
5738
5739 #if (NTDDI_VERSION >= NTDDI_VISTA)
5740 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
5741 #else
5742 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
5743 #endif
5744
5745 #define ES_SYSTEM_REQUIRED 0x00000001
5746 #define ES_DISPLAY_REQUIRED 0x00000002
5747 #define ES_USER_PRESENT 0x00000004
5748 #define ES_CONTINUOUS 0x80000000
5749
5750 #define LOW_PRIORITY 0
5751 #define LOW_REALTIME_PRIORITY 16
5752 #define HIGH_PRIORITY 31
5753 #define MAXIMUM_PRIORITY 32
5754
5755
5756 #ifdef _X86_
5757 /** Kernel definitions for x86 **/
5758
5759 /* Interrupt request levels */
5760 #define PASSIVE_LEVEL 0
5761 #define LOW_LEVEL 0
5762 #define APC_LEVEL 1
5763 #define DISPATCH_LEVEL 2
5764 #define CMCI_LEVEL 5
5765 #define PROFILE_LEVEL 27
5766 #define CLOCK1_LEVEL 28
5767 #define CLOCK2_LEVEL 28
5768 #define IPI_LEVEL 29
5769 #define POWER_LEVEL 30
5770 #define HIGH_LEVEL 31
5771 #define CLOCK_LEVEL CLOCK2_LEVEL
5772
5773 #define KIP0PCRADDRESS 0xffdff000
5774 #define KI_USER_SHARED_DATA 0xffdf0000
5775 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
5776
5777 #define PAGE_SIZE 0x1000
5778 #define PAGE_SHIFT 12L
5779 #define KeGetDcacheFillSize() 1L
5780
5781 #define EFLAG_SIGN 0x8000
5782 #define EFLAG_ZERO 0x4000
5783 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5784
5785 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5786 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5787 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5788
5789
5790 typedef struct _KFLOATING_SAVE {
5791 ULONG ControlWord;
5792 ULONG StatusWord;
5793 ULONG ErrorOffset;
5794 ULONG ErrorSelector;
5795 ULONG DataOffset;
5796 ULONG DataSelector;
5797 ULONG Cr0NpxState;
5798 ULONG Spare1;
5799 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5800
5801 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
5802
5803 #define YieldProcessor _mm_pause
5804
5805 FORCEINLINE
5806 VOID
5807 KeMemoryBarrier(VOID)
5808 {
5809 volatile LONG Barrier;
5810 #if defined(__GNUC__)
5811 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
5812 #elif defined(_MSC_VER)
5813 __asm xchg [Barrier], eax
5814 #endif
5815 }
5816
5817 NTHALAPI
5818 KIRQL
5819 NTAPI
5820 KeGetCurrentIrql(VOID);
5821
5822 NTHALAPI
5823 VOID
5824 FASTCALL
5825 KfLowerIrql(
5826 IN KIRQL NewIrql);
5827 #define KeLowerIrql(a) KfLowerIrql(a)
5828
5829 NTHALAPI
5830 KIRQL
5831 FASTCALL
5832 KfRaiseIrql(
5833 IN KIRQL NewIrql);
5834 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
5835
5836 NTHALAPI
5837 KIRQL
5838 NTAPI
5839 KeRaiseIrqlToDpcLevel(VOID);
5840
5841 NTHALAPI
5842 KIRQL
5843 NTAPI
5844 KeRaiseIrqlToSynchLevel(VOID);
5845
5846 NTHALAPI
5847 KIRQL
5848 FASTCALL
5849 KfAcquireSpinLock(
5850 IN OUT PKSPIN_LOCK SpinLock);
5851 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5852
5853 NTHALAPI
5854 VOID
5855 FASTCALL
5856 KfReleaseSpinLock(
5857 IN OUT PKSPIN_LOCK SpinLock,
5858 IN KIRQL NewIrql);
5859 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5860
5861 NTKERNELAPI
5862 VOID
5863 FASTCALL
5864 KefAcquireSpinLockAtDpcLevel(
5865 IN OUT PKSPIN_LOCK SpinLock);
5866 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5867
5868 NTKERNELAPI
5869 VOID
5870 FASTCALL
5871 KefReleaseSpinLockFromDpcLevel(
5872 IN OUT PKSPIN_LOCK SpinLock);
5873 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5874
5875 NTSYSAPI
5876 PKTHREAD
5877 NTAPI
5878 KeGetCurrentThread(VOID);
5879
5880 NTKERNELAPI
5881 NTSTATUS
5882 NTAPI
5883 KeSaveFloatingPointState(
5884 OUT PKFLOATING_SAVE FloatSave);
5885
5886 NTKERNELAPI
5887 NTSTATUS
5888 NTAPI
5889 KeRestoreFloatingPointState(
5890 IN PKFLOATING_SAVE FloatSave);
5891
5892 /* VOID
5893 * KeFlushIoBuffers(
5894 * IN PMDL Mdl,
5895 * IN BOOLEAN ReadOperation,
5896 * IN BOOLEAN DmaOperation)
5897 */
5898 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
5899
5900 /* x86 and x64 performs a 0x2C interrupt */
5901 #define DbgRaiseAssertionFailure __int2c
5902
5903 FORCEINLINE
5904 VOID
5905 _KeQueryTickCount(
5906 OUT PLARGE_INTEGER CurrentCount)
5907 {
5908 for (;;) {
5909 CurrentCount->HighPart = KeTickCount.High1Time;
5910 CurrentCount->LowPart = KeTickCount.LowPart;
5911 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
5912 YieldProcessor();
5913 }
5914 }
5915 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
5916
5917 #endif /* _X86_ */
5918
5919
5920
5921
5922 FORCEINLINE
5923 VOID
5924 InitializeListHead(
5925 OUT PLIST_ENTRY ListHead)
5926 {
5927 ListHead->Flink = ListHead->Blink = ListHead;
5928 }
5929
5930 FORCEINLINE
5931 VOID
5932 InsertHeadList(
5933 IN OUT PLIST_ENTRY ListHead,
5934 IN OUT PLIST_ENTRY Entry)
5935 {
5936 PLIST_ENTRY OldFlink;
5937 OldFlink = ListHead->Flink;
5938 Entry->Flink = OldFlink;
5939 Entry->Blink = ListHead;
5940 OldFlink->Blink = Entry;
5941 ListHead->Flink = Entry;
5942 }
5943
5944 FORCEINLINE
5945 VOID
5946 InsertTailList(
5947 IN OUT PLIST_ENTRY ListHead,
5948 IN OUT PLIST_ENTRY Entry)
5949 {
5950 PLIST_ENTRY OldBlink;
5951 OldBlink = ListHead->Blink;
5952 Entry->Flink = ListHead;
5953 Entry->Blink = OldBlink;
5954 OldBlink->Flink = Entry;
5955 ListHead->Blink = Entry;
5956 }
5957
5958 BOOLEAN
5959 FORCEINLINE
5960 IsListEmpty(
5961 IN CONST LIST_ENTRY * ListHead)
5962 {
5963 return (BOOLEAN)(ListHead->Flink == ListHead);
5964 }
5965
5966 FORCEINLINE
5967 PSINGLE_LIST_ENTRY
5968 PopEntryList(
5969 IN OUT PSINGLE_LIST_ENTRY ListHead)
5970 {
5971 PSINGLE_LIST_ENTRY FirstEntry;
5972 FirstEntry = ListHead->Next;
5973 if (FirstEntry != NULL) {
5974 ListHead->Next = FirstEntry->Next;
5975 }
5976 return FirstEntry;
5977 }
5978
5979 FORCEINLINE
5980 VOID
5981 PushEntryList(
5982 IN OUT PSINGLE_LIST_ENTRY ListHead,
5983 IN OUT PSINGLE_LIST_ENTRY Entry)
5984 {
5985 Entry->Next = ListHead->Next;
5986 ListHead->Next = Entry;
5987 }
5988
5989 FORCEINLINE
5990 BOOLEAN
5991 RemoveEntryList(
5992 IN PLIST_ENTRY Entry)
5993 {
5994 PLIST_ENTRY OldFlink;
5995 PLIST_ENTRY OldBlink;
5996
5997 OldFlink = Entry->Flink;
5998 OldBlink = Entry->Blink;
5999 OldFlink->Blink = OldBlink;
6000 OldBlink->Flink = OldFlink;
6001 return (BOOLEAN)(OldFlink == OldBlink);
6002 }
6003
6004 FORCEINLINE
6005 PLIST_ENTRY
6006 RemoveHeadList(
6007 IN OUT PLIST_ENTRY ListHead)
6008 {
6009 PLIST_ENTRY Flink;
6010 PLIST_ENTRY Entry;
6011
6012 Entry = ListHead->Flink;
6013 Flink = Entry->Flink;
6014 ListHead->Flink = Flink;
6015 Flink->Blink = ListHead;
6016 return Entry;
6017 }
6018
6019 FORCEINLINE
6020 PLIST_ENTRY
6021 RemoveTailList(
6022 IN OUT PLIST_ENTRY ListHead)
6023 {
6024 PLIST_ENTRY Blink;
6025 PLIST_ENTRY Entry;
6026
6027 Entry = ListHead->Blink;
6028 Blink = Entry->Blink;
6029 ListHead->Blink = Blink;
6030 Blink->Flink = ListHead;
6031 return Entry;
6032 }
6033
6034 NTSYSAPI
6035 VOID
6036 NTAPI
6037 RtlAssert(
6038 IN PVOID FailedAssertion,
6039 IN PVOID FileName,
6040 IN ULONG LineNumber,
6041 IN PSTR Message);
6042
6043 /* VOID
6044 * RtlCopyMemory(
6045 * IN VOID UNALIGNED *Destination,
6046 * IN CONST VOID UNALIGNED *Source,
6047 * IN SIZE_T Length)
6048 */
6049 #define RtlCopyMemory(Destination, Source, Length) \
6050 memcpy(Destination, Source, Length)
6051
6052 #define RtlCopyBytes RtlCopyMemory
6053
6054 #if defined(_M_AMD64)
6055 NTSYSAPI
6056 VOID
6057 NTAPI
6058 RtlCopyMemoryNonTemporal(
6059 VOID UNALIGNED *Destination,
6060 CONST VOID UNALIGNED *Source,
6061 SIZE_T Length);
6062 #else
6063 #define RtlCopyMemoryNonTemporal RtlCopyMemory
6064 #endif
6065
6066 /* BOOLEAN
6067 * RtlEqualLuid(
6068 * IN PLUID Luid1,
6069 * IN PLUID Luid2)
6070 */
6071 #define RtlEqualLuid(Luid1, Luid2) \
6072 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
6073
6074 /* ULONG
6075 * RtlEqualMemory(
6076 * IN VOID UNALIGNED *Destination,
6077 * IN CONST VOID UNALIGNED *Source,
6078 * IN SIZE_T Length)
6079 */
6080 #define RtlEqualMemory(Destination, Source, Length) \
6081 (!memcmp(Destination, Source, Length))
6082
6083 /* VOID
6084 * RtlFillMemory(
6085 * IN VOID UNALIGNED *Destination,
6086 * IN SIZE_T Length,
6087 * IN UCHAR Fill)
6088 */
6089 #define RtlFillMemory(Destination, Length, Fill) \
6090 memset(Destination, Fill, Length)
6091
6092 #define RtlFillBytes RtlFillMemory
6093
6094 NTSYSAPI
6095 VOID
6096 NTAPI
6097 RtlFreeUnicodeString(
6098 IN OUT PUNICODE_STRING UnicodeString);
6099
6100 NTSYSAPI
6101 NTSTATUS
6102 NTAPI
6103 RtlGUIDFromString(
6104 IN PUNICODE_STRING GuidString,
6105 OUT GUID *Guid);
6106
6107 NTSYSAPI
6108 VOID
6109 NTAPI
6110 RtlInitUnicodeString(
6111 IN OUT PUNICODE_STRING DestinationString,
6112 IN PCWSTR SourceString OPTIONAL);
6113
6114 /* VOID
6115 * RtlMoveMemory(
6116 * IN VOID UNALIGNED *Destination,
6117 * IN CONST VOID UNALIGNED *Source,
6118 * IN SIZE_T Length)
6119 */
6120 #define RtlMoveMemory(Destination, Source, Length) \
6121 memmove(Destination, Source, Length)
6122
6123 NTSYSAPI
6124 NTSTATUS
6125 NTAPI
6126 RtlStringFromGUID(
6127 IN REFGUID Guid,
6128 OUT PUNICODE_STRING GuidString);
6129
6130 /* VOID
6131 * RtlZeroMemory(
6132 * IN VOID UNALIGNED *Destination,
6133 * IN SIZE_T Length)
6134 */
6135 #define RtlZeroMemory(Destination, Length) \
6136 memset(Destination, 0, Length)
6137
6138 #define RtlZeroBytes RtlZeroMemory
6139
6140 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6141
6142
6143
6144 NTSYSAPI
6145 BOOLEAN
6146 NTAPI
6147 RtlAreBitsClear(
6148 IN PRTL_BITMAP BitMapHeader,
6149 IN ULONG StartingIndex,
6150 IN ULONG Length);
6151
6152 NTSYSAPI
6153 BOOLEAN
6154 NTAPI
6155 RtlAreBitsSet(
6156 IN PRTL_BITMAP BitMapHeader,
6157 IN ULONG StartingIndex,
6158 IN ULONG Length);
6159
6160 NTSYSAPI
6161 NTSTATUS
6162 NTAPI
6163 RtlAnsiStringToUnicodeString(
6164 IN OUT PUNICODE_STRING DestinationString,
6165 IN PANSI_STRING SourceString,
6166 IN BOOLEAN AllocateDestinationString);
6167
6168 NTSYSAPI
6169 ULONG
6170 NTAPI
6171 RtlxAnsiStringToUnicodeSize(
6172 IN PCANSI_STRING AnsiString);
6173
6174 #define RtlAnsiStringToUnicodeSize(String) ( \
6175 NLS_MB_CODE_PAGE_TAG ? \
6176 RtlxAnsiStringToUnicodeSize(String) : \
6177 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
6178 )
6179
6180 NTSYSAPI
6181 NTSTATUS
6182 NTAPI
6183 RtlAppendUnicodeStringToString(
6184 IN OUT PUNICODE_STRING Destination,
6185 IN PCUNICODE_STRING Source);
6186
6187 NTSYSAPI
6188 NTSTATUS
6189 NTAPI
6190 RtlAppendUnicodeToString(
6191 IN OUT PUNICODE_STRING Destination,
6192 IN PCWSTR Source);
6193
6194 NTSYSAPI
6195 NTSTATUS
6196 NTAPI
6197 RtlCheckRegistryKey(
6198 IN ULONG RelativeTo,
6199 IN PWSTR Path);
6200
6201 NTSYSAPI
6202 VOID
6203 NTAPI
6204 RtlClearAllBits(
6205 IN PRTL_BITMAP BitMapHeader);
6206
6207 NTSYSAPI
6208 VOID
6209 NTAPI
6210 RtlClearBits(
6211 IN PRTL_BITMAP BitMapHeader,
6212 IN ULONG StartingIndex,
6213 IN ULONG NumberToClear);
6214
6215 NTSYSAPI
6216 SIZE_T
6217 NTAPI
6218 RtlCompareMemory(
6219 IN CONST VOID *Source1,
6220 IN CONST VOID *Source2,
6221 IN SIZE_T Length);
6222
6223 NTSYSAPI
6224 LONG
6225 NTAPI
6226 RtlCompareUnicodeString(
6227 IN PCUNICODE_STRING String1,
6228 IN PCUNICODE_STRING String2,
6229 IN BOOLEAN CaseInSensitive);
6230
6231 NTSYSAPI
6232 LONG
6233 NTAPI
6234 RtlCompareUnicodeStrings(
6235 IN PCWCH String1,
6236 IN SIZE_T String1Length,
6237 IN PCWCH String2,
6238 IN SIZE_T String2Length,
6239 IN BOOLEAN CaseInSensitive);
6240
6241 NTSYSAPI
6242 VOID
6243 NTAPI
6244 RtlCopyUnicodeString(
6245 IN OUT PUNICODE_STRING DestinationString,
6246 IN PCUNICODE_STRING SourceString OPTIONAL);
6247
6248 NTSYSAPI
6249 NTSTATUS
6250 NTAPI
6251 RtlCreateRegistryKey(
6252 IN ULONG RelativeTo,
6253 IN PWSTR Path);
6254
6255 NTSYSAPI
6256 NTSTATUS
6257 NTAPI
6258 RtlCreateSecurityDescriptor(
6259 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
6260 IN ULONG Revision);
6261
6262 NTSYSAPI
6263 NTSTATUS
6264 NTAPI
6265 RtlDeleteRegistryValue(
6266 IN ULONG RelativeTo,
6267 IN PCWSTR Path,
6268 IN PCWSTR ValueName);
6269
6270 NTSYSAPI
6271 BOOLEAN
6272 NTAPI
6273 RtlEqualUnicodeString(
6274 IN CONST UNICODE_STRING *String1,
6275 IN CONST UNICODE_STRING *String2,
6276 IN BOOLEAN CaseInSensitive);
6277
6278 #if !defined(_AMD64_) && !defined(_IA64_)
6279 NTSYSAPI
6280 LARGE_INTEGER
6281 NTAPI
6282 RtlExtendedIntegerMultiply(
6283 IN LARGE_INTEGER Multiplicand,
6284 IN LONG Multiplier);
6285
6286 NTSYSAPI
6287 LARGE_INTEGER
6288 NTAPI
6289 RtlExtendedLargeIntegerDivide(
6290 IN LARGE_INTEGER Dividend,
6291 IN ULONG Divisor,
6292 OUT PULONG Remainder OPTIONAL);
6293 #endif
6294
6295 #if defined(_X86_) || defined(_IA64_)
6296 NTSYSAPI
6297 LARGE_INTEGER
6298 NTAPI
6299 RtlExtendedMagicDivide(
6300 IN LARGE_INTEGER Dividend,
6301 IN LARGE_INTEGER MagicDivisor,
6302 IN CCHAR ShiftCount);
6303 #endif
6304
6305 NTSYSAPI
6306 VOID
6307 NTAPI
6308 RtlFreeAnsiString(
6309 IN PANSI_STRING AnsiString);
6310
6311 NTSYSAPI
6312 ULONG
6313 NTAPI
6314 RtlFindClearBits(
6315 IN PRTL_BITMAP BitMapHeader,
6316 IN ULONG NumberToFind,
6317 IN ULONG HintIndex);
6318
6319 NTSYSAPI
6320 ULONG
6321 NTAPI
6322 RtlFindClearBitsAndSet(
6323 IN PRTL_BITMAP BitMapHeader,
6324 IN ULONG NumberToFind,
6325 IN ULONG HintIndex);
6326
6327 NTSYSAPI
6328 ULONG
6329 NTAPI
6330 RtlFindFirstRunClear(
6331 IN PRTL_BITMAP BitMapHeader,
6332 OUT PULONG StartingIndex);
6333
6334 NTSYSAPI
6335 ULONG
6336 NTAPI
6337 RtlFindClearRuns(
6338 IN PRTL_BITMAP BitMapHeader,
6339 OUT PRTL_BITMAP_RUN RunArray,
6340 IN ULONG SizeOfRunArray,
6341 IN BOOLEAN LocateLongestRuns);
6342
6343 NTSYSAPI
6344 ULONG
6345 NTAPI
6346 RtlFindLastBackwardRunClear(
6347 IN PRTL_BITMAP BitMapHeader,
6348 IN ULONG FromIndex,
6349 OUT PULONG StartingRunIndex);
6350
6351 NTSYSAPI
6352 CCHAR
6353 NTAPI
6354 RtlFindLeastSignificantBit(
6355 IN ULONGLONG Set);
6356
6357 NTSYSAPI
6358 ULONG
6359 NTAPI
6360 RtlFindLongestRunClear(
6361 IN PRTL_BITMAP BitMapHeader,
6362 OUT PULONG StartingIndex);
6363
6364 NTSYSAPI
6365 CCHAR
6366 NTAPI
6367 RtlFindMostSignificantBit(
6368 IN ULONGLONG Set);
6369
6370 NTSYSAPI
6371 ULONG
6372 NTAPI
6373 RtlFindNextForwardRunClear(
6374 IN PRTL_BITMAP BitMapHeader,
6375 IN ULONG FromIndex,
6376 OUT PULONG StartingRunIndex);
6377
6378 NTSYSAPI
6379 ULONG
6380 NTAPI
6381 RtlFindSetBits(
6382 IN PRTL_BITMAP BitMapHeader,
6383 IN ULONG NumberToFind,
6384 IN ULONG HintIndex);
6385
6386 NTSYSAPI
6387 ULONG
6388 NTAPI
6389 RtlFindSetBitsAndClear(
6390 IN PRTL_BITMAP BitMapHeader,
6391 IN ULONG NumberToFind,
6392 IN ULONG HintIndex);
6393
6394 NTSYSAPI
6395 NTSTATUS
6396 NTAPI
6397 RtlHashUnicodeString(
6398 IN CONST UNICODE_STRING *String,
6399 IN BOOLEAN CaseInSensitive,
6400 IN ULONG HashAlgorithm,
6401 OUT PULONG HashValue);
6402
6403 NTSYSAPI
6404 VOID
6405 NTAPI
6406 RtlInitAnsiString(
6407 IN OUT PANSI_STRING DestinationString,
6408 IN PCSZ SourceString);
6409
6410 NTSYSAPI
6411 VOID
6412 NTAPI
6413 RtlInitializeBitMap(
6414 IN PRTL_BITMAP BitMapHeader,
6415 IN PULONG BitMapBuffer,
6416 IN ULONG SizeOfBitMap);
6417
6418 NTSYSAPI
6419 VOID
6420 NTAPI
6421 RtlInitString(
6422 IN OUT PSTRING DestinationString,
6423 IN PCSZ SourceString);
6424
6425 NTSYSAPI
6426 NTSTATUS
6427 NTAPI
6428 RtlIntegerToUnicodeString(
6429 IN ULONG Value,
6430 IN ULONG Base OPTIONAL,
6431 IN OUT PUNICODE_STRING String);
6432
6433 NTSYSAPI
6434 NTSTATUS
6435 NTAPI
6436 RtlInt64ToUnicodeString(
6437 IN ULONGLONG Value,
6438 IN ULONG Base OPTIONAL,
6439 IN OUT PUNICODE_STRING String);
6440
6441 #ifdef _WIN64
6442 #define RtlIntPtrToUnicodeString(Value, Base, String) \
6443 RtlInt64ToUnicodeString(Value, Base, String)
6444 #else
6445 #define RtlIntPtrToUnicodeString(Value, Base, String) \
6446 RtlIntegerToUnicodeString(Value, Base, String)
6447 #endif
6448
6449 /* BOOLEAN
6450 * RtlIsZeroLuid(
6451 * IN PLUID L1);
6452 */
6453 #define RtlIsZeroLuid(_L1) \
6454 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
6455
6456 NTSYSAPI
6457 ULONG
6458 NTAPI
6459 RtlLengthSecurityDescriptor(
6460 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6461
6462 NTSYSAPI
6463 ULONG
6464 NTAPI
6465 RtlNumberOfClearBits(
6466 IN PRTL_BITMAP BitMapHeader);
6467
6468 NTSYSAPI
6469 ULONG
6470 NTAPI
6471 RtlNumberOfSetBits(
6472 IN PRTL_BITMAP BitMapHeader);
6473
6474 NTSYSAPI
6475 NTSTATUS
6476 NTAPI
6477 RtlQueryRegistryValues(
6478 IN ULONG RelativeTo,
6479 IN PCWSTR Path,
6480 IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable,
6481 IN PVOID Context OPTIONAL,
6482 IN PVOID Environment OPTIONAL);
6483
6484 #define SHORT_SIZE (sizeof(USHORT))
6485 #define SHORT_MASK (SHORT_SIZE - 1)
6486 #define LONG_SIZE (sizeof(LONG))
6487 #define LONGLONG_SIZE (sizeof(LONGLONG))
6488 #define LONG_MASK (LONG_SIZE - 1)
6489 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
6490 #define LOWBYTE_MASK 0x00FF
6491
6492 /* VOID
6493 * RtlRetrieveUlong(
6494 * PULONG DestinationAddress,
6495 * PULONG SourceAddress);
6496 */
6497 #if defined(_AMD64_)
6498 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6499 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
6500 #else
6501 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6502 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6503 { \
6504 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6505 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6506 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
6507 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
6508 } \
6509 else \
6510 { \
6511 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
6512 }
6513 #endif
6514
6515 /* VOID
6516 * RtlRetrieveUshort(
6517 * PUSHORT DestinationAddress,
6518 * PUSHORT SourceAddress);
6519 */
6520 #if defined(_AMD64_)
6521 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6522 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
6523 #else
6524 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6525 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6526 { \
6527 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6528 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6529 } \
6530 else \
6531 { \
6532 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
6533 }
6534 #endif
6535
6536 NTSYSAPI
6537 VOID
6538 NTAPI
6539 RtlSetAllBits(
6540 IN PRTL_BITMAP BitMapHeader);
6541
6542 NTSYSAPI
6543 VOID
6544 NTAPI
6545 RtlSetBits(
6546 IN PRTL_BITMAP BitMapHeader,
6547 IN ULONG StartingIndex,
6548 IN ULONG NumberToSet);
6549
6550 NTSYSAPI
6551 NTSTATUS
6552 NTAPI
6553 RtlSetDaclSecurityDescriptor(
6554 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
6555 IN BOOLEAN DaclPresent,
6556 IN PACL Dacl OPTIONAL,
6557 IN BOOLEAN DaclDefaulted OPTIONAL);
6558
6559 #if defined(_AMD64_)
6560
6561 /* VOID
6562 * RtlStoreUlong(
6563 * IN PULONG Address,
6564 * IN ULONG Value);
6565 */
6566 #define RtlStoreUlong(Address,Value) \
6567 *(ULONG UNALIGNED *)(Address) = (Value)
6568
6569 /* VOID
6570 * RtlStoreUlonglong(
6571 * IN OUT PULONGLONG Address,
6572 * ULONGLONG Value);
6573 */
6574 #define RtlStoreUlonglong(Address,Value) \
6575 *(ULONGLONG UNALIGNED *)(Address) = (Value)
6576
6577 /* VOID
6578 * RtlStoreUshort(
6579 * IN PUSHORT Address,
6580 * IN USHORT Value);
6581 */
6582 #define RtlStoreUshort(Address,Value) \
6583 *(USHORT UNALIGNED *)(Address) = (Value)
6584
6585 /* VOID
6586 * RtlRetrieveUshort(
6587 * PUSHORT DestinationAddress,
6588 * PUSHORT SourceAddress);
6589 */
6590 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6591 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
6592
6593 /* VOID
6594 * RtlRetrieveUlong(
6595 * PULONG DestinationAddress,
6596 * PULONG SourceAddress);
6597 */
6598 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6599 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
6600
6601 #else
6602
6603 #define RtlStoreUlong(Address,Value) \
6604 if ((ULONG_PTR)(Address) & LONG_MASK) { \
6605 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
6606 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
6607 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
6608 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
6609 } \
6610 else { \
6611 *((PULONG)(Address)) = (ULONG) (Value); \
6612 }
6613 #endif
6614
6615 /* VOID
6616 * RtlStoreUlonglong(
6617 * IN OUT PULONGLONG Address,
6618 * ULONGLONG Value);
6619 */
6620 #if defined(_AMD64_)
6621 #define RtlStoreUlonglong(Address,Value) \
6622 *(ULONGLONG UNALIGNED *)(Address) = (Value)
6623 #else
6624 #define RtlStoreUlonglong(Address,Value) \
6625 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
6626 RtlStoreUlong((ULONG_PTR)(Address), \
6627 (ULONGLONG)(Value) & 0xFFFFFFFF); \
6628 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
6629 (ULONGLONG)(Value) >> 32); \
6630 } else { \
6631 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
6632 }
6633 #endif
6634
6635 /* VOID
6636 * RtlStoreUlongPtr(
6637 * IN OUT PULONG_PTR Address,
6638 * IN ULONG_PTR Value);
6639 */
6640 #ifdef _WIN64
6641 #define RtlStoreUlongPtr(Address,Value) \
6642 RtlStoreUlonglong(Address,Value)
6643 #else
6644 #define RtlStoreUlongPtr(Address,Value) \
6645 RtlStoreUlong(Address,Value)
6646 #endif
6647
6648 /* VOID
6649 * RtlStoreUshort(
6650 * IN PUSHORT Address,
6651 * IN USHORT Value);
6652 */
6653 #if defined(_AMD64_)
6654 #define RtlStoreUshort(Address,Value) \
6655 *(USHORT UNALIGNED *)(Address) = (Value)
6656 #else
6657 #define RtlStoreUshort(Address,Value) \
6658 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
6659 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
6660 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
6661 } \
6662 else { \
6663 *((PUSHORT) (Address)) = (USHORT)Value; \
6664 }
6665 #endif
6666
6667 NTSYSAPI
6668 BOOLEAN
6669 NTAPI
6670 RtlTimeFieldsToTime(
6671 IN PTIME_FIELDS TimeFields,
6672 IN PLARGE_INTEGER Time);
6673
6674 NTSYSAPI
6675 VOID
6676 NTAPI
6677 RtlTimeToTimeFields(
6678 IN PLARGE_INTEGER Time,
6679 IN PTIME_FIELDS TimeFields);
6680
6681 NTSYSAPI
6682 ULONG
6683 FASTCALL
6684 RtlUlongByteSwap(
6685 IN ULONG Source);
6686
6687 NTSYSAPI
6688 ULONGLONG
6689 FASTCALL
6690 RtlUlonglongByteSwap(
6691 IN ULONGLONG Source);
6692
6693 NTSYSAPI
6694 NTSTATUS
6695 NTAPI
6696 RtlUnicodeStringToAnsiString(
6697 IN OUT PANSI_STRING DestinationString,
6698 IN PCUNICODE_STRING SourceString,
6699 IN BOOLEAN AllocateDestinationString);
6700
6701 NTSYSAPI
6702 ULONG
6703 NTAPI
6704 RtlxUnicodeStringToAnsiSize(
6705 IN PCUNICODE_STRING UnicodeString);
6706
6707 #define RtlUnicodeStringToAnsiSize(String) ( \
6708 NLS_MB_CODE_PAGE_TAG ? \
6709 RtlxUnicodeStringToAnsiSize(String) : \
6710 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
6711 )
6712
6713 NTSYSAPI
6714 NTSTATUS
6715 NTAPI
6716 RtlUnicodeStringToInteger(
6717 IN PCUNICODE_STRING String,
6718 IN ULONG Base OPTIONAL,
6719 OUT PULONG Value);
6720
6721 NTSYSAPI
6722 WCHAR
6723 NTAPI
6724 RtlUpcaseUnicodeChar(
6725 IN WCHAR SourceCharacter);
6726
6727 NTSYSAPI
6728 USHORT
6729 FASTCALL
6730 RtlUshortByteSwap(
6731 IN USHORT Source);
6732
6733 NTSYSAPI
6734 BOOLEAN
6735 NTAPI
6736 RtlValidRelativeSecurityDescriptor(
6737 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
6738 IN ULONG SecurityDescriptorLength,
6739 IN SECURITY_INFORMATION RequiredInformation);
6740
6741 NTSYSAPI
6742 BOOLEAN
6743 NTAPI
6744 RtlValidSecurityDescriptor(
6745 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6746
6747 NTSYSAPI
6748 NTSTATUS
6749 NTAPI
6750 RtlWriteRegistryValue(
6751 IN ULONG RelativeTo,
6752 IN PCWSTR Path,
6753 IN PCWSTR ValueName,
6754 IN ULONG ValueType,
6755 IN PVOID ValueData,
6756 IN ULONG ValueLength);
6757
6758
6759 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
6760
6761
6762 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
6763 NTSYSAPI
6764 VOID
6765 FASTCALL
6766 RtlPrefetchMemoryNonTemporal(
6767 IN PVOID Source,
6768 IN SIZE_T Length);
6769 #endif
6770
6771
6772 #if (NTDDI_VERSION >= NTDDI_WINXP)
6773
6774
6775
6776 NTSYSAPI
6777 VOID
6778 NTAPI
6779 RtlClearBit(
6780 PRTL_BITMAP BitMapHeader,
6781 ULONG BitNumber);
6782
6783 NTSYSAPI
6784 WCHAR
6785 NTAPI
6786 RtlDowncaseUnicodeChar(
6787 IN WCHAR SourceCharacter);
6788
6789 NTSYSAPI
6790 VOID
6791 NTAPI
6792 RtlSetBit(
6793 PRTL_BITMAP BitMapHeader,
6794 ULONG BitNumber);
6795
6796 NTSYSAPI
6797 BOOLEAN
6798 NTAPI
6799 RtlTestBit(
6800 IN PRTL_BITMAP BitMapHeader,
6801 IN ULONG BitNumber);
6802
6803 NTSYSAPI
6804 NTSTATUS
6805 NTAPI
6806 RtlHashUnicodeString(
6807 IN CONST UNICODE_STRING *String,
6808 IN BOOLEAN CaseInSensitive,
6809 IN ULONG HashAlgorithm,
6810 OUT PULONG HashValue);
6811
6812
6813 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
6814
6815 #if (NTDDI_VERSION >= NTDDI_VISTA)
6816
6817
6818
6819 NTSYSAPI
6820 ULONG
6821 NTAPI
6822 RtlNumberOfSetBitsUlongPtr(
6823 IN ULONG_PTR Target);
6824
6825 NTSYSAPI
6826 ULONGLONG
6827 NTAPI
6828 RtlIoDecodeMemIoResource (
6829 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
6830 OUT PULONGLONG Alignment OPTIONAL,
6831 OUT PULONGLONG MinimumAddress OPTIONAL,
6832 OUT PULONGLONG MaximumAddress OPTIONAL);
6833
6834 NTSYSAPI
6835 NTSTATUS
6836 NTAPI
6837 RtlIoEncodeMemIoResource(
6838 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
6839 IN UCHAR Type,
6840 IN ULONGLONG Length,
6841 IN ULONGLONG Alignment,
6842 IN ULONGLONG MinimumAddress,
6843 IN ULONGLONG MaximumAddress);
6844
6845 NTSYSAPI
6846 ULONGLONG
6847 NTAPI
6848 RtlCmDecodeMemIoResource(
6849 IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
6850 OUT PULONGLONG Start OPTIONAL);
6851
6852 NTSYSAPI
6853 NTSTATUS
6854 NTAPI
6855 RtlFindClosestEncodableLength(
6856 IN ULONGLONG SourceLength,
6857 OUT PULONGLONG TargetLength);
6858
6859 NTSYSAPI
6860 NTSTATUS
6861 NTAPI
6862 RtlCmEncodeMemIoResource(
6863 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
6864 IN UCHAR Type,
6865 IN ULONGLONG Length,
6866 IN ULONGLONG Start);
6867
6868
6869 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
6870
6871 #if (NTDDI_VERSION >= NTDDI_WIN7)
6872
6873
6874
6875 NTSYSAPI
6876 NTSTATUS
6877 NTAPI
6878 RtlUnicodeToUTF8N(
6879 OUT PCHAR UTF8StringDestination,
6880 IN ULONG UTF8StringMaxByteCount,
6881 OUT PULONG UTF8StringActualByteCount,
6882 IN PCWCH UnicodeStringSource,
6883 IN ULONG UnicodeStringByteCount);
6884
6885 NTSYSAPI
6886 NTSTATUS
6887 NTAPI
6888 RtlUTF8ToUnicodeN(
6889 OUT PWSTR UnicodeStringDestination,
6890 IN ULONG UnicodeStringMaxByteCount,
6891 OUT PULONG UnicodeStringActualByteCount,
6892 IN PCCH UTF8StringSource,
6893 IN ULONG UTF8StringByteCount);
6894
6895 NTSYSAPI
6896 ULONG64
6897 NTAPI
6898 RtlGetEnabledExtendedFeatures(
6899 IN ULONG64 FeatureMask);
6900
6901
6902 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
6903
6904
6905 #if !defined(MIDL_PASS)
6906 /* inline funftions */
6907 //DECLSPEC_DEPRECATED_DDK_WINXP
6908 static __inline
6909 LARGE_INTEGER
6910 NTAPI_INLINE
6911 RtlConvertLongToLargeInteger(
6912 IN LONG SignedInteger)
6913 {
6914 LARGE_INTEGER ret;
6915 ret.QuadPart = SignedInteger;
6916 return ret;
6917 }
6918
6919 //DECLSPEC_DEPRECATED_DDK_WINXP
6920 static __inline
6921 LARGE_INTEGER
6922 NTAPI_INLINE
6923 RtlConvertUlongToLargeInteger(
6924 IN ULONG UnsignedInteger)
6925 {
6926 LARGE_INTEGER ret;
6927 ret.QuadPart = UnsignedInteger;
6928 return ret;
6929 }
6930
6931 //DECLSPEC_DEPRECATED_DDK
6932 static __inline
6933 ULONG
6934 NTAPI_INLINE
6935 RtlEnlargedUnsignedDivide(
6936 IN ULARGE_INTEGER Dividend,
6937 IN ULONG Divisor,
6938 IN OUT PULONG Remainder)
6939 {
6940 if (Remainder)
6941 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
6942 return (ULONG)(Dividend.QuadPart / Divisor);
6943 }
6944
6945 //DECLSPEC_DEPRECATED_DDK
6946 static __inline
6947 LARGE_INTEGER
6948 NTAPI_INLINE
6949 RtlEnlargedUnsignedMultiply(
6950 IN ULONG Multiplicand,
6951 IN ULONG Multiplier)
6952 {
6953 LARGE_INTEGER ret;
6954 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
6955 return ret;
6956 }
6957
6958 //DECLSPEC_DEPRECATED_DDK
6959 static __inline
6960 LARGE_INTEGER
6961 NTAPI_INLINE
6962 RtlEnlargedIntegerMultiply(
6963 IN LONG Multiplicand,
6964 IN LONG Multiplier)
6965 {
6966 LARGE_INTEGER ret;
6967 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
6968 return ret;
6969 }
6970
6971 FORCEINLINE
6972 VOID
6973 RtlInitEmptyAnsiString(
6974 OUT PANSI_STRING AnsiString,
6975 IN PCHAR Buffer,
6976 IN USHORT BufferSize)
6977 {
6978 AnsiString->Length = 0;
6979 AnsiString->MaximumLength = BufferSize;
6980 AnsiString->Buffer = Buffer;
6981 }
6982
6983 FORCEINLINE
6984 VOID
6985 RtlInitEmptyUnicodeString(
6986 OUT PUNICODE_STRING UnicodeString,
6987 IN PWSTR Buffer,
6988 IN USHORT BufferSize)
6989 {
6990 UnicodeString->Length = 0;
6991 UnicodeString->MaximumLength = BufferSize;
6992 UnicodeString->Buffer = Buffer;
6993 }
6994
6995 #if defined(_AMD64_) || defined(_IA64_)
6996
6997
6998 static __inline
6999 LARGE_INTEGER
7000 NTAPI_INLINE
7001 RtlExtendedIntegerMultiply(
7002 IN LARGE_INTEGER Multiplicand,
7003 IN LONG Multiplier)
7004 {
7005 LARGE_INTEGER ret;
7006 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
7007 return ret;
7008 }
7009
7010 static __inline
7011 LARGE_INTEGER
7012 NTAPI_INLINE
7013 RtlExtendedLargeIntegerDivide(
7014 IN LARGE_INTEGER Dividend,
7015 IN ULONG Divisor,
7016 OUT PULONG Remainder OPTIONAL)
7017 {
7018 LARGE_INTEGER ret;
7019 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
7020 if (Remainder)
7021 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
7022 return ret;
7023 }
7024
7025
7026
7027 #endif /* defined(_AMD64_) || defined(_IA64_) */
7028
7029
7030 #if defined(_AMD64_)
7031
7032 #define MultiplyHigh __mulh
7033 #define UnsignedMultiplyHigh __umulh
7034
7035 //DECLSPEC_DEPRECATED_DDK
7036 static __inline
7037 LARGE_INTEGER
7038 NTAPI_INLINE
7039 RtlExtendedMagicDivide(
7040 IN LARGE_INTEGER Dividend,
7041 IN LARGE_INTEGER MagicDivisor,
7042 IN CCHAR ShiftCount)
7043 {
7044 LARGE_INTEGER ret;
7045 ULONG64 ret64;
7046 BOOLEAN Pos;
7047 Pos = (Dividend.QuadPart >= 0);
7048 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
7049 MagicDivisor.QuadPart);
7050 ret64 >>= ShiftCount;
7051 ret.QuadPart = Pos ? ret64 : -ret64;
7052 return ret;
7053 }
7054 #endif
7055
7056 //DECLSPEC_DEPRECATED_DDK
7057 static __inline
7058 LARGE_INTEGER
7059 NTAPI_INLINE
7060 RtlLargeIntegerAdd(
7061 IN LARGE_INTEGER Addend1,
7062 IN LARGE_INTEGER Addend2)
7063 {
7064 LARGE_INTEGER ret;
7065 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
7066 return ret;
7067 }
7068
7069 /* VOID
7070 * RtlLargeIntegerAnd(
7071 * IN OUT LARGE_INTEGER Result,
7072 * IN LARGE_INTEGER Source,
7073 * IN LARGE_INTEGER Mask);
7074 */
7075 #define RtlLargeIntegerAnd(Result, Source, Mask) \
7076 Result.QuadPart = Source.QuadPart & Mask.QuadPart
7077
7078 //DECLSPEC_DEPRECATED_DDK
7079 static __inline
7080 LARGE_INTEGER
7081 NTAPI_INLINE
7082 RtlLargeIntegerArithmeticShift(
7083 IN LARGE_INTEGER LargeInteger,
7084 IN CCHAR ShiftCount)
7085 {
7086 LARGE_INTEGER ret;
7087 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
7088 return ret;
7089 }
7090
7091 /* BOOLEAN
7092 * RtlLargeIntegerEqualTo(
7093 * IN LARGE_INTEGER Operand1,
7094 * IN LARGE_INTEGER Operand2);
7095 */
7096 #define RtlLargeIntegerEqualTo(X,Y) \
7097 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
7098
7099 FORCEINLINE
7100 PVOID
7101 RtlSecureZeroMemory(
7102 OUT PVOID Pointer,
7103 IN SIZE_T Size)
7104 {
7105 volatile char* vptr = (volatile char*)Pointer;
7106 #if defined(_M_AMD64)
7107 __stosb((PUCHAR)vptr, 0, Size);
7108 #else
7109 char * endptr = (char *)vptr + Size;
7110 while (vptr < endptr) {
7111 *vptr = 0; vptr++;
7112 }
7113 #endif
7114 return Pointer;
7115 }
7116
7117 #if defined(_M_AMD64)
7118 FORCEINLINE
7119 BOOLEAN
7120 RtlCheckBit(
7121 IN PRTL_BITMAP BitMapHeader,
7122 IN ULONG BitPosition)
7123 {
7124 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
7125 }
7126 #else
7127 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
7128 #endif /* defined(_M_AMD64) */
7129
7130 #define RtlLargeIntegerGreaterThan(X,Y) ( \
7131 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
7132 ((X).HighPart > (Y).HighPart) \
7133 )
7134
7135 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
7136 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
7137 ((X).HighPart > (Y).HighPart) \
7138 )
7139
7140 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
7141 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
7142 )
7143
7144 #define RtlLargeIntegerLessThan(X,Y) ( \
7145 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
7146 ((X).HighPart < (Y).HighPart) \
7147 )
7148
7149 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
7150 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
7151 ((X).HighPart < (Y).HighPart) \
7152 )
7153
7154 #define RtlLargeIntegerGreaterThanZero(X) ( \
7155 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
7156 ((X).HighPart > 0 ) \
7157 )
7158
7159 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
7160
7161 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
7162
7163 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
7164
7165 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
7166
7167 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
7168
7169 #endif /* !defined(MIDL_PASS) */
7170
7171 /* Byte Swap Functions */
7172 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
7173 ((defined(_M_AMD64) || defined(_M_IA64)) \
7174 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
7175
7176 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
7177 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
7178 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
7179
7180 #endif
7181
7182 #if DBG
7183
7184 #define ASSERT(exp) \
7185 (VOID)((!(exp)) ? \
7186 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
7187
7188 #define ASSERTMSG(msg, exp) \
7189 (VOID)((!(exp)) ? \
7190 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
7191
7192 #define RTL_SOFT_ASSERT(exp) \
7193 (VOID)((!(exp)) ? \
7194 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
7195
7196 #define RTL_SOFT_ASSERTMSG(msg, exp) \
7197 (VOID)((!(exp)) ? \
7198 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
7199
7200 #define RTL_VERIFY(exp) ASSERT(exp)
7201 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
7202
7203 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
7204 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
7205
7206 #if defined(_MSC_VER)
7207
7208 #define NT_ASSERT(exp) \
7209 ((!(exp)) ? \
7210 (__annotation(L"Debug", L"AssertFail", L#exp), \
7211 DbgRaiseAssertionFailure(), FALSE) : TRUE)
7212
7213 #define NT_ASSERTMSG(msg, exp) \
7214 ((!(exp)) ? \
7215 (__annotation(L"Debug", L"AssertFail", L##msg), \
7216 DbgRaiseAssertionFailure(), FALSE) : TRUE)
7217
7218 #define NT_ASSERTMSGW(msg, exp) \
7219 ((!(exp)) ? \
7220 (__annotation(L"Debug", L"AssertFail", msg), \
7221 DbgRaiseAssertionFailure(), FALSE) : TRUE)
7222
7223 #else
7224
7225 /* GCC doesn't support __annotation (nor PDB) */
7226 #define NT_ASSERT(exp) \
7227 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
7228
7229 #define NT_ASSERTMSG NT_ASSERT
7230 #define NT_ASSERTMSGW NT_ASSERT
7231
7232 #endif
7233
7234 #else /* !DBG */
7235
7236 #define ASSERT(exp) ((VOID) 0)
7237 #define ASSERTMSG(msg, exp) ((VOID) 0)
7238
7239 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
7240 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
7241
7242 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
7243 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
7244
7245 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
7246 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
7247
7248 #define NT_ASSERT(exp) ((VOID)0)
7249 #define NT_ASSERTMSG(exp) ((VOID)0)
7250 #define NT_ASSERTMSGW(exp) ((VOID)0)
7251
7252 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
7253 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
7254 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
7255
7256 #endif /* DBG */
7257
7258 #define InitializeListHead32(ListHead) (\
7259 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
7260
7261 #if !defined(_WINBASE_)
7262
7263 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
7264
7265 NTKERNELAPI
7266 VOID
7267 InitializeSListHead(
7268 OUT PSLIST_HEADER SListHead);
7269
7270 #else
7271
7272 VOID
7273 FORCEINLINE
7274 InitializeSListHead(
7275 OUT PSLIST_HEADER SListHead)
7276 {
7277 #if defined(_IA64_)
7278 ULONG64 FeatureBits;
7279 #endif
7280
7281 #if defined(_WIN64)
7282 if (((ULONG_PTR)SListHead & 0xf) != 0) {
7283 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
7284 }
7285 #endif
7286 RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
7287 #if defined(_IA64_)
7288 FeatureBits = __getReg(CV_IA64_CPUID4);
7289 if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
7290 SListHead->Header16.HeaderType = 1;
7291 SListHead->Header16.Init = 1;
7292 }
7293 #endif
7294 }
7295
7296 #endif
7297
7298 #if defined(_WIN64)
7299
7300 #define InterlockedPopEntrySList(Head) \
7301 ExpInterlockedPopEntrySList(Head)
7302
7303 #define InterlockedPushEntrySList(Head, Entry) \
7304 ExpInterlockedPushEntrySList(Head, Entry)
7305
7306 #define InterlockedFlushSList(Head) \
7307 ExpInterlockedFlushSList(Head)
7308
7309 #define QueryDepthSList(Head) \
7310 ExQueryDepthSList(Head)
7311
7312 #else /* !defined(_WIN64) */
7313
7314 NTKERNELAPI
7315 PSLIST_ENTRY
7316 FASTCALL
7317 InterlockedPopEntrySList(
7318 IN PSLIST_HEADER ListHead);
7319
7320 NTKERNELAPI
7321 PSLIST_ENTRY
7322 FASTCALL
7323 InterlockedPushEntrySList(
7324 IN PSLIST_HEADER ListHead,
7325 IN PSLIST_ENTRY ListEntry);
7326
7327 #define InterlockedFlushSList(ListHead) \
7328 ExInterlockedFlushSList(ListHead)
7329
7330 #define QueryDepthSList(Head) \
7331 ExQueryDepthSList(Head)
7332
7333 #endif /* !defined(_WIN64) */
7334
7335 #endif /* !defined(_WINBASE_) */
7336
7337 /******************************************************************************
7338 * Kernel Functions *
7339 ******************************************************************************/
7340
7341 NTHALAPI
7342 KIRQL
7343 NTAPI
7344 KeGetCurrentIrql(
7345 VOID);
7346
7347 NTKERNELAPI
7348 VOID
7349 NTAPI
7350 KeInitializeEvent(
7351 OUT PRKEVENT Event,
7352 IN EVENT_TYPE Type,
7353 IN BOOLEAN State);
7354
7355 NTKERNELAPI
7356 VOID
7357 NTAPI
7358 KeClearEvent(
7359 IN OUT PRKEVENT Event);
7360
7361 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7362
7363
7364 #if defined(_NTDDK_) || defined(_NTIFS_)
7365 NTKERNELAPI
7366 VOID
7367 NTAPI
7368 ProbeForRead(
7369 IN CONST VOID *Address, /* CONST is added */
7370 IN SIZE_T Length,
7371 IN ULONG Alignment);
7372 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
7373
7374 NTKERNELAPI
7375 VOID
7376 NTAPI
7377 ProbeForWrite(
7378 IN PVOID Address,
7379 IN SIZE_T Length,
7380 IN ULONG Alignment);
7381
7382
7383 #if defined(SINGLE_GROUP_LEGACY_API)
7384
7385 NTKERNELAPI
7386 VOID
7387 NTAPI
7388 KeRevertToUserAffinityThread(VOID);
7389
7390 NTKERNELAPI
7391 VOID
7392 NTAPI
7393 KeSetSystemAffinityThread(
7394 IN KAFFINITY Affinity);
7395
7396 NTKERNELAPI
7397 VOID
7398 NTAPI
7399 KeSetTargetProcessorDpc(
7400 IN OUT PRKDPC Dpc,
7401 IN CCHAR Number);
7402
7403 NTKERNELAPI
7404 KAFFINITY
7405 NTAPI
7406 KeQueryActiveProcessors(VOID);
7407
7408
7409 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
7410
7411 #if !defined(_M_AMD64)
7412 NTKERNELAPI
7413 ULONGLONG
7414 NTAPI
7415 KeQueryInterruptTime(VOID);
7416
7417 NTKERNELAPI
7418 VOID
7419 NTAPI
7420 KeQuerySystemTime(
7421 OUT PLARGE_INTEGER CurrentTime);
7422 #endif /* !_M_AMD64 */
7423
7424 #if !defined(_X86_)
7425 NTKERNELAPI
7426 KIRQL
7427 NTAPI
7428 KeAcquireSpinLockRaiseToDpc(
7429 IN OUT PKSPIN_LOCK SpinLock);
7430
7431 #define KeAcquireSpinLock(SpinLock, OldIrql) \
7432 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
7433
7434 NTKERNELAPI
7435 VOID
7436 NTAPI
7437 KeAcquireSpinLockAtDpcLevel(
7438 IN OUT PKSPIN_LOCK SpinLock);
7439
7440 NTKERNELAPI
7441 VOID
7442 NTAPI
7443 KeReleaseSpinLock(
7444 IN OUT PKSPIN_LOCK SpinLock,
7445 IN KIRQL NewIrql);
7446
7447 NTKERNELAPI
7448 VOID
7449 NTAPI
7450 KeReleaseSpinLockFromDpcLevel(
7451 IN OUT PKSPIN_LOCK SpinLock);
7452 #endif /* !_X86_ */
7453
7454 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
7455 NTKERNELAPI
7456 VOID
7457 NTAPI
7458 KeInitializeSpinLock(
7459 IN PKSPIN_LOCK SpinLock);
7460 #else
7461 FORCEINLINE
7462 VOID
7463 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
7464 {
7465 /* Clear the lock */
7466 *SpinLock = 0;
7467 }
7468 #endif
7469
7470 NTKERNELAPI
7471 DECLSPEC_NORETURN
7472 VOID
7473 NTAPI
7474 KeBugCheckEx(
7475 IN ULONG BugCheckCode,
7476 IN ULONG_PTR BugCheckParameter1,
7477 IN ULONG_PTR BugCheckParameter2,
7478 IN ULONG_PTR BugCheckParameter3,
7479 IN ULONG_PTR BugCheckParameter4);
7480
7481 NTKERNELAPI
7482 BOOLEAN
7483 NTAPI
7484 KeCancelTimer(
7485 IN OUT PKTIMER);
7486
7487 NTKERNELAPI
7488 NTSTATUS
7489 NTAPI
7490 KeDelayExecutionThread(
7491 IN KPROCESSOR_MODE WaitMode,
7492 IN BOOLEAN Alertable,
7493 IN PLARGE_INTEGER Interval);
7494
7495 NTKERNELAPI
7496 BOOLEAN
7497 NTAPI
7498 KeDeregisterBugCheckCallback(
7499 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
7500
7501 NTKERNELAPI
7502 VOID
7503 NTAPI
7504 KeEnterCriticalRegion(VOID);
7505
7506 NTKERNELAPI
7507 VOID
7508 NTAPI
7509 KeInitializeDeviceQueue(
7510 OUT PKDEVICE_QUEUE DeviceQueue);
7511
7512 NTKERNELAPI
7513 VOID
7514 NTAPI
7515 KeInitializeDpc(
7516 OUT PRKDPC Dpc,
7517 IN PKDEFERRED_ROUTINE DeferredRoutine,
7518 IN PVOID DeferredContext OPTIONAL);
7519
7520 NTKERNELAPI
7521 VOID
7522 NTAPI
7523 KeInitializeMutex(
7524 OUT PRKMUTEX Mutex,
7525 IN ULONG Level);
7526
7527 NTKERNELAPI
7528 VOID
7529 NTAPI
7530 KeInitializeSemaphore(
7531 OUT PRKSEMAPHORE Semaphore,
7532 IN LONG Count,
7533 IN LONG Limit);
7534
7535 NTKERNELAPI
7536 VOID
7537 NTAPI
7538 KeInitializeTimer(
7539 OUT PKTIMER Timer);
7540
7541 NTKERNELAPI
7542 VOID
7543 NTAPI
7544 KeInitializeTimerEx(
7545 OUT PKTIMER Timer,
7546 IN TIMER_TYPE Type);
7547
7548 NTKERNELAPI
7549 BOOLEAN
7550 NTAPI
7551 KeInsertByKeyDeviceQueue(
7552 IN OUT PKDEVICE_QUEUE DeviceQueue,
7553 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7554 IN ULONG SortKey);
7555
7556 NTKERNELAPI
7557 BOOLEAN
7558 NTAPI
7559 KeInsertDeviceQueue(
7560 IN OUT PKDEVICE_QUEUE DeviceQueue,
7561 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7562
7563 NTKERNELAPI
7564 BOOLEAN
7565 NTAPI
7566 KeInsertQueueDpc(
7567 IN OUT PRKDPC Dpc,
7568 IN PVOID SystemArgument1 OPTIONAL,
7569 IN PVOID SystemArgument2 OPTIONAL);
7570
7571 NTKERNELAPI
7572 VOID
7573 NTAPI
7574 KeLeaveCriticalRegion(VOID);
7575
7576 NTHALAPI
7577 LARGE_INTEGER
7578 NTAPI
7579 KeQueryPerformanceCounter(
7580 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
7581
7582 NTKERNELAPI
7583 KPRIORITY
7584 NTAPI
7585 KeQueryPriorityThread(
7586 IN PRKTHREAD Thread);
7587
7588 NTKERNELAPI
7589 ULONG
7590 NTAPI
7591 KeQueryTimeIncrement(VOID);
7592
7593 NTKERNELAPI
7594 LONG
7595 NTAPI
7596 KeReadStateEvent(
7597 IN PRKEVENT Event);
7598
7599 NTKERNELAPI
7600 LONG
7601 NTAPI
7602 KeReadStateMutex(
7603 IN PRKMUTEX Mutex);
7604
7605 NTKERNELAPI
7606 LONG
7607 NTAPI
7608 KeReadStateSemaphore(
7609 IN PRKSEMAPHORE Semaphore);
7610
7611 NTKERNELAPI
7612 BOOLEAN
7613 NTAPI
7614 KeReadStateTimer(
7615 IN PKTIMER Timer);
7616
7617 NTKERNELAPI
7618 BOOLEAN
7619 NTAPI
7620 KeRegisterBugCheckCallback(
7621 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7622 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7623 IN PVOID Buffer,
7624 IN ULONG Length,
7625 IN PUCHAR Component);
7626
7627 NTKERNELAPI
7628 LONG
7629 NTAPI
7630 KeReleaseMutex(
7631 IN OUT PRKMUTEX Mutex,
7632 IN BOOLEAN Wait);
7633
7634 NTKERNELAPI
7635 LONG
7636 NTAPI
7637 KeReleaseSemaphore(
7638 IN OUT PRKSEMAPHORE Semaphore,
7639 IN KPRIORITY Increment,
7640 IN LONG Adjustment,
7641 IN BOOLEAN Wait);
7642
7643 NTKERNELAPI
7644 PKDEVICE_QUEUE_ENTRY
7645 NTAPI
7646 KeRemoveByKeyDeviceQueue(
7647 IN OUT PKDEVICE_QUEUE DeviceQueue,
7648 IN ULONG SortKey);
7649
7650 NTKERNELAPI
7651 PKDEVICE_QUEUE_ENTRY
7652 NTAPI
7653 KeRemoveDeviceQueue(
7654 IN OUT PKDEVICE_QUEUE DeviceQueue);
7655
7656 NTKERNELAPI
7657 BOOLEAN
7658 NTAPI
7659 KeRemoveEntryDeviceQueue(
7660 IN OUT PKDEVICE_QUEUE DeviceQueue,
7661 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7662
7663 NTKERNELAPI
7664 BOOLEAN
7665 NTAPI
7666 KeRemoveQueueDpc(
7667 IN OUT PRKDPC Dpc);
7668
7669 NTKERNELAPI
7670 LONG
7671 NTAPI
7672 KeResetEvent(
7673 IN OUT PRKEVENT Event);
7674
7675 NTKERNELAPI
7676 LONG
7677 NTAPI
7678 KeSetEvent(
7679 IN OUT PRKEVENT Event,
7680 IN KPRIORITY Increment,
7681 IN BOOLEAN Wait);
7682
7683 NTKERNELAPI
7684 VOID
7685 NTAPI
7686 KeSetImportanceDpc(
7687 IN OUT PRKDPC Dpc,
7688 IN KDPC_IMPORTANCE Importance);
7689
7690 NTKERNELAPI
7691 KPRIORITY
7692 NTAPI
7693 KeSetPriorityThread(
7694 IN OUT PKTHREAD Thread,
7695 IN KPRIORITY Priority);
7696
7697 NTKERNELAPI
7698 BOOLEAN
7699 NTAPI
7700 KeSetTimer(
7701 IN OUT PKTIMER Timer,
7702 IN LARGE_INTEGER DueTime,
7703 IN PKDPC Dpc OPTIONAL);
7704
7705 NTKERNELAPI
7706 BOOLEAN
7707 NTAPI
7708 KeSetTimerEx(
7709 IN OUT PKTIMER Timer,
7710 IN LARGE_INTEGER DueTime,
7711 IN LONG Period OPTIONAL,
7712 IN PKDPC Dpc OPTIONAL);
7713
7714 NTHALAPI
7715 VOID
7716 NTAPI
7717 KeStallExecutionProcessor(
7718 IN ULONG MicroSeconds);
7719
7720 NTKERNELAPI
7721 BOOLEAN
7722 NTAPI
7723 KeSynchronizeExecution(
7724 IN OUT PKINTERRUPT Interrupt,
7725 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7726 IN PVOID SynchronizeContext OPTIONAL);
7727
7728 NTKERNELAPI
7729 NTSTATUS
7730 NTAPI
7731 KeWaitForMultipleObjects(
7732 IN ULONG Count,
7733 IN PVOID Object[],
7734 IN WAIT_TYPE WaitType,
7735 IN KWAIT_REASON WaitReason,
7736 IN KPROCESSOR_MODE WaitMode,
7737 IN BOOLEAN Alertable,
7738 IN PLARGE_INTEGER Timeout OPTIONAL,
7739 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
7740
7741 #define KeWaitForMutexObject KeWaitForSingleObject
7742
7743 NTKERNELAPI
7744 NTSTATUS
7745 NTAPI
7746 KeWaitForSingleObject(
7747 IN PVOID Object,
7748 IN KWAIT_REASON WaitReason,
7749 IN KPROCESSOR_MODE WaitMode,
7750 IN BOOLEAN Alertable,
7751 IN PLARGE_INTEGER Timeout OPTIONAL);
7752
7753 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
7754
7755 #if (NTDDI_VERSION >= NTDDI_WINXP)
7756
7757 _DECL_HAL_KE_IMPORT
7758 VOID
7759 FASTCALL
7760 KeAcquireInStackQueuedSpinLock(
7761 IN OUT PKSPIN_LOCK SpinLock,
7762 OUT PKLOCK_QUEUE_HANDLE LockHandle);
7763
7764 NTKERNELAPI
7765 VOID
7766 FASTCALL
7767 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7768 IN OUT PKSPIN_LOCK SpinLock,
7769 OUT PKLOCK_QUEUE_HANDLE LockHandle);
7770
7771 NTKERNELAPI
7772 KIRQL
7773 NTAPI
7774 KeAcquireInterruptSpinLock(
7775 IN OUT PKINTERRUPT Interrupt);
7776
7777 NTKERNELAPI
7778 BOOLEAN
7779 NTAPI
7780 KeAreApcsDisabled(VOID);
7781
7782 NTKERNELAPI
7783 ULONG
7784 NTAPI
7785 KeGetRecommendedSharedDataAlignment(VOID);
7786
7787 NTKERNELAPI
7788 ULONG
7789 NTAPI
7790 KeQueryRuntimeThread(
7791 IN PKTHREAD Thread,
7792 OUT PULONG UserTime);
7793
7794 NTKERNELAPI
7795 VOID
7796 FASTCALL
7797 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7798 IN PKLOCK_QUEUE_HANDLE LockHandle);
7799
7800 NTKERNELAPI
7801 VOID
7802 NTAPI
7803 KeReleaseInterruptSpinLock(
7804 IN OUT PKINTERRUPT Interrupt,
7805 IN KIRQL OldIrql);
7806
7807 NTKERNELAPI
7808 PKDEVICE_QUEUE_ENTRY
7809 NTAPI
7810 KeRemoveByKeyDeviceQueueIfBusy(
7811 IN OUT PKDEVICE_QUEUE DeviceQueue,
7812 IN ULONG SortKey);
7813
7814 _DECL_HAL_KE_IMPORT
7815 VOID
7816 FASTCALL
7817 KeReleaseInStackQueuedSpinLock(
7818 IN PKLOCK_QUEUE_HANDLE LockHandle);
7819
7820 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
7821
7822 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
7823
7824 NTKERNELAPI
7825 BOOLEAN
7826 NTAPI
7827 KeDeregisterBugCheckReasonCallback(
7828 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
7829
7830 NTKERNELAPI
7831 BOOLEAN
7832 NTAPI
7833 KeRegisterBugCheckReasonCallback(
7834 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
7835 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
7836 IN KBUGCHECK_CALLBACK_REASON Reason,
7837 IN PUCHAR Component);
7838
7839 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
7840
7841 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
7842 NTKERNELAPI
7843 VOID
7844 NTAPI
7845 KeFlushQueuedDpcs(VOID);
7846 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
7847
7848 #if (NTDDI_VERSION >= NTDDI_WS03)
7849
7850 NTKERNELAPI
7851 PVOID
7852 NTAPI
7853 KeRegisterNmiCallback(
7854 IN PNMI_CALLBACK CallbackRoutine,
7855 IN PVOID Context OPTIONAL);
7856
7857 NTKERNELAPI
7858 NTSTATUS
7859 NTAPI
7860 KeDeregisterNmiCallback(
7861 IN PVOID Handle);
7862
7863 NTKERNELAPI
7864 VOID
7865 NTAPI
7866 KeInitializeThreadedDpc(
7867 OUT PRKDPC Dpc,
7868 IN PKDEFERRED_ROUTINE DeferredRoutine,
7869 IN PVOID DeferredContext OPTIONAL);
7870
7871 NTKERNELAPI
7872 ULONG_PTR
7873 NTAPI
7874 KeIpiGenericCall(
7875 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
7876 IN ULONG_PTR Context);
7877
7878 NTKERNELAPI
7879 KIRQL
7880 FASTCALL
7881 KeAcquireSpinLockForDpc(
7882 IN OUT PKSPIN_LOCK SpinLock);
7883
7884 NTKERNELAPI
7885 VOID
7886 FASTCALL
7887 KeReleaseSpinLockForDpc(
7888 IN OUT PKSPIN_LOCK SpinLock,
7889 IN KIRQL OldIrql);
7890
7891 NTKERNELAPI
7892 BOOLEAN
7893 FASTCALL
7894 KeTestSpinLock(
7895 IN PKSPIN_LOCK SpinLock);
7896
7897
7898 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
7899
7900 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
7901
7902
7903 NTKERNELAPI
7904 BOOLEAN
7905 FASTCALL
7906 KeTryToAcquireSpinLockAtDpcLevel(
7907 IN OUT PKSPIN_LOCK SpinLock);
7908
7909 NTKERNELAPI
7910 BOOLEAN
7911 NTAPI
7912 KeAreAllApcsDisabled(VOID);
7913
7914 NTKERNELAPI
7915 VOID
7916 FASTCALL
7917 KeAcquireGuardedMutex(
7918 IN OUT PKGUARDED_MUTEX GuardedMutex);
7919
7920 NTKERNELAPI
7921 VOID
7922 FASTCALL
7923 KeAcquireGuardedMutexUnsafe(
7924 IN OUT PKGUARDED_MUTEX GuardedMutex);
7925
7926 NTKERNELAPI
7927 VOID
7928 NTAPI
7929 KeEnterGuardedRegion(VOID);
7930
7931 NTKERNELAPI
7932 VOID
7933 NTAPI
7934 KeLeaveGuardedRegion(VOID);
7935
7936 NTKERNELAPI
7937 VOID
7938 FASTCALL
7939 KeInitializeGuardedMutex(
7940 OUT PKGUARDED_MUTEX GuardedMutex);
7941
7942 NTKERNELAPI
7943 VOID
7944 FASTCALL
7945 KeReleaseGuardedMutexUnsafe(
7946 IN OUT PKGUARDED_MUTEX GuardedMutex);
7947
7948 NTKERNELAPI
7949 VOID
7950 FASTCALL
7951 KeReleaseGuardedMutex(
7952 IN OUT PKGUARDED_MUTEX GuardedMutex);
7953
7954 NTKERNELAPI
7955 BOOLEAN
7956 FASTCALL
7957 KeTryToAcquireGuardedMutex(
7958 IN OUT PKGUARDED_MUTEX GuardedMutex);
7959
7960 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
7961
7962 #if (NTDDI_VERSION >= NTDDI_VISTA)
7963
7964 NTKERNELAPI
7965 VOID
7966 FASTCALL
7967 KeAcquireInStackQueuedSpinLockForDpc(
7968 IN OUT PKSPIN_LOCK SpinLock,
7969 OUT PKLOCK_QUEUE_HANDLE LockHandle);
7970
7971 NTKERNELAPI
7972 VOID
7973 FASTCALL
7974 KeReleaseInStackQueuedSpinLockForDpc(
7975 IN PKLOCK_QUEUE_HANDLE LockHandle);
7976
7977 NTKERNELAPI
7978 NTSTATUS
7979 NTAPI
7980 KeQueryDpcWatchdogInformation(
7981 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
7982
7983 #if defined(SINGLE_GROUP_LEGACY_API)
7984
7985 NTKERNELAPI
7986 KAFFINITY
7987 NTAPI
7988 KeSetSystemAffinityThreadEx(
7989 IN KAFFINITY Affinity);
7990
7991 NTKERNELAPI
7992 VOID
7993 NTAPI
7994 KeRevertToUserAffinityThreadEx(
7995 IN KAFFINITY Affinity);
7996
7997 NTKERNELAPI
7998 ULONG
7999 NTAPI
8000 KeQueryActiveProcessorCount(
8001 OUT PKAFFINITY ActiveProcessors OPTIONAL);
8002
8003 NTKERNELAPI
8004 ULONG
8005 NTAPI
8006 KeQueryMaximumProcessorCount(VOID);
8007 #endif /* SINGLE_GROUP_LEGACY_API */
8008
8009 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8010
8011 #if (NTDDI_VERSION >= NTDDI_WS08)
8012
8013 PVOID
8014 KeRegisterProcessorChangeCallback(
8015 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
8016 IN PVOID CallbackContext OPTIONAL,
8017 IN ULONG Flags);
8018
8019 VOID
8020 KeDeregisterProcessorChangeCallback(
8021 IN PVOID CallbackHandle);
8022
8023 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
8024
8025 #if (NTDDI_VERSION >= NTDDI_WIN7)
8026
8027
8028 ULONG64
8029 NTAPI
8030 KeQueryTotalCycleTimeProcess(
8031 IN OUT PKPROCESS Process,
8032 OUT PULONG64 CycleTimeStamp);
8033
8034 ULONG64
8035 NTAPI
8036 KeQueryTotalCycleTimeThread(
8037 IN OUT PKTHREAD Thread,
8038 OUT PULONG64 CycleTimeStamp);
8039
8040 NTKERNELAPI
8041 NTSTATUS
8042 NTAPI
8043 KeSetTargetProcessorDpcEx(
8044 IN OUT PKDPC Dpc,
8045 IN PPROCESSOR_NUMBER ProcNumber);
8046
8047 NTKERNELAPI
8048 VOID
8049 NTAPI
8050 KeSetSystemGroupAffinityThread(
8051 IN PGROUP_AFFINITY Affinity,
8052 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
8053
8054 NTKERNELAPI
8055 VOID
8056 NTAPI
8057 KeRevertToUserGroupAffinityThread(
8058 IN PGROUP_AFFINITY PreviousAffinity);
8059
8060 NTKERNELAPI
8061 BOOLEAN
8062 NTAPI
8063 KeSetCoalescableTimer(
8064 IN OUT PKTIMER Timer,
8065 IN LARGE_INTEGER DueTime,
8066 IN ULONG Period,
8067 IN ULONG TolerableDelay,
8068 IN PKDPC Dpc OPTIONAL);
8069
8070 NTKERNELAPI
8071 ULONGLONG
8072 NTAPI
8073 KeQueryUnbiasedInterruptTime(VOID);
8074
8075 NTKERNELAPI
8076 ULONG
8077 NTAPI
8078 KeQueryActiveProcessorCountEx(
8079 IN USHORT GroupNumber);
8080
8081 NTKERNELAPI
8082 ULONG
8083 NTAPI
8084 KeQueryMaximumProcessorCountEx(
8085 IN USHORT GroupNumber);
8086
8087 NTKERNELAPI
8088 USHORT
8089 NTAPI
8090 KeQueryActiveGroupCount(VOID);
8091
8092 NTKERNELAPI
8093 USHORT
8094 NTAPI
8095 KeQueryMaximumGroupCount(VOID);
8096
8097 NTKERNELAPI
8098 KAFFINITY
8099 NTAPI
8100 KeQueryGroupAffinity(
8101 IN USHORT GroupNumber);
8102
8103 NTKERNELAPI
8104 ULONG
8105 NTAPI
8106 KeGetCurrentProcessorNumberEx(
8107 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
8108
8109 NTKERNELAPI
8110 VOID
8111 NTAPI
8112 KeQueryNodeActiveAffinity(
8113 IN USHORT NodeNumber,
8114 OUT PGROUP_AFFINITY Affinity OPTIONAL,
8115 OUT PUSHORT Count OPTIONAL);
8116
8117 NTKERNELAPI
8118 USHORT
8119 NTAPI
8120 KeQueryNodeMaximumProcessorCount(
8121 IN USHORT NodeNumber);
8122
8123 NTKERNELAPI
8124 USHORT
8125 NTAPI
8126 KeQueryHighestNodeNumber(VOID);
8127
8128 NTKERNELAPI
8129 USHORT
8130 NTAPI
8131 KeGetCurrentNodeNumber(VOID);
8132
8133 NTKERNELAPI
8134 NTSTATUS
8135 NTAPI
8136 KeQueryLogicalProcessorRelationship(
8137 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
8138 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
8139 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
8140 IN OUT PULONG Length);
8141
8142 NTKERNELAPI
8143 NTSTATUS
8144 NTAPI
8145 KeSaveExtendedProcessorState(
8146 IN ULONG64 Mask,
8147 OUT PXSTATE_SAVE XStateSave);
8148
8149 NTKERNELAPI
8150 VOID
8151 NTAPI
8152 KeRestoreExtendedProcessorState(
8153 IN PXSTATE_SAVE XStateSave);
8154
8155 NTSTATUS
8156 NTAPI
8157 KeGetProcessorNumberFromIndex(
8158 IN ULONG ProcIndex,
8159 OUT PPROCESSOR_NUMBER ProcNumber);
8160
8161 ULONG
8162 NTAPI
8163 KeGetProcessorIndexFromNumber(
8164 IN PPROCESSOR_NUMBER ProcNumber);
8165
8166 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
8167
8168 #if !defined(_IA64_)
8169 NTHALAPI
8170 VOID
8171 NTAPI
8172 KeFlushWriteBuffer(VOID);
8173 #endif
8174
8175 /* VOID
8176 * KeInitializeCallbackRecord(
8177 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
8178 */
8179 #define KeInitializeCallbackRecord(CallbackRecord) \
8180 CallbackRecord->State = BufferEmpty;
8181
8182 #if DBG
8183
8184 #if (NTDDI_VERSION >= NTDDI_VISTA)
8185 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
8186 #else
8187 #define PAGED_ASSERT( exp ) ASSERT( exp )
8188 #endif
8189
8190 #define PAGED_CODE() { \
8191 if (KeGetCurrentIrql() > APC_LEVEL) { \
8192 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
8193 PAGED_ASSERT(FALSE); \
8194 } \
8195 }
8196
8197 #else
8198
8199 #define PAGED_CODE()
8200
8201 #endif /* DBG */
8202
8203 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
8204
8205 /******************************************************************************
8206 * Memory manager Functions *
8207 ******************************************************************************/
8208 /* Alignment Macros */
8209 #define ALIGN_DOWN_BY(size, align) \
8210 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
8211
8212 #define ALIGN_UP_BY(size, align) \
8213 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
8214
8215 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
8216 ((PVOID)ALIGN_DOWN_BY(ptr, align))
8217
8218 #define ALIGN_UP_POINTER_BY(ptr, align) \
8219 ((PVOID)ALIGN_UP_BY(ptr, align))
8220
8221 #define ALIGN_DOWN(size, type) \
8222 ALIGN_DOWN_BY(size, sizeof(type))
8223
8224 #define ALIGN_UP(size, type) \
8225 ALIGN_UP_BY(size, sizeof(type))
8226
8227 #define ALIGN_DOWN_POINTER(ptr, type) \
8228 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
8229
8230 #define ALIGN_UP_POINTER(ptr, type) \
8231 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
8232
8233 /* ULONG
8234 * BYTE_OFFSET(
8235 * IN PVOID Va)
8236 */
8237 #define BYTE_OFFSET(Va) \
8238 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
8239
8240 /* ULONG
8241 * BYTES_TO_PAGES(
8242 * IN ULONG Size)
8243 */
8244 #define BYTES_TO_PAGES(Size) \
8245 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
8246
8247 /* PVOID
8248 * PAGE_ALIGN(
8249 * IN PVOID Va)
8250 */
8251 #define PAGE_ALIGN(Va) \
8252 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
8253
8254 /* ULONG_PTR
8255 * ROUND_TO_PAGES(
8256 * IN ULONG_PTR Size)
8257 */
8258 #define ROUND_TO_PAGES(Size) \
8259 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
8260
8261 /* ULONG
8262 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
8263 * IN PVOID Va,
8264 * IN ULONG Size)
8265 */
8266 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
8267 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
8268 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
8269
8270 #define COMPUTE_PAGES_SPANNED(Va, Size) \
8271 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
8272
8273 /*
8274 * ULONG
8275 * MmGetMdlByteCount(
8276 * IN PMDL Mdl)
8277 */
8278 #define MmGetMdlByteCount(_Mdl) \
8279 ((_Mdl)->ByteCount)
8280
8281 /*
8282 * ULONG
8283 * MmGetMdlByteOffset(
8284 * IN PMDL Mdl)
8285 */
8286 #define MmGetMdlByteOffset(_Mdl) \
8287 ((_Mdl)->ByteOffset)
8288
8289 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
8290
8291 /*
8292 * PPFN_NUMBER
8293 * MmGetMdlPfnArray(
8294 * IN PMDL Mdl)
8295 */
8296 #define MmGetMdlPfnArray(_Mdl) \
8297 ((PPFN_NUMBER) ((_Mdl) + 1))
8298
8299 /*
8300 * PVOID
8301 * MmGetMdlVirtualAddress(
8302 * IN PMDL Mdl)
8303 */
8304 #define MmGetMdlVirtualAddress(_Mdl) \
8305 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
8306
8307 #define MmGetProcedureAddress(Address) (Address)
8308
8309 /* PVOID MmGetSystemAddressForMdl(
8310 * IN PMDL Mdl);
8311 */
8312 #define MmGetSystemAddressForMdl(Mdl) \
8313 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
8314 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
8315 ((Mdl)->MappedSystemVa) : \
8316 (MmMapLockedPages((Mdl), KernelMode)))
8317
8318 /* PVOID
8319 * MmGetSystemAddressForMdlSafe(
8320 * IN PMDL Mdl,
8321 * IN MM_PAGE_PRIORITY Priority)
8322 */
8323 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
8324 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
8325 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
8326 (_Mdl)->MappedSystemVa : \
8327 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
8328 KernelMode, MmCached, NULL, FALSE, (_Priority)))
8329
8330 /*
8331 * VOID
8332 * MmInitializeMdl(
8333 * IN PMDL MemoryDescriptorList,
8334 * IN PVOID BaseVa,
8335 * IN SIZE_T Length)
8336 */
8337 #define MmInitializeMdl(_MemoryDescriptorList, \
8338 _BaseVa, \
8339 _Length) \
8340 { \
8341 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
8342 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
8343 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
8344 (_MemoryDescriptorList)->MdlFlags = 0; \
8345 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
8346 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
8347 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
8348 }
8349
8350 /*
8351 * VOID
8352 * MmPrepareMdlForReuse(
8353 * IN PMDL Mdl)
8354 */
8355 #define MmPrepareMdlForReuse(_Mdl) \
8356 { \
8357 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8358 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8359 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8360 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8361 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8362 } \
8363 }
8364
8365 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8366
8367 NTKERNELAPI
8368 PVOID
8369 NTAPI
8370 MmAllocateContiguousMemory(
8371 IN SIZE_T NumberOfBytes,
8372 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
8373
8374 NTKERNELAPI
8375 PVOID
8376 NTAPI
8377 MmAllocateContiguousMemorySpecifyCache(
8378 IN SIZE_T NumberOfBytes,
8379 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
8380 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
8381 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
8382 IN MEMORY_CACHING_TYPE CacheType);
8383
8384 NTKERNELAPI
8385 PMDL
8386 NTAPI
8387 MmAllocatePagesForMdl(
8388 IN PHYSICAL_ADDRESS LowAddress,
8389 IN PHYSICAL_ADDRESS HighAddress,
8390 IN PHYSICAL_ADDRESS SkipBytes,
8391 IN SIZE_T TotalBytes);
8392
8393 NTKERNELAPI
8394 VOID
8395 NTAPI
8396 MmBuildMdlForNonPagedPool(
8397 IN OUT PMDLX MemoryDescriptorList);
8398
8399 //DECLSPEC_DEPRECATED_DDK
8400 NTKERNELAPI
8401 PMDL
8402 NTAPI
8403 MmCreateMdl(
8404 IN PMDL MemoryDescriptorList OPTIONAL,
8405 IN PVOID Base,
8406 IN SIZE_T Length);
8407
8408 NTKERNELAPI
8409 VOID
8410 NTAPI
8411 MmFreeContiguousMemory(
8412 IN PVOID BaseAddress);
8413
8414 NTKERNELAPI
8415 VOID
8416 NTAPI
8417 MmFreeContiguousMemorySpecifyCache(
8418 IN PVOID BaseAddress,
8419 IN SIZE_T NumberOfBytes,
8420 IN MEMORY_CACHING_TYPE CacheType);
8421
8422 NTKERNELAPI
8423 VOID
8424 NTAPI
8425 MmFreePagesFromMdl(
8426 IN PMDLX MemoryDescriptorList);
8427
8428 NTKERNELAPI
8429 PVOID
8430 NTAPI
8431 MmGetSystemRoutineAddress(
8432 IN PUNICODE_STRING SystemRoutineName);
8433
8434 NTKERNELAPI
8435 LOGICAL
8436 NTAPI
8437 MmIsDriverVerifying(
8438 IN struct _DRIVER_OBJECT *DriverObject);
8439
8440 NTKERNELAPI
8441 PVOID
8442 NTAPI
8443 MmLockPagableDataSection(
8444 IN PVOID AddressWithinSection);
8445
8446 NTKERNELAPI
8447 PVOID
8448 NTAPI
8449 MmMapIoSpace(
8450 IN PHYSICAL_ADDRESS PhysicalAddress,
8451 IN SIZE_T NumberOfBytes,
8452 IN MEMORY_CACHING_TYPE CacheEnable);
8453
8454 NTKERNELAPI
8455 PVOID
8456 NTAPI
8457 MmMapLockedPages(
8458 IN PMDL MemoryDescriptorList,
8459 IN KPROCESSOR_MODE AccessMode);
8460
8461 NTKERNELAPI
8462 PVOID
8463 NTAPI
8464 MmMapLockedPagesSpecifyCache(
8465 IN PMDLX MemoryDescriptorList,
8466 IN KPROCESSOR_MODE AccessMode,
8467 IN MEMORY_CACHING_TYPE CacheType,
8468 IN PVOID BaseAddress OPTIONAL,
8469 IN ULONG BugCheckOnFailure,
8470 IN MM_PAGE_PRIORITY Priority);
8471
8472 NTKERNELAPI
8473 PVOID
8474 NTAPI
8475 MmPageEntireDriver(
8476 IN PVOID AddressWithinSection);
8477
8478 NTKERNELAPI
8479 VOID
8480 NTAPI
8481 MmProbeAndLockPages(
8482 IN OUT PMDL MemoryDescriptorList,
8483 IN KPROCESSOR_MODE AccessMode,
8484 IN LOCK_OPERATION Operation);
8485
8486 NTKERNELAPI
8487 MM_SYSTEMSIZE
8488 NTAPI
8489 MmQuerySystemSize(VOID);
8490
8491 NTKERNELAPI
8492 VOID
8493 NTAPI
8494 MmResetDriverPaging(
8495 IN PVOID AddressWithinSection);
8496
8497 NTKERNELAPI
8498 SIZE_T
8499 NTAPI
8500 MmSizeOfMdl(
8501 IN PVOID Base,
8502 IN SIZE_T Length);
8503
8504 NTKERNELAPI
8505 VOID
8506 NTAPI
8507 MmUnlockPagableImageSection(
8508 IN PVOID ImageSectionHandle);
8509
8510 NTKERNELAPI
8511 VOID
8512 NTAPI
8513 MmUnlockPages(
8514 IN OUT PMDL MemoryDescriptorList);
8515
8516 NTKERNELAPI
8517 VOID
8518 NTAPI
8519 MmUnmapIoSpace(
8520 IN PVOID BaseAddress,
8521 IN SIZE_T NumberOfBytes);
8522
8523 NTKERNELAPI
8524 VOID
8525 NTAPI
8526 MmProbeAndLockProcessPages(
8527 IN OUT PMDL MemoryDescriptorList,
8528 IN PEPROCESS Process,
8529 IN KPROCESSOR_MODE AccessMode,
8530 IN LOCK_OPERATION Operation);
8531
8532 NTKERNELAPI
8533 VOID
8534 NTAPI
8535 MmUnmapLockedPages(
8536 IN PVOID BaseAddress,
8537 IN PMDL MemoryDescriptorList);
8538
8539
8540
8541 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8542
8543 #if (NTDDI_VERSION >= NTDDI_WINXP)
8544
8545 NTKERNELAPI
8546 NTSTATUS
8547 NTAPI
8548 MmAdvanceMdl(
8549 IN OUT PMDL Mdl,
8550 IN ULONG NumberOfBytes);
8551
8552 NTKERNELAPI
8553 PVOID
8554 NTAPI
8555 MmAllocateMappingAddress(
8556 IN SIZE_T NumberOfBytes,
8557 IN ULONG PoolTag);
8558
8559 NTKERNELAPI
8560 VOID
8561 NTAPI
8562 MmFreeMappingAddress(
8563 IN PVOID BaseAddress,
8564 IN ULONG PoolTag);
8565
8566 NTKERNELAPI
8567 NTSTATUS
8568 NTAPI
8569 MmIsVerifierEnabled(
8570 OUT PULONG VerifierFlags);
8571
8572 NTKERNELAPI
8573 PVOID
8574 NTAPI
8575 MmMapLockedPagesWithReservedMapping(
8576 IN PVOID MappingAddress,
8577 IN ULONG PoolTag,
8578 IN PMDL MemoryDescriptorList,
8579 IN MEMORY_CACHING_TYPE CacheType);
8580
8581 NTKERNELAPI
8582 NTSTATUS
8583 NTAPI
8584 MmProtectMdlSystemAddress(
8585 IN PMDL MemoryDescriptorList,
8586 IN ULONG NewProtect);
8587
8588 NTKERNELAPI
8589 VOID
8590 NTAPI
8591 MmUnmapReservedMapping(
8592 IN PVOID BaseAddress,
8593 IN ULONG PoolTag,
8594 IN PMDL MemoryDescriptorList);
8595
8596 #endif
8597
8598 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8599 NTKERNELAPI
8600 PMDL
8601 NTAPI
8602 MmAllocatePagesForMdlEx(
8603 IN PHYSICAL_ADDRESS LowAddress,
8604 IN PHYSICAL_ADDRESS HighAddress,
8605 IN PHYSICAL_ADDRESS SkipBytes,
8606 IN SIZE_T TotalBytes,
8607 IN MEMORY_CACHING_TYPE CacheType,
8608 IN ULONG Flags);
8609 #endif
8610
8611 #if (NTDDI_VERSION >= NTDDI_VISTA)
8612
8613 NTKERNELAPI
8614 LOGICAL
8615 NTAPI
8616 MmIsDriverVerifyingByAddress(
8617 IN PVOID AddressWithinSection);
8618 #endif
8619
8620 /******************************************************************************
8621 * Security Manager Functions *
8622 ******************************************************************************/
8623
8624 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8625
8626 NTKERNELAPI
8627 BOOLEAN
8628 NTAPI
8629 SeAccessCheck(
8630 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8631 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8632 IN BOOLEAN SubjectContextLocked,
8633 IN ACCESS_MASK DesiredAccess,
8634 IN ACCESS_MASK PreviouslyGrantedAccess,
8635 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
8636 IN PGENERIC_MAPPING GenericMapping,
8637 IN KPROCESSOR_MODE AccessMode,
8638 OUT PACCESS_MASK GrantedAccess,
8639 OUT PNTSTATUS AccessStatus);
8640
8641 NTKERNELAPI
8642 NTSTATUS
8643 NTAPI
8644 SeAssignSecurity(
8645 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8646 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8647 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8648 IN BOOLEAN IsDirectoryObject,
8649 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8650 IN PGENERIC_MAPPING GenericMapping,
8651 IN POOL_TYPE PoolType);
8652
8653 NTKERNELAPI
8654 NTSTATUS
8655 NTAPI
8656 SeAssignSecurityEx(
8657 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8658 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8659 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8660 IN GUID *ObjectType OPTIONAL,
8661 IN BOOLEAN IsDirectoryObject,
8662 IN ULONG AutoInheritFlags,
8663 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8664 IN PGENERIC_MAPPING GenericMapping,
8665 IN POOL_TYPE PoolType);
8666
8667 NTKERNELAPI
8668 NTSTATUS
8669 NTAPI
8670 SeDeassignSecurity(
8671 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
8672
8673 NTKERNELAPI
8674 BOOLEAN
8675 NTAPI
8676 SeValidSecurityDescriptor(
8677 IN ULONG Length,
8678 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8679
8680 NTKERNELAPI
8681 ULONG
8682 NTAPI
8683 SeObjectCreateSaclAccessBits(
8684 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8685
8686 NTKERNELAPI
8687 VOID
8688 NTAPI
8689 SeReleaseSubjectContext(
8690 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
8691
8692 NTKERNELAPI
8693 VOID
8694 NTAPI
8695 SeUnlockSubjectContext(
8696 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
8697
8698 NTKERNELAPI
8699 VOID
8700 NTAPI
8701 SeCaptureSubjectContext(
8702 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
8703
8704 NTKERNELAPI
8705 VOID
8706 NTAPI
8707 SeLockSubjectContext(
8708 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
8709
8710 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8711
8712 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8713
8714 NTSTATUS
8715 NTAPI
8716 SeSetAuditParameter(
8717 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
8718 IN SE_ADT_PARAMETER_TYPE Type,
8719 IN ULONG Index,
8720 IN PVOID Data);
8721
8722 NTSTATUS
8723 NTAPI
8724 SeReportSecurityEvent(
8725 IN ULONG Flags,
8726 IN PUNICODE_STRING SourceName,
8727 IN PSID UserSid OPTIONAL,
8728 IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
8729
8730 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
8731
8732 #if (NTDDI_VERSION >= NTDDI_VISTA)
8733
8734 NTKERNELAPI
8735 ULONG
8736 NTAPI
8737 SeComputeAutoInheritByObjectType(
8738 IN PVOID ObjectType,
8739 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
8740 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
8741
8742 #ifdef SE_NTFS_WORLD_CACHE
8743 VOID
8744 NTAPI
8745 SeGetWorldRights(
8746 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8747 IN PGENERIC_MAPPING GenericMapping,
8748 OUT PACCESS_MASK GrantedAccess);
8749 #endif /* SE_NTFS_WORLD_CACHE */
8750
8751 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8752 /******************************************************************************
8753 * Configuration Manager Functions *
8754 ******************************************************************************/
8755
8756 #if (NTDDI_VERSION >= NTDDI_WINXP)
8757 NTKERNELAPI
8758 NTSTATUS
8759 NTAPI
8760 CmRegisterCallback(
8761 IN PEX_CALLBACK_FUNCTION Function,
8762 IN PVOID Context OPTIONAL,
8763 OUT PLARGE_INTEGER Cookie);
8764
8765 NTKERNELAPI
8766 NTSTATUS
8767 NTAPI
8768 CmUnRegisterCallback(
8769 IN LARGE_INTEGER Cookie);
8770 #endif
8771
8772 #if (NTDDI_VERSION >= NTDDI_VISTA)
8773
8774 NTKERNELAPI
8775 NTSTATUS
8776 NTAPI
8777 CmRegisterCallbackEx(
8778 PEX_CALLBACK_FUNCTION Function,
8779 PCUNICODE_STRING Altitude,
8780 PVOID Driver,
8781 PVOID Context,
8782 PLARGE_INTEGER Cookie,
8783 PVOID Reserved);
8784
8785 NTKERNELAPI
8786 VOID
8787 NTAPI
8788 CmGetCallbackVersion(
8789 OUT PULONG Major OPTIONAL,
8790 OUT PULONG Minor OPTIONAL);
8791
8792 NTKERNELAPI
8793 NTSTATUS
8794 NTAPI
8795 CmSetCallbackObjectContext(
8796 IN OUT PVOID Object,
8797 IN PLARGE_INTEGER Cookie,
8798 IN PVOID NewContext,
8799 OUT PVOID *OldContext OPTIONAL);
8800
8801 NTKERNELAPI
8802 NTSTATUS
8803 NTAPI
8804 CmCallbackGetKeyObjectID(
8805 IN PLARGE_INTEGER Cookie,
8806 IN PVOID Object,
8807 OUT PULONG_PTR ObjectID OPTIONAL,
8808 OUT PCUNICODE_STRING *ObjectName OPTIONAL);
8809
8810 NTKERNELAPI
8811 PVOID
8812 NTAPI
8813 CmGetBoundTransaction(
8814 IN PLARGE_INTEGER Cookie,
8815 IN PVOID Object);
8816
8817 #endif // NTDDI_VERSION >= NTDDI_VISTA
8818
8819
8820 /******************************************************************************
8821 * I/O Manager Functions *
8822 ******************************************************************************/
8823
8824 #if !defined(_M_AMD64)
8825 NTHALAPI
8826 VOID
8827 NTAPI
8828 READ_PORT_BUFFER_UCHAR(
8829 IN PUCHAR Port,
8830 IN PUCHAR Buffer,
8831 IN ULONG Count);
8832
8833 NTHALAPI
8834 VOID
8835 NTAPI
8836 READ_PORT_BUFFER_ULONG(
8837 IN PULONG Port,
8838 IN PULONG Buffer,
8839 IN ULONG Count);
8840
8841 NTHALAPI
8842 VOID
8843 NTAPI
8844 READ_PORT_BUFFER_USHORT(
8845 IN PUSHORT Port,
8846 IN PUSHORT Buffer,
8847 IN ULONG Count);
8848
8849 NTHALAPI
8850 UCHAR
8851 NTAPI
8852 READ_PORT_UCHAR(
8853 IN PUCHAR Port);
8854
8855 NTHALAPI
8856 ULONG
8857 NTAPI
8858 READ_PORT_ULONG(
8859 IN PULONG Port);
8860
8861 NTHALAPI
8862 USHORT
8863 NTAPI
8864 READ_PORT_USHORT(
8865 IN PUSHORT Port);
8866
8867 NTKERNELAPI
8868 VOID
8869 NTAPI
8870 READ_REGISTER_BUFFER_UCHAR(
8871 IN PUCHAR Register,
8872 IN PUCHAR Buffer,
8873 IN ULONG Count);
8874
8875 NTKERNELAPI
8876 VOID
8877 NTAPI
8878 READ_REGISTER_BUFFER_ULONG(
8879 IN PULONG Register,
8880 IN PULONG Buffer,
8881 IN ULONG Count);
8882
8883 NTKERNELAPI
8884 VOID
8885 NTAPI
8886 READ_REGISTER_BUFFER_USHORT(
8887 IN PUSHORT Register,
8888 IN PUSHORT Buffer,
8889 IN ULONG Count);
8890
8891 NTKERNELAPI
8892 UCHAR
8893 NTAPI
8894 READ_REGISTER_UCHAR(
8895 IN PUCHAR Register);
8896
8897 NTKERNELAPI
8898 ULONG
8899 NTAPI
8900 READ_REGISTER_ULONG(
8901 IN PULONG Register);
8902
8903 NTKERNELAPI
8904 USHORT
8905 NTAPI
8906 READ_REGISTER_USHORT(
8907 IN PUSHORT Register);
8908
8909 NTHALAPI
8910 VOID
8911 NTAPI
8912 WRITE_PORT_BUFFER_UCHAR(
8913 IN PUCHAR Port,
8914 IN PUCHAR Buffer,
8915 IN ULONG Count);
8916
8917 NTHALAPI
8918 VOID
8919 NTAPI
8920 WRITE_PORT_BUFFER_ULONG(
8921 IN PULONG Port,
8922 IN PULONG Buffer,
8923 IN ULONG Count);
8924
8925 NTHALAPI
8926 VOID
8927 NTAPI
8928 WRITE_PORT_BUFFER_USHORT(
8929 IN PUSHORT Port,
8930 IN PUSHORT Buffer,
8931 IN ULONG Count);
8932
8933 NTHALAPI
8934 VOID
8935 NTAPI
8936 WRITE_PORT_UCHAR(
8937 IN PUCHAR Port,
8938 IN UCHAR Value);
8939
8940 NTHALAPI
8941 VOID
8942 NTAPI
8943 WRITE_PORT_ULONG(
8944 IN PULONG Port,
8945 IN ULONG Value);
8946
8947 NTHALAPI
8948 VOID
8949 NTAPI
8950 WRITE_PORT_USHORT(
8951 IN PUSHORT Port,
8952 IN USHORT Value);
8953
8954 NTKERNELAPI
8955 VOID
8956 NTAPI
8957 WRITE_REGISTER_BUFFER_UCHAR(
8958 IN PUCHAR Register,
8959 IN PUCHAR Buffer,
8960 IN ULONG Count);
8961
8962 NTKERNELAPI
8963 VOID
8964 NTAPI
8965 WRITE_REGISTER_BUFFER_ULONG(
8966 IN PULONG Register,
8967 IN PULONG Buffer,
8968 IN ULONG Count);
8969
8970 NTKERNELAPI
8971 VOID
8972 NTAPI
8973 WRITE_REGISTER_BUFFER_USHORT(
8974 IN PUSHORT Register,
8975 IN PUSHORT Buffer,
8976 IN ULONG Count);
8977
8978 NTKERNELAPI
8979 VOID
8980 NTAPI
8981 WRITE_REGISTER_UCHAR(
8982 IN PUCHAR Register,
8983 IN UCHAR Value);
8984
8985 NTKERNELAPI
8986 VOID
8987 NTAPI
8988 WRITE_REGISTER_ULONG(
8989 IN PULONG Register,
8990 IN ULONG Value);
8991
8992 NTKERNELAPI
8993 VOID
8994 NTAPI
8995 WRITE_REGISTER_USHORT(
8996 IN PUSHORT Register,
8997 IN USHORT Value);
8998
8999 #else
9000
9001 FORCEINLINE
9002 VOID
9003 READ_PORT_BUFFER_UCHAR(
9004 IN PUCHAR Port,
9005 IN PUCHAR Buffer,
9006 IN ULONG Count)
9007 {
9008 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9009 }
9010
9011 FORCEINLINE
9012 VOID
9013 READ_PORT_BUFFER_ULONG(
9014 IN PULONG Port,
9015 IN PULONG Buffer,
9016 IN ULONG Count)
9017 {
9018 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9019 }
9020
9021 FORCEINLINE
9022 VOID
9023 READ_PORT_BUFFER_USHORT(
9024 IN PUSHORT Port,
9025 IN PUSHORT Buffer,
9026 IN ULONG Count)
9027 {
9028 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9029 }
9030
9031 FORCEINLINE
9032 UCHAR
9033 READ_PORT_UCHAR(
9034 IN PUCHAR Port)
9035 {
9036 return __inbyte((USHORT)(ULONG_PTR)Port);
9037 }
9038
9039 FORCEINLINE
9040 ULONG
9041 READ_PORT_ULONG(
9042 IN PULONG Port)
9043 {
9044 return __indword((USHORT)(ULONG_PTR)Port);
9045 }
9046
9047 FORCEINLINE
9048 USHORT
9049 READ_PORT_USHORT(
9050 IN PUSHORT Port)
9051 {
9052 return __inword((USHORT)(ULONG_PTR)Port);
9053 }
9054
9055 FORCEINLINE
9056 VOID
9057 READ_REGISTER_BUFFER_UCHAR(
9058 IN PUCHAR Register,
9059 IN PUCHAR Buffer,
9060 IN ULONG Count)
9061 {
9062 __movsb(Register, Buffer, Count);
9063 }
9064
9065 FORCEINLINE
9066 VOID
9067 READ_REGISTER_BUFFER_ULONG(
9068 IN PULONG Register,
9069 IN PULONG Buffer,
9070 IN ULONG Count)
9071 {
9072 __movsd(Register, Buffer, Count);
9073 }
9074
9075 FORCEINLINE
9076 VOID
9077 READ_REGISTER_BUFFER_USHORT(
9078 IN PUSHORT Register,
9079 IN PUSHORT Buffer,
9080 IN ULONG Count)
9081 {
9082 __movsw(Register, Buffer, Count);
9083 }
9084
9085 FORCEINLINE
9086 UCHAR
9087 READ_REGISTER_UCHAR(
9088 IN volatile UCHAR *Register)
9089 {
9090 return *Register;
9091 }
9092
9093 FORCEINLINE
9094 ULONG
9095 READ_REGISTER_ULONG(
9096 IN volatile ULONG *Register)
9097 {
9098 return *Register;
9099 }
9100
9101 FORCEINLINE
9102 USHORT
9103 READ_REGISTER_USHORT(
9104 IN volatile USHORT *Register)
9105 {
9106 return *Register;
9107 }
9108
9109 FORCEINLINE
9110 VOID
9111 WRITE_PORT_BUFFER_UCHAR(
9112 IN PUCHAR Port,
9113 IN PUCHAR Buffer,
9114 IN ULONG Count)
9115 {
9116 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9117 }
9118
9119 FORCEINLINE
9120 VOID
9121 WRITE_PORT_BUFFER_ULONG(
9122 IN PULONG Port,
9123 IN PULONG Buffer,
9124 IN ULONG Count)
9125 {
9126 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9127 }
9128
9129 FORCEINLINE
9130 VOID
9131 WRITE_PORT_BUFFER_USHORT(
9132 IN PUSHORT Port,
9133 IN PUSHORT Buffer,
9134 IN ULONG Count)
9135 {
9136 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9137 }
9138
9139 FORCEINLINE
9140 VOID
9141 WRITE_PORT_UCHAR(
9142 IN PUCHAR Port,
9143 IN UCHAR Value)
9144 {
9145 __outbyte((USHORT)(ULONG_PTR)Port, Value);
9146 }
9147
9148 FORCEINLINE
9149 VOID
9150 WRITE_PORT_ULONG(
9151 IN PULONG Port,
9152 IN ULONG Value)
9153 {
9154 __outdword((USHORT)(ULONG_PTR)Port, Value);
9155 }
9156
9157 FORCEINLINE
9158 VOID
9159 WRITE_PORT_USHORT(
9160 IN PUSHORT Port,
9161 IN USHORT Value)
9162 {
9163 __outword((USHORT)(ULONG_PTR)Port, Value);
9164 }
9165
9166 FORCEINLINE
9167 VOID
9168 WRITE_REGISTER_BUFFER_UCHAR(
9169 IN PUCHAR Register,
9170 IN PUCHAR Buffer,
9171 IN ULONG Count)
9172 {
9173 LONG Synch;
9174 __movsb(Register, Buffer, Count);
9175 InterlockedOr(&Synch, 1);
9176 }
9177
9178 FORCEINLINE
9179 VOID
9180 WRITE_REGISTER_BUFFER_ULONG(
9181 IN PULONG Register,
9182 IN PULONG Buffer,
9183 IN ULONG Count)
9184 {
9185 LONG Synch;
9186 __movsd(Register, Buffer, Count);
9187 InterlockedOr(&Synch, 1);
9188 }
9189
9190 FORCEINLINE
9191 VOID
9192 WRITE_REGISTER_BUFFER_USHORT(
9193 IN PUSHORT Register,
9194 IN PUSHORT Buffer,
9195 IN ULONG Count)
9196 {
9197 LONG Synch;
9198 __movsw(Register, Buffer, Count);
9199 InterlockedOr(&Synch, 1);
9200 }
9201
9202 FORCEINLINE
9203 VOID
9204 WRITE_REGISTER_UCHAR(
9205 IN volatile UCHAR *Register,
9206 IN UCHAR Value)
9207 {
9208 LONG Synch;
9209 *Register = Value;
9210 InterlockedOr(&Synch, 1);
9211 }
9212
9213 FORCEINLINE
9214 VOID
9215 WRITE_REGISTER_ULONG(
9216 IN volatile ULONG *Register,
9217 IN ULONG Value)
9218 {
9219 LONG Synch;
9220 *Register = Value;
9221 InterlockedOr(&Synch, 1);
9222 }
9223
9224 FORCEINLINE
9225 VOID
9226 WRITE_REGISTER_USHORT(
9227 IN volatile USHORT *Register,
9228 IN USHORT Value)
9229 {
9230 LONG Sync;
9231 *Register = Value;
9232 InterlockedOr(&Sync, 1);
9233 }
9234 #endif
9235
9236 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
9237 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
9238
9239 #define DMA_MACROS_DEFINED
9240
9241 FORCEINLINE
9242 NTSTATUS
9243 IoAllocateAdapterChannel(
9244 IN PDMA_ADAPTER DmaAdapter,
9245 IN PDEVICE_OBJECT DeviceObject,
9246 IN ULONG NumberOfMapRegisters,
9247 IN PDRIVER_CONTROL ExecutionRoutine,
9248 IN PVOID Context)
9249 {
9250 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
9251 AllocateAdapterChannel =
9252 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
9253 ASSERT(AllocateAdapterChannel);
9254 return AllocateAdapterChannel(DmaAdapter,
9255 DeviceObject,
9256 NumberOfMapRegisters,
9257 ExecutionRoutine,
9258 Context );
9259 }
9260
9261 FORCEINLINE
9262 BOOLEAN
9263 NTAPI
9264 IoFlushAdapterBuffers(
9265 IN PDMA_ADAPTER DmaAdapter,
9266 IN PMDL Mdl,
9267 IN PVOID MapRegisterBase,
9268 IN PVOID CurrentVa,
9269 IN ULONG Length,
9270 IN BOOLEAN WriteToDevice)
9271 {
9272 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
9273 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
9274 ASSERT(FlushAdapterBuffers);
9275 return FlushAdapterBuffers(DmaAdapter,
9276 Mdl,
9277 MapRegisterBase,
9278 CurrentVa,
9279 Length,
9280 WriteToDevice);
9281 }
9282
9283 FORCEINLINE
9284 VOID
9285 NTAPI
9286 IoFreeAdapterChannel(
9287 IN PDMA_ADAPTER DmaAdapter)
9288 {
9289 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
9290 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
9291 ASSERT(FreeAdapterChannel);
9292 FreeAdapterChannel(DmaAdapter);
9293 }
9294
9295 FORCEINLINE
9296 VOID
9297 NTAPI
9298 IoFreeMapRegisters(
9299 IN PDMA_ADAPTER DmaAdapter,
9300 IN PVOID MapRegisterBase,
9301 IN ULONG NumberOfMapRegisters)
9302 {
9303 PFREE_MAP_REGISTERS FreeMapRegisters;
9304 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
9305 ASSERT(FreeMapRegisters);
9306 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
9307 }
9308
9309 FORCEINLINE
9310 PHYSICAL_ADDRESS
9311 NTAPI
9312 IoMapTransfer(
9313 IN PDMA_ADAPTER DmaAdapter,
9314 IN PMDL Mdl,
9315 IN PVOID MapRegisterBase,
9316 IN PVOID CurrentVa,
9317 IN OUT PULONG Length,
9318 IN BOOLEAN WriteToDevice)
9319 {
9320 PMAP_TRANSFER MapTransfer;
9321
9322 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
9323 ASSERT(MapTransfer);
9324 return MapTransfer(DmaAdapter,
9325 Mdl,
9326 MapRegisterBase,
9327 CurrentVa,
9328 Length,
9329 WriteToDevice);
9330 }
9331 #endif
9332
9333 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9334
9335 NTKERNELAPI
9336 VOID
9337 NTAPI
9338 IoAcquireCancelSpinLock(
9339 OUT PKIRQL Irql);
9340
9341 NTKERNELAPI
9342 NTSTATUS
9343 NTAPI
9344 IoAcquireRemoveLockEx(
9345 IN PIO_REMOVE_LOCK RemoveLock,
9346 IN PVOID Tag OPTIONAL,
9347 IN PCSTR File,
9348 IN ULONG Line,
9349 IN ULONG RemlockSize);
9350 #endif
9351
9352 /*
9353 * NTSTATUS
9354 * IoAcquireRemoveLock(
9355 * IN PIO_REMOVE_LOCK RemoveLock,
9356 * IN OPTIONAL PVOID Tag)
9357 */
9358 #if DBG
9359 #define IoAcquireRemoveLock(RemoveLock, Tag) \
9360 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
9361 #else
9362 #define IoAcquireRemoveLock(RemoveLock, Tag) \
9363 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
9364 #endif
9365
9366 /*
9367 * VOID
9368 * IoAdjustPagingPathCount(
9369 * IN PLONG Count,
9370 * IN BOOLEAN Increment)
9371 */
9372 #define IoAdjustPagingPathCount(_Count, \
9373 _Increment) \
9374 { \
9375 if (_Increment) \
9376 { \
9377 InterlockedIncrement(_Count); \
9378 } \
9379 else \
9380 { \
9381 InterlockedDecrement(_Count); \
9382 } \
9383 }
9384
9385 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9386
9387 NTKERNELAPI
9388 NTSTATUS
9389 NTAPI
9390 IoAllocateDriverObjectExtension(
9391 IN PDRIVER_OBJECT DriverObject,
9392 IN PVOID ClientIdentificationAddress,
9393 IN ULONG DriverObjectExtensionSize,
9394 OUT PVOID *DriverObjectExtension);
9395
9396 NTKERNELAPI
9397 PVOID
9398 NTAPI
9399 IoAllocateErrorLogEntry(
9400 IN PVOID IoObject,
9401 IN UCHAR EntrySize);
9402
9403 NTKERNELAPI
9404 PIRP
9405 NTAPI
9406 IoAllocateIrp(
9407 IN CCHAR StackSize,
9408 IN BOOLEAN ChargeQuota);
9409
9410 NTKERNELAPI
9411 PMDL
9412 NTAPI
9413 IoAllocateMdl(
9414 IN PVOID VirtualAddress OPTIONAL,
9415 IN ULONG Length,
9416 IN BOOLEAN SecondaryBuffer,
9417 IN BOOLEAN ChargeQuota,
9418 IN OUT PIRP Irp OPTIONAL);
9419
9420 NTKERNELAPI
9421 PIO_WORKITEM
9422 NTAPI
9423 IoAllocateWorkItem(
9424 IN PDEVICE_OBJECT DeviceObject);
9425
9426 NTKERNELAPI
9427 NTSTATUS
9428 NTAPI
9429 IoAttachDevice(
9430 IN PDEVICE_OBJECT SourceDevice,
9431 IN PUNICODE_STRING TargetDevice,
9432 OUT PDEVICE_OBJECT *AttachedDevice);
9433
9434 NTKERNELAPI
9435 PDEVICE_OBJECT
9436 NTAPI
9437 IoAttachDeviceToDeviceStack(
9438 IN PDEVICE_OBJECT SourceDevice,
9439 IN PDEVICE_OBJECT TargetDevice);
9440
9441 NTKERNELAPI
9442 PIRP
9443 NTAPI
9444 IoBuildAsynchronousFsdRequest(
9445 IN ULONG MajorFunction,
9446 IN PDEVICE_OBJECT DeviceObject,
9447 IN OUT PVOID Buffer OPTIONAL,
9448 IN ULONG Length OPTIONAL,
9449 IN PLARGE_INTEGER StartingOffset OPTIONAL,
9450 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
9451
9452 NTKERNELAPI
9453 PIRP
9454 NTAPI
9455 IoBuildDeviceIoControlRequest(
9456 IN ULONG IoControlCode,
9457 IN PDEVICE_OBJECT DeviceObject,
9458 IN PVOID InputBuffer OPTIONAL,
9459 IN ULONG InputBufferLength,
9460 OUT PVOID OutputBuffer OPTIONAL,
9461 IN ULONG OutputBufferLength,
9462 IN BOOLEAN InternalDeviceIoControl,
9463 IN PKEVENT Event,
9464 OUT PIO_STATUS_BLOCK IoStatusBlock);
9465
9466 NTKERNELAPI
9467 VOID
9468 NTAPI
9469 IoBuildPartialMdl(
9470 IN PMDL SourceMdl,
9471 IN OUT PMDL TargetMdl,
9472 IN PVOID VirtualAddress,
9473 IN ULONG Length);
9474
9475 NTKERNELAPI
9476 PIRP
9477 NTAPI
9478 IoBuildSynchronousFsdRequest(
9479 IN ULONG MajorFunction,
9480 IN PDEVICE_OBJECT DeviceObject,
9481 IN OUT PVOID Buffer OPTIONAL,
9482 IN ULONG Length OPTIONAL,
9483 IN PLARGE_INTEGER StartingOffset OPTIONAL,
9484 IN PKEVENT Event,
9485 OUT PIO_STATUS_BLOCK IoStatusBlock);
9486
9487 NTKERNELAPI
9488 NTSTATUS
9489 FASTCALL
9490 IofCallDriver(
9491 IN PDEVICE_OBJECT DeviceObject,
9492 IN OUT PIRP Irp);
9493 #define IoCallDriver IofCallDriver
9494
9495 NTKERNELAPI
9496 VOID
9497 FASTCALL
9498 IofCompleteRequest(
9499 IN PIRP Irp,
9500 IN CCHAR PriorityBoost);
9501 #define IoCompleteRequest IofCompleteRequest
9502
9503 NTKERNELAPI
9504 BOOLEAN
9505 NTAPI
9506 IoCancelIrp(
9507 IN PIRP Irp);
9508
9509 NTKERNELAPI
9510 NTSTATUS
9511 NTAPI
9512 IoCheckShareAccess(
9513 IN ACCESS_MASK DesiredAccess,
9514 IN ULONG DesiredShareAccess,
9515 IN OUT PFILE_OBJECT FileObject,
9516 IN OUT PSHARE_ACCESS ShareAccess,
9517 IN BOOLEAN Update);
9518
9519 NTKERNELAPI
9520 VOID
9521 FASTCALL
9522 IofCompleteRequest(
9523 IN PIRP Irp,
9524 IN CCHAR PriorityBoost);
9525
9526 NTKERNELAPI
9527 NTSTATUS
9528 NTAPI
9529 IoConnectInterrupt(
9530 OUT PKINTERRUPT *InterruptObject,
9531 IN PKSERVICE_ROUTINE ServiceRoutine,
9532 IN PVOID ServiceContext OPTIONAL,
9533 IN PKSPIN_LOCK SpinLock OPTIONAL,
9534 IN ULONG Vector,
9535 IN KIRQL Irql,
9536 IN KIRQL SynchronizeIrql,
9537 IN KINTERRUPT_MODE InterruptMode,
9538 IN BOOLEAN ShareVector,
9539 IN KAFFINITY ProcessorEnableMask,
9540 IN BOOLEAN FloatingSave);
9541
9542 NTKERNELAPI
9543 NTSTATUS
9544 NTAPI
9545 IoCreateDevice(
9546 IN PDRIVER_OBJECT DriverObject,
9547 IN ULONG DeviceExtensionSize,
9548 IN PUNICODE_STRING DeviceName OPTIONAL,
9549 IN DEVICE_TYPE DeviceType,
9550 IN ULONG DeviceCharacteristics,
9551 IN BOOLEAN Exclusive,
9552 OUT PDEVICE_OBJECT *DeviceObject);
9553
9554 NTKERNELAPI
9555 NTSTATUS
9556 NTAPI
9557 IoCreateFile(
9558 OUT PHANDLE FileHandle,
9559 IN ACCESS_MASK DesiredAccess,
9560 IN POBJECT_ATTRIBUTES ObjectAttributes,
9561 OUT PIO_STATUS_BLOCK IoStatusBlock,
9562 IN PLARGE_INTEGER AllocationSize OPTIONAL,
9563 IN ULONG FileAttributes,
9564 IN ULONG ShareAccess,
9565 IN ULONG Disposition,
9566 IN ULONG CreateOptions,
9567 IN PVOID EaBuffer OPTIONAL,
9568 IN ULONG EaLength,
9569 IN CREATE_FILE_TYPE CreateFileType,
9570 IN PVOID InternalParameters OPTIONAL,
9571 IN ULONG Options);
9572
9573 NTKERNELAPI
9574 PKEVENT
9575 NTAPI
9576 IoCreateNotificationEvent(
9577 IN PUNICODE_STRING EventName,
9578 OUT PHANDLE EventHandle);
9579
9580 NTKERNELAPI
9581 NTSTATUS
9582 NTAPI
9583 IoCreateSymbolicLink(
9584 IN PUNICODE_STRING SymbolicLinkName,
9585 IN PUNICODE_STRING DeviceName);
9586
9587 NTKERNELAPI
9588 PKEVENT
9589 NTAPI
9590 IoCreateSynchronizationEvent(
9591 IN PUNICODE_STRING EventName,
9592 OUT PHANDLE EventHandle);
9593
9594 NTKERNELAPI
9595 NTSTATUS
9596 NTAPI
9597 IoCreateUnprotectedSymbolicLink(
9598 IN PUNICODE_STRING SymbolicLinkName,
9599 IN PUNICODE_STRING DeviceName);
9600
9601 NTKERNELAPI
9602 VOID
9603 NTAPI
9604 IoDeleteDevice(
9605 IN PDEVICE_OBJECT DeviceObject);
9606
9607 NTKERNELAPI
9608 NTSTATUS
9609 NTAPI
9610 IoDeleteSymbolicLink(
9611 IN PUNICODE_STRING SymbolicLinkName);
9612
9613 NTKERNELAPI
9614 VOID
9615 NTAPI
9616 IoDetachDevice(
9617 IN OUT PDEVICE_OBJECT TargetDevice);
9618
9619 NTKERNELAPI
9620 VOID
9621 NTAPI
9622 IoDisconnectInterrupt(
9623 IN PKINTERRUPT InterruptObject);
9624
9625 NTKERNELAPI
9626 VOID
9627 NTAPI
9628 IoFreeIrp(
9629 IN PIRP Irp);
9630
9631 NTKERNELAPI
9632 VOID
9633 NTAPI
9634 IoFreeMdl(
9635 IN PMDL Mdl);
9636
9637 NTKERNELAPI
9638 VOID
9639 NTAPI
9640 IoFreeWorkItem(
9641 IN PIO_WORKITEM IoWorkItem);
9642
9643 NTKERNELAPI
9644 PDEVICE_OBJECT
9645 NTAPI
9646 IoGetAttachedDevice(
9647 IN PDEVICE_OBJECT DeviceObject);
9648
9649 NTKERNELAPI
9650 PDEVICE_OBJECT
9651 NTAPI
9652 IoGetAttachedDeviceReference(
9653 IN PDEVICE_OBJECT DeviceObject);
9654
9655 NTKERNELAPI
9656 NTSTATUS
9657 NTAPI
9658 IoGetBootDiskInformation(
9659 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
9660 IN ULONG Size);
9661
9662 NTKERNELAPI
9663 NTSTATUS
9664 NTAPI
9665 IoGetDeviceInterfaceAlias(
9666 IN PUNICODE_STRING SymbolicLinkName,
9667 IN CONST GUID *AliasInterfaceClassGuid,
9668 OUT PUNICODE_STRING AliasSymbolicLinkName);
9669
9670 NTKERNELAPI
9671 PEPROCESS
9672 NTAPI
9673 IoGetCurrentProcess(VOID);
9674
9675 NTKERNELAPI
9676 NTSTATUS
9677 NTAPI
9678 IoGetDeviceInterfaces(
9679 IN CONST GUID *InterfaceClassGuid,
9680 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
9681 IN ULONG Flags,
9682 OUT PWSTR *SymbolicLinkList);
9683
9684 NTKERNELAPI
9685 NTSTATUS
9686 NTAPI
9687 IoGetDeviceObjectPointer(
9688 IN PUNICODE_STRING ObjectName,
9689 IN ACCESS_MASK DesiredAccess,
9690 OUT PFILE_OBJECT *FileObject,
9691 OUT PDEVICE_OBJECT *DeviceObject);
9692
9693 NTKERNELAPI
9694 NTSTATUS
9695 NTAPI
9696 IoGetDeviceProperty(
9697 IN PDEVICE_OBJECT DeviceObject,
9698 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
9699 IN ULONG BufferLength,
9700 OUT PVOID PropertyBuffer,
9701 OUT PULONG ResultLength);
9702
9703 NTKERNELAPI
9704 PDMA_ADAPTER
9705 NTAPI
9706 IoGetDmaAdapter(
9707 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
9708 IN PDEVICE_DESCRIPTION DeviceDescription,
9709 IN OUT PULONG NumberOfMapRegisters);
9710
9711 NTKERNELAPI
9712 PVOID
9713 NTAPI
9714 IoGetDriverObjectExtension(
9715 IN PDRIVER_OBJECT DriverObject,
9716 IN PVOID ClientIdentificationAddress);
9717
9718 NTKERNELAPI
9719 PVOID
9720 NTAPI
9721 IoGetInitialStack(VOID);
9722
9723 NTKERNELAPI
9724 PDEVICE_OBJECT
9725 NTAPI
9726 IoGetRelatedDeviceObject(
9727 IN PFILE_OBJECT FileObject);
9728
9729 NTKERNELAPI
9730 VOID
9731 NTAPI
9732 IoQueueWorkItem(
9733 IN PIO_WORKITEM IoWorkItem,
9734 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
9735 IN WORK_QUEUE_TYPE QueueType,
9736 IN PVOID Context OPTIONAL);
9737
9738 NTKERNELAPI
9739 VOID
9740 NTAPI
9741 IoInitializeIrp(
9742 IN OUT PIRP Irp,
9743 IN USHORT PacketSize,
9744 IN CCHAR StackSize);
9745
9746 NTKERNELAPI
9747 VOID
9748 NTAPI
9749 IoInitializeRemoveLockEx(
9750 IN PIO_REMOVE_LOCK Lock,
9751 IN ULONG AllocateTag,
9752 IN ULONG MaxLockedMinutes,
9753 IN ULONG HighWatermark,
9754 IN ULONG RemlockSize);
9755
9756 NTKERNELAPI
9757 NTSTATUS
9758 NTAPI
9759 IoInitializeTimer(
9760 IN PDEVICE_OBJECT DeviceObject,
9761 IN PIO_TIMER_ROUTINE TimerRoutine,
9762 IN PVOID Context OPTIONAL);
9763
9764 NTKERNELAPI
9765 VOID
9766 NTAPI
9767 IoInvalidateDeviceRelations(
9768 IN PDEVICE_OBJECT DeviceObject,
9769 IN DEVICE_RELATION_TYPE Type);
9770
9771 NTKERNELAPI
9772 VOID
9773 NTAPI
9774 IoInvalidateDeviceState(
9775 IN PDEVICE_OBJECT PhysicalDeviceObject);
9776
9777 NTKERNELAPI
9778 BOOLEAN
9779 NTAPI
9780 IoIsWdmVersionAvailable(
9781 IN UCHAR MajorVersion,
9782 IN UCHAR MinorVersion);
9783
9784 NTKERNELAPI
9785 NTSTATUS
9786 NTAPI
9787 IoOpenDeviceInterfaceRegistryKey(
9788 IN PUNICODE_STRING SymbolicLinkName,
9789 IN ACCESS_MASK DesiredAccess,
9790 OUT PHANDLE DeviceInterfaceKey);
9791
9792 NTKERNELAPI
9793 NTSTATUS
9794 NTAPI
9795 IoOpenDeviceRegistryKey(
9796 IN PDEVICE_OBJECT DeviceObject,
9797 IN ULONG DevInstKeyType,
9798 IN ACCESS_MASK DesiredAccess,
9799 OUT PHANDLE DevInstRegKey);
9800
9801 NTKERNELAPI
9802 NTSTATUS
9803 NTAPI
9804 IoRegisterDeviceInterface(
9805 IN PDEVICE_OBJECT PhysicalDeviceObject,
9806 IN CONST GUID *InterfaceClassGuid,
9807 IN PUNICODE_STRING ReferenceString OPTIONAL,
9808 OUT PUNICODE_STRING SymbolicLinkName);
9809
9810 NTKERNELAPI
9811 NTSTATUS
9812 NTAPI
9813 IoRegisterPlugPlayNotification(
9814 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
9815 IN ULONG EventCategoryFlags,
9816 IN PVOID EventCategoryData OPTIONAL,
9817 IN PDRIVER_OBJECT DriverObject,
9818 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
9819 IN OUT PVOID Context OPTIONAL,
9820 OUT PVOID *NotificationEntry);
9821
9822 NTKERNELAPI
9823 NTSTATUS
9824 NTAPI
9825 IoRegisterShutdownNotification(
9826 IN PDEVICE_OBJECT DeviceObject);
9827
9828 NTKERNELAPI
9829 VOID
9830 NTAPI
9831 IoReleaseCancelSpinLock(
9832 IN KIRQL Irql);
9833
9834 NTKERNELAPI
9835 VOID
9836 NTAPI
9837 IoReleaseRemoveLockAndWaitEx(
9838 IN PIO_REMOVE_LOCK RemoveLock,
9839 IN PVOID Tag OPTIONAL,
9840 IN ULONG RemlockSize);
9841
9842 NTKERNELAPI
9843 VOID
9844 NTAPI
9845 IoReleaseRemoveLockEx(
9846 IN PIO_REMOVE_LOCK RemoveLock,
9847 IN PVOID Tag OPTIONAL,
9848 IN ULONG RemlockSize);
9849
9850 NTKERNELAPI
9851 VOID
9852 NTAPI
9853 IoRemoveShareAccess(
9854 IN PFILE_OBJECT FileObject,
9855 IN OUT PSHARE_ACCESS ShareAccess);
9856
9857 NTKERNELAPI
9858 NTSTATUS
9859 NTAPI
9860 IoReportTargetDeviceChange(
9861 IN PDEVICE_OBJECT PhysicalDeviceObject,
9862 IN PVOID NotificationStructure);
9863
9864 NTKERNELAPI
9865 NTSTATUS
9866 NTAPI
9867 IoReportTargetDeviceChangeAsynchronous(
9868 IN PDEVICE_OBJECT PhysicalDeviceObject,
9869 IN PVOID NotificationStructure,
9870 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
9871 IN PVOID Context OPTIONAL);
9872
9873 NTKERNELAPI
9874 VOID
9875 NTAPI
9876 IoRequestDeviceEject(
9877 IN PDEVICE_OBJECT PhysicalDeviceObject);
9878
9879 NTKERNELAPI
9880 VOID
9881 NTAPI
9882 IoReuseIrp(
9883 IN OUT PIRP Irp,
9884 IN NTSTATUS Status);
9885
9886 NTKERNELAPI
9887 NTSTATUS
9888 NTAPI
9889 IoSetDeviceInterfaceState(
9890 IN PUNICODE_STRING SymbolicLinkName,
9891 IN BOOLEAN Enable);
9892
9893 NTKERNELAPI
9894 VOID
9895 NTAPI
9896 IoSetShareAccess(
9897 IN ACCESS_MASK DesiredAccess,
9898 IN ULONG DesiredShareAccess,
9899 IN OUT PFILE_OBJECT FileObject,
9900 OUT PSHARE_ACCESS ShareAccess);
9901
9902 NTKERNELAPI
9903 VOID
9904 NTAPI
9905 IoStartNextPacket(
9906 IN PDEVICE_OBJECT DeviceObject,
9907 IN BOOLEAN Cancelable);
9908
9909 NTKERNELAPI
9910 VOID
9911 NTAPI
9912 IoStartNextPacketByKey(
9913 IN PDEVICE_OBJECT DeviceObject,
9914 IN BOOLEAN Cancelable,
9915 IN ULONG Key);
9916
9917 NTKERNELAPI
9918 VOID
9919 NTAPI
9920 IoStartPacket(
9921 IN PDEVICE_OBJECT DeviceObject,
9922 IN PIRP Irp,
9923 IN PULONG Key OPTIONAL,
9924 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
9925
9926 NTKERNELAPI
9927 VOID
9928 NTAPI
9929 IoStartTimer(
9930 IN PDEVICE_OBJECT DeviceObject);
9931
9932 NTKERNELAPI
9933 VOID
9934 NTAPI
9935 IoStopTimer(
9936 IN PDEVICE_OBJECT DeviceObject);
9937
9938 NTKERNELAPI
9939 NTSTATUS
9940 NTAPI
9941 IoUnregisterPlugPlayNotification(
9942 IN PVOID NotificationEntry);
9943
9944 NTKERNELAPI
9945 VOID
9946 NTAPI
9947 IoUnregisterShutdownNotification(
9948 IN PDEVICE_OBJECT DeviceObject);
9949
9950 NTKERNELAPI
9951 VOID
9952 NTAPI
9953 IoUpdateShareAccess(
9954 IN PFILE_OBJECT FileObject,
9955 IN OUT PSHARE_ACCESS ShareAccess);
9956
9957 NTKERNELAPI
9958 NTSTATUS
9959 NTAPI
9960 IoWMIAllocateInstanceIds(
9961 IN GUID *Guid,
9962 IN ULONG InstanceCount,
9963 OUT ULONG *FirstInstanceId);
9964
9965 NTKERNELAPI
9966 NTSTATUS
9967 NTAPI
9968 IoWMIQuerySingleInstanceMultiple(
9969 IN PVOID *DataBlockObjectList,
9970 IN PUNICODE_STRING InstanceNames,
9971 IN ULONG ObjectCount,
9972 IN OUT ULONG *InOutBufferSize,
9973 OUT PVOID OutBuffer);
9974
9975 NTKERNELAPI
9976 NTSTATUS
9977 NTAPI
9978 IoWMIRegistrationControl(
9979 IN PDEVICE_OBJECT DeviceObject,
9980 IN ULONG Action);
9981
9982 NTKERNELAPI
9983 NTSTATUS
9984 NTAPI
9985 IoWMISuggestInstanceName(
9986 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
9987 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
9988 IN BOOLEAN CombineNames,
9989 OUT PUNICODE_STRING SuggestedInstanceName);
9990
9991 NTKERNELAPI
9992 NTSTATUS
9993 NTAPI
9994 IoWMIWriteEvent(
9995 IN OUT PVOID WnodeEventItem);
9996
9997 NTKERNELAPI
9998 VOID
9999 NTAPI
10000 IoWriteErrorLogEntry(
10001 IN PVOID ElEntry);
10002
10003 NTKERNELAPI
10004 PIRP
10005 NTAPI
10006 IoGetTopLevelIrp(VOID);
10007
10008 NTKERNELAPI
10009 NTSTATUS
10010 NTAPI
10011 IoRegisterLastChanceShutdownNotification(
10012 IN PDEVICE_OBJECT DeviceObject);
10013
10014 NTKERNELAPI
10015 VOID
10016 NTAPI
10017 IoSetTopLevelIrp(
10018 IN PIRP Irp OPTIONAL);
10019
10020 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10021
10022
10023 #if (NTDDI_VERSION >= NTDDI_WINXP)
10024
10025 NTKERNELAPI
10026 NTSTATUS
10027 NTAPI
10028 IoCsqInitialize(
10029 IN PIO_CSQ Csq,
10030 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
10031 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
10032 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
10033 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
10034 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
10035 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
10036
10037 NTKERNELAPI
10038 VOID
10039 NTAPI
10040 IoCsqInsertIrp(
10041 IN PIO_CSQ Csq,
10042 IN PIRP Irp,
10043 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
10044
10045 NTKERNELAPI
10046 PIRP
10047 NTAPI
10048 IoCsqRemoveIrp(
10049 IN PIO_CSQ Csq,
10050 IN PIO_CSQ_IRP_CONTEXT Context);
10051
10052 NTKERNELAPI
10053 PIRP
10054 NTAPI
10055 IoCsqRemoveNextIrp(
10056 IN PIO_CSQ Csq,
10057 IN PVOID PeekContext OPTIONAL);
10058
10059 NTKERNELAPI
10060 BOOLEAN
10061 NTAPI
10062 IoForwardIrpSynchronously(
10063 IN PDEVICE_OBJECT DeviceObject,
10064 IN PIRP Irp);
10065
10066 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
10067
10068 NTKERNELAPI
10069 VOID
10070 NTAPI
10071 IoFreeErrorLogEntry(
10072 PVOID ElEntry);
10073
10074 NTKERNELAPI
10075 NTSTATUS
10076 NTAPI
10077 IoSetCompletionRoutineEx(
10078 IN PDEVICE_OBJECT DeviceObject,
10079 IN PIRP Irp,
10080 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
10081 IN PVOID Context,
10082 IN BOOLEAN InvokeOnSuccess,
10083 IN BOOLEAN InvokeOnError,
10084 IN BOOLEAN InvokeOnCancel);
10085
10086 VOID
10087 NTAPI
10088 IoSetStartIoAttributes(
10089 IN PDEVICE_OBJECT DeviceObject,
10090 IN BOOLEAN DeferredStartIo,
10091 IN BOOLEAN NonCancelable);
10092
10093 NTKERNELAPI
10094 NTSTATUS
10095 NTAPI
10096 IoWMIDeviceObjectToInstanceName(
10097 IN PVOID DataBlockObject,
10098 IN PDEVICE_OBJECT DeviceObject,
10099 OUT PUNICODE_STRING InstanceName);
10100
10101 NTKERNELAPI
10102 NTSTATUS
10103 NTAPI
10104 IoWMIExecuteMethod(
10105 IN PVOID DataBlockObject,
10106 IN PUNICODE_STRING InstanceName,
10107 IN ULONG MethodId,
10108 IN ULONG InBufferSize,
10109 IN OUT PULONG OutBufferSize,
10110 IN OUT PUCHAR InOutBuffer);
10111
10112 NTKERNELAPI
10113 NTSTATUS
10114 NTAPI
10115 IoWMIHandleToInstanceName(
10116 IN PVOID DataBlockObject,
10117 IN HANDLE FileHandle,
10118 OUT PUNICODE_STRING InstanceName);
10119
10120 NTKERNELAPI
10121 NTSTATUS
10122 NTAPI
10123 IoWMIOpenBlock(
10124 IN GUID *DataBlockGuid,
10125 IN ULONG DesiredAccess,
10126 OUT PVOID *DataBlockObject);
10127
10128 NTKERNELAPI
10129 NTSTATUS
10130 NTAPI
10131 IoWMIQueryAllData(
10132 IN PVOID DataBlockObject,
10133 IN OUT ULONG *InOutBufferSize,
10134 OUT PVOID OutBuffer);
10135
10136 NTKERNELAPI
10137 NTSTATUS
10138 NTAPI
10139 IoWMIQueryAllDataMultiple(
10140 IN PVOID *DataBlockObjectList,
10141 IN ULONG ObjectCount,
10142 IN OUT ULONG *InOutBufferSize,
10143 OUT PVOID OutBuffer);
10144
10145 NTKERNELAPI
10146 NTSTATUS
10147 NTAPI
10148 IoWMIQuerySingleInstance(
10149 IN PVOID DataBlockObject,
10150 IN PUNICODE_STRING InstanceName,
10151 IN OUT ULONG *InOutBufferSize,
10152 OUT PVOID OutBuffer);
10153
10154 NTKERNELAPI
10155 NTSTATUS
10156 NTAPI
10157 IoWMISetNotificationCallback(
10158 IN OUT PVOID Object,
10159 IN WMI_NOTIFICATION_CALLBACK Callback,
10160 IN PVOID Context OPTIONAL);
10161
10162 NTKERNELAPI
10163 NTSTATUS
10164 NTAPI
10165 IoWMISetSingleInstance(
10166 IN PVOID DataBlockObject,
10167 IN PUNICODE_STRING InstanceName,
10168 IN ULONG Version,
10169 IN ULONG ValueBufferSize,
10170 IN PVOID ValueBuffer);
10171
10172 NTKERNELAPI
10173 NTSTATUS
10174 NTAPI
10175 IoWMISetSingleItem(
10176 IN PVOID DataBlockObject,
10177 IN PUNICODE_STRING InstanceName,
10178 IN ULONG DataItemId,
10179 IN ULONG Version,
10180 IN ULONG ValueBufferSize,
10181 IN PVOID ValueBuffer);
10182
10183 #endif
10184
10185 #if defined(_WIN64)
10186 NTKERNELAPI
10187 ULONG
10188 NTAPI
10189 IoWMIDeviceObjectToProviderId(
10190 IN PDEVICE_OBJECT DeviceObject);
10191 #else
10192 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
10193 #endif
10194
10195 /*
10196 * USHORT
10197 * IoSizeOfIrp(
10198 * IN CCHAR StackSize)
10199 */
10200 #define IoSizeOfIrp(_StackSize) \
10201 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
10202
10203 FORCEINLINE
10204 VOID
10205 IoSkipCurrentIrpStackLocation (
10206 IN OUT PIRP Irp)
10207 {
10208 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
10209 Irp->CurrentLocation++;
10210 Irp->Tail.Overlay.CurrentStackLocation++;
10211 }
10212
10213 FORCEINLINE
10214 VOID
10215 IoSetNextIrpStackLocation (
10216 IN OUT PIRP Irp)
10217 {
10218 ASSERT(Irp->CurrentLocation > 0);
10219 Irp->CurrentLocation--;
10220 Irp->Tail.Overlay.CurrentStackLocation--;
10221 }
10222
10223 FORCEINLINE
10224 PIO_STACK_LOCATION
10225 IoGetNextIrpStackLocation(
10226 IN PIRP Irp)
10227 {
10228 ASSERT(Irp->CurrentLocation > 0);
10229 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
10230 }
10231
10232 FORCEINLINE
10233 VOID
10234 IoSetCompletionRoutine(
10235 IN PIRP Irp,
10236 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
10237 IN PVOID Context OPTIONAL,
10238 IN BOOLEAN InvokeOnSuccess,
10239 IN BOOLEAN InvokeOnError,
10240 IN BOOLEAN InvokeOnCancel)
10241 {
10242 PIO_STACK_LOCATION irpSp;
10243 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
10244 irpSp = IoGetNextIrpStackLocation(Irp);
10245 irpSp->CompletionRoutine = CompletionRoutine;
10246 irpSp->Context = Context;
10247 irpSp->Control = 0;
10248
10249 if (InvokeOnSuccess) {
10250 irpSp->Control = SL_INVOKE_ON_SUCCESS;
10251 }
10252
10253 if (InvokeOnError) {
10254 irpSp->Control |= SL_INVOKE_ON_ERROR;
10255 }
10256
10257 if (InvokeOnCancel) {
10258 irpSp->Control |= SL_INVOKE_ON_CANCEL;
10259 }
10260 }
10261
10262 /*
10263 * PDRIVER_CANCEL
10264 * IoSetCancelRoutine(
10265 * IN PIRP Irp,
10266 * IN PDRIVER_CANCEL CancelRoutine)
10267 */
10268 #define IoSetCancelRoutine(_Irp, \
10269 _CancelRoutine) \
10270 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
10271 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
10272
10273 /*
10274 * VOID
10275 * IoRequestDpc(
10276 * IN PDEVICE_OBJECT DeviceObject,
10277 * IN PIRP Irp,
10278 * IN PVOID Context);
10279 */
10280 #define IoRequestDpc(DeviceObject, Irp, Context)( \
10281 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
10282
10283 /*
10284 * VOID
10285 * IoReleaseRemoveLock(
10286 * IN PIO_REMOVE_LOCK RemoveLock,
10287 * IN PVOID Tag)
10288 */
10289 #define IoReleaseRemoveLock(_RemoveLock, \
10290 _Tag) \
10291 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
10292
10293 /*
10294 * VOID
10295 * IoReleaseRemoveLockAndWait(
10296 * IN PIO_REMOVE_LOCK RemoveLock,
10297 * IN PVOID Tag)
10298 */
10299 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
10300 _Tag) \
10301 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
10302
10303 #if defined(_WIN64)
10304 NTKERNELAPI
10305 BOOLEAN
10306 IoIs32bitProcess(
10307 IN PIRP Irp OPTIONAL);
10308 #endif
10309
10310 #define PLUGPLAY_REGKEY_DEVICE 1
10311 #define PLUGPLAY_REGKEY_DRIVER 2
10312 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
10313
10314 FORCEINLINE
10315 PIO_STACK_LOCATION
10316 IoGetCurrentIrpStackLocation(
10317 IN PIRP Irp)
10318 {
10319 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
10320 return Irp->Tail.Overlay.CurrentStackLocation;
10321 }
10322
10323 FORCEINLINE
10324 VOID
10325 IoMarkIrpPending(
10326 IN OUT PIRP Irp)
10327 {
10328 IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
10329 }
10330
10331 /*
10332 * BOOLEAN
10333 * IoIsErrorUserInduced(
10334 * IN NTSTATUS Status);
10335 */
10336 #define IoIsErrorUserInduced(Status) \
10337 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
10338 ((Status) == STATUS_IO_TIMEOUT) || \
10339 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
10340 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
10341 ((Status) == STATUS_VERIFY_REQUIRED) || \
10342 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
10343 ((Status) == STATUS_WRONG_VOLUME)))
10344
10345 /* VOID
10346 * IoInitializeRemoveLock(
10347 * IN PIO_REMOVE_LOCK Lock,
10348 * IN ULONG AllocateTag,
10349 * IN ULONG MaxLockedMinutes,
10350 * IN ULONG HighWatermark)
10351 */
10352 #define IoInitializeRemoveLock( \
10353 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
10354 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
10355 HighWatermark, sizeof(IO_REMOVE_LOCK))
10356
10357 VOID
10358 FORCEINLINE
10359 IoInitializeDpcRequest(
10360 IN PDEVICE_OBJECT DeviceObject,
10361 IN PIO_DPC_ROUTINE DpcRoutine)
10362 {
10363 KeInitializeDpc( &DeviceObject->Dpc,
10364 (PKDEFERRED_ROUTINE) DpcRoutine,
10365 DeviceObject );
10366 }
10367
10368 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
10369
10370 /*
10371 * ULONG
10372 * IoGetFunctionCodeFromCtlCode(
10373 * IN ULONG ControlCode)
10374 */
10375 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
10376 (((_ControlCode) >> 2) & 0x00000FFF)
10377
10378 FORCEINLINE
10379 VOID
10380 IoCopyCurrentIrpStackLocationToNext(
10381 IN OUT PIRP Irp)
10382 {
10383 PIO_STACK_LOCATION irpSp;
10384 PIO_STACK_LOCATION nextIrpSp;
10385 irpSp = IoGetCurrentIrpStackLocation(Irp);
10386 nextIrpSp = IoGetNextIrpStackLocation(Irp);
10387 RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
10388 nextIrpSp->Control = 0;
10389 }
10390
10391 NTKERNELAPI
10392 VOID
10393 NTAPI
10394 IoGetStackLimits(
10395 OUT PULONG_PTR LowLimit,
10396 OUT PULONG_PTR HighLimit);
10397
10398 FORCEINLINE
10399 ULONG_PTR
10400 IoGetRemainingStackSize(VOID)
10401 {
10402 ULONG_PTR End, Begin;
10403 ULONG_PTR Result;
10404
10405 IoGetStackLimits(&Begin, &End);
10406 Result = (ULONG_PTR)(&End) - Begin;
10407 return Result;
10408 }
10409
10410 #if (NTDDI_VERSION >= NTDDI_WS03)
10411 VOID
10412 FORCEINLINE
10413 IoInitializeThreadedDpcRequest(
10414 IN PDEVICE_OBJECT DeviceObject,
10415 IN PIO_DPC_ROUTINE DpcRoutine)
10416 {
10417 KeInitializeThreadedDpc(&DeviceObject->Dpc,
10418 (PKDEFERRED_ROUTINE) DpcRoutine,
10419 DeviceObject );
10420 }
10421 #endif
10422
10423 /******************************************************************************
10424 * Power Management Support Functions *
10425 ******************************************************************************/
10426
10427 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
10428
10429 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10430
10431 NTKERNELAPI
10432 NTSTATUS
10433 NTAPI
10434 PoCallDriver(
10435 IN struct _DEVICE_OBJECT *DeviceObject,
10436 IN OUT struct _IRP *Irp);
10437
10438 NTKERNELAPI
10439 PULONG
10440 NTAPI
10441 PoRegisterDeviceForIdleDetection(
10442 IN struct _DEVICE_OBJECT *DeviceObject,
10443 IN ULONG ConservationIdleTime,
10444 IN ULONG PerformanceIdleTime,
10445 IN DEVICE_POWER_STATE State);
10446
10447 NTKERNELAPI
10448 PVOID
10449 NTAPI
10450 PoRegisterSystemState(
10451 IN OUT PVOID StateHandle OPTIONAL,
10452 IN EXECUTION_STATE Flags);
10453
10454 NTKERNELAPI
10455 NTSTATUS
10456 NTAPI
10457 PoRequestPowerIrp(
10458 IN struct _DEVICE_OBJECT *DeviceObject,
10459 IN UCHAR MinorFunction,
10460 IN POWER_STATE PowerState,
10461 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
10462 IN PVOID Context OPTIONAL,
10463 OUT struct _IRP **Irp OPTIONAL);
10464
10465 NTKERNELAPI
10466 POWER_STATE
10467 NTAPI
10468 PoSetPowerState(
10469 IN struct _DEVICE_OBJECT *DeviceObject,
10470 IN POWER_STATE_TYPE Type,
10471 IN POWER_STATE State);
10472
10473 NTKERNELAPI
10474 VOID
10475 NTAPI
10476 PoSetSystemState(
10477 IN EXECUTION_STATE Flags);
10478
10479 NTKERNELAPI
10480 VOID
10481 NTAPI
10482 PoStartNextPowerIrp(
10483 IN OUT struct _IRP *Irp);
10484
10485 NTKERNELAPI
10486 VOID
10487 NTAPI
10488 PoUnregisterSystemState(
10489 IN OUT PVOID StateHandle);
10490
10491 NTKERNELAPI
10492 NTSTATUS
10493 NTAPI
10494 PoRequestShutdownEvent(
10495 OUT PVOID *Event);
10496
10497 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10498
10499 #if (NTDDI_VERSION >= NTDDI_VISTA)
10500
10501 NTKERNELAPI
10502 VOID
10503 NTAPI
10504 PoSetSystemWake(
10505 IN OUT struct _IRP *Irp);
10506
10507 NTKERNELAPI
10508 BOOLEAN
10509 NTAPI
10510 PoGetSystemWake(
10511 IN struct _IRP *Irp);
10512
10513 NTKERNELAPI
10514 NTSTATUS
10515 NTAPI
10516 PoRegisterPowerSettingCallback(
10517 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
10518 IN LPCGUID SettingGuid,
10519 IN PPOWER_SETTING_CALLBACK Callback,
10520 IN PVOID Context OPTIONAL,
10521 OUT PVOID *Handle OPTIONAL);
10522
10523 NTKERNELAPI
10524 NTSTATUS
10525 NTAPI
10526 PoUnregisterPowerSettingCallback(
10527 IN OUT PVOID Handle);
10528
10529 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10530
10531 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
10532 NTKERNELAPI
10533 VOID
10534 NTAPI
10535 PoSetDeviceBusyEx(
10536 IN OUT PULONG IdlePointer);
10537 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
10538
10539 #if (NTDDI_VERSION >= NTDDI_WIN7)
10540
10541 NTKERNELAPI
10542 VOID
10543 NTAPI
10544 PoStartDeviceBusy(
10545 IN OUT PULONG IdlePointer);
10546
10547 NTKERNELAPI
10548 VOID
10549 NTAPI
10550 PoEndDeviceBusy(
10551 IN OUT PULONG IdlePointer);
10552
10553 NTKERNELAPI
10554 BOOLEAN
10555 NTAPI
10556 PoQueryWatchdogTime(
10557 IN PDEVICE_OBJECT Pdo,
10558 OUT PULONG SecondsRemaining);
10559
10560 NTKERNELAPI
10561 VOID
10562 NTAPI
10563 PoDeletePowerRequest(
10564 IN OUT PVOID PowerRequest);
10565
10566 NTKERNELAPI
10567 NTSTATUS
10568 NTAPI
10569 PoSetPowerRequest(
10570 IN OUT PVOID PowerRequest,
10571 IN POWER_REQUEST_TYPE Type);
10572
10573 NTKERNELAPI
10574 NTSTATUS
10575 NTAPI
10576 PoClearPowerRequest(
10577 IN OUT PVOID PowerRequest,
10578 IN POWER_REQUEST_TYPE Type);
10579
10580 NTKERNELAPI
10581 NTSTATUS
10582 NTAPI
10583 PoCreatePowerRequest(
10584 OUT PVOID *PowerRequest,
10585 IN PDEVICE_OBJECT DeviceObject,
10586 IN PCOUNTED_REASON_CONTEXT Context);
10587
10588 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10589
10590 /******************************************************************************
10591 * Executive Functions *
10592 ******************************************************************************/
10593
10594 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
10595 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
10596 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
10597
10598 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
10599 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
10600 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
10601 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
10602
10603 #define ExInitializeSListHead InitializeSListHead
10604
10605 #if defined(_X86_)
10606 #if defined(_NTHAL_)
10607 #define ExAcquireFastMutex ExiAcquireFastMutex
10608 #define ExReleaseFastMutex ExiReleaseFastMutex
10609 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
10610 #endif
10611 #define ExInterlockedAddUlong ExfInterlockedAddUlong
10612 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
10613 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
10614 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
10615 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
10616 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
10617 #endif /* defined(_X86_) */
10618
10619 #if defined(_WIN64)
10620
10621 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
10622 defined(_NTHAL_) || defined(_NTOSP_)
10623 NTKERNELAPI
10624 USHORT
10625 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
10626 #else
10627 FORCEINLINE
10628 USHORT
10629 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
10630 {
10631 return (USHORT)(ListHead->Alignment & 0xffff);
10632 }
10633 #endif
10634
10635 NTKERNELAPI
10636 PSLIST_ENTRY
10637 ExpInterlockedFlushSList(
10638 PSLIST_HEADER ListHead);
10639
10640 NTKERNELAPI
10641 PSLIST_ENTRY
10642 ExpInterlockedPopEntrySList(
10643 PSLIST_HEADER ListHead);
10644
10645 NTKERNELAPI
10646 PSLIST_ENTRY
10647 ExpInterlockedPushEntrySList(
10648 PSLIST_HEADER ListHead,
10649 PSLIST_ENTRY ListEntry);
10650
10651 #define ExInterlockedFlushSList(Head) \
10652 ExpInterlockedFlushSList(Head)
10653 #define ExInterlockedPopEntrySList(Head, Lock) \
10654 ExpInterlockedPopEntrySList(Head)
10655 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
10656 ExpInterlockedPushEntrySList(Head, Entry)
10657
10658 #else /* !defined(_WIN64) */
10659
10660 #define ExQueryDepthSList(listhead) (listhead)->Depth
10661
10662 NTKERNELAPI
10663 PSINGLE_LIST_ENTRY
10664 FASTCALL
10665 ExInterlockedFlushSList(
10666 IN OUT PSLIST_HEADER ListHead);
10667
10668 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
10669
10670 NTKERNELAPI
10671 PSINGLE_LIST_ENTRY
10672 FASTCALL
10673 ExInterlockedPopEntrySList(
10674 IN PSLIST_HEADER ListHead,
10675 IN PKSPIN_LOCK Lock);
10676
10677 NTKERNELAPI
10678 PSINGLE_LIST_ENTRY
10679 FASTCALL
10680 ExInterlockedPushEntrySList(
10681 IN PSLIST_HEADER ListHead,
10682 IN PSINGLE_LIST_ENTRY ListEntry,
10683 IN PKSPIN_LOCK Lock);
10684 #else
10685 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
10686 InterlockedPopEntrySList(_ListHead)
10687 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
10688 InterlockedPushEntrySList(_ListHead, _ListEntry)
10689 #endif // _WIN2K_COMPAT_SLIST_USAGE
10690
10691 #endif // !defined(_WIN64)
10692
10693 /* ERESOURCE_THREAD
10694 * ExGetCurrentResourceThread(
10695 * VOID);
10696 */
10697 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
10698
10699 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
10700
10701 /* VOID
10702 * ExInitializeWorkItem(
10703 * IN PWORK_QUEUE_ITEM Item,
10704 * IN PWORKER_THREAD_ROUTINE Routine,
10705 * IN PVOID Context)
10706 */
10707 #define ExInitializeWorkItem(Item, Routine, Context) \
10708 { \
10709 (Item)->WorkerRoutine = Routine; \
10710 (Item)->Parameter = Context; \
10711 (Item)->List.Flink = NULL; \
10712 }
10713
10714 FORCEINLINE
10715 VOID
10716 ExInitializeFastMutex(
10717 OUT PFAST_MUTEX FastMutex)
10718 {
10719 FastMutex->Count = FM_LOCK_BIT;
10720 FastMutex->Owner = NULL;
10721 FastMutex->Contention = 0;
10722 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
10723 return;
10724 }
10725
10726 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10727
10728 NTKERNELAPI
10729 VOID
10730 FASTCALL
10731 ExAcquireFastMutex(
10732 IN OUT PFAST_MUTEX FastMutex);
10733
10734 NTKERNELAPI
10735 VOID
10736 FASTCALL
10737 ExReleaseFastMutex(
10738 IN OUT PFAST_MUTEX FastMutex);
10739
10740 NTKERNELAPI
10741 BOOLEAN
10742 FASTCALL
10743 ExTryToAcquireFastMutex(
10744 IN OUT PFAST_MUTEX FastMutex);
10745
10746 NTKERNELAPI
10747 VOID
10748 FASTCALL
10749 ExAcquireFastMutexUnsafe(
10750 IN OUT PFAST_MUTEX FastMutex);
10751
10752 NTKERNELAPI
10753 VOID
10754 FASTCALL
10755 ExReleaseFastMutexUnsafe(
10756 IN OUT PFAST_MUTEX FastMutex);
10757
10758 NTKERNELAPI
10759 BOOLEAN
10760 NTAPI
10761 ExAcquireResourceExclusiveLite(
10762 IN OUT PERESOURCE Resource,
10763 IN BOOLEAN Wait);
10764
10765 NTKERNELAPI
10766 BOOLEAN
10767 NTAPI
10768 ExAcquireResourceSharedLite(
10769 IN OUT PERESOURCE Resource,
10770 IN BOOLEAN Wait);
10771
10772 NTKERNELAPI
10773 BOOLEAN
10774 NTAPI
10775 ExAcquireSharedStarveExclusive(
10776 IN OUT PERESOURCE Resource,
10777 IN BOOLEAN Wait);
10778
10779 NTKERNELAPI
10780 BOOLEAN
10781 NTAPI
10782 ExAcquireSharedWaitForExclusive(
10783 IN OUT PERESOURCE Resource,
10784 IN BOOLEAN Wait);
10785
10786 NTKERNELAPI
10787 PVOID
10788 NTAPI
10789 ExAllocatePool(
10790 IN POOL_TYPE PoolType,
10791 IN SIZE_T NumberOfBytes);
10792
10793 #ifdef POOL_TAGGING
10794 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
10795 #endif /* POOL_TAGGING */
10796
10797 NTKERNELAPI
10798 PVOID
10799 NTAPI
10800 ExAllocatePoolWithQuota(
10801 IN POOL_TYPE PoolType,
10802 IN SIZE_T NumberOfBytes);
10803
10804 #ifdef POOL_TAGGING
10805 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
10806 #endif /* POOL_TAGGING */
10807
10808 NTKERNELAPI
10809 PVOID
10810 NTAPI
10811 ExAllocatePoolWithQuotaTag(
10812 IN POOL_TYPE PoolType,
10813 IN SIZE_T NumberOfBytes,
10814 IN ULONG Tag);
10815
10816 #ifndef POOL_TAGGING
10817 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
10818 #endif
10819
10820 NTKERNELAPI
10821 PVOID
10822 NTAPI
10823 ExAllocatePoolWithTag(
10824 IN POOL_TYPE PoolType,
10825 IN SIZE_T NumberOfBytes,
10826 IN ULONG Tag);
10827
10828 NTKERNELAPI
10829 PVOID
10830 NTAPI
10831 ExAllocatePoolWithTagPriority(
10832 IN POOL_TYPE PoolType,
10833 IN SIZE_T NumberOfBytes,
10834 IN ULONG Tag,
10835 IN EX_POOL_PRIORITY Priority);
10836
10837 NTKERNELAPI
10838 VOID
10839 NTAPI
10840 ExConvertExclusiveToSharedLite(
10841 IN OUT PERESOURCE Resource);
10842
10843 NTKERNELAPI
10844 NTSTATUS
10845 NTAPI
10846 ExCreateCallback(
10847 OUT PCALLBACK_OBJECT *CallbackObject,
10848 IN POBJECT_ATTRIBUTES ObjectAttributes,
10849 IN BOOLEAN Create,
10850 IN BOOLEAN AllowMultipleCallbacks);
10851
10852 NTKERNELAPI
10853 VOID
10854 NTAPI
10855 ExDeleteNPagedLookasideList(
10856 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
10857
10858 NTKERNELAPI
10859 VOID
10860 NTAPI
10861 ExDeletePagedLookasideList(
10862 IN PPAGED_LOOKASIDE_LIST Lookaside);
10863
10864 NTKERNELAPI
10865 NTSTATUS
10866 NTAPI
10867 ExDeleteResourceLite(
10868 IN OUT PERESOURCE Resource);
10869
10870 NTKERNELAPI
10871 VOID
10872 NTAPI
10873 ExFreePool(
10874 IN PVOID P);
10875
10876 #ifdef POOL_TAGGING
10877 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
10878 #endif
10879
10880 NTKERNELAPI
10881 VOID
10882 NTAPI
10883 ExFreePoolWithTag(
10884 IN PVOID P,
10885 IN ULONG Tag);
10886
10887 NTKERNELAPI
10888 ULONG
10889 NTAPI
10890 ExGetExclusiveWaiterCount(
10891 IN PERESOURCE Resource);
10892
10893 NTKERNELAPI
10894 KPROCESSOR_MODE
10895 NTAPI
10896 ExGetPreviousMode(VOID);
10897
10898 NTKERNELAPI
10899 ULONG
10900 NTAPI
10901 ExGetSharedWaiterCount(
10902 IN PERESOURCE Resource);
10903
10904 NTKERNELAPI
10905 VOID
10906 NTAPI
10907 ExInitializeNPagedLookasideList(
10908 IN PNPAGED_LOOKASIDE_LIST Lookaside,
10909 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
10910 IN PFREE_FUNCTION Free OPTIONAL,
10911 IN ULONG Flags,
10912 IN SIZE_T Size,
10913 IN ULONG Tag,
10914 IN USHORT Depth);
10915
10916 NTKERNELAPI
10917 VOID
10918 NTAPI
10919 ExInitializePagedLookasideList(
10920 IN PPAGED_LOOKASIDE_LIST Lookaside,
10921 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
10922 IN PFREE_FUNCTION Free OPTIONAL,
10923 IN ULONG Flags,
10924 IN SIZE_T Size,
10925 IN ULONG Tag,
10926 IN USHORT Depth);
10927
10928 NTKERNELAPI
10929 NTSTATUS
10930 NTAPI
10931 ExInitializeResourceLite(
10932 OUT PERESOURCE Resource);
10933
10934 NTKERNELAPI
10935 LARGE_INTEGER
10936 NTAPI
10937 ExInterlockedAddLargeInteger(
10938 IN PLARGE_INTEGER Addend,
10939 IN LARGE_INTEGER Increment,
10940 IN PKSPIN_LOCK Lock);
10941
10942 #if defined(_WIN64)
10943 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
10944 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
10945 #else
10946 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
10947 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
10948 #endif
10949
10950 NTKERNELAPI
10951 ULONG
10952 FASTCALL
10953 ExInterlockedAddUlong(
10954 IN PULONG Addend,
10955 IN ULONG Increment,
10956 IN OUT PKSPIN_LOCK Lock);
10957
10958 #if defined(_AMD64_) || defined(_IA64_)
10959
10960 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
10961 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
10962
10963 #elif defined(_X86_)
10964
10965 NTKERNELAPI
10966 LONGLONG
10967 FASTCALL
10968 ExfInterlockedCompareExchange64(
10969 IN OUT LONGLONG volatile *Destination,
10970 IN PLONGLONG Exchange,
10971 IN PLONGLONG Comperand);
10972
10973 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
10974 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
10975
10976 #else
10977
10978 NTKERNELAPI
10979 LONGLONG
10980 FASTCALL
10981 ExInterlockedCompareExchange64(
10982 IN OUT LONGLONG volatile *Destination,
10983 IN PLONGLONG Exchange,
10984 IN PLONGLONG Comparand,
10985 IN PKSPIN_LOCK Lock);
10986
10987 #endif /* defined(_AMD64_) || defined(_IA64_) */
10988
10989 NTKERNELAPI
10990 PLIST_ENTRY
10991 FASTCALL
10992 ExInterlockedInsertHeadList(
10993 IN OUT PLIST_ENTRY ListHead,
10994 IN OUT PLIST_ENTRY ListEntry,
10995 IN OUT PKSPIN_LOCK Lock);
10996
10997 NTKERNELAPI
10998 PLIST_ENTRY
10999 FASTCALL
11000 ExInterlockedInsertTailList(
11001 IN OUT PLIST_ENTRY ListHead,
11002 IN OUT PLIST_ENTRY ListEntry,
11003 IN OUT PKSPIN_LOCK Lock);
11004
11005 NTKERNELAPI
11006 PSINGLE_LIST_ENTRY
11007 FASTCALL
11008 ExInterlockedPopEntryList(
11009 IN OUT PSINGLE_LIST_ENTRY ListHead,
11010 IN OUT PKSPIN_LOCK Lock);
11011
11012 NTKERNELAPI
11013 PSINGLE_LIST_ENTRY
11014 FASTCALL
11015 ExInterlockedPushEntryList(
11016 IN OUT PSINGLE_LIST_ENTRY ListHead,
11017 IN OUT PSINGLE_LIST_ENTRY ListEntry,
11018 IN OUT PKSPIN_LOCK Lock);
11019
11020 NTKERNELAPI
11021 PLIST_ENTRY
11022 FASTCALL
11023 ExInterlockedRemoveHeadList(
11024 IN OUT PLIST_ENTRY ListHead,
11025 IN OUT PKSPIN_LOCK Lock);
11026
11027 NTKERNELAPI
11028 BOOLEAN
11029 NTAPI
11030 ExIsProcessorFeaturePresent(
11031 IN ULONG ProcessorFeature);
11032
11033 NTKERNELAPI
11034 BOOLEAN
11035 NTAPI
11036 ExIsResourceAcquiredExclusiveLite(
11037 IN PERESOURCE Resource);
11038
11039 NTKERNELAPI
11040 ULONG
11041 NTAPI
11042 ExIsResourceAcquiredSharedLite(
11043 IN PERESOURCE Resource);
11044
11045 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
11046
11047 NTKERNELAPI
11048 VOID
11049 NTAPI
11050 ExLocalTimeToSystemTime(
11051 IN PLARGE_INTEGER LocalTime,
11052 OUT PLARGE_INTEGER SystemTime);
11053
11054 NTKERNELAPI
11055 VOID
11056 NTAPI
11057 ExNotifyCallback(
11058 IN PCALLBACK_OBJECT CallbackObject,
11059 IN PVOID Argument1 OPTIONAL,
11060 IN PVOID Argument2 OPTIONAL);
11061
11062 NTKERNELAPI
11063 VOID
11064 NTAPI
11065 ExQueueWorkItem(
11066 IN OUT PWORK_QUEUE_ITEM WorkItem,
11067 IN WORK_QUEUE_TYPE QueueType);
11068
11069 NTKERNELAPI
11070 DECLSPEC_NORETURN
11071 VOID
11072 NTAPI
11073 ExRaiseStatus(
11074 IN NTSTATUS Status);
11075
11076 NTKERNELAPI
11077 PVOID
11078 NTAPI
11079 ExRegisterCallback(
11080 IN PCALLBACK_OBJECT CallbackObject,
11081 IN PCALLBACK_FUNCTION CallbackFunction,
11082 IN PVOID CallbackContext OPTIONAL);
11083
11084 NTKERNELAPI
11085 NTSTATUS
11086 NTAPI
11087 ExReinitializeResourceLite(
11088 IN OUT PERESOURCE Resource);
11089
11090 NTKERNELAPI
11091 VOID
11092 NTAPI
11093 ExReleaseResourceForThreadLite(
11094 IN OUT PERESOURCE Resource,
11095 IN ERESOURCE_THREAD ResourceThreadId);
11096
11097 NTKERNELAPI
11098 VOID
11099 FASTCALL
11100 ExReleaseResourceLite(
11101 IN OUT PERESOURCE Resource);
11102
11103 NTKERNELAPI
11104 VOID
11105 NTAPI
11106 ExSetResourceOwnerPointer(
11107 IN OUT PERESOURCE Resource,
11108 IN PVOID OwnerPointer);
11109
11110 NTKERNELAPI
11111 ULONG
11112 NTAPI
11113 ExSetTimerResolution(
11114 IN ULONG DesiredTime,
11115 IN BOOLEAN SetResolution);
11116
11117 NTKERNELAPI
11118 VOID
11119 NTAPI
11120 ExSystemTimeToLocalTime(
11121 IN PLARGE_INTEGER SystemTime,
11122 OUT PLARGE_INTEGER LocalTime);
11123
11124 NTKERNELAPI
11125 VOID
11126 NTAPI
11127 ExUnregisterCallback(
11128 IN OUT PVOID CbRegistration);
11129
11130 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11131
11132 #if (NTDDI_VERSION >= NTDDI_WINXP)
11133
11134 NTKERNELAPI
11135 BOOLEAN
11136 FASTCALL
11137 ExAcquireRundownProtection(
11138 IN OUT PEX_RUNDOWN_REF RunRef);
11139
11140 NTKERNELAPI
11141 VOID
11142 FASTCALL
11143 ExInitializeRundownProtection(
11144 OUT PEX_RUNDOWN_REF RunRef);
11145
11146 NTKERNELAPI
11147 VOID
11148 FASTCALL
11149 ExReInitializeRundownProtection(
11150 IN OUT PEX_RUNDOWN_REF RunRef);
11151
11152 NTKERNELAPI
11153 VOID
11154 FASTCALL
11155 ExReleaseRundownProtection(
11156 IN OUT PEX_RUNDOWN_REF RunRef);
11157
11158 NTKERNELAPI
11159 VOID
11160 FASTCALL
11161 ExRundownCompleted(
11162 OUT PEX_RUNDOWN_REF RunRef);
11163
11164 NTKERNELAPI
11165 BOOLEAN
11166 NTAPI
11167 ExVerifySuite(
11168 IN SUITE_TYPE SuiteType);
11169
11170 NTKERNELAPI
11171 VOID
11172 FASTCALL
11173 ExWaitForRundownProtectionRelease(
11174 IN OUT PEX_RUNDOWN_REF RunRef);
11175
11176 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
11177
11178 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
11179
11180 NTKERNELAPI
11181 BOOLEAN
11182 FASTCALL
11183 ExAcquireRundownProtectionEx(
11184 IN OUT PEX_RUNDOWN_REF RunRef,
11185 IN ULONG Count);
11186
11187 NTKERNELAPI
11188 VOID
11189 FASTCALL
11190 ExReleaseRundownProtectionEx(
11191 IN OUT PEX_RUNDOWN_REF RunRef,
11192 IN ULONG Count);
11193
11194 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
11195
11196 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11197
11198 NTKERNELAPI
11199 PEX_RUNDOWN_REF_CACHE_AWARE
11200 NTAPI
11201 ExAllocateCacheAwareRundownProtection(
11202 IN POOL_TYPE PoolType,
11203 IN ULONG PoolTag);
11204
11205 NTKERNELAPI
11206 SIZE_T
11207 NTAPI
11208 ExSizeOfRundownProtectionCacheAware(VOID);
11209
11210 NTKERNELAPI
11211 PVOID
11212 NTAPI
11213 ExEnterCriticalRegionAndAcquireResourceShared(
11214 IN OUT PERESOURCE Resource);
11215
11216 NTKERNELAPI
11217 PVOID
11218 NTAPI
11219 ExEnterCriticalRegionAndAcquireResourceExclusive(
11220 IN OUT PERESOURCE Resource);
11221
11222 NTKERNELAPI
11223 PVOID
11224 NTAPI
11225 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
11226 IN OUT PERESOURCE Resource);
11227
11228 NTKERNELAPI
11229 VOID
11230 FASTCALL
11231 ExReleaseResourceAndLeaveCriticalRegion(
11232 IN OUT PERESOURCE Resource);
11233
11234 NTKERNELAPI
11235 VOID
11236 NTAPI
11237 ExInitializeRundownProtectionCacheAware(
11238 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
11239 IN SIZE_T RunRefSize);
11240
11241 NTKERNELAPI
11242 VOID
11243 NTAPI
11244 ExFreeCacheAwareRundownProtection(
11245 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11246
11247 NTKERNELAPI
11248 BOOLEAN
11249 FASTCALL
11250 ExAcquireRundownProtectionCacheAware(
11251 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11252
11253 NTKERNELAPI
11254 VOID
11255 FASTCALL
11256 ExReleaseRundownProtectionCacheAware(
11257 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11258
11259 NTKERNELAPI
11260 BOOLEAN
11261 FASTCALL
11262 ExAcquireRundownProtectionCacheAwareEx(
11263 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
11264 IN ULONG Count);
11265
11266 NTKERNELAPI
11267 VOID
11268 FASTCALL
11269 ExReleaseRundownProtectionCacheAwareEx(
11270 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
11271 IN ULONG Count);
11272
11273 NTKERNELAPI
11274 VOID
11275 FASTCALL
11276 ExWaitForRundownProtectionReleaseCacheAware(
11277 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
11278
11279 NTKERNELAPI
11280 VOID
11281 FASTCALL
11282 ExReInitializeRundownProtectionCacheAware(
11283 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11284
11285 NTKERNELAPI
11286 VOID
11287 FASTCALL
11288 ExRundownCompletedCacheAware(
11289 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11290
11291 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11292
11293 #if (NTDDI_VERSION >= NTDDI_VISTA)
11294
11295 NTKERNELAPI
11296 NTSTATUS
11297 NTAPI
11298 ExInitializeLookasideListEx(
11299 OUT PLOOKASIDE_LIST_EX Lookaside,
11300 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
11301 IN PFREE_FUNCTION_EX Free OPTIONAL,
11302 IN POOL_TYPE PoolType,
11303 IN ULONG Flags,
11304 IN SIZE_T Size,
11305 IN ULONG Tag,
11306 IN USHORT Depth);
11307 #endif
11308
11309 #if !defined(MIDL_PASS)
11310
11311 static __inline PVOID
11312 ExAllocateFromNPagedLookasideList(
11313 IN PNPAGED_LOOKASIDE_LIST Lookaside)
11314 {
11315 PVOID Entry;
11316
11317 Lookaside->L.TotalAllocates += 1;
11318 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
11319 if (Entry == NULL) {
11320 Lookaside->L.AllocateMisses++;
11321 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
11322 Lookaside->L.Size,
11323 Lookaside->L.Tag);
11324 }
11325 return Entry;
11326 }
11327
11328 static __inline PVOID
11329 ExAllocateFromPagedLookasideList(
11330 IN PPAGED_LOOKASIDE_LIST Lookaside)
11331 {
11332 PVOID Entry;
11333
11334 Lookaside->L.TotalAllocates++;
11335 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
11336 if (Entry == NULL) {
11337 Lookaside->L.AllocateMisses++;
11338 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
11339 Lookaside->L.Size,
11340 Lookaside->L.Tag);
11341 }
11342 return Entry;
11343 }
11344
11345 static __inline VOID
11346 ExFreeToNPagedLookasideList(
11347 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
11348 IN PVOID Entry)
11349 {
11350 Lookaside->L.TotalFrees++;
11351 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
11352 Lookaside->L.FreeMisses++;
11353 (Lookaside->L.Free)(Entry);
11354 } else {
11355 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
11356 }
11357 }
11358
11359 static __inline VOID
11360 ExFreeToPagedLookasideList(
11361 IN PPAGED_LOOKASIDE_LIST Lookaside,
11362 IN PVOID Entry)
11363 {
11364 Lookaside->L.TotalFrees++;
11365 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
11366 Lookaside->L.FreeMisses++;
11367 (Lookaside->L.Free)(Entry);
11368 } else {
11369 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
11370 }
11371 }
11372
11373 #endif // !defined(MIDL_PASS)
11374
11375 /******************************************************************************
11376 * Object Manager Functions *
11377 ******************************************************************************/
11378
11379 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11380
11381 NTKERNELAPI
11382 LONG_PTR
11383 FASTCALL
11384 ObfDereferenceObject(
11385 IN PVOID Object);
11386 #define ObDereferenceObject ObfDereferenceObject
11387
11388 NTKERNELAPI
11389 NTSTATUS
11390 NTAPI
11391 ObGetObjectSecurity(
11392 IN PVOID Object,
11393 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
11394 OUT PBOOLEAN MemoryAllocated);
11395
11396 NTKERNELAPI
11397 LONG_PTR
11398 FASTCALL
11399 ObfReferenceObject(
11400 IN PVOID Object);
11401 #define ObReferenceObject ObfReferenceObject
11402
11403 NTKERNELAPI
11404 NTSTATUS
11405 NTAPI
11406 ObReferenceObjectByHandle(
11407 IN HANDLE Handle,
11408 IN ACCESS_MASK DesiredAccess,
11409 IN POBJECT_TYPE ObjectType OPTIONAL,
11410 IN KPROCESSOR_MODE AccessMode,
11411 OUT PVOID *Object,
11412 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
11413
11414 NTKERNELAPI
11415 NTSTATUS
11416 NTAPI
11417 ObReferenceObjectByPointer(
11418 IN PVOID Object,
11419 IN ACCESS_MASK DesiredAccess,
11420 IN POBJECT_TYPE ObjectType OPTIONAL,
11421 IN KPROCESSOR_MODE AccessMode);
11422
11423 NTKERNELAPI
11424 VOID
11425 NTAPI
11426 ObReleaseObjectSecurity(
11427 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
11428 IN BOOLEAN MemoryAllocated);
11429
11430 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11431
11432 #if (NTDDI_VERSION >= NTDDI_VISTA)
11433 NTKERNELAPI
11434 VOID
11435 NTAPI
11436 ObDereferenceObjectDeferDelete(
11437 IN PVOID Object);
11438 #endif
11439
11440 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
11441 NTKERNELAPI
11442 NTSTATUS
11443 NTAPI
11444 ObRegisterCallbacks(
11445 IN POB_CALLBACK_REGISTRATION CallbackRegistration,
11446 OUT PVOID *RegistrationHandle);
11447
11448 NTKERNELAPI
11449 VOID
11450 NTAPI
11451 ObUnRegisterCallbacks(
11452 IN PVOID RegistrationHandle);
11453
11454 NTKERNELAPI
11455 USHORT
11456 NTAPI
11457 ObGetFilterVersion(VOID);
11458
11459 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
11460
11461 #if (NTDDI_VERSION >= NTDDI_WIN7)
11462
11463 NTKERNELAPI
11464 NTSTATUS
11465 NTAPI
11466 ObReferenceObjectByHandleWithTag(
11467 IN HANDLE Handle,
11468 IN ACCESS_MASK DesiredAccess,
11469 IN POBJECT_TYPE ObjectType OPTIONAL,
11470 IN KPROCESSOR_MODE AccessMode,
11471 IN ULONG Tag,
11472 OUT PVOID *Object,
11473 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
11474
11475 NTKERNELAPI
11476 LONG_PTR
11477 FASTCALL
11478 ObfReferenceObjectWithTag(
11479 IN PVOID Object,
11480 IN ULONG Tag);
11481
11482 NTKERNELAPI
11483 NTSTATUS
11484 NTAPI
11485 ObReferenceObjectByPointerWithTag(
11486 IN PVOID Object,
11487 IN ACCESS_MASK DesiredAccess,
11488 IN POBJECT_TYPE ObjectType OPTIONAL,
11489 IN KPROCESSOR_MODE AccessMode,
11490 IN ULONG Tag);
11491
11492 NTKERNELAPI
11493 LONG_PTR
11494 FASTCALL
11495 ObfDereferenceObjectWithTag(
11496 IN PVOID Object,
11497 IN ULONG Tag);
11498
11499 NTKERNELAPI
11500 VOID
11501 NTAPI
11502 ObDereferenceObjectDeferDeleteWithTag(
11503 IN PVOID Object,
11504 IN ULONG Tag);
11505
11506 #define ObDereferenceObject ObfDereferenceObject
11507 #define ObReferenceObject ObfReferenceObject
11508 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
11509 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
11510
11511 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
11512
11513
11514 /******************************************************************************
11515 * Process Manager Functions *
11516 ******************************************************************************/
11517
11518 NTKERNELAPI
11519 NTSTATUS
11520 NTAPI
11521 PsWrapApcWow64Thread(
11522 IN OUT PVOID *ApcContext,
11523 IN OUT PVOID *ApcRoutine);
11524
11525 /*
11526 * PEPROCESS
11527 * PsGetCurrentProcess(VOID)
11528 */
11529 #define PsGetCurrentProcess IoGetCurrentProcess
11530
11531 #if !defined(_PSGETCURRENTTHREAD_)
11532 #define _PSGETCURRENTTHREAD_
11533 FORCEINLINE
11534 PETHREAD
11535 NTAPI
11536 PsGetCurrentThread(VOID)
11537 {
11538 return (PETHREAD)KeGetCurrentThread();
11539 }
11540 #endif /* !_PSGETCURRENTTHREAD_ */
11541
11542
11543 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11544
11545 NTKERNELAPI
11546 NTSTATUS
11547 NTAPI
11548 PsCreateSystemThread(
11549 OUT PHANDLE ThreadHandle,
11550 IN ULONG DesiredAccess,
11551 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
11552 IN HANDLE ProcessHandle OPTIONAL,
11553 OUT PCLIENT_ID ClientId OPTIONAL,
11554 IN PKSTART_ROUTINE StartRoutine,
11555 IN PVOID StartContext OPTIONAL);
11556
11557 NTKERNELAPI
11558 NTSTATUS
11559 NTAPI
11560 PsTerminateSystemThread(
11561 IN NTSTATUS ExitStatus);
11562
11563
11564 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11565
11566 /******************************************************************************
11567 * WMI Library Support Functions *
11568 ******************************************************************************/
11569
11570 #ifdef RUN_WPP
11571 #if (NTDDI_VERSION >= NTDDI_WINXP)
11572 NTKERNELAPI
11573 NTSTATUS
11574 __cdecl
11575 WmiTraceMessage(
11576 IN TRACEHANDLE LoggerHandle,
11577 IN ULONG MessageFlags,
11578 IN LPGUID MessageGuid,
11579 IN USHORT MessageNumber,
11580 IN ...);
11581 #endif
11582 #endif /* RUN_WPP */
11583
11584 #if (NTDDI_VERSION >= NTDDI_WINXP)
11585
11586 NTKERNELAPI
11587 NTSTATUS
11588 NTAPI
11589 WmiQueryTraceInformation(
11590 IN TRACE_INFORMATION_CLASS TraceInformationClass,
11591 OUT PVOID TraceInformation,
11592 IN ULONG TraceInformationLength,
11593 OUT PULONG RequiredLength OPTIONAL,
11594 IN PVOID Buffer OPTIONAL);
11595
11596 #if 0
11597 /* FIXME: Get va_list from where? */
11598 NTKERNELAPI
11599 NTSTATUS
11600 __cdecl
11601 WmiTraceMessageVa(
11602 IN TRACEHANDLE LoggerHandle,
11603 IN ULONG MessageFlags,
11604 IN LPGUID MessageGuid,
11605 IN USHORT MessageNumber,
11606 IN va_list MessageArgList);
11607 #endif
11608
11609 #endif
11610
11611 /******************************************************************************
11612 * Kernel Debugger Functions *
11613 ******************************************************************************/
11614
11615 #ifndef _DBGNT_
11616
11617 ULONG
11618 __cdecl
11619 DbgPrint(
11620 IN PCSTR Format,
11621 IN ...);
11622 #endif
11623
11624 #if DBG
11625
11626 #define KdPrint(_x_) DbgPrint _x_
11627 #define KdPrintEx(_x_) DbgPrintEx _x_
11628 #define vKdPrintEx(_x_) vDbgPrintEx _x_
11629 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
11630 #define KdBreakPoint() DbgBreakPoint()
11631 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
11632
11633 #else /* !DBG */
11634
11635 #define KdPrint(_x_)
11636 #define KdPrintEx(_x_)
11637 #define vKdPrintEx(_x_)
11638 #define vKdPrintExWithPrefix(_x_)
11639 #define KdBreakPoint()
11640 #define KdBreakPointWithStatus(s)
11641
11642 #endif /* !DBG */
11643
11644 #if defined(__GNUC__)
11645
11646 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
11647 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
11648 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11649 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11650
11651 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
11652
11653 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
11654 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
11655 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
11656 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
11657
11658 #else
11659
11660 extern BOOLEAN KdDebuggerNotPresent;
11661 extern BOOLEAN KdDebuggerEnabled;
11662 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11663 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11664
11665 #endif
11666
11667 #ifdef _VA_LIST_DEFINED
11668 #if (NTDDI_VERSION >= NTDDI_WINXP)
11669
11670 NTSYSAPI
11671 ULONG
11672 NTAPI
11673 vDbgPrintEx(
11674 IN ULONG ComponentId,
11675 IN ULONG Level,
11676 IN PCCH Format,
11677 IN va_list ap);
11678
11679 NTSYSAPI
11680 ULONG
11681 NTAPI
11682 vDbgPrintExWithPrefix(
11683 IN PCCH Prefix,
11684 IN ULONG ComponentId,
11685 IN ULONG Level,
11686 IN PCCH Format,
11687 IN va_list ap);
11688
11689 #endif
11690 #endif // _VA_LIST_DEFINED
11691
11692 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11693
11694 NTKERNELAPI
11695 NTSTATUS
11696 NTAPI
11697 KdDisableDebugger(VOID);
11698
11699 NTKERNELAPI
11700 NTSTATUS
11701 NTAPI
11702 KdEnableDebugger(VOID);
11703
11704 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
11705 #define DbgBreakPoint __debugbreak
11706 #else
11707 VOID
11708 NTAPI
11709 DbgBreakPoint(VOID);
11710 #endif
11711
11712 NTSYSAPI
11713 VOID
11714 NTAPI
11715 DbgBreakPointWithStatus(
11716 IN ULONG Status);
11717
11718 NTSYSAPI
11719 ULONG
11720 _cdecl
11721 DbgPrintReturnControlC(
11722 IN PCCH Format,
11723 IN ...);
11724
11725 #endif
11726
11727 #if (NTDDI_VERSION >= NTDDI_WINXP)
11728
11729 NTSYSAPI
11730 ULONG
11731 _cdecl
11732 DbgPrintEx(
11733 IN ULONG ComponentId,
11734 IN ULONG Level,
11735 IN PCSTR Format,
11736 IN ...);
11737
11738 NTSYSAPI
11739 NTSTATUS
11740 NTAPI
11741 DbgQueryDebugFilterState(
11742 IN ULONG ComponentId,
11743 IN ULONG Level);
11744
11745 NTSYSAPI
11746 NTSTATUS
11747 NTAPI
11748 DbgSetDebugFilterState(
11749 IN ULONG ComponentId,
11750 IN ULONG Level,
11751 IN BOOLEAN State);
11752
11753 #endif
11754
11755 #if (NTDDI_VERSION >= NTDDI_WS03)
11756 NTKERNELAPI
11757 BOOLEAN
11758 NTAPI
11759 KdRefreshDebuggerNotPresent(VOID);
11760 #endif
11761
11762 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11763 NTKERNELAPI
11764 NTSTATUS
11765 NTAPI
11766 KdChangeOption(
11767 IN KD_OPTION Option,
11768 IN ULONG InBufferBytes OPTIONAL,
11769 IN PVOID InBuffer,
11770 IN ULONG OutBufferBytes OPTIONAL,
11771 OUT PVOID OutBuffer,
11772 OUT PULONG OutBufferNeeded OPTIONAL);
11773 #endif
11774
11775 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11776
11777 FORCEINLINE
11778 PVOID
11779 NTAPI
11780 HalAllocateCommonBuffer(
11781 IN PDMA_ADAPTER DmaAdapter,
11782 IN ULONG Length,
11783 OUT PPHYSICAL_ADDRESS LogicalAddress,
11784 IN BOOLEAN CacheEnabled)
11785 {
11786 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
11787 PVOID commonBuffer;
11788
11789 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
11790 ASSERT( allocateCommonBuffer != NULL );
11791 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
11792 return commonBuffer;
11793 }
11794
11795 FORCEINLINE
11796 VOID
11797 NTAPI
11798 HalFreeCommonBuffer(
11799 IN PDMA_ADAPTER DmaAdapter,
11800 IN ULONG Length,
11801 IN PHYSICAL_ADDRESS LogicalAddress,
11802 IN PVOID VirtualAddress,
11803 IN BOOLEAN CacheEnabled)
11804 {
11805 PFREE_COMMON_BUFFER freeCommonBuffer;
11806
11807 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
11808 ASSERT( freeCommonBuffer != NULL );
11809 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
11810 }
11811
11812 FORCEINLINE
11813 ULONG
11814 NTAPI
11815 HalReadDmaCounter(
11816 IN PDMA_ADAPTER DmaAdapter)
11817 {
11818 PREAD_DMA_COUNTER readDmaCounter;
11819 ULONG counter;
11820
11821 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
11822 ASSERT( readDmaCounter != NULL );
11823 counter = readDmaCounter( DmaAdapter );
11824 return counter;
11825 }
11826
11827 #endif
11828
11829
11830 #ifndef _NTTMAPI_
11831 #define _NTTMAPI_
11832
11833 #include <ktmtypes.h>
11834
11835 typedef enum _KTMOBJECT_TYPE {
11836 KTMOBJECT_TRANSACTION,
11837 KTMOBJECT_TRANSACTION_MANAGER,
11838 KTMOBJECT_RESOURCE_MANAGER,
11839 KTMOBJECT_ENLISTMENT,
11840 KTMOBJECT_INVALID
11841 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
11842
11843 typedef struct _KTMOBJECT_CURSOR {
11844 GUID LastQuery;
11845 ULONG ObjectIdCount;
11846 GUID ObjectIds[1];
11847 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
11848
11849 typedef enum _TRANSACTION_INFORMATION_CLASS {
11850 TransactionBasicInformation,
11851 TransactionPropertiesInformation,
11852 TransactionEnlistmentInformation,
11853 TransactionSuperiorEnlistmentInformation
11854 } TRANSACTION_INFORMATION_CLASS;
11855
11856 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
11857 TransactionManagerBasicInformation,
11858 TransactionManagerLogInformation,
11859 TransactionManagerLogPathInformation,
11860 TransactionManagerRecoveryInformation = 4
11861 } TRANSACTIONMANAGER_INFORMATION_CLASS;
11862
11863 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
11864 ResourceManagerBasicInformation,
11865 ResourceManagerCompletionInformation,
11866 } RESOURCEMANAGER_INFORMATION_CLASS;
11867
11868 typedef enum _ENLISTMENT_INFORMATION_CLASS {
11869 EnlistmentBasicInformation,
11870 EnlistmentRecoveryInformation,
11871 EnlistmentCrmInformation
11872 } ENLISTMENT_INFORMATION_CLASS;
11873
11874 #endif /* !_NTTMAPI_ */
11875 /******************************************************************************
11876 * ZwXxx Functions *
11877 ******************************************************************************/
11878
11879
11880 /* Constants */
11881 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
11882 #define ZwCurrentProcess() NtCurrentProcess()
11883 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
11884 #define ZwCurrentThread() NtCurrentThread()
11885
11886
11887
11888 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11889
11890
11891
11892 NTSYSAPI
11893 NTSTATUS
11894 NTAPI
11895 ZwClose(
11896 IN HANDLE Handle);
11897
11898 NTSYSAPI
11899 NTSTATUS
11900 NTAPI
11901 ZwCreateDirectoryObject(
11902 OUT PHANDLE DirectoryHandle,
11903 IN ACCESS_MASK DesiredAccess,
11904 IN POBJECT_ATTRIBUTES ObjectAttributes);
11905
11906 NTSYSAPI
11907 NTSTATUS
11908 NTAPI
11909 ZwCreateFile(
11910 OUT PHANDLE FileHandle,
11911 IN ACCESS_MASK DesiredAccess,
11912 IN POBJECT_ATTRIBUTES ObjectAttributes,
11913 OUT PIO_STATUS_BLOCK IoStatusBlock,
11914 IN PLARGE_INTEGER AllocationSize OPTIONAL,
11915 IN ULONG FileAttributes,
11916 IN ULONG ShareAccess,
11917 IN ULONG CreateDisposition,
11918 IN ULONG CreateOptions,
11919 IN PVOID EaBuffer OPTIONAL,
11920 IN ULONG EaLength);
11921
11922 NTSYSAPI
11923 NTSTATUS
11924 NTAPI
11925 ZwCreateKey(
11926 OUT PHANDLE KeyHandle,
11927 IN ACCESS_MASK DesiredAccess,
11928 IN POBJECT_ATTRIBUTES ObjectAttributes,
11929 IN ULONG TitleIndex,
11930 IN PUNICODE_STRING Class OPTIONAL,
11931 IN ULONG CreateOptions,
11932 OUT PULONG Disposition OPTIONAL);
11933
11934 NTSYSAPI
11935 NTSTATUS
11936 NTAPI
11937 ZwCreateSection(
11938 OUT PHANDLE SectionHandle,
11939 IN ACCESS_MASK DesiredAccess,
11940 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
11941 IN PLARGE_INTEGER MaximumSize OPTIONAL,
11942 IN ULONG SectionPageProtection,
11943 IN ULONG AllocationAttributes,
11944 IN HANDLE FileHandle OPTIONAL);
11945
11946 NTSYSAPI
11947 NTSTATUS
11948 NTAPI
11949 ZwDeleteKey(
11950 IN HANDLE KeyHandle);
11951
11952 NTSYSAPI
11953 NTSTATUS
11954 NTAPI
11955 ZwDeleteValueKey(
11956 IN HANDLE KeyHandle,
11957 IN PUNICODE_STRING ValueName);
11958
11959 NTSYSAPI
11960 NTSTATUS
11961 NTAPI
11962 ZwEnumerateKey(
11963 IN HANDLE KeyHandle,
11964 IN ULONG Index,
11965 IN KEY_INFORMATION_CLASS KeyInformationClass,
11966 OUT PVOID KeyInformation OPTIONAL,
11967 IN ULONG Length,
11968 OUT PULONG ResultLength);
11969
11970 NTSYSAPI
11971 NTSTATUS
11972 NTAPI
11973 ZwEnumerateValueKey(
11974 IN HANDLE KeyHandle,
11975 IN ULONG Index,
11976 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
11977 OUT PVOID KeyValueInformation OPTIONAL,
11978 IN ULONG Length,
11979 OUT PULONG ResultLength);
11980
11981 NTSYSAPI
11982 NTSTATUS
11983 NTAPI
11984 ZwFlushKey(
11985 IN HANDLE KeyHandle);
11986
11987 NTSYSAPI
11988 NTSTATUS
11989 NTAPI
11990 ZwLoadDriver(
11991 IN PUNICODE_STRING DriverServiceName);
11992
11993 NTSYSAPI
11994 NTSTATUS
11995 NTAPI
11996 ZwMakeTemporaryObject(
11997 IN HANDLE Handle);
11998
11999 NTSYSAPI
12000 NTSTATUS
12001 NTAPI
12002 ZwMapViewOfSection(
12003 IN HANDLE SectionHandle,
12004 IN HANDLE ProcessHandle,
12005 IN OUT PVOID *BaseAddress,
12006 IN ULONG_PTR ZeroBits,
12007 IN SIZE_T CommitSize,
12008 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
12009 IN OUT PSIZE_T ViewSize,
12010 IN SECTION_INHERIT InheritDisposition,
12011 IN ULONG AllocationType,
12012 IN ULONG Protect);
12013
12014 NTSYSAPI
12015 NTSTATUS
12016 NTAPI
12017 ZwOpenFile(
12018 OUT PHANDLE FileHandle,
12019 IN ACCESS_MASK DesiredAccess,
12020 IN POBJECT_ATTRIBUTES ObjectAttributes,
12021 OUT PIO_STATUS_BLOCK IoStatusBlock,
12022 IN ULONG ShareAccess,
12023 IN ULONG OpenOptions);
12024
12025 NTSYSAPI
12026 NTSTATUS
12027 NTAPI
12028 ZwOpenKey(
12029 OUT PHANDLE KeyHandle,
12030 IN ACCESS_MASK DesiredAccess,
12031 IN POBJECT_ATTRIBUTES ObjectAttributes);
12032
12033 NTSYSAPI
12034 NTSTATUS
12035 NTAPI
12036 ZwOpenSection(
12037 OUT PHANDLE SectionHandle,
12038 IN ACCESS_MASK DesiredAccess,
12039 IN POBJECT_ATTRIBUTES ObjectAttributes);
12040
12041 NTSYSAPI
12042 NTSTATUS
12043 NTAPI
12044 ZwOpenSymbolicLinkObject(
12045 OUT PHANDLE LinkHandle,
12046 IN ACCESS_MASK DesiredAccess,
12047 IN POBJECT_ATTRIBUTES ObjectAttributes);
12048
12049 NTSYSAPI
12050 NTSTATUS
12051 NTAPI
12052 ZwQueryInformationFile(
12053 IN HANDLE FileHandle,
12054 OUT PIO_STATUS_BLOCK IoStatusBlock,
12055 OUT PVOID FileInformation,
12056 IN ULONG Length,
12057 IN FILE_INFORMATION_CLASS FileInformationClass);
12058
12059 NTSYSAPI
12060 NTSTATUS
12061 NTAPI
12062 ZwQueryKey(
12063 IN HANDLE KeyHandle,
12064 IN KEY_INFORMATION_CLASS KeyInformationClass,
12065 OUT PVOID KeyInformation OPTIONAL,
12066 IN ULONG Length,
12067 OUT PULONG ResultLength);
12068
12069 NTSYSAPI
12070 NTSTATUS
12071 NTAPI
12072 ZwQuerySymbolicLinkObject(
12073 IN HANDLE LinkHandle,
12074 IN OUT PUNICODE_STRING LinkTarget,
12075 OUT PULONG ReturnedLength OPTIONAL);
12076
12077 NTSYSAPI
12078 NTSTATUS
12079 NTAPI
12080 ZwQueryValueKey(
12081 IN HANDLE KeyHandle,
12082 IN PUNICODE_STRING ValueName,
12083 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
12084 OUT PVOID KeyValueInformation OPTIONAL,
12085 IN ULONG Length,
12086 OUT PULONG ResultLength);
12087
12088 NTSYSAPI
12089 NTSTATUS
12090 NTAPI
12091 ZwReadFile(
12092 IN HANDLE FileHandle,
12093 IN HANDLE Event OPTIONAL,
12094 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
12095 IN PVOID ApcContext OPTIONAL,
12096 OUT PIO_STATUS_BLOCK IoStatusBlock,
12097 OUT PVOID Buffer,
12098 IN ULONG Length,
12099 IN PLARGE_INTEGER ByteOffset OPTIONAL,
12100 IN PULONG Key OPTIONAL);
12101
12102 NTSYSAPI
12103 NTSTATUS
12104 NTAPI
12105 ZwSetInformationFile(
12106 IN HANDLE FileHandle,
12107 OUT PIO_STATUS_BLOCK IoStatusBlock,
12108 IN PVOID FileInformation,
12109 IN ULONG Length,
12110 IN FILE_INFORMATION_CLASS FileInformationClass);
12111
12112 NTSYSAPI
12113 NTSTATUS
12114 NTAPI
12115 ZwSetValueKey(
12116 IN HANDLE KeyHandle,
12117 IN PUNICODE_STRING ValueName,
12118 IN ULONG TitleIndex OPTIONAL,
12119 IN ULONG Type,
12120 IN PVOID Data OPTIONAL,
12121 IN ULONG DataSize);
12122
12123 NTSYSAPI
12124 NTSTATUS
12125 NTAPI
12126 ZwUnloadDriver(
12127 IN PUNICODE_STRING DriverServiceName);
12128
12129 NTSYSAPI
12130 NTSTATUS
12131 NTAPI
12132 ZwUnmapViewOfSection(
12133 IN HANDLE ProcessHandle,
12134 IN PVOID BaseAddress OPTIONAL);
12135
12136 NTSYSAPI
12137 NTSTATUS
12138 NTAPI
12139 ZwWriteFile(
12140 IN HANDLE FileHandle,
12141 IN HANDLE Event OPTIONAL,
12142 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
12143 IN PVOID ApcContext OPTIONAL,
12144 OUT PIO_STATUS_BLOCK IoStatusBlock,
12145 IN PVOID Buffer,
12146 IN ULONG Length,
12147 IN PLARGE_INTEGER ByteOffset OPTIONAL,
12148 IN PULONG Key OPTIONAL);
12149
12150 NTSYSAPI
12151 NTSTATUS
12152 NTAPI
12153 ZwQueryFullAttributesFile(
12154 IN POBJECT_ATTRIBUTES ObjectAttributes,
12155 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
12156
12157
12158 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12159
12160
12161 #if (NTDDI_VERSION >= NTDDI_WS03)
12162 NTSYSCALLAPI
12163 NTSTATUS
12164 NTAPI
12165 ZwOpenEvent(
12166 OUT PHANDLE EventHandle,
12167 IN ACCESS_MASK DesiredAccess,
12168 IN POBJECT_ATTRIBUTES ObjectAttributes);
12169 #endif
12170
12171 #if (NTDDI_VERSION >= NTDDI_VISTA)
12172
12173 NTSYSAPI
12174 NTSTATUS
12175 ZwCreateKeyTransacted(
12176 OUT PHANDLE KeyHandle,
12177 IN ACCESS_MASK DesiredAccess,
12178 IN POBJECT_ATTRIBUTES ObjectAttributes,
12179 IN ULONG TitleIndex,
12180 IN PUNICODE_STRING Class OPTIONAL,
12181 IN ULONG CreateOptions,
12182 IN HANDLE TransactionHandle,
12183 OUT PULONG Disposition OPTIONAL);
12184
12185 NTSYSAPI
12186 NTSTATUS
12187 NTAPI
12188 ZwOpenKeyTransacted(
12189 OUT PHANDLE KeyHandle,
12190 IN ACCESS_MASK DesiredAccess,
12191 IN POBJECT_ATTRIBUTES ObjectAttributes,
12192 IN HANDLE TransactionHandle);
12193
12194 NTSYSCALLAPI
12195 NTSTATUS
12196 NTAPI
12197 ZwCreateTransactionManager(
12198 OUT PHANDLE TmHandle,
12199 IN ACCESS_MASK DesiredAccess,
12200 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12201 IN PUNICODE_STRING LogFileName OPTIONAL,
12202 IN ULONG CreateOptions OPTIONAL,
12203 IN ULONG CommitStrength OPTIONAL);
12204
12205 NTSYSCALLAPI
12206 NTSTATUS
12207 NTAPI
12208 ZwOpenTransactionManager(
12209 OUT PHANDLE TmHandle,
12210 IN ACCESS_MASK DesiredAccess,
12211 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12212 IN PUNICODE_STRING LogFileName OPTIONAL,
12213 IN LPGUID TmIdentity OPTIONAL,
12214 IN ULONG OpenOptions OPTIONAL);
12215
12216 NTSYSCALLAPI
12217 NTSTATUS
12218 NTAPI
12219 ZwRollforwardTransactionManager(
12220 IN HANDLE TransactionManagerHandle,
12221 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12222
12223 NTSYSCALLAPI
12224 NTSTATUS
12225 NTAPI
12226 ZwRecoverTransactionManager(
12227 IN HANDLE TransactionManagerHandle);
12228
12229 NTSYSCALLAPI
12230 NTSTATUS
12231 NTAPI
12232 ZwQueryInformationTransactionManager(
12233 IN HANDLE TransactionManagerHandle,
12234 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
12235 OUT PVOID TransactionManagerInformation,
12236 IN ULONG TransactionManagerInformationLength,
12237 OUT PULONG ReturnLength OPTIONAL);
12238
12239 NTSYSCALLAPI
12240 NTSTATUS
12241 NTAPI
12242 ZwSetInformationTransactionManager(
12243 IN HANDLE TmHandle,
12244 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
12245 IN PVOID TransactionManagerInformation,
12246 IN ULONG TransactionManagerInformationLength);
12247
12248 NTSYSCALLAPI
12249 NTSTATUS
12250 NTAPI
12251 ZwEnumerateTransactionObject(
12252 IN HANDLE RootObjectHandle OPTIONAL,
12253 IN KTMOBJECT_TYPE QueryType,
12254 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
12255 IN ULONG ObjectCursorLength,
12256 OUT PULONG ReturnLength);
12257
12258 NTSYSCALLAPI
12259 NTSTATUS
12260 NTAPI
12261 ZwCreateTransaction(
12262 OUT PHANDLE TransactionHandle,
12263 IN ACCESS_MASK DesiredAccess,
12264 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12265 IN LPGUID Uow OPTIONAL,
12266 IN HANDLE TmHandle OPTIONAL,
12267 IN ULONG CreateOptions OPTIONAL,
12268 IN ULONG IsolationLevel OPTIONAL,
12269 IN ULONG IsolationFlags OPTIONAL,
12270 IN PLARGE_INTEGER Timeout OPTIONAL,
12271 IN PUNICODE_STRING Description OPTIONAL);
12272
12273 NTSYSCALLAPI
12274 NTSTATUS
12275 NTAPI
12276 ZwOpenTransaction(
12277 OUT PHANDLE TransactionHandle,
12278 IN ACCESS_MASK DesiredAccess,
12279 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12280 IN LPGUID Uow,
12281 IN HANDLE TmHandle OPTIONAL);
12282
12283 NTSYSCALLAPI
12284 NTSTATUS
12285 NTAPI
12286 ZwQueryInformationTransaction(
12287 IN HANDLE TransactionHandle,
12288 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
12289 OUT PVOID TransactionInformation,
12290 IN ULONG TransactionInformationLength,
12291 OUT PULONG ReturnLength OPTIONAL);
12292
12293 NTSYSCALLAPI
12294 NTSTATUS
12295 NTAPI
12296 ZwSetInformationTransaction(
12297 IN HANDLE TransactionHandle,
12298 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
12299 IN PVOID TransactionInformation,
12300 IN ULONG TransactionInformationLength);
12301
12302 NTSYSCALLAPI
12303 NTSTATUS
12304 NTAPI
12305 ZwCommitTransaction(
12306 IN HANDLE TransactionHandle,
12307 IN BOOLEAN Wait);
12308
12309 NTSYSCALLAPI
12310 NTSTATUS
12311 NTAPI
12312 ZwRollbackTransaction(
12313 IN HANDLE TransactionHandle,
12314 IN BOOLEAN Wait);
12315
12316 NTSYSCALLAPI
12317 NTSTATUS
12318 NTAPI
12319 ZwCreateResourceManager(
12320 OUT PHANDLE ResourceManagerHandle,
12321 IN ACCESS_MASK DesiredAccess,
12322 IN HANDLE TmHandle,
12323 IN LPGUID ResourceManagerGuid OPTIONAL,
12324 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12325 IN ULONG CreateOptions OPTIONAL,
12326 IN PUNICODE_STRING Description OPTIONAL);
12327
12328 NTSYSCALLAPI
12329 NTSTATUS
12330 NTAPI
12331 ZwOpenResourceManager(
12332 OUT PHANDLE ResourceManagerHandle,
12333 IN ACCESS_MASK DesiredAccess,
12334 IN HANDLE TmHandle,
12335 IN LPGUID ResourceManagerGuid,
12336 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
12337
12338 NTSYSCALLAPI
12339 NTSTATUS
12340 NTAPI
12341 ZwRecoverResourceManager(
12342 IN HANDLE ResourceManagerHandle);
12343
12344 NTSYSCALLAPI
12345 NTSTATUS
12346 NTAPI
12347 ZwGetNotificationResourceManager(
12348 IN HANDLE ResourceManagerHandle,
12349 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
12350 IN ULONG NotificationLength,
12351 IN PLARGE_INTEGER Timeout,
12352 IN PULONG ReturnLength OPTIONAL,
12353 IN ULONG Asynchronous,
12354 IN ULONG_PTR AsynchronousContext OPTIONAL);
12355
12356 NTSYSCALLAPI
12357 NTSTATUS
12358 NTAPI
12359 ZwQueryInformationResourceManager(
12360 IN HANDLE ResourceManagerHandle,
12361 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
12362 OUT PVOID ResourceManagerInformation,
12363 IN ULONG ResourceManagerInformationLength,
12364 IN PULONG ReturnLength OPTIONAL);
12365
12366 NTSYSCALLAPI
12367 NTSTATUS
12368 NTAPI
12369 ZwSetInformationResourceManager(
12370 IN HANDLE ResourceManagerHandle,
12371 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
12372 IN PVOID ResourceManagerInformation,
12373 IN ULONG ResourceManagerInformationLength);
12374
12375 NTSYSCALLAPI
12376 NTSTATUS
12377 NTAPI
12378 ZwCreateEnlistment(
12379 OUT PHANDLE EnlistmentHandle,
12380 IN ACCESS_MASK DesiredAccess,
12381 IN HANDLE ResourceManagerHandle,
12382 IN HANDLE TransactionHandle,
12383 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12384 IN ULONG CreateOptions OPTIONAL,
12385 IN NOTIFICATION_MASK NotificationMask,
12386 IN PVOID EnlistmentKey OPTIONAL);
12387
12388 NTSYSCALLAPI
12389 NTSTATUS
12390 NTAPI
12391 ZwOpenEnlistment(
12392 OUT PHANDLE EnlistmentHandle,
12393 IN ACCESS_MASK DesiredAccess,
12394 IN HANDLE RmHandle,
12395 IN LPGUID EnlistmentGuid,
12396 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
12397
12398 NTSYSCALLAPI
12399 NTSTATUS
12400 NTAPI
12401 ZwQueryInformationEnlistment(
12402 IN HANDLE EnlistmentHandle,
12403 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
12404 OUT PVOID EnlistmentInformation,
12405 IN ULONG EnlistmentInformationLength,
12406 IN PULONG ReturnLength OPTIONAL);
12407
12408 NTSYSCALLAPI
12409 NTSTATUS
12410 NTAPI
12411 ZwSetInformationEnlistment(
12412 IN HANDLE EnlistmentHandle,
12413 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
12414 IN PVOID EnlistmentInformation,
12415 IN ULONG EnlistmentInformationLength);
12416
12417 NTSYSCALLAPI
12418 NTSTATUS
12419 NTAPI
12420 ZwRecoverEnlistment(
12421 IN HANDLE EnlistmentHandle,
12422 IN PVOID EnlistmentKey OPTIONAL);
12423
12424 NTSYSCALLAPI
12425 NTSTATUS
12426 NTAPI
12427 ZwPrePrepareEnlistment(
12428 IN HANDLE EnlistmentHandle,
12429 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12430
12431 NTSYSCALLAPI
12432 NTSTATUS
12433 NTAPI
12434 ZwPrepareEnlistment(
12435 IN HANDLE EnlistmentHandle,
12436 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12437
12438 NTSYSCALLAPI
12439 NTSTATUS
12440 NTAPI
12441 ZwCommitEnlistment(
12442 IN HANDLE EnlistmentHandle,
12443 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12444
12445 NTSYSCALLAPI
12446 NTSTATUS
12447 NTAPI
12448 ZwRollbackEnlistment(
12449 IN HANDLE EnlistmentHandle,
12450 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12451
12452 NTSYSCALLAPI
12453 NTSTATUS
12454 NTAPI
12455 ZwPrePrepareComplete(
12456 IN HANDLE EnlistmentHandle,
12457 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12458
12459 NTSYSCALLAPI
12460 NTSTATUS
12461 NTAPI
12462 ZwPrepareComplete(
12463 IN HANDLE EnlistmentHandle,
12464 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12465
12466 NTSYSCALLAPI
12467 NTSTATUS
12468 NTAPI
12469 ZwCommitComplete(
12470 IN HANDLE EnlistmentHandle,
12471 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12472
12473 NTSYSCALLAPI
12474 NTSTATUS
12475 NTAPI
12476 ZwReadOnlyEnlistment(
12477 IN HANDLE EnlistmentHandle,
12478 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12479
12480 NTSYSCALLAPI
12481 NTSTATUS
12482 NTAPI
12483 ZwRollbackComplete(
12484 IN HANDLE EnlistmentHandle,
12485 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12486
12487 NTSYSCALLAPI
12488 NTSTATUS
12489 NTAPI
12490 ZwSinglePhaseReject(
12491 IN HANDLE EnlistmentHandle,
12492 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12493
12494
12495 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12496
12497
12498 #if (NTDDI_VERSION >= NTDDI_WIN7)
12499
12500
12501
12502 NTSYSAPI
12503 NTSTATUS
12504 NTAPI
12505 ZwOpenKeyEx(
12506 OUT PHANDLE KeyHandle,
12507 IN ACCESS_MASK DesiredAccess,
12508 IN POBJECT_ATTRIBUTES ObjectAttributes,
12509 IN ULONG OpenOptions);
12510
12511 NTSYSAPI
12512 NTSTATUS
12513 NTAPI
12514 ZwOpenKeyTransactedEx(
12515 OUT PHANDLE KeyHandle,
12516 IN ACCESS_MASK DesiredAccess,
12517 IN POBJECT_ATTRIBUTES ObjectAttributes,
12518 IN ULONG OpenOptions,
12519 IN HANDLE TransactionHandle);
12520
12521 NTSYSAPI
12522 NTSTATUS
12523 NTAPI
12524 ZwNotifyChangeMultipleKeys(
12525 IN HANDLE MasterKeyHandle,
12526 IN ULONG Count OPTIONAL,
12527 IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
12528 IN HANDLE Event OPTIONAL,
12529 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
12530 IN PVOID ApcContext OPTIONAL,
12531 OUT PIO_STATUS_BLOCK IoStatusBlock,
12532 IN ULONG CompletionFilter,
12533 IN BOOLEAN WatchTree,
12534 OUT PVOID Buffer OPTIONAL,
12535 IN ULONG BufferSize,
12536 IN BOOLEAN Asynchronous);
12537
12538 NTSYSAPI
12539 NTSTATUS
12540 NTAPI
12541 ZwQueryMultipleValueKey(
12542 IN HANDLE KeyHandle,
12543 IN OUT PKEY_VALUE_ENTRY ValueEntries,
12544 IN ULONG EntryCount,
12545 OUT PVOID ValueBuffer,
12546 IN OUT PULONG BufferLength,
12547 OUT PULONG RequiredBufferLength OPTIONAL);
12548
12549 NTSYSAPI
12550 NTSTATUS
12551 NTAPI
12552 ZwRenameKey(
12553 IN HANDLE KeyHandle,
12554 IN PUNICODE_STRING NewName);
12555
12556 NTSYSAPI
12557 NTSTATUS
12558 NTAPI
12559 ZwSetInformationKey(
12560 IN HANDLE KeyHandle,
12561 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
12562 IN PVOID KeySetInformation,
12563 IN ULONG KeySetInformationLength);
12564
12565 #endif
12566
12567 /******************************************************************************
12568 * Unsorted *
12569 ******************************************************************************/
12570
12571 /* GUID Comparison */
12572 #ifndef __IID_ALIGNED__
12573 #define __IID_ALIGNED__
12574 #ifdef __cplusplus
12575 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
12576 {
12577 return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
12578 (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
12579 }
12580 #else
12581 #define IsEqualGUIDAligned(guid1, guid2) \
12582 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
12583 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
12584 #endif /* __cplusplus */
12585 #endif /* !__IID_ALIGNED__ */
12586
12587 typedef enum {
12588 LT_DONT_CARE,
12589 LT_LOWEST_LATENCY
12590 } LATENCY_TIME;
12591
12592 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
12593
12594 #define MAXIMUM_FILENAME_LENGTH 256
12595
12596 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
12597
12598 #define OBJECT_TYPE_CREATE (0x0001)
12599 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
12600
12601 #define DIRECTORY_QUERY (0x0001)
12602 #define DIRECTORY_TRAVERSE (0x0002)
12603 #define DIRECTORY_CREATE_OBJECT (0x0004)
12604 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
12605 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
12606
12607 #define EVENT_QUERY_STATE (0x0001)
12608 #define EVENT_MODIFY_STATE (0x0002)
12609 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
12610
12611 #define SYMBOLIC_LINK_QUERY 0x0001
12612 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
12613
12614 #define DUPLICATE_CLOSE_SOURCE 0x00000001
12615 #define DUPLICATE_SAME_ACCESS 0x00000002
12616 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
12617
12618 /* Global debug flag */
12619 extern ULONG NtGlobalFlag;
12620
12621 /* Service Start Types */
12622 #define SERVICE_BOOT_START 0x00000000
12623 #define SERVICE_SYSTEM_START 0x00000001
12624 #define SERVICE_AUTO_START 0x00000002
12625 #define SERVICE_DEMAND_START 0x00000003
12626 #define SERVICE_DISABLED 0x00000004
12627
12628 #ifndef _TRACEHANDLE_DEFINED
12629 #define _TRACEHANDLE_DEFINED
12630 typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
12631 #endif
12632
12633
12634
12635 #ifdef __cplusplus
12636 }
12637 #endif
12638
12639 #endif /* !_WDMDDK_ */