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