add PIO_CSQ_INSERT_IRP_EX to wdm.h
[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 NTSTATUS
5195 (NTAPI IO_CSQ_INSERT_IRP_EX)(
5196 IN struct _IO_CSQ *Csq,
5197 IN PIRP Irp,
5198 IN PVOID InsertContext);
5199 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
5200
5201 typedef VOID
5202 (NTAPI *PIO_CSQ_REMOVE_IRP)(
5203 IN struct _IO_CSQ *Csq,
5204 IN PIRP Irp);
5205
5206 typedef PIRP
5207 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
5208 IN struct _IO_CSQ *Csq,
5209 IN PIRP Irp,
5210 IN PVOID PeekContext);
5211
5212 typedef VOID
5213 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
5214 IN struct _IO_CSQ *Csq,
5215 OUT PKIRQL Irql);
5216
5217 typedef VOID
5218 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
5219 IN struct _IO_CSQ *Csq,
5220 IN KIRQL Irql);
5221
5222 typedef VOID
5223 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
5224 IN struct _IO_CSQ *Csq,
5225 IN PIRP Irp);
5226
5227 typedef struct _IO_CSQ {
5228 ULONG Type;
5229 PIO_CSQ_INSERT_IRP CsqInsertIrp;
5230 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
5231 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
5232 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
5233 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
5234 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
5235 PVOID ReservePointer;
5236 } IO_CSQ, *PIO_CSQ;
5237
5238 typedef enum _BUS_QUERY_ID_TYPE {
5239 BusQueryDeviceID,
5240 BusQueryHardwareIDs,
5241 BusQueryCompatibleIDs,
5242 BusQueryInstanceID,
5243 BusQueryDeviceSerialNumber
5244 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
5245
5246 typedef enum _DEVICE_TEXT_TYPE {
5247 DeviceTextDescription,
5248 DeviceTextLocationInformation
5249 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
5250
5251 typedef enum _WORK_QUEUE_TYPE {
5252 CriticalWorkQueue,
5253 DelayedWorkQueue,
5254 HyperCriticalWorkQueue,
5255 MaximumWorkQueue
5256 } WORK_QUEUE_TYPE;
5257
5258 #if !defined(_AMD64_) && !defined(_IA64_)
5259 #include <pshpack4.h>
5260 #endif
5261 typedef struct _IO_STACK_LOCATION {
5262 UCHAR MajorFunction;
5263 UCHAR MinorFunction;
5264 UCHAR Flags;
5265 UCHAR Control;
5266 union {
5267 struct {
5268 PIO_SECURITY_CONTEXT SecurityContext;
5269 ULONG Options;
5270 USHORT POINTER_ALIGNMENT FileAttributes;
5271 USHORT ShareAccess;
5272 ULONG POINTER_ALIGNMENT EaLength;
5273 } Create;
5274 struct {
5275 ULONG Length;
5276 ULONG POINTER_ALIGNMENT Key;
5277 LARGE_INTEGER ByteOffset;
5278 } Read;
5279 struct {
5280 ULONG Length;
5281 ULONG POINTER_ALIGNMENT Key;
5282 LARGE_INTEGER ByteOffset;
5283 } Write;
5284 struct {
5285 ULONG Length;
5286 PUNICODE_STRING FileName;
5287 FILE_INFORMATION_CLASS FileInformationClass;
5288 ULONG FileIndex;
5289 } QueryDirectory;
5290 struct {
5291 ULONG Length;
5292 ULONG CompletionFilter;
5293 } NotifyDirectory;
5294 struct {
5295 ULONG Length;
5296 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
5297 } QueryFile;
5298 struct {
5299 ULONG Length;
5300 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
5301 PFILE_OBJECT FileObject;
5302 _ANONYMOUS_UNION union {
5303 _ANONYMOUS_STRUCT struct {
5304 BOOLEAN ReplaceIfExists;
5305 BOOLEAN AdvanceOnly;
5306 } DUMMYSTRUCTNAME;
5307 ULONG ClusterCount;
5308 HANDLE DeleteHandle;
5309 } DUMMYUNIONNAME;
5310 } SetFile;
5311 struct {
5312 ULONG Length;
5313 PVOID EaList;
5314 ULONG EaListLength;
5315 ULONG EaIndex;
5316 } QueryEa;
5317 struct {
5318 ULONG Length;
5319 } SetEa;
5320 struct {
5321 ULONG Length;
5322 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
5323 } QueryVolume;
5324 struct {
5325 ULONG Length;
5326 FS_INFORMATION_CLASS FsInformationClass;
5327 } SetVolume;
5328 struct {
5329 ULONG OutputBufferLength;
5330 ULONG InputBufferLength;
5331 ULONG FsControlCode;
5332 PVOID Type3InputBuffer;
5333 } FileSystemControl;
5334 struct {
5335 PLARGE_INTEGER Length;
5336 ULONG Key;
5337 LARGE_INTEGER ByteOffset;
5338 } LockControl;
5339 struct {
5340 ULONG OutputBufferLength;
5341 ULONG POINTER_ALIGNMENT InputBufferLength;
5342 ULONG POINTER_ALIGNMENT IoControlCode;
5343 PVOID Type3InputBuffer;
5344 } DeviceIoControl;
5345 struct {
5346 SECURITY_INFORMATION SecurityInformation;
5347 ULONG POINTER_ALIGNMENT Length;
5348 } QuerySecurity;
5349 struct {
5350 SECURITY_INFORMATION SecurityInformation;
5351 PSECURITY_DESCRIPTOR SecurityDescriptor;
5352 } SetSecurity;
5353 struct {
5354 PVPB Vpb;
5355 PDEVICE_OBJECT DeviceObject;
5356 } MountVolume;
5357 struct {
5358 PVPB Vpb;
5359 PDEVICE_OBJECT DeviceObject;
5360 } VerifyVolume;
5361 struct {
5362 struct _SCSI_REQUEST_BLOCK *Srb;
5363 } Scsi;
5364 struct {
5365 ULONG Length;
5366 PSID StartSid;
5367 struct _FILE_GET_QUOTA_INFORMATION *SidList;
5368 ULONG SidListLength;
5369 } QueryQuota;
5370 struct {
5371 ULONG Length;
5372 } SetQuota;
5373 struct {
5374 DEVICE_RELATION_TYPE Type;
5375 } QueryDeviceRelations;
5376 struct {
5377 CONST GUID *InterfaceType;
5378 USHORT Size;
5379 USHORT Version;
5380 PINTERFACE Interface;
5381 PVOID InterfaceSpecificData;
5382 } QueryInterface;
5383 struct {
5384 PDEVICE_CAPABILITIES Capabilities;
5385 } DeviceCapabilities;
5386 struct {
5387 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
5388 } FilterResourceRequirements;
5389 struct {
5390 ULONG WhichSpace;
5391 PVOID Buffer;
5392 ULONG Offset;
5393 ULONG POINTER_ALIGNMENT Length;
5394 } ReadWriteConfig;
5395 struct {
5396 BOOLEAN Lock;
5397 } SetLock;
5398 struct {
5399 BUS_QUERY_ID_TYPE IdType;
5400 } QueryId;
5401 struct {
5402 DEVICE_TEXT_TYPE DeviceTextType;
5403 LCID POINTER_ALIGNMENT LocaleId;
5404 } QueryDeviceText;
5405 struct {
5406 BOOLEAN InPath;
5407 BOOLEAN Reserved[3];
5408 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
5409 } UsageNotification;
5410 struct {
5411 SYSTEM_POWER_STATE PowerState;
5412 } WaitWake;
5413 struct {
5414 PPOWER_SEQUENCE PowerSequence;
5415 } PowerSequence;
5416 struct {
5417 ULONG SystemContext;
5418 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
5419 POWER_STATE POINTER_ALIGNMENT State;
5420 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
5421 } Power;
5422 struct {
5423 PCM_RESOURCE_LIST AllocatedResources;
5424 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
5425 } StartDevice;
5426 struct {
5427 ULONG_PTR ProviderId;
5428 PVOID DataPath;
5429 ULONG BufferSize;
5430 PVOID Buffer;
5431 } WMI;
5432 struct {
5433 PVOID Argument1;
5434 PVOID Argument2;
5435 PVOID Argument3;
5436 PVOID Argument4;
5437 } Others;
5438 } Parameters;
5439 PDEVICE_OBJECT DeviceObject;
5440 PFILE_OBJECT FileObject;
5441 PIO_COMPLETION_ROUTINE CompletionRoutine;
5442 PVOID Context;
5443 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
5444 #if !defined(_AMD64_) && !defined(_IA64_)
5445 #include <poppack.h>
5446 #endif
5447
5448 /* IO_STACK_LOCATION.Control */
5449
5450 #define SL_PENDING_RETURNED 0x01
5451 #define SL_ERROR_RETURNED 0x02
5452 #define SL_INVOKE_ON_CANCEL 0x20
5453 #define SL_INVOKE_ON_SUCCESS 0x40
5454 #define SL_INVOKE_ON_ERROR 0x80
5455
5456 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
5457
5458 #define PCI_WHICHSPACE_CONFIG 0x0
5459 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
5460
5461 #define METHOD_BUFFERED 0
5462 #define METHOD_IN_DIRECT 1
5463 #define METHOD_OUT_DIRECT 2
5464 #define METHOD_NEITHER 3
5465
5466 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
5467 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
5468
5469 #define FILE_SUPERSEDED 0x00000000
5470 #define FILE_OPENED 0x00000001
5471 #define FILE_CREATED 0x00000002
5472 #define FILE_OVERWRITTEN 0x00000003
5473 #define FILE_EXISTS 0x00000004
5474 #define FILE_DOES_NOT_EXIST 0x00000005
5475
5476 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
5477 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
5478
5479 /* also in winnt.h */
5480 #define FILE_LIST_DIRECTORY 0x00000001
5481 #define FILE_READ_DATA 0x00000001
5482 #define FILE_ADD_FILE 0x00000002
5483 #define FILE_WRITE_DATA 0x00000002
5484 #define FILE_ADD_SUBDIRECTORY 0x00000004
5485 #define FILE_APPEND_DATA 0x00000004
5486 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
5487 #define FILE_READ_EA 0x00000008
5488 #define FILE_WRITE_EA 0x00000010
5489 #define FILE_EXECUTE 0x00000020
5490 #define FILE_TRAVERSE 0x00000020
5491 #define FILE_DELETE_CHILD 0x00000040
5492 #define FILE_READ_ATTRIBUTES 0x00000080
5493 #define FILE_WRITE_ATTRIBUTES 0x00000100
5494
5495 #define FILE_SHARE_READ 0x00000001
5496 #define FILE_SHARE_WRITE 0x00000002
5497 #define FILE_SHARE_DELETE 0x00000004
5498 #define FILE_SHARE_VALID_FLAGS 0x00000007
5499
5500 #define FILE_ATTRIBUTE_READONLY 0x00000001
5501 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
5502 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
5503 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
5504 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
5505 #define FILE_ATTRIBUTE_DEVICE 0x00000040
5506 #define FILE_ATTRIBUTE_NORMAL 0x00000080
5507 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
5508 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
5509 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
5510 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
5511 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
5512 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
5513 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
5514 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
5515
5516 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
5517 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
5518
5519 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
5520 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
5521 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
5522 #define FILE_VALID_SET_FLAGS 0x00000036
5523
5524 #define FILE_SUPERSEDE 0x00000000
5525 #define FILE_OPEN 0x00000001
5526 #define FILE_CREATE 0x00000002
5527 #define FILE_OPEN_IF 0x00000003
5528 #define FILE_OVERWRITE 0x00000004
5529 #define FILE_OVERWRITE_IF 0x00000005
5530 #define FILE_MAXIMUM_DISPOSITION 0x00000005
5531
5532 #define FILE_DIRECTORY_FILE 0x00000001
5533 #define FILE_WRITE_THROUGH 0x00000002
5534 #define FILE_SEQUENTIAL_ONLY 0x00000004
5535 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
5536 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
5537 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
5538 #define FILE_NON_DIRECTORY_FILE 0x00000040
5539 #define FILE_CREATE_TREE_CONNECTION 0x00000080
5540 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
5541 #define FILE_NO_EA_KNOWLEDGE 0x00000200
5542 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
5543 #define FILE_RANDOM_ACCESS 0x00000800
5544 #define FILE_DELETE_ON_CLOSE 0x00001000
5545 #define FILE_OPEN_BY_FILE_ID 0x00002000
5546 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
5547 #define FILE_NO_COMPRESSION 0x00008000
5548 #if (NTDDI_VERSION >= NTDDI_WIN7)
5549 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
5550 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
5551 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5552 #define FILE_RESERVE_OPFILTER 0x00100000
5553 #define FILE_OPEN_REPARSE_POINT 0x00200000
5554 #define FILE_OPEN_NO_RECALL 0x00400000
5555 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
5556
5557 #define FILE_ANY_ACCESS 0x00000000
5558 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
5559 #define FILE_READ_ACCESS 0x00000001
5560 #define FILE_WRITE_ACCESS 0x00000002
5561
5562 #define FILE_ALL_ACCESS \
5563 (STANDARD_RIGHTS_REQUIRED | \
5564 SYNCHRONIZE | \
5565 0x1FF)
5566
5567 #define FILE_GENERIC_EXECUTE \
5568 (STANDARD_RIGHTS_EXECUTE | \
5569 FILE_READ_ATTRIBUTES | \
5570 FILE_EXECUTE | \
5571 SYNCHRONIZE)
5572
5573 #define FILE_GENERIC_READ \
5574 (STANDARD_RIGHTS_READ | \
5575 FILE_READ_DATA | \
5576 FILE_READ_ATTRIBUTES | \
5577 FILE_READ_EA | \
5578 SYNCHRONIZE)
5579
5580 #define FILE_GENERIC_WRITE \
5581 (STANDARD_RIGHTS_WRITE | \
5582 FILE_WRITE_DATA | \
5583 FILE_WRITE_ATTRIBUTES | \
5584 FILE_WRITE_EA | \
5585 FILE_APPEND_DATA | \
5586 SYNCHRONIZE)
5587
5588 /* end winnt.h */
5589
5590 /******************************************************************************
5591 * Object Manager Types *
5592 ******************************************************************************/
5593
5594 typedef struct _OBJECT_NAME_INFORMATION {
5595 UNICODE_STRING Name;
5596 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
5597
5598 /* Exported object types */
5599 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType;
5600 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
5601 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
5602 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
5603 extern POBJECT_TYPE NTSYSAPI PsThreadType;
5604 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
5605 extern POBJECT_TYPE NTSYSAPI PsProcessType;
5606
5607
5608 /******************************************************************************
5609 * Process Manager Types *
5610 ******************************************************************************/
5611
5612 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
5613 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
5614 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
5615 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
5616 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
5617
5618 /* Process Qoutas */
5619 typedef struct _QUOTA_LIMITS {
5620 SIZE_T PagedPoolLimit;
5621 SIZE_T NonPagedPoolLimit;
5622 SIZE_T MinimumWorkingSetSize;
5623 SIZE_T MaximumWorkingSetSize;
5624 SIZE_T PagefileLimit;
5625 LARGE_INTEGER TimeLimit;
5626 } QUOTA_LIMITS, *PQUOTA_LIMITS;
5627
5628 /* Thread Access Rights */
5629 #define THREAD_TERMINATE 0x0001
5630 #define THREAD_SUSPEND_RESUME 0x0002
5631 #define THREAD_ALERT 0x0004
5632 #define THREAD_GET_CONTEXT 0x0008
5633 #define THREAD_SET_CONTEXT 0x0010
5634 #define THREAD_SET_INFORMATION 0x0020
5635 #define THREAD_SET_LIMITED_INFORMATION 0x0400
5636 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
5637
5638 #define PROCESS_DUP_HANDLE (0x0040)
5639
5640 #if (NTDDI_VERSION >= NTDDI_VISTA)
5641 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
5642 #else
5643 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
5644 #endif
5645
5646 #if (NTDDI_VERSION >= NTDDI_VISTA)
5647 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
5648 #else
5649 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
5650 #endif
5651
5652 #define ES_SYSTEM_REQUIRED 0x00000001
5653 #define ES_DISPLAY_REQUIRED 0x00000002
5654 #define ES_USER_PRESENT 0x00000004
5655 #define ES_CONTINUOUS 0x80000000
5656
5657 #define LOW_PRIORITY 0
5658 #define LOW_REALTIME_PRIORITY 16
5659 #define HIGH_PRIORITY 31
5660 #define MAXIMUM_PRIORITY 32
5661
5662
5663 #ifdef _X86_
5664 /** Kernel definitions for x86 **/
5665
5666 /* Interrupt request levels */
5667 #define PASSIVE_LEVEL 0
5668 #define LOW_LEVEL 0
5669 #define APC_LEVEL 1
5670 #define DISPATCH_LEVEL 2
5671 #define CMCI_LEVEL 5
5672 #define PROFILE_LEVEL 27
5673 #define CLOCK1_LEVEL 28
5674 #define CLOCK2_LEVEL 28
5675 #define IPI_LEVEL 29
5676 #define POWER_LEVEL 30
5677 #define HIGH_LEVEL 31
5678 #define CLOCK_LEVEL CLOCK2_LEVEL
5679
5680 #define KIP0PCRADDRESS 0xffdff000
5681 #define KI_USER_SHARED_DATA 0xffdf0000
5682 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
5683
5684 #define PAGE_SIZE 0x1000
5685 #define PAGE_SHIFT 12L
5686 #define KeGetDcacheFillSize() 1L
5687
5688 #define EFLAG_SIGN 0x8000
5689 #define EFLAG_ZERO 0x4000
5690 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5691
5692 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5693 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5694 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5695
5696
5697 typedef struct _KFLOATING_SAVE {
5698 ULONG ControlWord;
5699 ULONG StatusWord;
5700 ULONG ErrorOffset;
5701 ULONG ErrorSelector;
5702 ULONG DataOffset;
5703 ULONG DataSelector;
5704 ULONG Cr0NpxState;
5705 ULONG Spare1;
5706 } KFLOATING_SAVE, *PKFLOATING_SAVE;
5707
5708 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
5709
5710 #define YieldProcessor _mm_pause
5711
5712 FORCEINLINE
5713 VOID
5714 KeMemoryBarrier(VOID)
5715 {
5716 volatile LONG Barrier;
5717 #if defined(__GNUC__)
5718 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
5719 #elif defined(_MSC_VER)
5720 __asm xchg [Barrier], eax
5721 #endif
5722 }
5723
5724 NTHALAPI
5725 KIRQL
5726 NTAPI
5727 KeGetCurrentIrql(VOID);
5728
5729 NTHALAPI
5730 VOID
5731 FASTCALL
5732 KfLowerIrql(
5733 IN KIRQL NewIrql);
5734 #define KeLowerIrql(a) KfLowerIrql(a)
5735
5736 NTHALAPI
5737 KIRQL
5738 FASTCALL
5739 KfRaiseIrql(
5740 IN KIRQL NewIrql);
5741 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
5742
5743 NTHALAPI
5744 KIRQL
5745 NTAPI
5746 KeRaiseIrqlToDpcLevel(VOID);
5747
5748 NTHALAPI
5749 KIRQL
5750 NTAPI
5751 KeRaiseIrqlToSynchLevel(VOID);
5752
5753 NTHALAPI
5754 KIRQL
5755 FASTCALL
5756 KfAcquireSpinLock(
5757 IN OUT PKSPIN_LOCK SpinLock);
5758 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5759
5760 NTHALAPI
5761 VOID
5762 FASTCALL
5763 KfReleaseSpinLock(
5764 IN OUT PKSPIN_LOCK SpinLock,
5765 IN KIRQL NewIrql);
5766 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5767
5768 NTKERNELAPI
5769 VOID
5770 FASTCALL
5771 KefAcquireSpinLockAtDpcLevel(
5772 IN OUT PKSPIN_LOCK SpinLock);
5773 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5774
5775 NTKERNELAPI
5776 VOID
5777 FASTCALL
5778 KefReleaseSpinLockFromDpcLevel(
5779 IN OUT PKSPIN_LOCK SpinLock);
5780 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5781
5782 NTSYSAPI
5783 PKTHREAD
5784 NTAPI
5785 KeGetCurrentThread(VOID);
5786
5787 NTKERNELAPI
5788 NTSTATUS
5789 NTAPI
5790 KeSaveFloatingPointState(
5791 OUT PKFLOATING_SAVE FloatSave);
5792
5793 NTKERNELAPI
5794 NTSTATUS
5795 NTAPI
5796 KeRestoreFloatingPointState(
5797 IN PKFLOATING_SAVE FloatSave);
5798
5799 /* VOID
5800 * KeFlushIoBuffers(
5801 * IN PMDL Mdl,
5802 * IN BOOLEAN ReadOperation,
5803 * IN BOOLEAN DmaOperation)
5804 */
5805 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
5806
5807 /* x86 and x64 performs a 0x2C interrupt */
5808 #define DbgRaiseAssertionFailure __int2c
5809
5810 FORCEINLINE
5811 VOID
5812 _KeQueryTickCount(
5813 OUT PLARGE_INTEGER CurrentCount)
5814 {
5815 for (;;) {
5816 CurrentCount->HighPart = KeTickCount.High1Time;
5817 CurrentCount->LowPart = KeTickCount.LowPart;
5818 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
5819 YieldProcessor();
5820 }
5821 }
5822 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
5823
5824 #endif /* _X86_ */
5825
5826
5827
5828
5829 FORCEINLINE
5830 VOID
5831 InitializeListHead(
5832 OUT PLIST_ENTRY ListHead)
5833 {
5834 ListHead->Flink = ListHead->Blink = ListHead;
5835 }
5836
5837 FORCEINLINE
5838 VOID
5839 InsertHeadList(
5840 IN OUT PLIST_ENTRY ListHead,
5841 IN OUT PLIST_ENTRY Entry)
5842 {
5843 PLIST_ENTRY OldFlink;
5844 OldFlink = ListHead->Flink;
5845 Entry->Flink = OldFlink;
5846 Entry->Blink = ListHead;
5847 OldFlink->Blink = Entry;
5848 ListHead->Flink = Entry;
5849 }
5850
5851 FORCEINLINE
5852 VOID
5853 InsertTailList(
5854 IN OUT PLIST_ENTRY ListHead,
5855 IN OUT PLIST_ENTRY Entry)
5856 {
5857 PLIST_ENTRY OldBlink;
5858 OldBlink = ListHead->Blink;
5859 Entry->Flink = ListHead;
5860 Entry->Blink = OldBlink;
5861 OldBlink->Flink = Entry;
5862 ListHead->Blink = Entry;
5863 }
5864
5865 BOOLEAN
5866 FORCEINLINE
5867 IsListEmpty(
5868 IN CONST LIST_ENTRY * ListHead)
5869 {
5870 return (BOOLEAN)(ListHead->Flink == ListHead);
5871 }
5872
5873 FORCEINLINE
5874 PSINGLE_LIST_ENTRY
5875 PopEntryList(
5876 IN OUT PSINGLE_LIST_ENTRY ListHead)
5877 {
5878 PSINGLE_LIST_ENTRY FirstEntry;
5879 FirstEntry = ListHead->Next;
5880 if (FirstEntry != NULL) {
5881 ListHead->Next = FirstEntry->Next;
5882 }
5883 return FirstEntry;
5884 }
5885
5886 FORCEINLINE
5887 VOID
5888 PushEntryList(
5889 IN OUT PSINGLE_LIST_ENTRY ListHead,
5890 IN OUT PSINGLE_LIST_ENTRY Entry)
5891 {
5892 Entry->Next = ListHead->Next;
5893 ListHead->Next = Entry;
5894 }
5895
5896 FORCEINLINE
5897 BOOLEAN
5898 RemoveEntryList(
5899 IN PLIST_ENTRY Entry)
5900 {
5901 PLIST_ENTRY OldFlink;
5902 PLIST_ENTRY OldBlink;
5903
5904 OldFlink = Entry->Flink;
5905 OldBlink = Entry->Blink;
5906 OldFlink->Blink = OldBlink;
5907 OldBlink->Flink = OldFlink;
5908 return (BOOLEAN)(OldFlink == OldBlink);
5909 }
5910
5911 FORCEINLINE
5912 PLIST_ENTRY
5913 RemoveHeadList(
5914 IN OUT PLIST_ENTRY ListHead)
5915 {
5916 PLIST_ENTRY Flink;
5917 PLIST_ENTRY Entry;
5918
5919 Entry = ListHead->Flink;
5920 Flink = Entry->Flink;
5921 ListHead->Flink = Flink;
5922 Flink->Blink = ListHead;
5923 return Entry;
5924 }
5925
5926 FORCEINLINE
5927 PLIST_ENTRY
5928 RemoveTailList(
5929 IN OUT PLIST_ENTRY ListHead)
5930 {
5931 PLIST_ENTRY Blink;
5932 PLIST_ENTRY Entry;
5933
5934 Entry = ListHead->Blink;
5935 Blink = Entry->Blink;
5936 ListHead->Blink = Blink;
5937 Blink->Flink = ListHead;
5938 return Entry;
5939 }
5940
5941 NTSYSAPI
5942 VOID
5943 NTAPI
5944 RtlAssert(
5945 IN PVOID FailedAssertion,
5946 IN PVOID FileName,
5947 IN ULONG LineNumber,
5948 IN PSTR Message);
5949
5950 /* VOID
5951 * RtlCopyMemory(
5952 * IN VOID UNALIGNED *Destination,
5953 * IN CONST VOID UNALIGNED *Source,
5954 * IN SIZE_T Length)
5955 */
5956 #define RtlCopyMemory(Destination, Source, Length) \
5957 memcpy(Destination, Source, Length)
5958
5959 #define RtlCopyBytes RtlCopyMemory
5960
5961 #if defined(_M_AMD64)
5962 NTSYSAPI
5963 VOID
5964 NTAPI
5965 RtlCopyMemoryNonTemporal(
5966 VOID UNALIGNED *Destination,
5967 CONST VOID UNALIGNED *Source,
5968 SIZE_T Length);
5969 #else
5970 #define RtlCopyMemoryNonTemporal RtlCopyMemory
5971 #endif
5972
5973 /* BOOLEAN
5974 * RtlEqualLuid(
5975 * IN PLUID Luid1,
5976 * IN PLUID Luid2)
5977 */
5978 #define RtlEqualLuid(Luid1, Luid2) \
5979 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
5980
5981 /* ULONG
5982 * RtlEqualMemory(
5983 * IN VOID UNALIGNED *Destination,
5984 * IN CONST VOID UNALIGNED *Source,
5985 * IN SIZE_T Length)
5986 */
5987 #define RtlEqualMemory(Destination, Source, Length) \
5988 (!memcmp(Destination, Source, Length))
5989
5990 /* VOID
5991 * RtlFillMemory(
5992 * IN VOID UNALIGNED *Destination,
5993 * IN SIZE_T Length,
5994 * IN UCHAR Fill)
5995 */
5996 #define RtlFillMemory(Destination, Length, Fill) \
5997 memset(Destination, Fill, Length)
5998
5999 #define RtlFillBytes RtlFillMemory
6000
6001 NTSYSAPI
6002 VOID
6003 NTAPI
6004 RtlFreeUnicodeString(
6005 IN OUT PUNICODE_STRING UnicodeString);
6006
6007 NTSYSAPI
6008 NTSTATUS
6009 NTAPI
6010 RtlGUIDFromString(
6011 IN PUNICODE_STRING GuidString,
6012 OUT GUID *Guid);
6013
6014 NTSYSAPI
6015 VOID
6016 NTAPI
6017 RtlInitUnicodeString(
6018 IN OUT PUNICODE_STRING DestinationString,
6019 IN PCWSTR SourceString OPTIONAL);
6020
6021 /* VOID
6022 * RtlMoveMemory(
6023 * IN VOID UNALIGNED *Destination,
6024 * IN CONST VOID UNALIGNED *Source,
6025 * IN SIZE_T Length)
6026 */
6027 #define RtlMoveMemory(Destination, Source, Length) \
6028 memmove(Destination, Source, Length)
6029
6030 NTSYSAPI
6031 NTSTATUS
6032 NTAPI
6033 RtlStringFromGUID(
6034 IN REFGUID Guid,
6035 OUT PUNICODE_STRING GuidString);
6036
6037 /* VOID
6038 * RtlZeroMemory(
6039 * IN VOID UNALIGNED *Destination,
6040 * IN SIZE_T Length)
6041 */
6042 #define RtlZeroMemory(Destination, Length) \
6043 memset(Destination, 0, Length)
6044
6045 #define RtlZeroBytes RtlZeroMemory
6046
6047 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6048
6049
6050
6051 NTSYSAPI
6052 BOOLEAN
6053 NTAPI
6054 RtlAreBitsClear(
6055 IN PRTL_BITMAP BitMapHeader,
6056 IN ULONG StartingIndex,
6057 IN ULONG Length);
6058
6059 NTSYSAPI
6060 BOOLEAN
6061 NTAPI
6062 RtlAreBitsSet(
6063 IN PRTL_BITMAP BitMapHeader,
6064 IN ULONG StartingIndex,
6065 IN ULONG Length);
6066
6067 NTSYSAPI
6068 NTSTATUS
6069 NTAPI
6070 RtlAnsiStringToUnicodeString(
6071 IN OUT PUNICODE_STRING DestinationString,
6072 IN PANSI_STRING SourceString,
6073 IN BOOLEAN AllocateDestinationString);
6074
6075 NTSYSAPI
6076 ULONG
6077 NTAPI
6078 RtlxAnsiStringToUnicodeSize(
6079 IN PCANSI_STRING AnsiString);
6080
6081 #define RtlAnsiStringToUnicodeSize(String) ( \
6082 NLS_MB_CODE_PAGE_TAG ? \
6083 RtlxAnsiStringToUnicodeSize(String) : \
6084 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
6085 )
6086
6087 NTSYSAPI
6088 NTSTATUS
6089 NTAPI
6090 RtlAppendUnicodeStringToString(
6091 IN OUT PUNICODE_STRING Destination,
6092 IN PCUNICODE_STRING Source);
6093
6094 NTSYSAPI
6095 NTSTATUS
6096 NTAPI
6097 RtlAppendUnicodeToString(
6098 IN OUT PUNICODE_STRING Destination,
6099 IN PCWSTR Source);
6100
6101 NTSYSAPI
6102 NTSTATUS
6103 NTAPI
6104 RtlCheckRegistryKey(
6105 IN ULONG RelativeTo,
6106 IN PWSTR Path);
6107
6108 NTSYSAPI
6109 VOID
6110 NTAPI
6111 RtlClearAllBits(
6112 IN PRTL_BITMAP BitMapHeader);
6113
6114 NTSYSAPI
6115 VOID
6116 NTAPI
6117 RtlClearBits(
6118 IN PRTL_BITMAP BitMapHeader,
6119 IN ULONG StartingIndex,
6120 IN ULONG NumberToClear);
6121
6122 NTSYSAPI
6123 SIZE_T
6124 NTAPI
6125 RtlCompareMemory(
6126 IN CONST VOID *Source1,
6127 IN CONST VOID *Source2,
6128 IN SIZE_T Length);
6129
6130 NTSYSAPI
6131 LONG
6132 NTAPI
6133 RtlCompareUnicodeString(
6134 IN PCUNICODE_STRING String1,
6135 IN PCUNICODE_STRING String2,
6136 IN BOOLEAN CaseInSensitive);
6137
6138 NTSYSAPI
6139 LONG
6140 NTAPI
6141 RtlCompareUnicodeStrings(
6142 IN PCWCH String1,
6143 IN SIZE_T String1Length,
6144 IN PCWCH String2,
6145 IN SIZE_T String2Length,
6146 IN BOOLEAN CaseInSensitive);
6147
6148 NTSYSAPI
6149 VOID
6150 NTAPI
6151 RtlCopyUnicodeString(
6152 IN OUT PUNICODE_STRING DestinationString,
6153 IN PCUNICODE_STRING SourceString OPTIONAL);
6154
6155 NTSYSAPI
6156 NTSTATUS
6157 NTAPI
6158 RtlCreateRegistryKey(
6159 IN ULONG RelativeTo,
6160 IN PWSTR Path);
6161
6162 NTSYSAPI
6163 NTSTATUS
6164 NTAPI
6165 RtlCreateSecurityDescriptor(
6166 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
6167 IN ULONG Revision);
6168
6169 NTSYSAPI
6170 NTSTATUS
6171 NTAPI
6172 RtlDeleteRegistryValue(
6173 IN ULONG RelativeTo,
6174 IN PCWSTR Path,
6175 IN PCWSTR ValueName);
6176
6177 NTSYSAPI
6178 BOOLEAN
6179 NTAPI
6180 RtlEqualUnicodeString(
6181 IN CONST UNICODE_STRING *String1,
6182 IN CONST UNICODE_STRING *String2,
6183 IN BOOLEAN CaseInSensitive);
6184
6185 #if !defined(_AMD64_) && !defined(_IA64_)
6186 NTSYSAPI
6187 LARGE_INTEGER
6188 NTAPI
6189 RtlExtendedIntegerMultiply(
6190 IN LARGE_INTEGER Multiplicand,
6191 IN LONG Multiplier);
6192
6193 NTSYSAPI
6194 LARGE_INTEGER
6195 NTAPI
6196 RtlExtendedLargeIntegerDivide(
6197 IN LARGE_INTEGER Dividend,
6198 IN ULONG Divisor,
6199 OUT PULONG Remainder OPTIONAL);
6200 #endif
6201
6202 #if defined(_X86_) || defined(_IA64_)
6203 NTSYSAPI
6204 LARGE_INTEGER
6205 NTAPI
6206 RtlExtendedMagicDivide(
6207 IN LARGE_INTEGER Dividend,
6208 IN LARGE_INTEGER MagicDivisor,
6209 IN CCHAR ShiftCount);
6210 #endif
6211
6212 NTSYSAPI
6213 VOID
6214 NTAPI
6215 RtlFreeAnsiString(
6216 IN PANSI_STRING AnsiString);
6217
6218 NTSYSAPI
6219 ULONG
6220 NTAPI
6221 RtlFindClearBits(
6222 IN PRTL_BITMAP BitMapHeader,
6223 IN ULONG NumberToFind,
6224 IN ULONG HintIndex);
6225
6226 NTSYSAPI
6227 ULONG
6228 NTAPI
6229 RtlFindClearBitsAndSet(
6230 IN PRTL_BITMAP BitMapHeader,
6231 IN ULONG NumberToFind,
6232 IN ULONG HintIndex);
6233
6234 NTSYSAPI
6235 ULONG
6236 NTAPI
6237 RtlFindFirstRunClear(
6238 IN PRTL_BITMAP BitMapHeader,
6239 OUT PULONG StartingIndex);
6240
6241 NTSYSAPI
6242 ULONG
6243 NTAPI
6244 RtlFindClearRuns(
6245 IN PRTL_BITMAP BitMapHeader,
6246 OUT PRTL_BITMAP_RUN RunArray,
6247 IN ULONG SizeOfRunArray,
6248 IN BOOLEAN LocateLongestRuns);
6249
6250 NTSYSAPI
6251 ULONG
6252 NTAPI
6253 RtlFindLastBackwardRunClear(
6254 IN PRTL_BITMAP BitMapHeader,
6255 IN ULONG FromIndex,
6256 OUT PULONG StartingRunIndex);
6257
6258 NTSYSAPI
6259 CCHAR
6260 NTAPI
6261 RtlFindLeastSignificantBit(
6262 IN ULONGLONG Set);
6263
6264 NTSYSAPI
6265 ULONG
6266 NTAPI
6267 RtlFindLongestRunClear(
6268 IN PRTL_BITMAP BitMapHeader,
6269 OUT PULONG StartingIndex);
6270
6271 NTSYSAPI
6272 CCHAR
6273 NTAPI
6274 RtlFindMostSignificantBit(
6275 IN ULONGLONG Set);
6276
6277 NTSYSAPI
6278 ULONG
6279 NTAPI
6280 RtlFindNextForwardRunClear(
6281 IN PRTL_BITMAP BitMapHeader,
6282 IN ULONG FromIndex,
6283 OUT PULONG StartingRunIndex);
6284
6285 NTSYSAPI
6286 ULONG
6287 NTAPI
6288 RtlFindSetBits(
6289 IN PRTL_BITMAP BitMapHeader,
6290 IN ULONG NumberToFind,
6291 IN ULONG HintIndex);
6292
6293 NTSYSAPI
6294 ULONG
6295 NTAPI
6296 RtlFindSetBitsAndClear(
6297 IN PRTL_BITMAP BitMapHeader,
6298 IN ULONG NumberToFind,
6299 IN ULONG HintIndex);
6300
6301 NTSYSAPI
6302 NTSTATUS
6303 NTAPI
6304 RtlHashUnicodeString(
6305 IN CONST UNICODE_STRING *String,
6306 IN BOOLEAN CaseInSensitive,
6307 IN ULONG HashAlgorithm,
6308 OUT PULONG HashValue);
6309
6310 NTSYSAPI
6311 VOID
6312 NTAPI
6313 RtlInitAnsiString(
6314 IN OUT PANSI_STRING DestinationString,
6315 IN PCSZ SourceString);
6316
6317 NTSYSAPI
6318 VOID
6319 NTAPI
6320 RtlInitializeBitMap(
6321 IN PRTL_BITMAP BitMapHeader,
6322 IN PULONG BitMapBuffer,
6323 IN ULONG SizeOfBitMap);
6324
6325 NTSYSAPI
6326 VOID
6327 NTAPI
6328 RtlInitString(
6329 IN OUT PSTRING DestinationString,
6330 IN PCSZ SourceString);
6331
6332 NTSYSAPI
6333 NTSTATUS
6334 NTAPI
6335 RtlIntegerToUnicodeString(
6336 IN ULONG Value,
6337 IN ULONG Base OPTIONAL,
6338 IN OUT PUNICODE_STRING String);
6339
6340 NTSYSAPI
6341 NTSTATUS
6342 NTAPI
6343 RtlInt64ToUnicodeString(
6344 IN ULONGLONG Value,
6345 IN ULONG Base OPTIONAL,
6346 IN OUT PUNICODE_STRING String);
6347
6348 #ifdef _WIN64
6349 #define RtlIntPtrToUnicodeString(Value, Base, String) \
6350 RtlInt64ToUnicodeString(Value, Base, String)
6351 #else
6352 #define RtlIntPtrToUnicodeString(Value, Base, String) \
6353 RtlIntegerToUnicodeString(Value, Base, String)
6354 #endif
6355
6356 /* BOOLEAN
6357 * RtlIsZeroLuid(
6358 * IN PLUID L1);
6359 */
6360 #define RtlIsZeroLuid(_L1) \
6361 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
6362
6363 NTSYSAPI
6364 ULONG
6365 NTAPI
6366 RtlLengthSecurityDescriptor(
6367 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6368
6369 NTSYSAPI
6370 ULONG
6371 NTAPI
6372 RtlNumberOfClearBits(
6373 IN PRTL_BITMAP BitMapHeader);
6374
6375 NTSYSAPI
6376 ULONG
6377 NTAPI
6378 RtlNumberOfSetBits(
6379 IN PRTL_BITMAP BitMapHeader);
6380
6381 NTSYSAPI
6382 NTSTATUS
6383 NTAPI
6384 RtlQueryRegistryValues(
6385 IN ULONG RelativeTo,
6386 IN PCWSTR Path,
6387 IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable,
6388 IN PVOID Context OPTIONAL,
6389 IN PVOID Environment OPTIONAL);
6390
6391 #define SHORT_SIZE (sizeof(USHORT))
6392 #define SHORT_MASK (SHORT_SIZE - 1)
6393 #define LONG_SIZE (sizeof(LONG))
6394 #define LONGLONG_SIZE (sizeof(LONGLONG))
6395 #define LONG_MASK (LONG_SIZE - 1)
6396 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
6397 #define LOWBYTE_MASK 0x00FF
6398
6399 /* VOID
6400 * RtlRetrieveUlong(
6401 * PULONG DestinationAddress,
6402 * PULONG SourceAddress);
6403 */
6404 #if defined(_AMD64_)
6405 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6406 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
6407 #else
6408 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6409 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6410 { \
6411 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6412 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6413 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
6414 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
6415 } \
6416 else \
6417 { \
6418 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
6419 }
6420 #endif
6421
6422 /* VOID
6423 * RtlRetrieveUshort(
6424 * PUSHORT DestinationAddress,
6425 * PUSHORT SourceAddress);
6426 */
6427 #if defined(_AMD64_)
6428 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6429 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
6430 #else
6431 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6432 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6433 { \
6434 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6435 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6436 } \
6437 else \
6438 { \
6439 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
6440 }
6441 #endif
6442
6443 NTSYSAPI
6444 VOID
6445 NTAPI
6446 RtlSetAllBits(
6447 IN PRTL_BITMAP BitMapHeader);
6448
6449 NTSYSAPI
6450 VOID
6451 NTAPI
6452 RtlSetBits(
6453 IN PRTL_BITMAP BitMapHeader,
6454 IN ULONG StartingIndex,
6455 IN ULONG NumberToSet);
6456
6457 NTSYSAPI
6458 NTSTATUS
6459 NTAPI
6460 RtlSetDaclSecurityDescriptor(
6461 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
6462 IN BOOLEAN DaclPresent,
6463 IN PACL Dacl OPTIONAL,
6464 IN BOOLEAN DaclDefaulted OPTIONAL);
6465
6466 #if defined(_AMD64_)
6467
6468 /* VOID
6469 * RtlStoreUlong(
6470 * IN PULONG Address,
6471 * IN ULONG Value);
6472 */
6473 #define RtlStoreUlong(Address,Value) \
6474 *(ULONG UNALIGNED *)(Address) = (Value)
6475
6476 /* VOID
6477 * RtlStoreUlonglong(
6478 * IN OUT PULONGLONG Address,
6479 * ULONGLONG Value);
6480 */
6481 #define RtlStoreUlonglong(Address,Value) \
6482 *(ULONGLONG UNALIGNED *)(Address) = (Value)
6483
6484 /* VOID
6485 * RtlStoreUshort(
6486 * IN PUSHORT Address,
6487 * IN USHORT Value);
6488 */
6489 #define RtlStoreUshort(Address,Value) \
6490 *(USHORT UNALIGNED *)(Address) = (Value)
6491
6492 /* VOID
6493 * RtlRetrieveUshort(
6494 * PUSHORT DestinationAddress,
6495 * PUSHORT SourceAddress);
6496 */
6497 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6498 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
6499
6500 /* VOID
6501 * RtlRetrieveUlong(
6502 * PULONG DestinationAddress,
6503 * PULONG SourceAddress);
6504 */
6505 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6506 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
6507
6508 #else
6509
6510 #define RtlStoreUlong(Address,Value) \
6511 if ((ULONG_PTR)(Address) & LONG_MASK) { \
6512 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
6513 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
6514 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
6515 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
6516 } \
6517 else { \
6518 *((PULONG)(Address)) = (ULONG) (Value); \
6519 }
6520 #endif
6521
6522 /* VOID
6523 * RtlStoreUlonglong(
6524 * IN OUT PULONGLONG Address,
6525 * ULONGLONG Value);
6526 */
6527 #if defined(_AMD64_)
6528 #define RtlStoreUlonglong(Address,Value) \
6529 *(ULONGLONG UNALIGNED *)(Address) = (Value)
6530 #else
6531 #define RtlStoreUlonglong(Address,Value) \
6532 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
6533 RtlStoreUlong((ULONG_PTR)(Address), \
6534 (ULONGLONG)(Value) & 0xFFFFFFFF); \
6535 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
6536 (ULONGLONG)(Value) >> 32); \
6537 } else { \
6538 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
6539 }
6540 #endif
6541
6542 /* VOID
6543 * RtlStoreUlongPtr(
6544 * IN OUT PULONG_PTR Address,
6545 * IN ULONG_PTR Value);
6546 */
6547 #ifdef _WIN64
6548 #define RtlStoreUlongPtr(Address,Value) \
6549 RtlStoreUlonglong(Address,Value)
6550 #else
6551 #define RtlStoreUlongPtr(Address,Value) \
6552 RtlStoreUlong(Address,Value)
6553 #endif
6554
6555 /* VOID
6556 * RtlStoreUshort(
6557 * IN PUSHORT Address,
6558 * IN USHORT Value);
6559 */
6560 #if defined(_AMD64_)
6561 #define RtlStoreUshort(Address,Value) \
6562 *(USHORT UNALIGNED *)(Address) = (Value)
6563 #else
6564 #define RtlStoreUshort(Address,Value) \
6565 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
6566 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
6567 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
6568 } \
6569 else { \
6570 *((PUSHORT) (Address)) = (USHORT)Value; \
6571 }
6572 #endif
6573
6574 NTSYSAPI
6575 BOOLEAN
6576 NTAPI
6577 RtlTimeFieldsToTime(
6578 IN PTIME_FIELDS TimeFields,
6579 IN PLARGE_INTEGER Time);
6580
6581 NTSYSAPI
6582 VOID
6583 NTAPI
6584 RtlTimeToTimeFields(
6585 IN PLARGE_INTEGER Time,
6586 IN PTIME_FIELDS TimeFields);
6587
6588 NTSYSAPI
6589 ULONG
6590 FASTCALL
6591 RtlUlongByteSwap(
6592 IN ULONG Source);
6593
6594 NTSYSAPI
6595 ULONGLONG
6596 FASTCALL
6597 RtlUlonglongByteSwap(
6598 IN ULONGLONG Source);
6599
6600 NTSYSAPI
6601 NTSTATUS
6602 NTAPI
6603 RtlUnicodeStringToAnsiString(
6604 IN OUT PANSI_STRING DestinationString,
6605 IN PCUNICODE_STRING SourceString,
6606 IN BOOLEAN AllocateDestinationString);
6607
6608 NTSYSAPI
6609 ULONG
6610 NTAPI
6611 RtlxUnicodeStringToAnsiSize(
6612 IN PCUNICODE_STRING UnicodeString);
6613
6614 #define RtlUnicodeStringToAnsiSize(String) ( \
6615 NLS_MB_CODE_PAGE_TAG ? \
6616 RtlxUnicodeStringToAnsiSize(String) : \
6617 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
6618 )
6619
6620 NTSYSAPI
6621 NTSTATUS
6622 NTAPI
6623 RtlUnicodeStringToInteger(
6624 IN PCUNICODE_STRING String,
6625 IN ULONG Base OPTIONAL,
6626 OUT PULONG Value);
6627
6628 NTSYSAPI
6629 WCHAR
6630 NTAPI
6631 RtlUpcaseUnicodeChar(
6632 IN WCHAR SourceCharacter);
6633
6634 NTSYSAPI
6635 USHORT
6636 FASTCALL
6637 RtlUshortByteSwap(
6638 IN USHORT Source);
6639
6640 NTSYSAPI
6641 BOOLEAN
6642 NTAPI
6643 RtlValidRelativeSecurityDescriptor(
6644 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
6645 IN ULONG SecurityDescriptorLength,
6646 IN SECURITY_INFORMATION RequiredInformation);
6647
6648 NTSYSAPI
6649 BOOLEAN
6650 NTAPI
6651 RtlValidSecurityDescriptor(
6652 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
6653
6654 NTSYSAPI
6655 NTSTATUS
6656 NTAPI
6657 RtlWriteRegistryValue(
6658 IN ULONG RelativeTo,
6659 IN PCWSTR Path,
6660 IN PCWSTR ValueName,
6661 IN ULONG ValueType,
6662 IN PVOID ValueData,
6663 IN ULONG ValueLength);
6664
6665
6666 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
6667
6668
6669 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
6670 NTSYSAPI
6671 VOID
6672 FASTCALL
6673 RtlPrefetchMemoryNonTemporal(
6674 IN PVOID Source,
6675 IN SIZE_T Length);
6676 #endif
6677
6678
6679 #if (NTDDI_VERSION >= NTDDI_WINXP)
6680
6681
6682
6683 NTSYSAPI
6684 VOID
6685 NTAPI
6686 RtlClearBit(
6687 PRTL_BITMAP BitMapHeader,
6688 ULONG BitNumber);
6689
6690 NTSYSAPI
6691 WCHAR
6692 NTAPI
6693 RtlDowncaseUnicodeChar(
6694 IN WCHAR SourceCharacter);
6695
6696 NTSYSAPI
6697 VOID
6698 NTAPI
6699 RtlSetBit(
6700 PRTL_BITMAP BitMapHeader,
6701 ULONG BitNumber);
6702
6703 NTSYSAPI
6704 BOOLEAN
6705 NTAPI
6706 RtlTestBit(
6707 IN PRTL_BITMAP BitMapHeader,
6708 IN ULONG BitNumber);
6709
6710 NTSYSAPI
6711 NTSTATUS
6712 NTAPI
6713 RtlHashUnicodeString(
6714 IN CONST UNICODE_STRING *String,
6715 IN BOOLEAN CaseInSensitive,
6716 IN ULONG HashAlgorithm,
6717 OUT PULONG HashValue);
6718
6719
6720 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
6721
6722 #if (NTDDI_VERSION >= NTDDI_VISTA)
6723
6724
6725
6726 NTSYSAPI
6727 ULONG
6728 NTAPI
6729 RtlNumberOfSetBitsUlongPtr(
6730 IN ULONG_PTR Target);
6731
6732 NTSYSAPI
6733 ULONGLONG
6734 NTAPI
6735 RtlIoDecodeMemIoResource (
6736 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
6737 OUT PULONGLONG Alignment OPTIONAL,
6738 OUT PULONGLONG MinimumAddress OPTIONAL,
6739 OUT PULONGLONG MaximumAddress OPTIONAL);
6740
6741 NTSYSAPI
6742 NTSTATUS
6743 NTAPI
6744 RtlIoEncodeMemIoResource(
6745 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
6746 IN UCHAR Type,
6747 IN ULONGLONG Length,
6748 IN ULONGLONG Alignment,
6749 IN ULONGLONG MinimumAddress,
6750 IN ULONGLONG MaximumAddress);
6751
6752 NTSYSAPI
6753 ULONGLONG
6754 NTAPI
6755 RtlCmDecodeMemIoResource(
6756 IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
6757 OUT PULONGLONG Start OPTIONAL);
6758
6759 NTSYSAPI
6760 NTSTATUS
6761 NTAPI
6762 RtlFindClosestEncodableLength(
6763 IN ULONGLONG SourceLength,
6764 OUT PULONGLONG TargetLength);
6765
6766 NTSYSAPI
6767 NTSTATUS
6768 NTAPI
6769 RtlCmEncodeMemIoResource(
6770 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
6771 IN UCHAR Type,
6772 IN ULONGLONG Length,
6773 IN ULONGLONG Start);
6774
6775
6776 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
6777
6778 #if (NTDDI_VERSION >= NTDDI_WIN7)
6779
6780
6781
6782 NTSYSAPI
6783 NTSTATUS
6784 NTAPI
6785 RtlUnicodeToUTF8N(
6786 OUT PCHAR UTF8StringDestination,
6787 IN ULONG UTF8StringMaxByteCount,
6788 OUT PULONG UTF8StringActualByteCount,
6789 IN PCWCH UnicodeStringSource,
6790 IN ULONG UnicodeStringByteCount);
6791
6792 NTSYSAPI
6793 NTSTATUS
6794 NTAPI
6795 RtlUTF8ToUnicodeN(
6796 OUT PWSTR UnicodeStringDestination,
6797 IN ULONG UnicodeStringMaxByteCount,
6798 OUT PULONG UnicodeStringActualByteCount,
6799 IN PCCH UTF8StringSource,
6800 IN ULONG UTF8StringByteCount);
6801
6802 NTSYSAPI
6803 ULONG64
6804 NTAPI
6805 RtlGetEnabledExtendedFeatures(
6806 IN ULONG64 FeatureMask);
6807
6808
6809 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
6810
6811
6812 #if !defined(MIDL_PASS)
6813 /* inline funftions */
6814 //DECLSPEC_DEPRECATED_DDK_WINXP
6815 static __inline
6816 LARGE_INTEGER
6817 NTAPI_INLINE
6818 RtlConvertLongToLargeInteger(
6819 IN LONG SignedInteger)
6820 {
6821 LARGE_INTEGER ret;
6822 ret.QuadPart = SignedInteger;
6823 return ret;
6824 }
6825
6826 //DECLSPEC_DEPRECATED_DDK_WINXP
6827 static __inline
6828 LARGE_INTEGER
6829 NTAPI_INLINE
6830 RtlConvertUlongToLargeInteger(
6831 IN ULONG UnsignedInteger)
6832 {
6833 LARGE_INTEGER ret;
6834 ret.QuadPart = UnsignedInteger;
6835 return ret;
6836 }
6837
6838 //DECLSPEC_DEPRECATED_DDK
6839 static __inline
6840 ULONG
6841 NTAPI_INLINE
6842 RtlEnlargedUnsignedDivide(
6843 IN ULARGE_INTEGER Dividend,
6844 IN ULONG Divisor,
6845 IN OUT PULONG Remainder)
6846 {
6847 if (Remainder)
6848 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
6849 return (ULONG)(Dividend.QuadPart / Divisor);
6850 }
6851
6852 //DECLSPEC_DEPRECATED_DDK
6853 static __inline
6854 LARGE_INTEGER
6855 NTAPI_INLINE
6856 RtlEnlargedUnsignedMultiply(
6857 IN ULONG Multiplicand,
6858 IN ULONG Multiplier)
6859 {
6860 LARGE_INTEGER ret;
6861 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
6862 return ret;
6863 }
6864
6865 //DECLSPEC_DEPRECATED_DDK
6866 static __inline
6867 LARGE_INTEGER
6868 NTAPI_INLINE
6869 RtlEnlargedIntegerMultiply(
6870 IN LONG Multiplicand,
6871 IN LONG Multiplier)
6872 {
6873 LARGE_INTEGER ret;
6874 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
6875 return ret;
6876 }
6877
6878 FORCEINLINE
6879 VOID
6880 RtlInitEmptyAnsiString(
6881 OUT PANSI_STRING AnsiString,
6882 IN PCHAR Buffer,
6883 IN USHORT BufferSize)
6884 {
6885 AnsiString->Length = 0;
6886 AnsiString->MaximumLength = BufferSize;
6887 AnsiString->Buffer = Buffer;
6888 }
6889
6890 FORCEINLINE
6891 VOID
6892 RtlInitEmptyUnicodeString(
6893 OUT PUNICODE_STRING UnicodeString,
6894 IN PWSTR Buffer,
6895 IN USHORT BufferSize)
6896 {
6897 UnicodeString->Length = 0;
6898 UnicodeString->MaximumLength = BufferSize;
6899 UnicodeString->Buffer = Buffer;
6900 }
6901
6902 #if defined(_AMD64_) || defined(_IA64_)
6903
6904
6905 static __inline
6906 LARGE_INTEGER
6907 NTAPI_INLINE
6908 RtlExtendedIntegerMultiply(
6909 IN LARGE_INTEGER Multiplicand,
6910 IN LONG Multiplier)
6911 {
6912 LARGE_INTEGER ret;
6913 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
6914 return ret;
6915 }
6916
6917 static __inline
6918 LARGE_INTEGER
6919 NTAPI_INLINE
6920 RtlExtendedLargeIntegerDivide(
6921 IN LARGE_INTEGER Dividend,
6922 IN ULONG Divisor,
6923 OUT PULONG Remainder OPTIONAL)
6924 {
6925 LARGE_INTEGER ret;
6926 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
6927 if (Remainder)
6928 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
6929 return ret;
6930 }
6931
6932
6933
6934 #endif /* defined(_AMD64_) || defined(_IA64_) */
6935
6936
6937 #if defined(_AMD64_)
6938
6939 #define MultiplyHigh __mulh
6940 #define UnsignedMultiplyHigh __umulh
6941
6942 //DECLSPEC_DEPRECATED_DDK
6943 static __inline
6944 LARGE_INTEGER
6945 NTAPI_INLINE
6946 RtlExtendedMagicDivide(
6947 IN LARGE_INTEGER Dividend,
6948 IN LARGE_INTEGER MagicDivisor,
6949 IN CCHAR ShiftCount)
6950 {
6951 LARGE_INTEGER ret;
6952 ULONG64 ret64;
6953 BOOLEAN Pos;
6954 Pos = (Dividend.QuadPart >= 0);
6955 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
6956 MagicDivisor.QuadPart);
6957 ret64 >>= ShiftCount;
6958 ret.QuadPart = Pos ? ret64 : -ret64;
6959 return ret;
6960 }
6961 #endif
6962
6963 //DECLSPEC_DEPRECATED_DDK
6964 static __inline
6965 LARGE_INTEGER
6966 NTAPI_INLINE
6967 RtlLargeIntegerAdd(
6968 IN LARGE_INTEGER Addend1,
6969 IN LARGE_INTEGER Addend2)
6970 {
6971 LARGE_INTEGER ret;
6972 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
6973 return ret;
6974 }
6975
6976 /* VOID
6977 * RtlLargeIntegerAnd(
6978 * IN OUT LARGE_INTEGER Result,
6979 * IN LARGE_INTEGER Source,
6980 * IN LARGE_INTEGER Mask);
6981 */
6982 #define RtlLargeIntegerAnd(Result, Source, Mask) \
6983 Result.QuadPart = Source.QuadPart & Mask.QuadPart
6984
6985 //DECLSPEC_DEPRECATED_DDK
6986 static __inline
6987 LARGE_INTEGER
6988 NTAPI_INLINE
6989 RtlLargeIntegerArithmeticShift(
6990 IN LARGE_INTEGER LargeInteger,
6991 IN CCHAR ShiftCount)
6992 {
6993 LARGE_INTEGER ret;
6994 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
6995 return ret;
6996 }
6997
6998 /* BOOLEAN
6999 * RtlLargeIntegerEqualTo(
7000 * IN LARGE_INTEGER Operand1,
7001 * IN LARGE_INTEGER Operand2);
7002 */
7003 #define RtlLargeIntegerEqualTo(X,Y) \
7004 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
7005
7006 FORCEINLINE
7007 PVOID
7008 RtlSecureZeroMemory(
7009 OUT PVOID Pointer,
7010 IN SIZE_T Size)
7011 {
7012 volatile char* vptr = (volatile char*)Pointer;
7013 #if defined(_M_AMD64)
7014 __stosb((PUCHAR)vptr, 0, Size);
7015 #else
7016 char * endptr = (char *)vptr + Size;
7017 while (vptr < endptr) {
7018 *vptr = 0; vptr++;
7019 }
7020 #endif
7021 return Pointer;
7022 }
7023
7024 #if defined(_M_AMD64)
7025 FORCEINLINE
7026 BOOLEAN
7027 RtlCheckBit(
7028 IN PRTL_BITMAP BitMapHeader,
7029 IN ULONG BitPosition)
7030 {
7031 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
7032 }
7033 #else
7034 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
7035 #endif /* defined(_M_AMD64) */
7036
7037 #define RtlLargeIntegerGreaterThan(X,Y) ( \
7038 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
7039 ((X).HighPart > (Y).HighPart) \
7040 )
7041
7042 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
7043 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
7044 ((X).HighPart > (Y).HighPart) \
7045 )
7046
7047 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
7048 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
7049 )
7050
7051 #define RtlLargeIntegerLessThan(X,Y) ( \
7052 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
7053 ((X).HighPart < (Y).HighPart) \
7054 )
7055
7056 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
7057 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
7058 ((X).HighPart < (Y).HighPart) \
7059 )
7060
7061 #define RtlLargeIntegerGreaterThanZero(X) ( \
7062 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
7063 ((X).HighPart > 0 ) \
7064 )
7065
7066 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
7067
7068 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
7069
7070 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
7071
7072 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
7073
7074 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
7075
7076 #endif /* !defined(MIDL_PASS) */
7077
7078 /* Byte Swap Functions */
7079 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
7080 ((defined(_M_AMD64) || defined(_M_IA64)) \
7081 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
7082
7083 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
7084 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
7085 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
7086
7087 #endif
7088
7089 #if DBG
7090
7091 #define ASSERT(exp) \
7092 (VOID)((!(exp)) ? \
7093 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
7094
7095 #define ASSERTMSG(msg, exp) \
7096 (VOID)((!(exp)) ? \
7097 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
7098
7099 #define RTL_SOFT_ASSERT(exp) \
7100 (VOID)((!(exp)) ? \
7101 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
7102
7103 #define RTL_SOFT_ASSERTMSG(msg, exp) \
7104 (VOID)((!(exp)) ? \
7105 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
7106
7107 #define RTL_VERIFY(exp) ASSERT(exp)
7108 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
7109
7110 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
7111 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
7112
7113 #if defined(_MSC_VER)
7114
7115 #define NT_ASSERT(exp) \
7116 ((!(exp)) ? \
7117 (__annotation(L"Debug", L"AssertFail", L#exp), \
7118 DbgRaiseAssertionFailure(), FALSE) : TRUE)
7119
7120 #define NT_ASSERTMSG(msg, exp) \
7121 ((!(exp)) ? \
7122 (__annotation(L"Debug", L"AssertFail", L##msg), \
7123 DbgRaiseAssertionFailure(), FALSE) : TRUE)
7124
7125 #define NT_ASSERTMSGW(msg, exp) \
7126 ((!(exp)) ? \
7127 (__annotation(L"Debug", L"AssertFail", msg), \
7128 DbgRaiseAssertionFailure(), FALSE) : TRUE)
7129
7130 #else
7131
7132 /* GCC doesn't support __annotation (nor PDB) */
7133 #define NT_ASSERT(exp) \
7134 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
7135
7136 #define NT_ASSERTMSG NT_ASSERT
7137 #define NT_ASSERTMSGW NT_ASSERT
7138
7139 #endif
7140
7141 #else /* !DBG */
7142
7143 #define ASSERT(exp) ((VOID) 0)
7144 #define ASSERTMSG(msg, exp) ((VOID) 0)
7145
7146 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
7147 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
7148
7149 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
7150 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
7151
7152 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
7153 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
7154
7155 #define NT_ASSERT(exp) ((VOID)0)
7156 #define NT_ASSERTMSG(exp) ((VOID)0)
7157 #define NT_ASSERTMSGW(exp) ((VOID)0)
7158
7159 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
7160 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
7161 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
7162
7163 #endif /* DBG */
7164
7165 #define InitializeListHead32(ListHead) (\
7166 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
7167
7168 #if !defined(_WINBASE_)
7169
7170 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
7171
7172 NTKERNELAPI
7173 VOID
7174 InitializeSListHead(
7175 OUT PSLIST_HEADER SListHead);
7176
7177 #else
7178
7179 VOID
7180 FORCEINLINE
7181 InitializeSListHead(
7182 OUT PSLIST_HEADER SListHead)
7183 {
7184 #if defined(_IA64_)
7185 ULONG64 FeatureBits;
7186 #endif
7187
7188 #if defined(_WIN64)
7189 if (((ULONG_PTR)SListHead & 0xf) != 0) {
7190 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
7191 }
7192 #endif
7193 RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
7194 #if defined(_IA64_)
7195 FeatureBits = __getReg(CV_IA64_CPUID4);
7196 if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
7197 SListHead->Header16.HeaderType = 1;
7198 SListHead->Header16.Init = 1;
7199 }
7200 #endif
7201 }
7202
7203 #endif
7204
7205 #if defined(_WIN64)
7206
7207 #define InterlockedPopEntrySList(Head) \
7208 ExpInterlockedPopEntrySList(Head)
7209
7210 #define InterlockedPushEntrySList(Head, Entry) \
7211 ExpInterlockedPushEntrySList(Head, Entry)
7212
7213 #define InterlockedFlushSList(Head) \
7214 ExpInterlockedFlushSList(Head)
7215
7216 #define QueryDepthSList(Head) \
7217 ExQueryDepthSList(Head)
7218
7219 #else /* !defined(_WIN64) */
7220
7221 NTKERNELAPI
7222 PSLIST_ENTRY
7223 FASTCALL
7224 InterlockedPopEntrySList(
7225 IN PSLIST_HEADER ListHead);
7226
7227 NTKERNELAPI
7228 PSLIST_ENTRY
7229 FASTCALL
7230 InterlockedPushEntrySList(
7231 IN PSLIST_HEADER ListHead,
7232 IN PSLIST_ENTRY ListEntry);
7233
7234 #define InterlockedFlushSList(ListHead) \
7235 ExInterlockedFlushSList(ListHead)
7236
7237 #define QueryDepthSList(Head) \
7238 ExQueryDepthSList(Head)
7239
7240 #endif /* !defined(_WIN64) */
7241
7242 #endif /* !defined(_WINBASE_) */
7243
7244 /******************************************************************************
7245 * Kernel Functions *
7246 ******************************************************************************/
7247
7248 NTHALAPI
7249 KIRQL
7250 NTAPI
7251 KeGetCurrentIrql(
7252 VOID);
7253
7254 NTKERNELAPI
7255 VOID
7256 NTAPI
7257 KeInitializeEvent(
7258 OUT PRKEVENT Event,
7259 IN EVENT_TYPE Type,
7260 IN BOOLEAN State);
7261
7262 NTKERNELAPI
7263 VOID
7264 NTAPI
7265 KeClearEvent(
7266 IN OUT PRKEVENT Event);
7267
7268 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7269
7270
7271 #if defined(_NTDDK_) || defined(_NTIFS_)
7272 NTKERNELAPI
7273 VOID
7274 NTAPI
7275 ProbeForRead(
7276 IN CONST VOID *Address, /* CONST is added */
7277 IN SIZE_T Length,
7278 IN ULONG Alignment);
7279 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
7280
7281 NTKERNELAPI
7282 VOID
7283 NTAPI
7284 ProbeForWrite(
7285 IN PVOID Address,
7286 IN SIZE_T Length,
7287 IN ULONG Alignment);
7288
7289
7290 #if defined(SINGLE_GROUP_LEGACY_API)
7291
7292 NTKERNELAPI
7293 VOID
7294 NTAPI
7295 KeRevertToUserAffinityThread(VOID);
7296
7297 NTKERNELAPI
7298 VOID
7299 NTAPI
7300 KeSetSystemAffinityThread(
7301 IN KAFFINITY Affinity);
7302
7303 NTKERNELAPI
7304 VOID
7305 NTAPI
7306 KeSetTargetProcessorDpc(
7307 IN OUT PRKDPC Dpc,
7308 IN CCHAR Number);
7309
7310 NTKERNELAPI
7311 KAFFINITY
7312 NTAPI
7313 KeQueryActiveProcessors(VOID);
7314
7315
7316 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
7317
7318 #if !defined(_M_AMD64)
7319 NTKERNELAPI
7320 ULONGLONG
7321 NTAPI
7322 KeQueryInterruptTime(VOID);
7323
7324 NTKERNELAPI
7325 VOID
7326 NTAPI
7327 KeQuerySystemTime(
7328 OUT PLARGE_INTEGER CurrentTime);
7329 #endif /* !_M_AMD64 */
7330
7331 #if !defined(_X86_)
7332 NTKERNELAPI
7333 KIRQL
7334 NTAPI
7335 KeAcquireSpinLockRaiseToDpc(
7336 IN OUT PKSPIN_LOCK SpinLock);
7337
7338 #define KeAcquireSpinLock(SpinLock, OldIrql) \
7339 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
7340
7341 NTKERNELAPI
7342 VOID
7343 NTAPI
7344 KeAcquireSpinLockAtDpcLevel(
7345 IN OUT PKSPIN_LOCK SpinLock);
7346
7347 NTKERNELAPI
7348 VOID
7349 NTAPI
7350 KeReleaseSpinLock(
7351 IN OUT PKSPIN_LOCK SpinLock,
7352 IN KIRQL NewIrql);
7353
7354 NTKERNELAPI
7355 VOID
7356 NTAPI
7357 KeReleaseSpinLockFromDpcLevel(
7358 IN OUT PKSPIN_LOCK SpinLock);
7359 #endif /* !_X86_ */
7360
7361 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
7362 NTKERNELAPI
7363 VOID
7364 NTAPI
7365 KeInitializeSpinLock(
7366 IN PKSPIN_LOCK SpinLock);
7367 #else
7368 FORCEINLINE
7369 VOID
7370 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
7371 {
7372 /* Clear the lock */
7373 *SpinLock = 0;
7374 }
7375 #endif
7376
7377 NTKERNELAPI
7378 DECLSPEC_NORETURN
7379 VOID
7380 NTAPI
7381 KeBugCheckEx(
7382 IN ULONG BugCheckCode,
7383 IN ULONG_PTR BugCheckParameter1,
7384 IN ULONG_PTR BugCheckParameter2,
7385 IN ULONG_PTR BugCheckParameter3,
7386 IN ULONG_PTR BugCheckParameter4);
7387
7388 NTKERNELAPI
7389 BOOLEAN
7390 NTAPI
7391 KeCancelTimer(
7392 IN OUT PKTIMER);
7393
7394 NTKERNELAPI
7395 NTSTATUS
7396 NTAPI
7397 KeDelayExecutionThread(
7398 IN KPROCESSOR_MODE WaitMode,
7399 IN BOOLEAN Alertable,
7400 IN PLARGE_INTEGER Interval);
7401
7402 NTKERNELAPI
7403 BOOLEAN
7404 NTAPI
7405 KeDeregisterBugCheckCallback(
7406 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
7407
7408 NTKERNELAPI
7409 VOID
7410 NTAPI
7411 KeEnterCriticalRegion(VOID);
7412
7413 NTKERNELAPI
7414 VOID
7415 NTAPI
7416 KeInitializeDeviceQueue(
7417 OUT PKDEVICE_QUEUE DeviceQueue);
7418
7419 NTKERNELAPI
7420 VOID
7421 NTAPI
7422 KeInitializeDpc(
7423 OUT PRKDPC Dpc,
7424 IN PKDEFERRED_ROUTINE DeferredRoutine,
7425 IN PVOID DeferredContext OPTIONAL);
7426
7427 NTKERNELAPI
7428 VOID
7429 NTAPI
7430 KeInitializeMutex(
7431 OUT PRKMUTEX Mutex,
7432 IN ULONG Level);
7433
7434 NTKERNELAPI
7435 VOID
7436 NTAPI
7437 KeInitializeSemaphore(
7438 OUT PRKSEMAPHORE Semaphore,
7439 IN LONG Count,
7440 IN LONG Limit);
7441
7442 NTKERNELAPI
7443 VOID
7444 NTAPI
7445 KeInitializeTimer(
7446 OUT PKTIMER Timer);
7447
7448 NTKERNELAPI
7449 VOID
7450 NTAPI
7451 KeInitializeTimerEx(
7452 OUT PKTIMER Timer,
7453 IN TIMER_TYPE Type);
7454
7455 NTKERNELAPI
7456 BOOLEAN
7457 NTAPI
7458 KeInsertByKeyDeviceQueue(
7459 IN OUT PKDEVICE_QUEUE DeviceQueue,
7460 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
7461 IN ULONG SortKey);
7462
7463 NTKERNELAPI
7464 BOOLEAN
7465 NTAPI
7466 KeInsertDeviceQueue(
7467 IN OUT PKDEVICE_QUEUE DeviceQueue,
7468 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7469
7470 NTKERNELAPI
7471 BOOLEAN
7472 NTAPI
7473 KeInsertQueueDpc(
7474 IN OUT PRKDPC Dpc,
7475 IN PVOID SystemArgument1 OPTIONAL,
7476 IN PVOID SystemArgument2 OPTIONAL);
7477
7478 NTKERNELAPI
7479 VOID
7480 NTAPI
7481 KeLeaveCriticalRegion(VOID);
7482
7483 NTHALAPI
7484 LARGE_INTEGER
7485 NTAPI
7486 KeQueryPerformanceCounter(
7487 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
7488
7489 NTKERNELAPI
7490 KPRIORITY
7491 NTAPI
7492 KeQueryPriorityThread(
7493 IN PRKTHREAD Thread);
7494
7495 NTKERNELAPI
7496 ULONG
7497 NTAPI
7498 KeQueryTimeIncrement(VOID);
7499
7500 NTKERNELAPI
7501 LONG
7502 NTAPI
7503 KeReadStateEvent(
7504 IN PRKEVENT Event);
7505
7506 NTKERNELAPI
7507 LONG
7508 NTAPI
7509 KeReadStateMutex(
7510 IN PRKMUTEX Mutex);
7511
7512 NTKERNELAPI
7513 LONG
7514 NTAPI
7515 KeReadStateSemaphore(
7516 IN PRKSEMAPHORE Semaphore);
7517
7518 NTKERNELAPI
7519 BOOLEAN
7520 NTAPI
7521 KeReadStateTimer(
7522 IN PKTIMER Timer);
7523
7524 NTKERNELAPI
7525 BOOLEAN
7526 NTAPI
7527 KeRegisterBugCheckCallback(
7528 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
7529 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
7530 IN PVOID Buffer,
7531 IN ULONG Length,
7532 IN PUCHAR Component);
7533
7534 NTKERNELAPI
7535 LONG
7536 NTAPI
7537 KeReleaseMutex(
7538 IN OUT PRKMUTEX Mutex,
7539 IN BOOLEAN Wait);
7540
7541 NTKERNELAPI
7542 LONG
7543 NTAPI
7544 KeReleaseSemaphore(
7545 IN OUT PRKSEMAPHORE Semaphore,
7546 IN KPRIORITY Increment,
7547 IN LONG Adjustment,
7548 IN BOOLEAN Wait);
7549
7550 NTKERNELAPI
7551 PKDEVICE_QUEUE_ENTRY
7552 NTAPI
7553 KeRemoveByKeyDeviceQueue(
7554 IN OUT PKDEVICE_QUEUE DeviceQueue,
7555 IN ULONG SortKey);
7556
7557 NTKERNELAPI
7558 PKDEVICE_QUEUE_ENTRY
7559 NTAPI
7560 KeRemoveDeviceQueue(
7561 IN OUT PKDEVICE_QUEUE DeviceQueue);
7562
7563 NTKERNELAPI
7564 BOOLEAN
7565 NTAPI
7566 KeRemoveEntryDeviceQueue(
7567 IN OUT PKDEVICE_QUEUE DeviceQueue,
7568 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
7569
7570 NTKERNELAPI
7571 BOOLEAN
7572 NTAPI
7573 KeRemoveQueueDpc(
7574 IN OUT PRKDPC Dpc);
7575
7576 NTKERNELAPI
7577 LONG
7578 NTAPI
7579 KeResetEvent(
7580 IN OUT PRKEVENT Event);
7581
7582 NTKERNELAPI
7583 LONG
7584 NTAPI
7585 KeSetEvent(
7586 IN OUT PRKEVENT Event,
7587 IN KPRIORITY Increment,
7588 IN BOOLEAN Wait);
7589
7590 NTKERNELAPI
7591 VOID
7592 NTAPI
7593 KeSetImportanceDpc(
7594 IN OUT PRKDPC Dpc,
7595 IN KDPC_IMPORTANCE Importance);
7596
7597 NTKERNELAPI
7598 KPRIORITY
7599 NTAPI
7600 KeSetPriorityThread(
7601 IN OUT PKTHREAD Thread,
7602 IN KPRIORITY Priority);
7603
7604 NTKERNELAPI
7605 BOOLEAN
7606 NTAPI
7607 KeSetTimer(
7608 IN OUT PKTIMER Timer,
7609 IN LARGE_INTEGER DueTime,
7610 IN PKDPC Dpc OPTIONAL);
7611
7612 NTKERNELAPI
7613 BOOLEAN
7614 NTAPI
7615 KeSetTimerEx(
7616 IN OUT PKTIMER Timer,
7617 IN LARGE_INTEGER DueTime,
7618 IN LONG Period OPTIONAL,
7619 IN PKDPC Dpc OPTIONAL);
7620
7621 NTHALAPI
7622 VOID
7623 NTAPI
7624 KeStallExecutionProcessor(
7625 IN ULONG MicroSeconds);
7626
7627 NTKERNELAPI
7628 BOOLEAN
7629 NTAPI
7630 KeSynchronizeExecution(
7631 IN OUT PKINTERRUPT Interrupt,
7632 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
7633 IN PVOID SynchronizeContext OPTIONAL);
7634
7635 NTKERNELAPI
7636 NTSTATUS
7637 NTAPI
7638 KeWaitForMultipleObjects(
7639 IN ULONG Count,
7640 IN PVOID Object[],
7641 IN WAIT_TYPE WaitType,
7642 IN KWAIT_REASON WaitReason,
7643 IN KPROCESSOR_MODE WaitMode,
7644 IN BOOLEAN Alertable,
7645 IN PLARGE_INTEGER Timeout OPTIONAL,
7646 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
7647
7648 #define KeWaitForMutexObject KeWaitForSingleObject
7649
7650 NTKERNELAPI
7651 NTSTATUS
7652 NTAPI
7653 KeWaitForSingleObject(
7654 IN PVOID Object,
7655 IN KWAIT_REASON WaitReason,
7656 IN KPROCESSOR_MODE WaitMode,
7657 IN BOOLEAN Alertable,
7658 IN PLARGE_INTEGER Timeout OPTIONAL);
7659
7660 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
7661
7662 #if (NTDDI_VERSION >= NTDDI_WINXP)
7663
7664 _DECL_HAL_KE_IMPORT
7665 VOID
7666 FASTCALL
7667 KeAcquireInStackQueuedSpinLock(
7668 IN OUT PKSPIN_LOCK SpinLock,
7669 OUT PKLOCK_QUEUE_HANDLE LockHandle);
7670
7671 NTKERNELAPI
7672 VOID
7673 FASTCALL
7674 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7675 IN OUT PKSPIN_LOCK SpinLock,
7676 OUT PKLOCK_QUEUE_HANDLE LockHandle);
7677
7678 NTKERNELAPI
7679 KIRQL
7680 NTAPI
7681 KeAcquireInterruptSpinLock(
7682 IN OUT PKINTERRUPT Interrupt);
7683
7684 NTKERNELAPI
7685 BOOLEAN
7686 NTAPI
7687 KeAreApcsDisabled(VOID);
7688
7689 NTKERNELAPI
7690 ULONG
7691 NTAPI
7692 KeGetRecommendedSharedDataAlignment(VOID);
7693
7694 NTKERNELAPI
7695 ULONG
7696 NTAPI
7697 KeQueryRuntimeThread(
7698 IN PKTHREAD Thread,
7699 OUT PULONG UserTime);
7700
7701 NTKERNELAPI
7702 VOID
7703 FASTCALL
7704 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7705 IN PKLOCK_QUEUE_HANDLE LockHandle);
7706
7707 NTKERNELAPI
7708 VOID
7709 NTAPI
7710 KeReleaseInterruptSpinLock(
7711 IN OUT PKINTERRUPT Interrupt,
7712 IN KIRQL OldIrql);
7713
7714 NTKERNELAPI
7715 PKDEVICE_QUEUE_ENTRY
7716 NTAPI
7717 KeRemoveByKeyDeviceQueueIfBusy(
7718 IN OUT PKDEVICE_QUEUE DeviceQueue,
7719 IN ULONG SortKey);
7720
7721 _DECL_HAL_KE_IMPORT
7722 VOID
7723 FASTCALL
7724 KeReleaseInStackQueuedSpinLock(
7725 IN PKLOCK_QUEUE_HANDLE LockHandle);
7726
7727 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
7728
7729 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
7730
7731 NTKERNELAPI
7732 BOOLEAN
7733 NTAPI
7734 KeDeregisterBugCheckReasonCallback(
7735 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
7736
7737 NTKERNELAPI
7738 BOOLEAN
7739 NTAPI
7740 KeRegisterBugCheckReasonCallback(
7741 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
7742 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
7743 IN KBUGCHECK_CALLBACK_REASON Reason,
7744 IN PUCHAR Component);
7745
7746 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
7747
7748 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
7749 NTKERNELAPI
7750 VOID
7751 NTAPI
7752 KeFlushQueuedDpcs(VOID);
7753 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
7754
7755 #if (NTDDI_VERSION >= NTDDI_WS03)
7756
7757 NTKERNELAPI
7758 PVOID
7759 NTAPI
7760 KeRegisterNmiCallback(
7761 IN PNMI_CALLBACK CallbackRoutine,
7762 IN PVOID Context OPTIONAL);
7763
7764 NTKERNELAPI
7765 NTSTATUS
7766 NTAPI
7767 KeDeregisterNmiCallback(
7768 IN PVOID Handle);
7769
7770 NTKERNELAPI
7771 VOID
7772 NTAPI
7773 KeInitializeThreadedDpc(
7774 OUT PRKDPC Dpc,
7775 IN PKDEFERRED_ROUTINE DeferredRoutine,
7776 IN PVOID DeferredContext OPTIONAL);
7777
7778 NTKERNELAPI
7779 ULONG_PTR
7780 NTAPI
7781 KeIpiGenericCall(
7782 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
7783 IN ULONG_PTR Context);
7784
7785 NTKERNELAPI
7786 KIRQL
7787 FASTCALL
7788 KeAcquireSpinLockForDpc(
7789 IN OUT PKSPIN_LOCK SpinLock);
7790
7791 NTKERNELAPI
7792 VOID
7793 FASTCALL
7794 KeReleaseSpinLockForDpc(
7795 IN OUT PKSPIN_LOCK SpinLock,
7796 IN KIRQL OldIrql);
7797
7798 NTKERNELAPI
7799 BOOLEAN
7800 FASTCALL
7801 KeTestSpinLock(
7802 IN PKSPIN_LOCK SpinLock);
7803
7804
7805 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
7806
7807 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
7808
7809
7810 NTKERNELAPI
7811 BOOLEAN
7812 FASTCALL
7813 KeTryToAcquireSpinLockAtDpcLevel(
7814 IN OUT PKSPIN_LOCK SpinLock);
7815
7816 NTKERNELAPI
7817 BOOLEAN
7818 NTAPI
7819 KeAreAllApcsDisabled(VOID);
7820
7821 NTKERNELAPI
7822 VOID
7823 FASTCALL
7824 KeAcquireGuardedMutex(
7825 IN OUT PKGUARDED_MUTEX GuardedMutex);
7826
7827 NTKERNELAPI
7828 VOID
7829 FASTCALL
7830 KeAcquireGuardedMutexUnsafe(
7831 IN OUT PKGUARDED_MUTEX GuardedMutex);
7832
7833 NTKERNELAPI
7834 VOID
7835 NTAPI
7836 KeEnterGuardedRegion(VOID);
7837
7838 NTKERNELAPI
7839 VOID
7840 NTAPI
7841 KeLeaveGuardedRegion(VOID);
7842
7843 NTKERNELAPI
7844 VOID
7845 FASTCALL
7846 KeInitializeGuardedMutex(
7847 OUT PKGUARDED_MUTEX GuardedMutex);
7848
7849 NTKERNELAPI
7850 VOID
7851 FASTCALL
7852 KeReleaseGuardedMutexUnsafe(
7853 IN OUT PKGUARDED_MUTEX GuardedMutex);
7854
7855 NTKERNELAPI
7856 VOID
7857 FASTCALL
7858 KeReleaseGuardedMutex(
7859 IN OUT PKGUARDED_MUTEX GuardedMutex);
7860
7861 NTKERNELAPI
7862 BOOLEAN
7863 FASTCALL
7864 KeTryToAcquireGuardedMutex(
7865 IN OUT PKGUARDED_MUTEX GuardedMutex);
7866
7867 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
7868
7869 #if (NTDDI_VERSION >= NTDDI_VISTA)
7870
7871 NTKERNELAPI
7872 VOID
7873 FASTCALL
7874 KeAcquireInStackQueuedSpinLockForDpc(
7875 IN OUT PKSPIN_LOCK SpinLock,
7876 OUT PKLOCK_QUEUE_HANDLE LockHandle);
7877
7878 NTKERNELAPI
7879 VOID
7880 FASTCALL
7881 KeReleaseInStackQueuedSpinLockForDpc(
7882 IN PKLOCK_QUEUE_HANDLE LockHandle);
7883
7884 NTKERNELAPI
7885 NTSTATUS
7886 NTAPI
7887 KeQueryDpcWatchdogInformation(
7888 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
7889
7890 #if defined(SINGLE_GROUP_LEGACY_API)
7891
7892 NTKERNELAPI
7893 KAFFINITY
7894 NTAPI
7895 KeSetSystemAffinityThreadEx(
7896 IN KAFFINITY Affinity);
7897
7898 NTKERNELAPI
7899 VOID
7900 NTAPI
7901 KeRevertToUserAffinityThreadEx(
7902 IN KAFFINITY Affinity);
7903
7904 NTKERNELAPI
7905 ULONG
7906 NTAPI
7907 KeQueryActiveProcessorCount(
7908 OUT PKAFFINITY ActiveProcessors OPTIONAL);
7909
7910 NTKERNELAPI
7911 ULONG
7912 NTAPI
7913 KeQueryMaximumProcessorCount(VOID);
7914 #endif /* SINGLE_GROUP_LEGACY_API */
7915
7916 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
7917
7918 #if (NTDDI_VERSION >= NTDDI_WS08)
7919
7920 PVOID
7921 KeRegisterProcessorChangeCallback(
7922 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
7923 IN PVOID CallbackContext OPTIONAL,
7924 IN ULONG Flags);
7925
7926 VOID
7927 KeDeregisterProcessorChangeCallback(
7928 IN PVOID CallbackHandle);
7929
7930 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
7931
7932 #if (NTDDI_VERSION >= NTDDI_WIN7)
7933
7934
7935 ULONG64
7936 NTAPI
7937 KeQueryTotalCycleTimeProcess(
7938 IN OUT PKPROCESS Process,
7939 OUT PULONG64 CycleTimeStamp);
7940
7941 ULONG64
7942 NTAPI
7943 KeQueryTotalCycleTimeThread(
7944 IN OUT PKTHREAD Thread,
7945 OUT PULONG64 CycleTimeStamp);
7946
7947 NTKERNELAPI
7948 NTSTATUS
7949 NTAPI
7950 KeSetTargetProcessorDpcEx(
7951 IN OUT PKDPC Dpc,
7952 IN PPROCESSOR_NUMBER ProcNumber);
7953
7954 NTKERNELAPI
7955 VOID
7956 NTAPI
7957 KeSetSystemGroupAffinityThread(
7958 IN PGROUP_AFFINITY Affinity,
7959 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
7960
7961 NTKERNELAPI
7962 VOID
7963 NTAPI
7964 KeRevertToUserGroupAffinityThread(
7965 IN PGROUP_AFFINITY PreviousAffinity);
7966
7967 NTKERNELAPI
7968 BOOLEAN
7969 NTAPI
7970 KeSetCoalescableTimer(
7971 IN OUT PKTIMER Timer,
7972 IN LARGE_INTEGER DueTime,
7973 IN ULONG Period,
7974 IN ULONG TolerableDelay,
7975 IN PKDPC Dpc OPTIONAL);
7976
7977 NTKERNELAPI
7978 ULONGLONG
7979 NTAPI
7980 KeQueryUnbiasedInterruptTime(VOID);
7981
7982 NTKERNELAPI
7983 ULONG
7984 NTAPI
7985 KeQueryActiveProcessorCountEx(
7986 IN USHORT GroupNumber);
7987
7988 NTKERNELAPI
7989 ULONG
7990 NTAPI
7991 KeQueryMaximumProcessorCountEx(
7992 IN USHORT GroupNumber);
7993
7994 NTKERNELAPI
7995 USHORT
7996 NTAPI
7997 KeQueryActiveGroupCount(VOID);
7998
7999 NTKERNELAPI
8000 USHORT
8001 NTAPI
8002 KeQueryMaximumGroupCount(VOID);
8003
8004 NTKERNELAPI
8005 KAFFINITY
8006 NTAPI
8007 KeQueryGroupAffinity(
8008 IN USHORT GroupNumber);
8009
8010 NTKERNELAPI
8011 ULONG
8012 NTAPI
8013 KeGetCurrentProcessorNumberEx(
8014 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
8015
8016 NTKERNELAPI
8017 VOID
8018 NTAPI
8019 KeQueryNodeActiveAffinity(
8020 IN USHORT NodeNumber,
8021 OUT PGROUP_AFFINITY Affinity OPTIONAL,
8022 OUT PUSHORT Count OPTIONAL);
8023
8024 NTKERNELAPI
8025 USHORT
8026 NTAPI
8027 KeQueryNodeMaximumProcessorCount(
8028 IN USHORT NodeNumber);
8029
8030 NTKERNELAPI
8031 USHORT
8032 NTAPI
8033 KeQueryHighestNodeNumber(VOID);
8034
8035 NTKERNELAPI
8036 USHORT
8037 NTAPI
8038 KeGetCurrentNodeNumber(VOID);
8039
8040 NTKERNELAPI
8041 NTSTATUS
8042 NTAPI
8043 KeQueryLogicalProcessorRelationship(
8044 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
8045 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
8046 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
8047 IN OUT PULONG Length);
8048
8049 NTKERNELAPI
8050 NTSTATUS
8051 NTAPI
8052 KeSaveExtendedProcessorState(
8053 IN ULONG64 Mask,
8054 OUT PXSTATE_SAVE XStateSave);
8055
8056 NTKERNELAPI
8057 VOID
8058 NTAPI
8059 KeRestoreExtendedProcessorState(
8060 IN PXSTATE_SAVE XStateSave);
8061
8062 NTSTATUS
8063 NTAPI
8064 KeGetProcessorNumberFromIndex(
8065 IN ULONG ProcIndex,
8066 OUT PPROCESSOR_NUMBER ProcNumber);
8067
8068 ULONG
8069 NTAPI
8070 KeGetProcessorIndexFromNumber(
8071 IN PPROCESSOR_NUMBER ProcNumber);
8072
8073 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
8074
8075 #if !defined(_IA64_)
8076 NTHALAPI
8077 VOID
8078 NTAPI
8079 KeFlushWriteBuffer(VOID);
8080 #endif
8081
8082 /* VOID
8083 * KeInitializeCallbackRecord(
8084 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
8085 */
8086 #define KeInitializeCallbackRecord(CallbackRecord) \
8087 CallbackRecord->State = BufferEmpty;
8088
8089 #if DBG
8090
8091 #if (NTDDI_VERSION >= NTDDI_VISTA)
8092 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
8093 #else
8094 #define PAGED_ASSERT( exp ) ASSERT( exp )
8095 #endif
8096
8097 #define PAGED_CODE() { \
8098 if (KeGetCurrentIrql() > APC_LEVEL) { \
8099 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
8100 PAGED_ASSERT(FALSE); \
8101 } \
8102 }
8103
8104 #else
8105
8106 #define PAGED_CODE()
8107
8108 #endif /* DBG */
8109
8110 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
8111
8112 /******************************************************************************
8113 * Memory manager Functions *
8114 ******************************************************************************/
8115 /* Alignment Macros */
8116 #define ALIGN_DOWN_BY(size, align) \
8117 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
8118
8119 #define ALIGN_UP_BY(size, align) \
8120 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
8121
8122 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
8123 ((PVOID)ALIGN_DOWN_BY(ptr, align))
8124
8125 #define ALIGN_UP_POINTER_BY(ptr, align) \
8126 ((PVOID)ALIGN_UP_BY(ptr, align))
8127
8128 #define ALIGN_DOWN(size, type) \
8129 ALIGN_DOWN_BY(size, sizeof(type))
8130
8131 #define ALIGN_UP(size, type) \
8132 ALIGN_UP_BY(size, sizeof(type))
8133
8134 #define ALIGN_DOWN_POINTER(ptr, type) \
8135 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
8136
8137 #define ALIGN_UP_POINTER(ptr, type) \
8138 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
8139
8140 /* ULONG
8141 * BYTE_OFFSET(
8142 * IN PVOID Va)
8143 */
8144 #define BYTE_OFFSET(Va) \
8145 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
8146
8147 /* ULONG
8148 * BYTES_TO_PAGES(
8149 * IN ULONG Size)
8150 */
8151 #define BYTES_TO_PAGES(Size) \
8152 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
8153
8154 /* PVOID
8155 * PAGE_ALIGN(
8156 * IN PVOID Va)
8157 */
8158 #define PAGE_ALIGN(Va) \
8159 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
8160
8161 /* ULONG_PTR
8162 * ROUND_TO_PAGES(
8163 * IN ULONG_PTR Size)
8164 */
8165 #define ROUND_TO_PAGES(Size) \
8166 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
8167
8168 /* ULONG
8169 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
8170 * IN PVOID Va,
8171 * IN ULONG Size)
8172 */
8173 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
8174 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
8175 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
8176
8177 #define COMPUTE_PAGES_SPANNED(Va, Size) \
8178 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
8179
8180 /*
8181 * ULONG
8182 * MmGetMdlByteCount(
8183 * IN PMDL Mdl)
8184 */
8185 #define MmGetMdlByteCount(_Mdl) \
8186 ((_Mdl)->ByteCount)
8187
8188 /*
8189 * ULONG
8190 * MmGetMdlByteOffset(
8191 * IN PMDL Mdl)
8192 */
8193 #define MmGetMdlByteOffset(_Mdl) \
8194 ((_Mdl)->ByteOffset)
8195
8196 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
8197
8198 /*
8199 * PPFN_NUMBER
8200 * MmGetMdlPfnArray(
8201 * IN PMDL Mdl)
8202 */
8203 #define MmGetMdlPfnArray(_Mdl) \
8204 ((PPFN_NUMBER) ((_Mdl) + 1))
8205
8206 /*
8207 * PVOID
8208 * MmGetMdlVirtualAddress(
8209 * IN PMDL Mdl)
8210 */
8211 #define MmGetMdlVirtualAddress(_Mdl) \
8212 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
8213
8214 #define MmGetProcedureAddress(Address) (Address)
8215
8216 /* PVOID MmGetSystemAddressForMdl(
8217 * IN PMDL Mdl);
8218 */
8219 #define MmGetSystemAddressForMdl(Mdl) \
8220 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
8221 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
8222 ((Mdl)->MappedSystemVa) : \
8223 (MmMapLockedPages((Mdl), KernelMode)))
8224
8225 /* PVOID
8226 * MmGetSystemAddressForMdlSafe(
8227 * IN PMDL Mdl,
8228 * IN MM_PAGE_PRIORITY Priority)
8229 */
8230 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
8231 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
8232 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
8233 (_Mdl)->MappedSystemVa : \
8234 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
8235 KernelMode, MmCached, NULL, FALSE, (_Priority)))
8236
8237 /*
8238 * VOID
8239 * MmInitializeMdl(
8240 * IN PMDL MemoryDescriptorList,
8241 * IN PVOID BaseVa,
8242 * IN SIZE_T Length)
8243 */
8244 #define MmInitializeMdl(_MemoryDescriptorList, \
8245 _BaseVa, \
8246 _Length) \
8247 { \
8248 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
8249 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
8250 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
8251 (_MemoryDescriptorList)->MdlFlags = 0; \
8252 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
8253 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
8254 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
8255 }
8256
8257 /*
8258 * VOID
8259 * MmPrepareMdlForReuse(
8260 * IN PMDL Mdl)
8261 */
8262 #define MmPrepareMdlForReuse(_Mdl) \
8263 { \
8264 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8265 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8266 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8267 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8268 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8269 } \
8270 }
8271
8272 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8273
8274 NTKERNELAPI
8275 PVOID
8276 NTAPI
8277 MmAllocateContiguousMemory(
8278 IN SIZE_T NumberOfBytes,
8279 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
8280
8281 NTKERNELAPI
8282 PVOID
8283 NTAPI
8284 MmAllocateContiguousMemorySpecifyCache(
8285 IN SIZE_T NumberOfBytes,
8286 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
8287 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
8288 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
8289 IN MEMORY_CACHING_TYPE CacheType);
8290
8291 NTKERNELAPI
8292 PMDL
8293 NTAPI
8294 MmAllocatePagesForMdl(
8295 IN PHYSICAL_ADDRESS LowAddress,
8296 IN PHYSICAL_ADDRESS HighAddress,
8297 IN PHYSICAL_ADDRESS SkipBytes,
8298 IN SIZE_T TotalBytes);
8299
8300 NTKERNELAPI
8301 VOID
8302 NTAPI
8303 MmBuildMdlForNonPagedPool(
8304 IN OUT PMDLX MemoryDescriptorList);
8305
8306 //DECLSPEC_DEPRECATED_DDK
8307 NTKERNELAPI
8308 PMDL
8309 NTAPI
8310 MmCreateMdl(
8311 IN PMDL MemoryDescriptorList OPTIONAL,
8312 IN PVOID Base,
8313 IN SIZE_T Length);
8314
8315 NTKERNELAPI
8316 VOID
8317 NTAPI
8318 MmFreeContiguousMemory(
8319 IN PVOID BaseAddress);
8320
8321 NTKERNELAPI
8322 VOID
8323 NTAPI
8324 MmFreeContiguousMemorySpecifyCache(
8325 IN PVOID BaseAddress,
8326 IN SIZE_T NumberOfBytes,
8327 IN MEMORY_CACHING_TYPE CacheType);
8328
8329 NTKERNELAPI
8330 VOID
8331 NTAPI
8332 MmFreePagesFromMdl(
8333 IN PMDLX MemoryDescriptorList);
8334
8335 NTKERNELAPI
8336 PVOID
8337 NTAPI
8338 MmGetSystemRoutineAddress(
8339 IN PUNICODE_STRING SystemRoutineName);
8340
8341 NTKERNELAPI
8342 LOGICAL
8343 NTAPI
8344 MmIsDriverVerifying(
8345 IN struct _DRIVER_OBJECT *DriverObject);
8346
8347 NTKERNELAPI
8348 PVOID
8349 NTAPI
8350 MmLockPagableDataSection(
8351 IN PVOID AddressWithinSection);
8352
8353 NTKERNELAPI
8354 PVOID
8355 NTAPI
8356 MmMapIoSpace(
8357 IN PHYSICAL_ADDRESS PhysicalAddress,
8358 IN SIZE_T NumberOfBytes,
8359 IN MEMORY_CACHING_TYPE CacheEnable);
8360
8361 NTKERNELAPI
8362 PVOID
8363 NTAPI
8364 MmMapLockedPages(
8365 IN PMDL MemoryDescriptorList,
8366 IN KPROCESSOR_MODE AccessMode);
8367
8368 NTKERNELAPI
8369 PVOID
8370 NTAPI
8371 MmMapLockedPagesSpecifyCache(
8372 IN PMDLX MemoryDescriptorList,
8373 IN KPROCESSOR_MODE AccessMode,
8374 IN MEMORY_CACHING_TYPE CacheType,
8375 IN PVOID BaseAddress OPTIONAL,
8376 IN ULONG BugCheckOnFailure,
8377 IN MM_PAGE_PRIORITY Priority);
8378
8379 NTKERNELAPI
8380 PVOID
8381 NTAPI
8382 MmPageEntireDriver(
8383 IN PVOID AddressWithinSection);
8384
8385 NTKERNELAPI
8386 VOID
8387 NTAPI
8388 MmProbeAndLockPages(
8389 IN OUT PMDL MemoryDescriptorList,
8390 IN KPROCESSOR_MODE AccessMode,
8391 IN LOCK_OPERATION Operation);
8392
8393 NTKERNELAPI
8394 MM_SYSTEMSIZE
8395 NTAPI
8396 MmQuerySystemSize(VOID);
8397
8398 NTKERNELAPI
8399 VOID
8400 NTAPI
8401 MmResetDriverPaging(
8402 IN PVOID AddressWithinSection);
8403
8404 NTKERNELAPI
8405 SIZE_T
8406 NTAPI
8407 MmSizeOfMdl(
8408 IN PVOID Base,
8409 IN SIZE_T Length);
8410
8411 NTKERNELAPI
8412 VOID
8413 NTAPI
8414 MmUnlockPagableImageSection(
8415 IN PVOID ImageSectionHandle);
8416
8417 NTKERNELAPI
8418 VOID
8419 NTAPI
8420 MmUnlockPages(
8421 IN OUT PMDL MemoryDescriptorList);
8422
8423 NTKERNELAPI
8424 VOID
8425 NTAPI
8426 MmUnmapIoSpace(
8427 IN PVOID BaseAddress,
8428 IN SIZE_T NumberOfBytes);
8429
8430 NTKERNELAPI
8431 VOID
8432 NTAPI
8433 MmProbeAndLockProcessPages(
8434 IN OUT PMDL MemoryDescriptorList,
8435 IN PEPROCESS Process,
8436 IN KPROCESSOR_MODE AccessMode,
8437 IN LOCK_OPERATION Operation);
8438
8439 NTKERNELAPI
8440 VOID
8441 NTAPI
8442 MmUnmapLockedPages(
8443 IN PVOID BaseAddress,
8444 IN PMDL MemoryDescriptorList);
8445
8446
8447
8448 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8449
8450 #if (NTDDI_VERSION >= NTDDI_WINXP)
8451
8452 NTKERNELAPI
8453 NTSTATUS
8454 NTAPI
8455 MmAdvanceMdl(
8456 IN OUT PMDL Mdl,
8457 IN ULONG NumberOfBytes);
8458
8459 NTKERNELAPI
8460 PVOID
8461 NTAPI
8462 MmAllocateMappingAddress(
8463 IN SIZE_T NumberOfBytes,
8464 IN ULONG PoolTag);
8465
8466 NTKERNELAPI
8467 VOID
8468 NTAPI
8469 MmFreeMappingAddress(
8470 IN PVOID BaseAddress,
8471 IN ULONG PoolTag);
8472
8473 NTKERNELAPI
8474 NTSTATUS
8475 NTAPI
8476 MmIsVerifierEnabled(
8477 OUT PULONG VerifierFlags);
8478
8479 NTKERNELAPI
8480 PVOID
8481 NTAPI
8482 MmMapLockedPagesWithReservedMapping(
8483 IN PVOID MappingAddress,
8484 IN ULONG PoolTag,
8485 IN PMDL MemoryDescriptorList,
8486 IN MEMORY_CACHING_TYPE CacheType);
8487
8488 NTKERNELAPI
8489 NTSTATUS
8490 NTAPI
8491 MmProtectMdlSystemAddress(
8492 IN PMDL MemoryDescriptorList,
8493 IN ULONG NewProtect);
8494
8495 NTKERNELAPI
8496 VOID
8497 NTAPI
8498 MmUnmapReservedMapping(
8499 IN PVOID BaseAddress,
8500 IN ULONG PoolTag,
8501 IN PMDL MemoryDescriptorList);
8502
8503 #endif
8504
8505 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8506 NTKERNELAPI
8507 PMDL
8508 NTAPI
8509 MmAllocatePagesForMdlEx(
8510 IN PHYSICAL_ADDRESS LowAddress,
8511 IN PHYSICAL_ADDRESS HighAddress,
8512 IN PHYSICAL_ADDRESS SkipBytes,
8513 IN SIZE_T TotalBytes,
8514 IN MEMORY_CACHING_TYPE CacheType,
8515 IN ULONG Flags);
8516 #endif
8517
8518 #if (NTDDI_VERSION >= NTDDI_VISTA)
8519
8520 NTKERNELAPI
8521 LOGICAL
8522 NTAPI
8523 MmIsDriverVerifyingByAddress(
8524 IN PVOID AddressWithinSection);
8525 #endif
8526
8527 /******************************************************************************
8528 * Security Manager Functions *
8529 ******************************************************************************/
8530
8531 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8532
8533 NTKERNELAPI
8534 BOOLEAN
8535 NTAPI
8536 SeAccessCheck(
8537 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8538 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
8539 IN BOOLEAN SubjectContextLocked,
8540 IN ACCESS_MASK DesiredAccess,
8541 IN ACCESS_MASK PreviouslyGrantedAccess,
8542 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
8543 IN PGENERIC_MAPPING GenericMapping,
8544 IN KPROCESSOR_MODE AccessMode,
8545 OUT PACCESS_MASK GrantedAccess,
8546 OUT PNTSTATUS AccessStatus);
8547
8548 NTKERNELAPI
8549 NTSTATUS
8550 NTAPI
8551 SeAssignSecurity(
8552 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8553 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8554 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8555 IN BOOLEAN IsDirectoryObject,
8556 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8557 IN PGENERIC_MAPPING GenericMapping,
8558 IN POOL_TYPE PoolType);
8559
8560 NTKERNELAPI
8561 NTSTATUS
8562 NTAPI
8563 SeAssignSecurityEx(
8564 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
8565 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
8566 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
8567 IN GUID *ObjectType OPTIONAL,
8568 IN BOOLEAN IsDirectoryObject,
8569 IN ULONG AutoInheritFlags,
8570 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
8571 IN PGENERIC_MAPPING GenericMapping,
8572 IN POOL_TYPE PoolType);
8573
8574 NTKERNELAPI
8575 NTSTATUS
8576 NTAPI
8577 SeDeassignSecurity(
8578 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
8579
8580 NTKERNELAPI
8581 BOOLEAN
8582 NTAPI
8583 SeValidSecurityDescriptor(
8584 IN ULONG Length,
8585 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8586
8587 NTKERNELAPI
8588 ULONG
8589 NTAPI
8590 SeObjectCreateSaclAccessBits(
8591 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8592
8593 NTKERNELAPI
8594 VOID
8595 NTAPI
8596 SeReleaseSubjectContext(
8597 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
8598
8599 NTKERNELAPI
8600 VOID
8601 NTAPI
8602 SeUnlockSubjectContext(
8603 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
8604
8605 NTKERNELAPI
8606 VOID
8607 NTAPI
8608 SeCaptureSubjectContext(
8609 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
8610
8611 NTKERNELAPI
8612 VOID
8613 NTAPI
8614 SeLockSubjectContext(
8615 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
8616
8617 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8618
8619 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8620
8621 NTSTATUS
8622 NTAPI
8623 SeSetAuditParameter(
8624 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
8625 IN SE_ADT_PARAMETER_TYPE Type,
8626 IN ULONG Index,
8627 IN PVOID Data);
8628
8629 NTSTATUS
8630 NTAPI
8631 SeReportSecurityEvent(
8632 IN ULONG Flags,
8633 IN PUNICODE_STRING SourceName,
8634 IN PSID UserSid OPTIONAL,
8635 IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
8636
8637 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
8638
8639 #if (NTDDI_VERSION >= NTDDI_VISTA)
8640
8641 NTKERNELAPI
8642 ULONG
8643 NTAPI
8644 SeComputeAutoInheritByObjectType(
8645 IN PVOID ObjectType,
8646 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
8647 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
8648
8649 #ifdef SE_NTFS_WORLD_CACHE
8650 VOID
8651 NTAPI
8652 SeGetWorldRights(
8653 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
8654 IN PGENERIC_MAPPING GenericMapping,
8655 OUT PACCESS_MASK GrantedAccess);
8656 #endif /* SE_NTFS_WORLD_CACHE */
8657
8658 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8659 /******************************************************************************
8660 * Configuration Manager Functions *
8661 ******************************************************************************/
8662
8663 #if (NTDDI_VERSION >= NTDDI_WINXP)
8664 NTKERNELAPI
8665 NTSTATUS
8666 NTAPI
8667 CmRegisterCallback(
8668 IN PEX_CALLBACK_FUNCTION Function,
8669 IN PVOID Context OPTIONAL,
8670 OUT PLARGE_INTEGER Cookie);
8671
8672 NTKERNELAPI
8673 NTSTATUS
8674 NTAPI
8675 CmUnRegisterCallback(
8676 IN LARGE_INTEGER Cookie);
8677 #endif
8678
8679 #if (NTDDI_VERSION >= NTDDI_VISTA)
8680
8681 NTKERNELAPI
8682 NTSTATUS
8683 NTAPI
8684 CmRegisterCallbackEx(
8685 PEX_CALLBACK_FUNCTION Function,
8686 PCUNICODE_STRING Altitude,
8687 PVOID Driver,
8688 PVOID Context,
8689 PLARGE_INTEGER Cookie,
8690 PVOID Reserved);
8691
8692 NTKERNELAPI
8693 VOID
8694 NTAPI
8695 CmGetCallbackVersion(
8696 OUT PULONG Major OPTIONAL,
8697 OUT PULONG Minor OPTIONAL);
8698
8699 NTKERNELAPI
8700 NTSTATUS
8701 NTAPI
8702 CmSetCallbackObjectContext(
8703 IN OUT PVOID Object,
8704 IN PLARGE_INTEGER Cookie,
8705 IN PVOID NewContext,
8706 OUT PVOID *OldContext OPTIONAL);
8707
8708 NTKERNELAPI
8709 NTSTATUS
8710 NTAPI
8711 CmCallbackGetKeyObjectID(
8712 IN PLARGE_INTEGER Cookie,
8713 IN PVOID Object,
8714 OUT PULONG_PTR ObjectID OPTIONAL,
8715 OUT PCUNICODE_STRING *ObjectName OPTIONAL);
8716
8717 NTKERNELAPI
8718 PVOID
8719 NTAPI
8720 CmGetBoundTransaction(
8721 IN PLARGE_INTEGER Cookie,
8722 IN PVOID Object);
8723
8724 #endif // NTDDI_VERSION >= NTDDI_VISTA
8725
8726
8727 /******************************************************************************
8728 * I/O Manager Functions *
8729 ******************************************************************************/
8730
8731 #if !defined(_M_AMD64)
8732 NTHALAPI
8733 VOID
8734 NTAPI
8735 READ_PORT_BUFFER_UCHAR(
8736 IN PUCHAR Port,
8737 IN PUCHAR Buffer,
8738 IN ULONG Count);
8739
8740 NTHALAPI
8741 VOID
8742 NTAPI
8743 READ_PORT_BUFFER_ULONG(
8744 IN PULONG Port,
8745 IN PULONG Buffer,
8746 IN ULONG Count);
8747
8748 NTHALAPI
8749 VOID
8750 NTAPI
8751 READ_PORT_BUFFER_USHORT(
8752 IN PUSHORT Port,
8753 IN PUSHORT Buffer,
8754 IN ULONG Count);
8755
8756 NTHALAPI
8757 UCHAR
8758 NTAPI
8759 READ_PORT_UCHAR(
8760 IN PUCHAR Port);
8761
8762 NTHALAPI
8763 ULONG
8764 NTAPI
8765 READ_PORT_ULONG(
8766 IN PULONG Port);
8767
8768 NTHALAPI
8769 USHORT
8770 NTAPI
8771 READ_PORT_USHORT(
8772 IN PUSHORT Port);
8773
8774 NTKERNELAPI
8775 VOID
8776 NTAPI
8777 READ_REGISTER_BUFFER_UCHAR(
8778 IN PUCHAR Register,
8779 IN PUCHAR Buffer,
8780 IN ULONG Count);
8781
8782 NTKERNELAPI
8783 VOID
8784 NTAPI
8785 READ_REGISTER_BUFFER_ULONG(
8786 IN PULONG Register,
8787 IN PULONG Buffer,
8788 IN ULONG Count);
8789
8790 NTKERNELAPI
8791 VOID
8792 NTAPI
8793 READ_REGISTER_BUFFER_USHORT(
8794 IN PUSHORT Register,
8795 IN PUSHORT Buffer,
8796 IN ULONG Count);
8797
8798 NTKERNELAPI
8799 UCHAR
8800 NTAPI
8801 READ_REGISTER_UCHAR(
8802 IN PUCHAR Register);
8803
8804 NTKERNELAPI
8805 ULONG
8806 NTAPI
8807 READ_REGISTER_ULONG(
8808 IN PULONG Register);
8809
8810 NTKERNELAPI
8811 USHORT
8812 NTAPI
8813 READ_REGISTER_USHORT(
8814 IN PUSHORT Register);
8815
8816 NTHALAPI
8817 VOID
8818 NTAPI
8819 WRITE_PORT_BUFFER_UCHAR(
8820 IN PUCHAR Port,
8821 IN PUCHAR Buffer,
8822 IN ULONG Count);
8823
8824 NTHALAPI
8825 VOID
8826 NTAPI
8827 WRITE_PORT_BUFFER_ULONG(
8828 IN PULONG Port,
8829 IN PULONG Buffer,
8830 IN ULONG Count);
8831
8832 NTHALAPI
8833 VOID
8834 NTAPI
8835 WRITE_PORT_BUFFER_USHORT(
8836 IN PUSHORT Port,
8837 IN PUSHORT Buffer,
8838 IN ULONG Count);
8839
8840 NTHALAPI
8841 VOID
8842 NTAPI
8843 WRITE_PORT_UCHAR(
8844 IN PUCHAR Port,
8845 IN UCHAR Value);
8846
8847 NTHALAPI
8848 VOID
8849 NTAPI
8850 WRITE_PORT_ULONG(
8851 IN PULONG Port,
8852 IN ULONG Value);
8853
8854 NTHALAPI
8855 VOID
8856 NTAPI
8857 WRITE_PORT_USHORT(
8858 IN PUSHORT Port,
8859 IN USHORT Value);
8860
8861 NTKERNELAPI
8862 VOID
8863 NTAPI
8864 WRITE_REGISTER_BUFFER_UCHAR(
8865 IN PUCHAR Register,
8866 IN PUCHAR Buffer,
8867 IN ULONG Count);
8868
8869 NTKERNELAPI
8870 VOID
8871 NTAPI
8872 WRITE_REGISTER_BUFFER_ULONG(
8873 IN PULONG Register,
8874 IN PULONG Buffer,
8875 IN ULONG Count);
8876
8877 NTKERNELAPI
8878 VOID
8879 NTAPI
8880 WRITE_REGISTER_BUFFER_USHORT(
8881 IN PUSHORT Register,
8882 IN PUSHORT Buffer,
8883 IN ULONG Count);
8884
8885 NTKERNELAPI
8886 VOID
8887 NTAPI
8888 WRITE_REGISTER_UCHAR(
8889 IN PUCHAR Register,
8890 IN UCHAR Value);
8891
8892 NTKERNELAPI
8893 VOID
8894 NTAPI
8895 WRITE_REGISTER_ULONG(
8896 IN PULONG Register,
8897 IN ULONG Value);
8898
8899 NTKERNELAPI
8900 VOID
8901 NTAPI
8902 WRITE_REGISTER_USHORT(
8903 IN PUSHORT Register,
8904 IN USHORT Value);
8905
8906 #else
8907
8908 FORCEINLINE
8909 VOID
8910 READ_PORT_BUFFER_UCHAR(
8911 IN PUCHAR Port,
8912 IN PUCHAR Buffer,
8913 IN ULONG Count)
8914 {
8915 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
8916 }
8917
8918 FORCEINLINE
8919 VOID
8920 READ_PORT_BUFFER_ULONG(
8921 IN PULONG Port,
8922 IN PULONG Buffer,
8923 IN ULONG Count)
8924 {
8925 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
8926 }
8927
8928 FORCEINLINE
8929 VOID
8930 READ_PORT_BUFFER_USHORT(
8931 IN PUSHORT Port,
8932 IN PUSHORT Buffer,
8933 IN ULONG Count)
8934 {
8935 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
8936 }
8937
8938 FORCEINLINE
8939 UCHAR
8940 READ_PORT_UCHAR(
8941 IN PUCHAR Port)
8942 {
8943 return __inbyte((USHORT)(ULONG_PTR)Port);
8944 }
8945
8946 FORCEINLINE
8947 ULONG
8948 READ_PORT_ULONG(
8949 IN PULONG Port)
8950 {
8951 return __indword((USHORT)(ULONG_PTR)Port);
8952 }
8953
8954 FORCEINLINE
8955 USHORT
8956 READ_PORT_USHORT(
8957 IN PUSHORT Port)
8958 {
8959 return __inword((USHORT)(ULONG_PTR)Port);
8960 }
8961
8962 FORCEINLINE
8963 VOID
8964 READ_REGISTER_BUFFER_UCHAR(
8965 IN PUCHAR Register,
8966 IN PUCHAR Buffer,
8967 IN ULONG Count)
8968 {
8969 __movsb(Register, Buffer, Count);
8970 }
8971
8972 FORCEINLINE
8973 VOID
8974 READ_REGISTER_BUFFER_ULONG(
8975 IN PULONG Register,
8976 IN PULONG Buffer,
8977 IN ULONG Count)
8978 {
8979 __movsd(Register, Buffer, Count);
8980 }
8981
8982 FORCEINLINE
8983 VOID
8984 READ_REGISTER_BUFFER_USHORT(
8985 IN PUSHORT Register,
8986 IN PUSHORT Buffer,
8987 IN ULONG Count)
8988 {
8989 __movsw(Register, Buffer, Count);
8990 }
8991
8992 FORCEINLINE
8993 UCHAR
8994 READ_REGISTER_UCHAR(
8995 IN volatile UCHAR *Register)
8996 {
8997 return *Register;
8998 }
8999
9000 FORCEINLINE
9001 ULONG
9002 READ_REGISTER_ULONG(
9003 IN volatile ULONG *Register)
9004 {
9005 return *Register;
9006 }
9007
9008 FORCEINLINE
9009 USHORT
9010 READ_REGISTER_USHORT(
9011 IN volatile USHORT *Register)
9012 {
9013 return *Register;
9014 }
9015
9016 FORCEINLINE
9017 VOID
9018 WRITE_PORT_BUFFER_UCHAR(
9019 IN PUCHAR Port,
9020 IN PUCHAR Buffer,
9021 IN ULONG Count)
9022 {
9023 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9024 }
9025
9026 FORCEINLINE
9027 VOID
9028 WRITE_PORT_BUFFER_ULONG(
9029 IN PULONG Port,
9030 IN PULONG Buffer,
9031 IN ULONG Count)
9032 {
9033 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9034 }
9035
9036 FORCEINLINE
9037 VOID
9038 WRITE_PORT_BUFFER_USHORT(
9039 IN PUSHORT Port,
9040 IN PUSHORT Buffer,
9041 IN ULONG Count)
9042 {
9043 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
9044 }
9045
9046 FORCEINLINE
9047 VOID
9048 WRITE_PORT_UCHAR(
9049 IN PUCHAR Port,
9050 IN UCHAR Value)
9051 {
9052 __outbyte((USHORT)(ULONG_PTR)Port, Value);
9053 }
9054
9055 FORCEINLINE
9056 VOID
9057 WRITE_PORT_ULONG(
9058 IN PULONG Port,
9059 IN ULONG Value)
9060 {
9061 __outdword((USHORT)(ULONG_PTR)Port, Value);
9062 }
9063
9064 FORCEINLINE
9065 VOID
9066 WRITE_PORT_USHORT(
9067 IN PUSHORT Port,
9068 IN USHORT Value)
9069 {
9070 __outword((USHORT)(ULONG_PTR)Port, Value);
9071 }
9072
9073 FORCEINLINE
9074 VOID
9075 WRITE_REGISTER_BUFFER_UCHAR(
9076 IN PUCHAR Register,
9077 IN PUCHAR Buffer,
9078 IN ULONG Count)
9079 {
9080 LONG Synch;
9081 __movsb(Register, Buffer, Count);
9082 InterlockedOr(&Synch, 1);
9083 }
9084
9085 FORCEINLINE
9086 VOID
9087 WRITE_REGISTER_BUFFER_ULONG(
9088 IN PULONG Register,
9089 IN PULONG Buffer,
9090 IN ULONG Count)
9091 {
9092 LONG Synch;
9093 __movsd(Register, Buffer, Count);
9094 InterlockedOr(&Synch, 1);
9095 }
9096
9097 FORCEINLINE
9098 VOID
9099 WRITE_REGISTER_BUFFER_USHORT(
9100 IN PUSHORT Register,
9101 IN PUSHORT Buffer,
9102 IN ULONG Count)
9103 {
9104 LONG Synch;
9105 __movsw(Register, Buffer, Count);
9106 InterlockedOr(&Synch, 1);
9107 }
9108
9109 FORCEINLINE
9110 VOID
9111 WRITE_REGISTER_UCHAR(
9112 IN volatile UCHAR *Register,
9113 IN UCHAR Value)
9114 {
9115 LONG Synch;
9116 *Register = Value;
9117 InterlockedOr(&Synch, 1);
9118 }
9119
9120 FORCEINLINE
9121 VOID
9122 WRITE_REGISTER_ULONG(
9123 IN volatile ULONG *Register,
9124 IN ULONG Value)
9125 {
9126 LONG Synch;
9127 *Register = Value;
9128 InterlockedOr(&Synch, 1);
9129 }
9130
9131 FORCEINLINE
9132 VOID
9133 WRITE_REGISTER_USHORT(
9134 IN volatile USHORT *Register,
9135 IN USHORT Value)
9136 {
9137 LONG Sync;
9138 *Register = Value;
9139 InterlockedOr(&Sync, 1);
9140 }
9141 #endif
9142
9143 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
9144 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
9145
9146 #define DMA_MACROS_DEFINED
9147
9148 FORCEINLINE
9149 NTSTATUS
9150 IoAllocateAdapterChannel(
9151 IN PDMA_ADAPTER DmaAdapter,
9152 IN PDEVICE_OBJECT DeviceObject,
9153 IN ULONG NumberOfMapRegisters,
9154 IN PDRIVER_CONTROL ExecutionRoutine,
9155 IN PVOID Context)
9156 {
9157 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
9158 AllocateAdapterChannel =
9159 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
9160 ASSERT(AllocateAdapterChannel);
9161 return AllocateAdapterChannel(DmaAdapter,
9162 DeviceObject,
9163 NumberOfMapRegisters,
9164 ExecutionRoutine,
9165 Context );
9166 }
9167
9168 FORCEINLINE
9169 BOOLEAN
9170 NTAPI
9171 IoFlushAdapterBuffers(
9172 IN PDMA_ADAPTER DmaAdapter,
9173 IN PMDL Mdl,
9174 IN PVOID MapRegisterBase,
9175 IN PVOID CurrentVa,
9176 IN ULONG Length,
9177 IN BOOLEAN WriteToDevice)
9178 {
9179 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
9180 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
9181 ASSERT(FlushAdapterBuffers);
9182 return FlushAdapterBuffers(DmaAdapter,
9183 Mdl,
9184 MapRegisterBase,
9185 CurrentVa,
9186 Length,
9187 WriteToDevice);
9188 }
9189
9190 FORCEINLINE
9191 VOID
9192 NTAPI
9193 IoFreeAdapterChannel(
9194 IN PDMA_ADAPTER DmaAdapter)
9195 {
9196 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
9197 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
9198 ASSERT(FreeAdapterChannel);
9199 FreeAdapterChannel(DmaAdapter);
9200 }
9201
9202 FORCEINLINE
9203 VOID
9204 NTAPI
9205 IoFreeMapRegisters(
9206 IN PDMA_ADAPTER DmaAdapter,
9207 IN PVOID MapRegisterBase,
9208 IN ULONG NumberOfMapRegisters)
9209 {
9210 PFREE_MAP_REGISTERS FreeMapRegisters;
9211 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
9212 ASSERT(FreeMapRegisters);
9213 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
9214 }
9215
9216 FORCEINLINE
9217 PHYSICAL_ADDRESS
9218 NTAPI
9219 IoMapTransfer(
9220 IN PDMA_ADAPTER DmaAdapter,
9221 IN PMDL Mdl,
9222 IN PVOID MapRegisterBase,
9223 IN PVOID CurrentVa,
9224 IN OUT PULONG Length,
9225 IN BOOLEAN WriteToDevice)
9226 {
9227 PMAP_TRANSFER MapTransfer;
9228
9229 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
9230 ASSERT(MapTransfer);
9231 return MapTransfer(DmaAdapter,
9232 Mdl,
9233 MapRegisterBase,
9234 CurrentVa,
9235 Length,
9236 WriteToDevice);
9237 }
9238 #endif
9239
9240 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9241
9242 NTKERNELAPI
9243 VOID
9244 NTAPI
9245 IoAcquireCancelSpinLock(
9246 OUT PKIRQL Irql);
9247
9248 NTKERNELAPI
9249 NTSTATUS
9250 NTAPI
9251 IoAcquireRemoveLockEx(
9252 IN PIO_REMOVE_LOCK RemoveLock,
9253 IN PVOID Tag OPTIONAL,
9254 IN PCSTR File,
9255 IN ULONG Line,
9256 IN ULONG RemlockSize);
9257 #endif
9258
9259 /*
9260 * NTSTATUS
9261 * IoAcquireRemoveLock(
9262 * IN PIO_REMOVE_LOCK RemoveLock,
9263 * IN OPTIONAL PVOID Tag)
9264 */
9265 #if DBG
9266 #define IoAcquireRemoveLock(RemoveLock, Tag) \
9267 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
9268 #else
9269 #define IoAcquireRemoveLock(RemoveLock, Tag) \
9270 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
9271 #endif
9272
9273 /*
9274 * VOID
9275 * IoAdjustPagingPathCount(
9276 * IN PLONG Count,
9277 * IN BOOLEAN Increment)
9278 */
9279 #define IoAdjustPagingPathCount(_Count, \
9280 _Increment) \
9281 { \
9282 if (_Increment) \
9283 { \
9284 InterlockedIncrement(_Count); \
9285 } \
9286 else \
9287 { \
9288 InterlockedDecrement(_Count); \
9289 } \
9290 }
9291
9292 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9293
9294 NTKERNELAPI
9295 NTSTATUS
9296 NTAPI
9297 IoAllocateDriverObjectExtension(
9298 IN PDRIVER_OBJECT DriverObject,
9299 IN PVOID ClientIdentificationAddress,
9300 IN ULONG DriverObjectExtensionSize,
9301 OUT PVOID *DriverObjectExtension);
9302
9303 NTKERNELAPI
9304 PVOID
9305 NTAPI
9306 IoAllocateErrorLogEntry(
9307 IN PVOID IoObject,
9308 IN UCHAR EntrySize);
9309
9310 NTKERNELAPI
9311 PIRP
9312 NTAPI
9313 IoAllocateIrp(
9314 IN CCHAR StackSize,
9315 IN BOOLEAN ChargeQuota);
9316
9317 NTKERNELAPI
9318 PMDL
9319 NTAPI
9320 IoAllocateMdl(
9321 IN PVOID VirtualAddress OPTIONAL,
9322 IN ULONG Length,
9323 IN BOOLEAN SecondaryBuffer,
9324 IN BOOLEAN ChargeQuota,
9325 IN OUT PIRP Irp OPTIONAL);
9326
9327 NTKERNELAPI
9328 PIO_WORKITEM
9329 NTAPI
9330 IoAllocateWorkItem(
9331 IN PDEVICE_OBJECT DeviceObject);
9332
9333 NTKERNELAPI
9334 NTSTATUS
9335 NTAPI
9336 IoAttachDevice(
9337 IN PDEVICE_OBJECT SourceDevice,
9338 IN PUNICODE_STRING TargetDevice,
9339 OUT PDEVICE_OBJECT *AttachedDevice);
9340
9341 NTKERNELAPI
9342 PDEVICE_OBJECT
9343 NTAPI
9344 IoAttachDeviceToDeviceStack(
9345 IN PDEVICE_OBJECT SourceDevice,
9346 IN PDEVICE_OBJECT TargetDevice);
9347
9348 NTKERNELAPI
9349 PIRP
9350 NTAPI
9351 IoBuildAsynchronousFsdRequest(
9352 IN ULONG MajorFunction,
9353 IN PDEVICE_OBJECT DeviceObject,
9354 IN OUT PVOID Buffer OPTIONAL,
9355 IN ULONG Length OPTIONAL,
9356 IN PLARGE_INTEGER StartingOffset OPTIONAL,
9357 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
9358
9359 NTKERNELAPI
9360 PIRP
9361 NTAPI
9362 IoBuildDeviceIoControlRequest(
9363 IN ULONG IoControlCode,
9364 IN PDEVICE_OBJECT DeviceObject,
9365 IN PVOID InputBuffer OPTIONAL,
9366 IN ULONG InputBufferLength,
9367 OUT PVOID OutputBuffer OPTIONAL,
9368 IN ULONG OutputBufferLength,
9369 IN BOOLEAN InternalDeviceIoControl,
9370 IN PKEVENT Event,
9371 OUT PIO_STATUS_BLOCK IoStatusBlock);
9372
9373 NTKERNELAPI
9374 VOID
9375 NTAPI
9376 IoBuildPartialMdl(
9377 IN PMDL SourceMdl,
9378 IN OUT PMDL TargetMdl,
9379 IN PVOID VirtualAddress,
9380 IN ULONG Length);
9381
9382 NTKERNELAPI
9383 PIRP
9384 NTAPI
9385 IoBuildSynchronousFsdRequest(
9386 IN ULONG MajorFunction,
9387 IN PDEVICE_OBJECT DeviceObject,
9388 IN OUT PVOID Buffer OPTIONAL,
9389 IN ULONG Length OPTIONAL,
9390 IN PLARGE_INTEGER StartingOffset OPTIONAL,
9391 IN PKEVENT Event,
9392 OUT PIO_STATUS_BLOCK IoStatusBlock);
9393
9394 NTKERNELAPI
9395 NTSTATUS
9396 FASTCALL
9397 IofCallDriver(
9398 IN PDEVICE_OBJECT DeviceObject,
9399 IN OUT PIRP Irp);
9400 #define IoCallDriver IofCallDriver
9401
9402 NTKERNELAPI
9403 VOID
9404 FASTCALL
9405 IofCompleteRequest(
9406 IN PIRP Irp,
9407 IN CCHAR PriorityBoost);
9408 #define IoCompleteRequest IofCompleteRequest
9409
9410 NTKERNELAPI
9411 BOOLEAN
9412 NTAPI
9413 IoCancelIrp(
9414 IN PIRP Irp);
9415
9416 NTKERNELAPI
9417 NTSTATUS
9418 NTAPI
9419 IoCheckShareAccess(
9420 IN ACCESS_MASK DesiredAccess,
9421 IN ULONG DesiredShareAccess,
9422 IN OUT PFILE_OBJECT FileObject,
9423 IN OUT PSHARE_ACCESS ShareAccess,
9424 IN BOOLEAN Update);
9425
9426 NTKERNELAPI
9427 VOID
9428 FASTCALL
9429 IofCompleteRequest(
9430 IN PIRP Irp,
9431 IN CCHAR PriorityBoost);
9432
9433 NTKERNELAPI
9434 NTSTATUS
9435 NTAPI
9436 IoConnectInterrupt(
9437 OUT PKINTERRUPT *InterruptObject,
9438 IN PKSERVICE_ROUTINE ServiceRoutine,
9439 IN PVOID ServiceContext OPTIONAL,
9440 IN PKSPIN_LOCK SpinLock OPTIONAL,
9441 IN ULONG Vector,
9442 IN KIRQL Irql,
9443 IN KIRQL SynchronizeIrql,
9444 IN KINTERRUPT_MODE InterruptMode,
9445 IN BOOLEAN ShareVector,
9446 IN KAFFINITY ProcessorEnableMask,
9447 IN BOOLEAN FloatingSave);
9448
9449 NTKERNELAPI
9450 NTSTATUS
9451 NTAPI
9452 IoCreateDevice(
9453 IN PDRIVER_OBJECT DriverObject,
9454 IN ULONG DeviceExtensionSize,
9455 IN PUNICODE_STRING DeviceName OPTIONAL,
9456 IN DEVICE_TYPE DeviceType,
9457 IN ULONG DeviceCharacteristics,
9458 IN BOOLEAN Exclusive,
9459 OUT PDEVICE_OBJECT *DeviceObject);
9460
9461 NTKERNELAPI
9462 NTSTATUS
9463 NTAPI
9464 IoCreateFile(
9465 OUT PHANDLE FileHandle,
9466 IN ACCESS_MASK DesiredAccess,
9467 IN POBJECT_ATTRIBUTES ObjectAttributes,
9468 OUT PIO_STATUS_BLOCK IoStatusBlock,
9469 IN PLARGE_INTEGER AllocationSize OPTIONAL,
9470 IN ULONG FileAttributes,
9471 IN ULONG ShareAccess,
9472 IN ULONG Disposition,
9473 IN ULONG CreateOptions,
9474 IN PVOID EaBuffer OPTIONAL,
9475 IN ULONG EaLength,
9476 IN CREATE_FILE_TYPE CreateFileType,
9477 IN PVOID InternalParameters OPTIONAL,
9478 IN ULONG Options);
9479
9480 NTKERNELAPI
9481 PKEVENT
9482 NTAPI
9483 IoCreateNotificationEvent(
9484 IN PUNICODE_STRING EventName,
9485 OUT PHANDLE EventHandle);
9486
9487 NTKERNELAPI
9488 NTSTATUS
9489 NTAPI
9490 IoCreateSymbolicLink(
9491 IN PUNICODE_STRING SymbolicLinkName,
9492 IN PUNICODE_STRING DeviceName);
9493
9494 NTKERNELAPI
9495 PKEVENT
9496 NTAPI
9497 IoCreateSynchronizationEvent(
9498 IN PUNICODE_STRING EventName,
9499 OUT PHANDLE EventHandle);
9500
9501 NTKERNELAPI
9502 NTSTATUS
9503 NTAPI
9504 IoCreateUnprotectedSymbolicLink(
9505 IN PUNICODE_STRING SymbolicLinkName,
9506 IN PUNICODE_STRING DeviceName);
9507
9508 NTKERNELAPI
9509 VOID
9510 NTAPI
9511 IoDeleteDevice(
9512 IN PDEVICE_OBJECT DeviceObject);
9513
9514 NTKERNELAPI
9515 NTSTATUS
9516 NTAPI
9517 IoDeleteSymbolicLink(
9518 IN PUNICODE_STRING SymbolicLinkName);
9519
9520 NTKERNELAPI
9521 VOID
9522 NTAPI
9523 IoDetachDevice(
9524 IN OUT PDEVICE_OBJECT TargetDevice);
9525
9526 NTKERNELAPI
9527 VOID
9528 NTAPI
9529 IoDisconnectInterrupt(
9530 IN PKINTERRUPT InterruptObject);
9531
9532 NTKERNELAPI
9533 VOID
9534 NTAPI
9535 IoFreeIrp(
9536 IN PIRP Irp);
9537
9538 NTKERNELAPI
9539 VOID
9540 NTAPI
9541 IoFreeMdl(
9542 IN PMDL Mdl);
9543
9544 NTKERNELAPI
9545 VOID
9546 NTAPI
9547 IoFreeWorkItem(
9548 IN PIO_WORKITEM IoWorkItem);
9549
9550 NTKERNELAPI
9551 PDEVICE_OBJECT
9552 NTAPI
9553 IoGetAttachedDevice(
9554 IN PDEVICE_OBJECT DeviceObject);
9555
9556 NTKERNELAPI
9557 PDEVICE_OBJECT
9558 NTAPI
9559 IoGetAttachedDeviceReference(
9560 IN PDEVICE_OBJECT DeviceObject);
9561
9562 NTKERNELAPI
9563 NTSTATUS
9564 NTAPI
9565 IoGetBootDiskInformation(
9566 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
9567 IN ULONG Size);
9568
9569 NTKERNELAPI
9570 NTSTATUS
9571 NTAPI
9572 IoGetDeviceInterfaceAlias(
9573 IN PUNICODE_STRING SymbolicLinkName,
9574 IN CONST GUID *AliasInterfaceClassGuid,
9575 OUT PUNICODE_STRING AliasSymbolicLinkName);
9576
9577 NTKERNELAPI
9578 PEPROCESS
9579 NTAPI
9580 IoGetCurrentProcess(VOID);
9581
9582 NTKERNELAPI
9583 NTSTATUS
9584 NTAPI
9585 IoGetDeviceInterfaces(
9586 IN CONST GUID *InterfaceClassGuid,
9587 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
9588 IN ULONG Flags,
9589 OUT PWSTR *SymbolicLinkList);
9590
9591 NTKERNELAPI
9592 NTSTATUS
9593 NTAPI
9594 IoGetDeviceObjectPointer(
9595 IN PUNICODE_STRING ObjectName,
9596 IN ACCESS_MASK DesiredAccess,
9597 OUT PFILE_OBJECT *FileObject,
9598 OUT PDEVICE_OBJECT *DeviceObject);
9599
9600 NTKERNELAPI
9601 NTSTATUS
9602 NTAPI
9603 IoGetDeviceProperty(
9604 IN PDEVICE_OBJECT DeviceObject,
9605 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
9606 IN ULONG BufferLength,
9607 OUT PVOID PropertyBuffer,
9608 OUT PULONG ResultLength);
9609
9610 NTKERNELAPI
9611 PDMA_ADAPTER
9612 NTAPI
9613 IoGetDmaAdapter(
9614 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
9615 IN PDEVICE_DESCRIPTION DeviceDescription,
9616 IN OUT PULONG NumberOfMapRegisters);
9617
9618 NTKERNELAPI
9619 PVOID
9620 NTAPI
9621 IoGetDriverObjectExtension(
9622 IN PDRIVER_OBJECT DriverObject,
9623 IN PVOID ClientIdentificationAddress);
9624
9625 NTKERNELAPI
9626 PVOID
9627 NTAPI
9628 IoGetInitialStack(VOID);
9629
9630 NTKERNELAPI
9631 PDEVICE_OBJECT
9632 NTAPI
9633 IoGetRelatedDeviceObject(
9634 IN PFILE_OBJECT FileObject);
9635
9636 NTKERNELAPI
9637 VOID
9638 NTAPI
9639 IoQueueWorkItem(
9640 IN PIO_WORKITEM IoWorkItem,
9641 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
9642 IN WORK_QUEUE_TYPE QueueType,
9643 IN PVOID Context OPTIONAL);
9644
9645 NTKERNELAPI
9646 VOID
9647 NTAPI
9648 IoInitializeIrp(
9649 IN OUT PIRP Irp,
9650 IN USHORT PacketSize,
9651 IN CCHAR StackSize);
9652
9653 NTKERNELAPI
9654 VOID
9655 NTAPI
9656 IoInitializeRemoveLockEx(
9657 IN PIO_REMOVE_LOCK Lock,
9658 IN ULONG AllocateTag,
9659 IN ULONG MaxLockedMinutes,
9660 IN ULONG HighWatermark,
9661 IN ULONG RemlockSize);
9662
9663 NTKERNELAPI
9664 NTSTATUS
9665 NTAPI
9666 IoInitializeTimer(
9667 IN PDEVICE_OBJECT DeviceObject,
9668 IN PIO_TIMER_ROUTINE TimerRoutine,
9669 IN PVOID Context OPTIONAL);
9670
9671 NTKERNELAPI
9672 VOID
9673 NTAPI
9674 IoInvalidateDeviceRelations(
9675 IN PDEVICE_OBJECT DeviceObject,
9676 IN DEVICE_RELATION_TYPE Type);
9677
9678 NTKERNELAPI
9679 VOID
9680 NTAPI
9681 IoInvalidateDeviceState(
9682 IN PDEVICE_OBJECT PhysicalDeviceObject);
9683
9684 NTKERNELAPI
9685 BOOLEAN
9686 NTAPI
9687 IoIsWdmVersionAvailable(
9688 IN UCHAR MajorVersion,
9689 IN UCHAR MinorVersion);
9690
9691 NTKERNELAPI
9692 NTSTATUS
9693 NTAPI
9694 IoOpenDeviceInterfaceRegistryKey(
9695 IN PUNICODE_STRING SymbolicLinkName,
9696 IN ACCESS_MASK DesiredAccess,
9697 OUT PHANDLE DeviceInterfaceKey);
9698
9699 NTKERNELAPI
9700 NTSTATUS
9701 NTAPI
9702 IoOpenDeviceRegistryKey(
9703 IN PDEVICE_OBJECT DeviceObject,
9704 IN ULONG DevInstKeyType,
9705 IN ACCESS_MASK DesiredAccess,
9706 OUT PHANDLE DevInstRegKey);
9707
9708 NTKERNELAPI
9709 NTSTATUS
9710 NTAPI
9711 IoRegisterDeviceInterface(
9712 IN PDEVICE_OBJECT PhysicalDeviceObject,
9713 IN CONST GUID *InterfaceClassGuid,
9714 IN PUNICODE_STRING ReferenceString OPTIONAL,
9715 OUT PUNICODE_STRING SymbolicLinkName);
9716
9717 NTKERNELAPI
9718 NTSTATUS
9719 NTAPI
9720 IoRegisterPlugPlayNotification(
9721 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
9722 IN ULONG EventCategoryFlags,
9723 IN PVOID EventCategoryData OPTIONAL,
9724 IN PDRIVER_OBJECT DriverObject,
9725 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
9726 IN OUT PVOID Context OPTIONAL,
9727 OUT PVOID *NotificationEntry);
9728
9729 NTKERNELAPI
9730 NTSTATUS
9731 NTAPI
9732 IoRegisterShutdownNotification(
9733 IN PDEVICE_OBJECT DeviceObject);
9734
9735 NTKERNELAPI
9736 VOID
9737 NTAPI
9738 IoReleaseCancelSpinLock(
9739 IN KIRQL Irql);
9740
9741 NTKERNELAPI
9742 VOID
9743 NTAPI
9744 IoReleaseRemoveLockAndWaitEx(
9745 IN PIO_REMOVE_LOCK RemoveLock,
9746 IN PVOID Tag OPTIONAL,
9747 IN ULONG RemlockSize);
9748
9749 NTKERNELAPI
9750 VOID
9751 NTAPI
9752 IoReleaseRemoveLockEx(
9753 IN PIO_REMOVE_LOCK RemoveLock,
9754 IN PVOID Tag OPTIONAL,
9755 IN ULONG RemlockSize);
9756
9757 NTKERNELAPI
9758 VOID
9759 NTAPI
9760 IoRemoveShareAccess(
9761 IN PFILE_OBJECT FileObject,
9762 IN OUT PSHARE_ACCESS ShareAccess);
9763
9764 NTKERNELAPI
9765 NTSTATUS
9766 NTAPI
9767 IoReportTargetDeviceChange(
9768 IN PDEVICE_OBJECT PhysicalDeviceObject,
9769 IN PVOID NotificationStructure);
9770
9771 NTKERNELAPI
9772 NTSTATUS
9773 NTAPI
9774 IoReportTargetDeviceChangeAsynchronous(
9775 IN PDEVICE_OBJECT PhysicalDeviceObject,
9776 IN PVOID NotificationStructure,
9777 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
9778 IN PVOID Context OPTIONAL);
9779
9780 NTKERNELAPI
9781 VOID
9782 NTAPI
9783 IoRequestDeviceEject(
9784 IN PDEVICE_OBJECT PhysicalDeviceObject);
9785
9786 NTKERNELAPI
9787 VOID
9788 NTAPI
9789 IoReuseIrp(
9790 IN OUT PIRP Irp,
9791 IN NTSTATUS Status);
9792
9793 NTKERNELAPI
9794 NTSTATUS
9795 NTAPI
9796 IoSetDeviceInterfaceState(
9797 IN PUNICODE_STRING SymbolicLinkName,
9798 IN BOOLEAN Enable);
9799
9800 NTKERNELAPI
9801 VOID
9802 NTAPI
9803 IoSetShareAccess(
9804 IN ACCESS_MASK DesiredAccess,
9805 IN ULONG DesiredShareAccess,
9806 IN OUT PFILE_OBJECT FileObject,
9807 OUT PSHARE_ACCESS ShareAccess);
9808
9809 NTKERNELAPI
9810 VOID
9811 NTAPI
9812 IoStartNextPacket(
9813 IN PDEVICE_OBJECT DeviceObject,
9814 IN BOOLEAN Cancelable);
9815
9816 NTKERNELAPI
9817 VOID
9818 NTAPI
9819 IoStartNextPacketByKey(
9820 IN PDEVICE_OBJECT DeviceObject,
9821 IN BOOLEAN Cancelable,
9822 IN ULONG Key);
9823
9824 NTKERNELAPI
9825 VOID
9826 NTAPI
9827 IoStartPacket(
9828 IN PDEVICE_OBJECT DeviceObject,
9829 IN PIRP Irp,
9830 IN PULONG Key OPTIONAL,
9831 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
9832
9833 NTKERNELAPI
9834 VOID
9835 NTAPI
9836 IoStartTimer(
9837 IN PDEVICE_OBJECT DeviceObject);
9838
9839 NTKERNELAPI
9840 VOID
9841 NTAPI
9842 IoStopTimer(
9843 IN PDEVICE_OBJECT DeviceObject);
9844
9845 NTKERNELAPI
9846 NTSTATUS
9847 NTAPI
9848 IoUnregisterPlugPlayNotification(
9849 IN PVOID NotificationEntry);
9850
9851 NTKERNELAPI
9852 VOID
9853 NTAPI
9854 IoUnregisterShutdownNotification(
9855 IN PDEVICE_OBJECT DeviceObject);
9856
9857 NTKERNELAPI
9858 VOID
9859 NTAPI
9860 IoUpdateShareAccess(
9861 IN PFILE_OBJECT FileObject,
9862 IN OUT PSHARE_ACCESS ShareAccess);
9863
9864 NTKERNELAPI
9865 NTSTATUS
9866 NTAPI
9867 IoWMIAllocateInstanceIds(
9868 IN GUID *Guid,
9869 IN ULONG InstanceCount,
9870 OUT ULONG *FirstInstanceId);
9871
9872 NTKERNELAPI
9873 NTSTATUS
9874 NTAPI
9875 IoWMIQuerySingleInstanceMultiple(
9876 IN PVOID *DataBlockObjectList,
9877 IN PUNICODE_STRING InstanceNames,
9878 IN ULONG ObjectCount,
9879 IN OUT ULONG *InOutBufferSize,
9880 OUT PVOID OutBuffer);
9881
9882 NTKERNELAPI
9883 NTSTATUS
9884 NTAPI
9885 IoWMIRegistrationControl(
9886 IN PDEVICE_OBJECT DeviceObject,
9887 IN ULONG Action);
9888
9889 NTKERNELAPI
9890 NTSTATUS
9891 NTAPI
9892 IoWMISuggestInstanceName(
9893 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
9894 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
9895 IN BOOLEAN CombineNames,
9896 OUT PUNICODE_STRING SuggestedInstanceName);
9897
9898 NTKERNELAPI
9899 NTSTATUS
9900 NTAPI
9901 IoWMIWriteEvent(
9902 IN OUT PVOID WnodeEventItem);
9903
9904 NTKERNELAPI
9905 VOID
9906 NTAPI
9907 IoWriteErrorLogEntry(
9908 IN PVOID ElEntry);
9909
9910 NTKERNELAPI
9911 PIRP
9912 NTAPI
9913 IoGetTopLevelIrp(VOID);
9914
9915 NTKERNELAPI
9916 NTSTATUS
9917 NTAPI
9918 IoRegisterLastChanceShutdownNotification(
9919 IN PDEVICE_OBJECT DeviceObject);
9920
9921 NTKERNELAPI
9922 VOID
9923 NTAPI
9924 IoSetTopLevelIrp(
9925 IN PIRP Irp OPTIONAL);
9926
9927 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
9928
9929
9930 #if (NTDDI_VERSION >= NTDDI_WINXP)
9931
9932 NTKERNELAPI
9933 NTSTATUS
9934 NTAPI
9935 IoCsqInitialize(
9936 IN PIO_CSQ Csq,
9937 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
9938 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
9939 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
9940 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
9941 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
9942 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
9943
9944 NTKERNELAPI
9945 VOID
9946 NTAPI
9947 IoCsqInsertIrp(
9948 IN PIO_CSQ Csq,
9949 IN PIRP Irp,
9950 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
9951
9952 NTKERNELAPI
9953 PIRP
9954 NTAPI
9955 IoCsqRemoveIrp(
9956 IN PIO_CSQ Csq,
9957 IN PIO_CSQ_IRP_CONTEXT Context);
9958
9959 NTKERNELAPI
9960 PIRP
9961 NTAPI
9962 IoCsqRemoveNextIrp(
9963 IN PIO_CSQ Csq,
9964 IN PVOID PeekContext OPTIONAL);
9965
9966 NTKERNELAPI
9967 BOOLEAN
9968 NTAPI
9969 IoForwardIrpSynchronously(
9970 IN PDEVICE_OBJECT DeviceObject,
9971 IN PIRP Irp);
9972
9973 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
9974
9975 NTKERNELAPI
9976 VOID
9977 NTAPI
9978 IoFreeErrorLogEntry(
9979 PVOID ElEntry);
9980
9981 NTKERNELAPI
9982 NTSTATUS
9983 NTAPI
9984 IoSetCompletionRoutineEx(
9985 IN PDEVICE_OBJECT DeviceObject,
9986 IN PIRP Irp,
9987 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
9988 IN PVOID Context,
9989 IN BOOLEAN InvokeOnSuccess,
9990 IN BOOLEAN InvokeOnError,
9991 IN BOOLEAN InvokeOnCancel);
9992
9993 VOID
9994 NTAPI
9995 IoSetStartIoAttributes(
9996 IN PDEVICE_OBJECT DeviceObject,
9997 IN BOOLEAN DeferredStartIo,
9998 IN BOOLEAN NonCancelable);
9999
10000 NTKERNELAPI
10001 NTSTATUS
10002 NTAPI
10003 IoWMIDeviceObjectToInstanceName(
10004 IN PVOID DataBlockObject,
10005 IN PDEVICE_OBJECT DeviceObject,
10006 OUT PUNICODE_STRING InstanceName);
10007
10008 NTKERNELAPI
10009 NTSTATUS
10010 NTAPI
10011 IoWMIExecuteMethod(
10012 IN PVOID DataBlockObject,
10013 IN PUNICODE_STRING InstanceName,
10014 IN ULONG MethodId,
10015 IN ULONG InBufferSize,
10016 IN OUT PULONG OutBufferSize,
10017 IN OUT PUCHAR InOutBuffer);
10018
10019 NTKERNELAPI
10020 NTSTATUS
10021 NTAPI
10022 IoWMIHandleToInstanceName(
10023 IN PVOID DataBlockObject,
10024 IN HANDLE FileHandle,
10025 OUT PUNICODE_STRING InstanceName);
10026
10027 NTKERNELAPI
10028 NTSTATUS
10029 NTAPI
10030 IoWMIOpenBlock(
10031 IN GUID *DataBlockGuid,
10032 IN ULONG DesiredAccess,
10033 OUT PVOID *DataBlockObject);
10034
10035 NTKERNELAPI
10036 NTSTATUS
10037 NTAPI
10038 IoWMIQueryAllData(
10039 IN PVOID DataBlockObject,
10040 IN OUT ULONG *InOutBufferSize,
10041 OUT PVOID OutBuffer);
10042
10043 NTKERNELAPI
10044 NTSTATUS
10045 NTAPI
10046 IoWMIQueryAllDataMultiple(
10047 IN PVOID *DataBlockObjectList,
10048 IN ULONG ObjectCount,
10049 IN OUT ULONG *InOutBufferSize,
10050 OUT PVOID OutBuffer);
10051
10052 NTKERNELAPI
10053 NTSTATUS
10054 NTAPI
10055 IoWMIQuerySingleInstance(
10056 IN PVOID DataBlockObject,
10057 IN PUNICODE_STRING InstanceName,
10058 IN OUT ULONG *InOutBufferSize,
10059 OUT PVOID OutBuffer);
10060
10061 NTKERNELAPI
10062 NTSTATUS
10063 NTAPI
10064 IoWMISetNotificationCallback(
10065 IN OUT PVOID Object,
10066 IN WMI_NOTIFICATION_CALLBACK Callback,
10067 IN PVOID Context OPTIONAL);
10068
10069 NTKERNELAPI
10070 NTSTATUS
10071 NTAPI
10072 IoWMISetSingleInstance(
10073 IN PVOID DataBlockObject,
10074 IN PUNICODE_STRING InstanceName,
10075 IN ULONG Version,
10076 IN ULONG ValueBufferSize,
10077 IN PVOID ValueBuffer);
10078
10079 NTKERNELAPI
10080 NTSTATUS
10081 NTAPI
10082 IoWMISetSingleItem(
10083 IN PVOID DataBlockObject,
10084 IN PUNICODE_STRING InstanceName,
10085 IN ULONG DataItemId,
10086 IN ULONG Version,
10087 IN ULONG ValueBufferSize,
10088 IN PVOID ValueBuffer);
10089
10090 #endif
10091
10092 #if defined(_WIN64)
10093 NTKERNELAPI
10094 ULONG
10095 NTAPI
10096 IoWMIDeviceObjectToProviderId(
10097 IN PDEVICE_OBJECT DeviceObject);
10098 #else
10099 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
10100 #endif
10101
10102 /*
10103 * USHORT
10104 * IoSizeOfIrp(
10105 * IN CCHAR StackSize)
10106 */
10107 #define IoSizeOfIrp(_StackSize) \
10108 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
10109
10110 FORCEINLINE
10111 VOID
10112 IoSkipCurrentIrpStackLocation (
10113 IN OUT PIRP Irp)
10114 {
10115 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
10116 Irp->CurrentLocation++;
10117 Irp->Tail.Overlay.CurrentStackLocation++;
10118 }
10119
10120 FORCEINLINE
10121 VOID
10122 IoSetNextIrpStackLocation (
10123 IN OUT PIRP Irp)
10124 {
10125 ASSERT(Irp->CurrentLocation > 0);
10126 Irp->CurrentLocation--;
10127 Irp->Tail.Overlay.CurrentStackLocation--;
10128 }
10129
10130 FORCEINLINE
10131 PIO_STACK_LOCATION
10132 IoGetNextIrpStackLocation(
10133 IN PIRP Irp)
10134 {
10135 ASSERT(Irp->CurrentLocation > 0);
10136 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
10137 }
10138
10139 FORCEINLINE
10140 VOID
10141 IoSetCompletionRoutine(
10142 IN PIRP Irp,
10143 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
10144 IN PVOID Context OPTIONAL,
10145 IN BOOLEAN InvokeOnSuccess,
10146 IN BOOLEAN InvokeOnError,
10147 IN BOOLEAN InvokeOnCancel)
10148 {
10149 PIO_STACK_LOCATION irpSp;
10150 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
10151 irpSp = IoGetNextIrpStackLocation(Irp);
10152 irpSp->CompletionRoutine = CompletionRoutine;
10153 irpSp->Context = Context;
10154 irpSp->Control = 0;
10155
10156 if (InvokeOnSuccess) {
10157 irpSp->Control = SL_INVOKE_ON_SUCCESS;
10158 }
10159
10160 if (InvokeOnError) {
10161 irpSp->Control |= SL_INVOKE_ON_ERROR;
10162 }
10163
10164 if (InvokeOnCancel) {
10165 irpSp->Control |= SL_INVOKE_ON_CANCEL;
10166 }
10167 }
10168
10169 /*
10170 * PDRIVER_CANCEL
10171 * IoSetCancelRoutine(
10172 * IN PIRP Irp,
10173 * IN PDRIVER_CANCEL CancelRoutine)
10174 */
10175 #define IoSetCancelRoutine(_Irp, \
10176 _CancelRoutine) \
10177 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
10178 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
10179
10180 /*
10181 * VOID
10182 * IoRequestDpc(
10183 * IN PDEVICE_OBJECT DeviceObject,
10184 * IN PIRP Irp,
10185 * IN PVOID Context);
10186 */
10187 #define IoRequestDpc(DeviceObject, Irp, Context)( \
10188 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
10189
10190 /*
10191 * VOID
10192 * IoReleaseRemoveLock(
10193 * IN PIO_REMOVE_LOCK RemoveLock,
10194 * IN PVOID Tag)
10195 */
10196 #define IoReleaseRemoveLock(_RemoveLock, \
10197 _Tag) \
10198 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
10199
10200 /*
10201 * VOID
10202 * IoReleaseRemoveLockAndWait(
10203 * IN PIO_REMOVE_LOCK RemoveLock,
10204 * IN PVOID Tag)
10205 */
10206 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
10207 _Tag) \
10208 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
10209
10210 #if defined(_WIN64)
10211 NTKERNELAPI
10212 BOOLEAN
10213 IoIs32bitProcess(
10214 IN PIRP Irp OPTIONAL);
10215 #endif
10216
10217 #define PLUGPLAY_REGKEY_DEVICE 1
10218 #define PLUGPLAY_REGKEY_DRIVER 2
10219 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
10220
10221 FORCEINLINE
10222 PIO_STACK_LOCATION
10223 IoGetCurrentIrpStackLocation(
10224 IN PIRP Irp)
10225 {
10226 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
10227 return Irp->Tail.Overlay.CurrentStackLocation;
10228 }
10229
10230 FORCEINLINE
10231 VOID
10232 IoMarkIrpPending(
10233 IN OUT PIRP Irp)
10234 {
10235 IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
10236 }
10237
10238 /*
10239 * BOOLEAN
10240 * IoIsErrorUserInduced(
10241 * IN NTSTATUS Status);
10242 */
10243 #define IoIsErrorUserInduced(Status) \
10244 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
10245 ((Status) == STATUS_IO_TIMEOUT) || \
10246 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
10247 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
10248 ((Status) == STATUS_VERIFY_REQUIRED) || \
10249 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
10250 ((Status) == STATUS_WRONG_VOLUME)))
10251
10252 /* VOID
10253 * IoInitializeRemoveLock(
10254 * IN PIO_REMOVE_LOCK Lock,
10255 * IN ULONG AllocateTag,
10256 * IN ULONG MaxLockedMinutes,
10257 * IN ULONG HighWatermark)
10258 */
10259 #define IoInitializeRemoveLock( \
10260 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
10261 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
10262 HighWatermark, sizeof(IO_REMOVE_LOCK))
10263
10264 VOID
10265 FORCEINLINE
10266 IoInitializeDpcRequest(
10267 IN PDEVICE_OBJECT DeviceObject,
10268 IN PIO_DPC_ROUTINE DpcRoutine)
10269 {
10270 KeInitializeDpc( &DeviceObject->Dpc,
10271 (PKDEFERRED_ROUTINE) DpcRoutine,
10272 DeviceObject );
10273 }
10274
10275 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
10276
10277 /*
10278 * ULONG
10279 * IoGetFunctionCodeFromCtlCode(
10280 * IN ULONG ControlCode)
10281 */
10282 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
10283 (((_ControlCode) >> 2) & 0x00000FFF)
10284
10285 FORCEINLINE
10286 VOID
10287 IoCopyCurrentIrpStackLocationToNext(
10288 IN OUT PIRP Irp)
10289 {
10290 PIO_STACK_LOCATION irpSp;
10291 PIO_STACK_LOCATION nextIrpSp;
10292 irpSp = IoGetCurrentIrpStackLocation(Irp);
10293 nextIrpSp = IoGetNextIrpStackLocation(Irp);
10294 RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
10295 nextIrpSp->Control = 0;
10296 }
10297
10298 NTKERNELAPI
10299 VOID
10300 NTAPI
10301 IoGetStackLimits(
10302 OUT PULONG_PTR LowLimit,
10303 OUT PULONG_PTR HighLimit);
10304
10305 FORCEINLINE
10306 ULONG_PTR
10307 IoGetRemainingStackSize(VOID)
10308 {
10309 ULONG_PTR End, Begin;
10310 ULONG_PTR Result;
10311
10312 IoGetStackLimits(&Begin, &End);
10313 Result = (ULONG_PTR)(&End) - Begin;
10314 return Result;
10315 }
10316
10317 #if (NTDDI_VERSION >= NTDDI_WS03)
10318 VOID
10319 FORCEINLINE
10320 IoInitializeThreadedDpcRequest(
10321 IN PDEVICE_OBJECT DeviceObject,
10322 IN PIO_DPC_ROUTINE DpcRoutine)
10323 {
10324 KeInitializeThreadedDpc(&DeviceObject->Dpc,
10325 (PKDEFERRED_ROUTINE) DpcRoutine,
10326 DeviceObject );
10327 }
10328 #endif
10329
10330 /******************************************************************************
10331 * Power Management Support Functions *
10332 ******************************************************************************/
10333
10334 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
10335
10336 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10337
10338 NTKERNELAPI
10339 NTSTATUS
10340 NTAPI
10341 PoCallDriver(
10342 IN struct _DEVICE_OBJECT *DeviceObject,
10343 IN OUT struct _IRP *Irp);
10344
10345 NTKERNELAPI
10346 PULONG
10347 NTAPI
10348 PoRegisterDeviceForIdleDetection(
10349 IN struct _DEVICE_OBJECT *DeviceObject,
10350 IN ULONG ConservationIdleTime,
10351 IN ULONG PerformanceIdleTime,
10352 IN DEVICE_POWER_STATE State);
10353
10354 NTKERNELAPI
10355 PVOID
10356 NTAPI
10357 PoRegisterSystemState(
10358 IN OUT PVOID StateHandle OPTIONAL,
10359 IN EXECUTION_STATE Flags);
10360
10361 NTKERNELAPI
10362 NTSTATUS
10363 NTAPI
10364 PoRequestPowerIrp(
10365 IN struct _DEVICE_OBJECT *DeviceObject,
10366 IN UCHAR MinorFunction,
10367 IN POWER_STATE PowerState,
10368 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
10369 IN PVOID Context OPTIONAL,
10370 OUT struct _IRP **Irp OPTIONAL);
10371
10372 NTKERNELAPI
10373 POWER_STATE
10374 NTAPI
10375 PoSetPowerState(
10376 IN struct _DEVICE_OBJECT *DeviceObject,
10377 IN POWER_STATE_TYPE Type,
10378 IN POWER_STATE State);
10379
10380 NTKERNELAPI
10381 VOID
10382 NTAPI
10383 PoSetSystemState(
10384 IN EXECUTION_STATE Flags);
10385
10386 NTKERNELAPI
10387 VOID
10388 NTAPI
10389 PoStartNextPowerIrp(
10390 IN OUT struct _IRP *Irp);
10391
10392 NTKERNELAPI
10393 VOID
10394 NTAPI
10395 PoUnregisterSystemState(
10396 IN OUT PVOID StateHandle);
10397
10398 NTKERNELAPI
10399 NTSTATUS
10400 NTAPI
10401 PoRequestShutdownEvent(
10402 OUT PVOID *Event);
10403
10404 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10405
10406 #if (NTDDI_VERSION >= NTDDI_VISTA)
10407
10408 NTKERNELAPI
10409 VOID
10410 NTAPI
10411 PoSetSystemWake(
10412 IN OUT struct _IRP *Irp);
10413
10414 NTKERNELAPI
10415 BOOLEAN
10416 NTAPI
10417 PoGetSystemWake(
10418 IN struct _IRP *Irp);
10419
10420 NTKERNELAPI
10421 NTSTATUS
10422 NTAPI
10423 PoRegisterPowerSettingCallback(
10424 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
10425 IN LPCGUID SettingGuid,
10426 IN PPOWER_SETTING_CALLBACK Callback,
10427 IN PVOID Context OPTIONAL,
10428 OUT PVOID *Handle OPTIONAL);
10429
10430 NTKERNELAPI
10431 NTSTATUS
10432 NTAPI
10433 PoUnregisterPowerSettingCallback(
10434 IN OUT PVOID Handle);
10435
10436 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10437
10438 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
10439 NTKERNELAPI
10440 VOID
10441 NTAPI
10442 PoSetDeviceBusyEx(
10443 IN OUT PULONG IdlePointer);
10444 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
10445
10446 #if (NTDDI_VERSION >= NTDDI_WIN7)
10447
10448 NTKERNELAPI
10449 VOID
10450 NTAPI
10451 PoStartDeviceBusy(
10452 IN OUT PULONG IdlePointer);
10453
10454 NTKERNELAPI
10455 VOID
10456 NTAPI
10457 PoEndDeviceBusy(
10458 IN OUT PULONG IdlePointer);
10459
10460 NTKERNELAPI
10461 BOOLEAN
10462 NTAPI
10463 PoQueryWatchdogTime(
10464 IN PDEVICE_OBJECT Pdo,
10465 OUT PULONG SecondsRemaining);
10466
10467 NTKERNELAPI
10468 VOID
10469 NTAPI
10470 PoDeletePowerRequest(
10471 IN OUT PVOID PowerRequest);
10472
10473 NTKERNELAPI
10474 NTSTATUS
10475 NTAPI
10476 PoSetPowerRequest(
10477 IN OUT PVOID PowerRequest,
10478 IN POWER_REQUEST_TYPE Type);
10479
10480 NTKERNELAPI
10481 NTSTATUS
10482 NTAPI
10483 PoClearPowerRequest(
10484 IN OUT PVOID PowerRequest,
10485 IN POWER_REQUEST_TYPE Type);
10486
10487 NTKERNELAPI
10488 NTSTATUS
10489 NTAPI
10490 PoCreatePowerRequest(
10491 OUT PVOID *PowerRequest,
10492 IN PDEVICE_OBJECT DeviceObject,
10493 IN PCOUNTED_REASON_CONTEXT Context);
10494
10495 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10496
10497 /******************************************************************************
10498 * Executive Functions *
10499 ******************************************************************************/
10500
10501 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
10502 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
10503 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
10504
10505 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
10506 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
10507 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
10508 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
10509
10510 #define ExInitializeSListHead InitializeSListHead
10511
10512 #if defined(_X86_)
10513 #if defined(_NTHAL_)
10514 #define ExAcquireFastMutex ExiAcquireFastMutex
10515 #define ExReleaseFastMutex ExiReleaseFastMutex
10516 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
10517 #endif
10518 #define ExInterlockedAddUlong ExfInterlockedAddUlong
10519 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
10520 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
10521 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
10522 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
10523 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
10524 #endif /* defined(_X86_) */
10525
10526 #if defined(_WIN64)
10527
10528 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
10529 defined(_NTHAL_) || defined(_NTOSP_)
10530 NTKERNELAPI
10531 USHORT
10532 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
10533 #else
10534 FORCEINLINE
10535 USHORT
10536 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
10537 {
10538 return (USHORT)(ListHead->Alignment & 0xffff);
10539 }
10540 #endif
10541
10542 NTKERNELAPI
10543 PSLIST_ENTRY
10544 ExpInterlockedFlushSList(
10545 PSLIST_HEADER ListHead);
10546
10547 NTKERNELAPI
10548 PSLIST_ENTRY
10549 ExpInterlockedPopEntrySList(
10550 PSLIST_HEADER ListHead);
10551
10552 NTKERNELAPI
10553 PSLIST_ENTRY
10554 ExpInterlockedPushEntrySList(
10555 PSLIST_HEADER ListHead,
10556 PSLIST_ENTRY ListEntry);
10557
10558 #define ExInterlockedFlushSList(Head) \
10559 ExpInterlockedFlushSList(Head)
10560 #define ExInterlockedPopEntrySList(Head, Lock) \
10561 ExpInterlockedPopEntrySList(Head)
10562 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
10563 ExpInterlockedPushEntrySList(Head, Entry)
10564
10565 #else /* !defined(_WIN64) */
10566
10567 #define ExQueryDepthSList(listhead) (listhead)->Depth
10568
10569 NTKERNELAPI
10570 PSINGLE_LIST_ENTRY
10571 FASTCALL
10572 ExInterlockedFlushSList(
10573 IN OUT PSLIST_HEADER ListHead);
10574
10575 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
10576
10577 NTKERNELAPI
10578 PSINGLE_LIST_ENTRY
10579 FASTCALL
10580 ExInterlockedPopEntrySList(
10581 IN PSLIST_HEADER ListHead,
10582 IN PKSPIN_LOCK Lock);
10583
10584 NTKERNELAPI
10585 PSINGLE_LIST_ENTRY
10586 FASTCALL
10587 ExInterlockedPushEntrySList(
10588 IN PSLIST_HEADER ListHead,
10589 IN PSINGLE_LIST_ENTRY ListEntry,
10590 IN PKSPIN_LOCK Lock);
10591 #else
10592 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
10593 InterlockedPopEntrySList(_ListHead)
10594 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
10595 InterlockedPushEntrySList(_ListHead, _ListEntry)
10596 #endif // _WIN2K_COMPAT_SLIST_USAGE
10597
10598 #endif // !defined(_WIN64)
10599
10600 /* ERESOURCE_THREAD
10601 * ExGetCurrentResourceThread(
10602 * VOID);
10603 */
10604 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
10605
10606 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
10607
10608 /* VOID
10609 * ExInitializeWorkItem(
10610 * IN PWORK_QUEUE_ITEM Item,
10611 * IN PWORKER_THREAD_ROUTINE Routine,
10612 * IN PVOID Context)
10613 */
10614 #define ExInitializeWorkItem(Item, Routine, Context) \
10615 { \
10616 (Item)->WorkerRoutine = Routine; \
10617 (Item)->Parameter = Context; \
10618 (Item)->List.Flink = NULL; \
10619 }
10620
10621 FORCEINLINE
10622 VOID
10623 ExInitializeFastMutex(
10624 OUT PFAST_MUTEX FastMutex)
10625 {
10626 FastMutex->Count = FM_LOCK_BIT;
10627 FastMutex->Owner = NULL;
10628 FastMutex->Contention = 0;
10629 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
10630 return;
10631 }
10632
10633 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10634
10635 NTKERNELAPI
10636 VOID
10637 FASTCALL
10638 ExAcquireFastMutex(
10639 IN OUT PFAST_MUTEX FastMutex);
10640
10641 NTKERNELAPI
10642 VOID
10643 FASTCALL
10644 ExReleaseFastMutex(
10645 IN OUT PFAST_MUTEX FastMutex);
10646
10647 NTKERNELAPI
10648 BOOLEAN
10649 FASTCALL
10650 ExTryToAcquireFastMutex(
10651 IN OUT PFAST_MUTEX FastMutex);
10652
10653 NTKERNELAPI
10654 VOID
10655 FASTCALL
10656 ExAcquireFastMutexUnsafe(
10657 IN OUT PFAST_MUTEX FastMutex);
10658
10659 NTKERNELAPI
10660 VOID
10661 FASTCALL
10662 ExReleaseFastMutexUnsafe(
10663 IN OUT PFAST_MUTEX FastMutex);
10664
10665 NTKERNELAPI
10666 BOOLEAN
10667 NTAPI
10668 ExAcquireResourceExclusiveLite(
10669 IN OUT PERESOURCE Resource,
10670 IN BOOLEAN Wait);
10671
10672 NTKERNELAPI
10673 BOOLEAN
10674 NTAPI
10675 ExAcquireResourceSharedLite(
10676 IN OUT PERESOURCE Resource,
10677 IN BOOLEAN Wait);
10678
10679 NTKERNELAPI
10680 BOOLEAN
10681 NTAPI
10682 ExAcquireSharedStarveExclusive(
10683 IN OUT PERESOURCE Resource,
10684 IN BOOLEAN Wait);
10685
10686 NTKERNELAPI
10687 BOOLEAN
10688 NTAPI
10689 ExAcquireSharedWaitForExclusive(
10690 IN OUT PERESOURCE Resource,
10691 IN BOOLEAN Wait);
10692
10693 NTKERNELAPI
10694 PVOID
10695 NTAPI
10696 ExAllocatePool(
10697 IN POOL_TYPE PoolType,
10698 IN SIZE_T NumberOfBytes);
10699
10700 #ifdef POOL_TAGGING
10701 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
10702 #endif /* POOL_TAGGING */
10703
10704 NTKERNELAPI
10705 PVOID
10706 NTAPI
10707 ExAllocatePoolWithQuota(
10708 IN POOL_TYPE PoolType,
10709 IN SIZE_T NumberOfBytes);
10710
10711 #ifdef POOL_TAGGING
10712 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
10713 #endif /* POOL_TAGGING */
10714
10715 NTKERNELAPI
10716 PVOID
10717 NTAPI
10718 ExAllocatePoolWithQuotaTag(
10719 IN POOL_TYPE PoolType,
10720 IN SIZE_T NumberOfBytes,
10721 IN ULONG Tag);
10722
10723 #ifndef POOL_TAGGING
10724 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
10725 #endif
10726
10727 NTKERNELAPI
10728 PVOID
10729 NTAPI
10730 ExAllocatePoolWithTag(
10731 IN POOL_TYPE PoolType,
10732 IN SIZE_T NumberOfBytes,
10733 IN ULONG Tag);
10734
10735 NTKERNELAPI
10736 PVOID
10737 NTAPI
10738 ExAllocatePoolWithTagPriority(
10739 IN POOL_TYPE PoolType,
10740 IN SIZE_T NumberOfBytes,
10741 IN ULONG Tag,
10742 IN EX_POOL_PRIORITY Priority);
10743
10744 NTKERNELAPI
10745 VOID
10746 NTAPI
10747 ExConvertExclusiveToSharedLite(
10748 IN OUT PERESOURCE Resource);
10749
10750 NTKERNELAPI
10751 NTSTATUS
10752 NTAPI
10753 ExCreateCallback(
10754 OUT PCALLBACK_OBJECT *CallbackObject,
10755 IN POBJECT_ATTRIBUTES ObjectAttributes,
10756 IN BOOLEAN Create,
10757 IN BOOLEAN AllowMultipleCallbacks);
10758
10759 NTKERNELAPI
10760 VOID
10761 NTAPI
10762 ExDeleteNPagedLookasideList(
10763 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
10764
10765 NTKERNELAPI
10766 VOID
10767 NTAPI
10768 ExDeletePagedLookasideList(
10769 IN PPAGED_LOOKASIDE_LIST Lookaside);
10770
10771 NTKERNELAPI
10772 NTSTATUS
10773 NTAPI
10774 ExDeleteResourceLite(
10775 IN OUT PERESOURCE Resource);
10776
10777 NTKERNELAPI
10778 VOID
10779 NTAPI
10780 ExFreePool(
10781 IN PVOID P);
10782
10783 #ifdef POOL_TAGGING
10784 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
10785 #endif
10786
10787 NTKERNELAPI
10788 VOID
10789 NTAPI
10790 ExFreePoolWithTag(
10791 IN PVOID P,
10792 IN ULONG Tag);
10793
10794 NTKERNELAPI
10795 ULONG
10796 NTAPI
10797 ExGetExclusiveWaiterCount(
10798 IN PERESOURCE Resource);
10799
10800 NTKERNELAPI
10801 KPROCESSOR_MODE
10802 NTAPI
10803 ExGetPreviousMode(VOID);
10804
10805 NTKERNELAPI
10806 ULONG
10807 NTAPI
10808 ExGetSharedWaiterCount(
10809 IN PERESOURCE Resource);
10810
10811 NTKERNELAPI
10812 VOID
10813 NTAPI
10814 ExInitializeNPagedLookasideList(
10815 IN PNPAGED_LOOKASIDE_LIST Lookaside,
10816 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
10817 IN PFREE_FUNCTION Free OPTIONAL,
10818 IN ULONG Flags,
10819 IN SIZE_T Size,
10820 IN ULONG Tag,
10821 IN USHORT Depth);
10822
10823 NTKERNELAPI
10824 VOID
10825 NTAPI
10826 ExInitializePagedLookasideList(
10827 IN PPAGED_LOOKASIDE_LIST Lookaside,
10828 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
10829 IN PFREE_FUNCTION Free OPTIONAL,
10830 IN ULONG Flags,
10831 IN SIZE_T Size,
10832 IN ULONG Tag,
10833 IN USHORT Depth);
10834
10835 NTKERNELAPI
10836 NTSTATUS
10837 NTAPI
10838 ExInitializeResourceLite(
10839 OUT PERESOURCE Resource);
10840
10841 NTKERNELAPI
10842 LARGE_INTEGER
10843 NTAPI
10844 ExInterlockedAddLargeInteger(
10845 IN PLARGE_INTEGER Addend,
10846 IN LARGE_INTEGER Increment,
10847 IN PKSPIN_LOCK Lock);
10848
10849 #if defined(_WIN64)
10850 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
10851 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
10852 #else
10853 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
10854 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
10855 #endif
10856
10857 NTKERNELAPI
10858 ULONG
10859 FASTCALL
10860 ExInterlockedAddUlong(
10861 IN PULONG Addend,
10862 IN ULONG Increment,
10863 IN OUT PKSPIN_LOCK Lock);
10864
10865 #if defined(_AMD64_) || defined(_IA64_)
10866
10867 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
10868 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
10869
10870 #elif defined(_X86_)
10871
10872 NTKERNELAPI
10873 LONGLONG
10874 FASTCALL
10875 ExfInterlockedCompareExchange64(
10876 IN OUT LONGLONG volatile *Destination,
10877 IN PLONGLONG Exchange,
10878 IN PLONGLONG Comperand);
10879
10880 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
10881 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
10882
10883 #else
10884
10885 NTKERNELAPI
10886 LONGLONG
10887 FASTCALL
10888 ExInterlockedCompareExchange64(
10889 IN OUT LONGLONG volatile *Destination,
10890 IN PLONGLONG Exchange,
10891 IN PLONGLONG Comparand,
10892 IN PKSPIN_LOCK Lock);
10893
10894 #endif /* defined(_AMD64_) || defined(_IA64_) */
10895
10896 NTKERNELAPI
10897 PLIST_ENTRY
10898 FASTCALL
10899 ExInterlockedInsertHeadList(
10900 IN OUT PLIST_ENTRY ListHead,
10901 IN OUT PLIST_ENTRY ListEntry,
10902 IN OUT PKSPIN_LOCK Lock);
10903
10904 NTKERNELAPI
10905 PLIST_ENTRY
10906 FASTCALL
10907 ExInterlockedInsertTailList(
10908 IN OUT PLIST_ENTRY ListHead,
10909 IN OUT PLIST_ENTRY ListEntry,
10910 IN OUT PKSPIN_LOCK Lock);
10911
10912 NTKERNELAPI
10913 PSINGLE_LIST_ENTRY
10914 FASTCALL
10915 ExInterlockedPopEntryList(
10916 IN OUT PSINGLE_LIST_ENTRY ListHead,
10917 IN OUT PKSPIN_LOCK Lock);
10918
10919 NTKERNELAPI
10920 PSINGLE_LIST_ENTRY
10921 FASTCALL
10922 ExInterlockedPushEntryList(
10923 IN OUT PSINGLE_LIST_ENTRY ListHead,
10924 IN OUT PSINGLE_LIST_ENTRY ListEntry,
10925 IN OUT PKSPIN_LOCK Lock);
10926
10927 NTKERNELAPI
10928 PLIST_ENTRY
10929 FASTCALL
10930 ExInterlockedRemoveHeadList(
10931 IN OUT PLIST_ENTRY ListHead,
10932 IN OUT PKSPIN_LOCK Lock);
10933
10934 NTKERNELAPI
10935 BOOLEAN
10936 NTAPI
10937 ExIsProcessorFeaturePresent(
10938 IN ULONG ProcessorFeature);
10939
10940 NTKERNELAPI
10941 BOOLEAN
10942 NTAPI
10943 ExIsResourceAcquiredExclusiveLite(
10944 IN PERESOURCE Resource);
10945
10946 NTKERNELAPI
10947 ULONG
10948 NTAPI
10949 ExIsResourceAcquiredSharedLite(
10950 IN PERESOURCE Resource);
10951
10952 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
10953
10954 NTKERNELAPI
10955 VOID
10956 NTAPI
10957 ExLocalTimeToSystemTime(
10958 IN PLARGE_INTEGER LocalTime,
10959 OUT PLARGE_INTEGER SystemTime);
10960
10961 NTKERNELAPI
10962 VOID
10963 NTAPI
10964 ExNotifyCallback(
10965 IN PCALLBACK_OBJECT CallbackObject,
10966 IN PVOID Argument1 OPTIONAL,
10967 IN PVOID Argument2 OPTIONAL);
10968
10969 NTKERNELAPI
10970 VOID
10971 NTAPI
10972 ExQueueWorkItem(
10973 IN OUT PWORK_QUEUE_ITEM WorkItem,
10974 IN WORK_QUEUE_TYPE QueueType);
10975
10976 NTKERNELAPI
10977 DECLSPEC_NORETURN
10978 VOID
10979 NTAPI
10980 ExRaiseStatus(
10981 IN NTSTATUS Status);
10982
10983 NTKERNELAPI
10984 PVOID
10985 NTAPI
10986 ExRegisterCallback(
10987 IN PCALLBACK_OBJECT CallbackObject,
10988 IN PCALLBACK_FUNCTION CallbackFunction,
10989 IN PVOID CallbackContext OPTIONAL);
10990
10991 NTKERNELAPI
10992 NTSTATUS
10993 NTAPI
10994 ExReinitializeResourceLite(
10995 IN OUT PERESOURCE Resource);
10996
10997 NTKERNELAPI
10998 VOID
10999 NTAPI
11000 ExReleaseResourceForThreadLite(
11001 IN OUT PERESOURCE Resource,
11002 IN ERESOURCE_THREAD ResourceThreadId);
11003
11004 NTKERNELAPI
11005 VOID
11006 FASTCALL
11007 ExReleaseResourceLite(
11008 IN OUT PERESOURCE Resource);
11009
11010 NTKERNELAPI
11011 VOID
11012 NTAPI
11013 ExSetResourceOwnerPointer(
11014 IN OUT PERESOURCE Resource,
11015 IN PVOID OwnerPointer);
11016
11017 NTKERNELAPI
11018 ULONG
11019 NTAPI
11020 ExSetTimerResolution(
11021 IN ULONG DesiredTime,
11022 IN BOOLEAN SetResolution);
11023
11024 NTKERNELAPI
11025 VOID
11026 NTAPI
11027 ExSystemTimeToLocalTime(
11028 IN PLARGE_INTEGER SystemTime,
11029 OUT PLARGE_INTEGER LocalTime);
11030
11031 NTKERNELAPI
11032 VOID
11033 NTAPI
11034 ExUnregisterCallback(
11035 IN OUT PVOID CbRegistration);
11036
11037 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11038
11039 #if (NTDDI_VERSION >= NTDDI_WINXP)
11040
11041 NTKERNELAPI
11042 BOOLEAN
11043 FASTCALL
11044 ExAcquireRundownProtection(
11045 IN OUT PEX_RUNDOWN_REF RunRef);
11046
11047 NTKERNELAPI
11048 VOID
11049 FASTCALL
11050 ExInitializeRundownProtection(
11051 OUT PEX_RUNDOWN_REF RunRef);
11052
11053 NTKERNELAPI
11054 VOID
11055 FASTCALL
11056 ExReInitializeRundownProtection(
11057 IN OUT PEX_RUNDOWN_REF RunRef);
11058
11059 NTKERNELAPI
11060 VOID
11061 FASTCALL
11062 ExReleaseRundownProtection(
11063 IN OUT PEX_RUNDOWN_REF RunRef);
11064
11065 NTKERNELAPI
11066 VOID
11067 FASTCALL
11068 ExRundownCompleted(
11069 OUT PEX_RUNDOWN_REF RunRef);
11070
11071 NTKERNELAPI
11072 BOOLEAN
11073 NTAPI
11074 ExVerifySuite(
11075 IN SUITE_TYPE SuiteType);
11076
11077 NTKERNELAPI
11078 VOID
11079 FASTCALL
11080 ExWaitForRundownProtectionRelease(
11081 IN OUT PEX_RUNDOWN_REF RunRef);
11082
11083 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
11084
11085 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
11086
11087 NTKERNELAPI
11088 BOOLEAN
11089 FASTCALL
11090 ExAcquireRundownProtectionEx(
11091 IN OUT PEX_RUNDOWN_REF RunRef,
11092 IN ULONG Count);
11093
11094 NTKERNELAPI
11095 VOID
11096 FASTCALL
11097 ExReleaseRundownProtectionEx(
11098 IN OUT PEX_RUNDOWN_REF RunRef,
11099 IN ULONG Count);
11100
11101 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
11102
11103 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11104
11105 NTKERNELAPI
11106 PEX_RUNDOWN_REF_CACHE_AWARE
11107 NTAPI
11108 ExAllocateCacheAwareRundownProtection(
11109 IN POOL_TYPE PoolType,
11110 IN ULONG PoolTag);
11111
11112 NTKERNELAPI
11113 SIZE_T
11114 NTAPI
11115 ExSizeOfRundownProtectionCacheAware(VOID);
11116
11117 NTKERNELAPI
11118 PVOID
11119 NTAPI
11120 ExEnterCriticalRegionAndAcquireResourceShared(
11121 IN OUT PERESOURCE Resource);
11122
11123 NTKERNELAPI
11124 PVOID
11125 NTAPI
11126 ExEnterCriticalRegionAndAcquireResourceExclusive(
11127 IN OUT PERESOURCE Resource);
11128
11129 NTKERNELAPI
11130 PVOID
11131 NTAPI
11132 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
11133 IN OUT PERESOURCE Resource);
11134
11135 NTKERNELAPI
11136 VOID
11137 FASTCALL
11138 ExReleaseResourceAndLeaveCriticalRegion(
11139 IN OUT PERESOURCE Resource);
11140
11141 NTKERNELAPI
11142 VOID
11143 NTAPI
11144 ExInitializeRundownProtectionCacheAware(
11145 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
11146 IN SIZE_T RunRefSize);
11147
11148 NTKERNELAPI
11149 VOID
11150 NTAPI
11151 ExFreeCacheAwareRundownProtection(
11152 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11153
11154 NTKERNELAPI
11155 BOOLEAN
11156 FASTCALL
11157 ExAcquireRundownProtectionCacheAware(
11158 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11159
11160 NTKERNELAPI
11161 VOID
11162 FASTCALL
11163 ExReleaseRundownProtectionCacheAware(
11164 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11165
11166 NTKERNELAPI
11167 BOOLEAN
11168 FASTCALL
11169 ExAcquireRundownProtectionCacheAwareEx(
11170 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
11171 IN ULONG Count);
11172
11173 NTKERNELAPI
11174 VOID
11175 FASTCALL
11176 ExReleaseRundownProtectionCacheAwareEx(
11177 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
11178 IN ULONG Count);
11179
11180 NTKERNELAPI
11181 VOID
11182 FASTCALL
11183 ExWaitForRundownProtectionReleaseCacheAware(
11184 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
11185
11186 NTKERNELAPI
11187 VOID
11188 FASTCALL
11189 ExReInitializeRundownProtectionCacheAware(
11190 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11191
11192 NTKERNELAPI
11193 VOID
11194 FASTCALL
11195 ExRundownCompletedCacheAware(
11196 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
11197
11198 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11199
11200 #if (NTDDI_VERSION >= NTDDI_VISTA)
11201
11202 NTKERNELAPI
11203 NTSTATUS
11204 NTAPI
11205 ExInitializeLookasideListEx(
11206 OUT PLOOKASIDE_LIST_EX Lookaside,
11207 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
11208 IN PFREE_FUNCTION_EX Free OPTIONAL,
11209 IN POOL_TYPE PoolType,
11210 IN ULONG Flags,
11211 IN SIZE_T Size,
11212 IN ULONG Tag,
11213 IN USHORT Depth);
11214 #endif
11215
11216 #if !defined(MIDL_PASS)
11217
11218 static __inline PVOID
11219 ExAllocateFromNPagedLookasideList(
11220 IN PNPAGED_LOOKASIDE_LIST Lookaside)
11221 {
11222 PVOID Entry;
11223
11224 Lookaside->L.TotalAllocates += 1;
11225 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
11226 if (Entry == NULL) {
11227 Lookaside->L.AllocateMisses++;
11228 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
11229 Lookaside->L.Size,
11230 Lookaside->L.Tag);
11231 }
11232 return Entry;
11233 }
11234
11235 static __inline PVOID
11236 ExAllocateFromPagedLookasideList(
11237 IN PPAGED_LOOKASIDE_LIST Lookaside)
11238 {
11239 PVOID Entry;
11240
11241 Lookaside->L.TotalAllocates++;
11242 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
11243 if (Entry == NULL) {
11244 Lookaside->L.AllocateMisses++;
11245 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
11246 Lookaside->L.Size,
11247 Lookaside->L.Tag);
11248 }
11249 return Entry;
11250 }
11251
11252 static __inline VOID
11253 ExFreeToNPagedLookasideList(
11254 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
11255 IN PVOID Entry)
11256 {
11257 Lookaside->L.TotalFrees++;
11258 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
11259 Lookaside->L.FreeMisses++;
11260 (Lookaside->L.Free)(Entry);
11261 } else {
11262 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
11263 }
11264 }
11265
11266 static __inline VOID
11267 ExFreeToPagedLookasideList(
11268 IN PPAGED_LOOKASIDE_LIST Lookaside,
11269 IN PVOID Entry)
11270 {
11271 Lookaside->L.TotalFrees++;
11272 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
11273 Lookaside->L.FreeMisses++;
11274 (Lookaside->L.Free)(Entry);
11275 } else {
11276 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
11277 }
11278 }
11279
11280 #endif // !defined(MIDL_PASS)
11281
11282 /******************************************************************************
11283 * Object Manager Functions *
11284 ******************************************************************************/
11285
11286 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11287
11288 NTKERNELAPI
11289 LONG_PTR
11290 FASTCALL
11291 ObfDereferenceObject(
11292 IN PVOID Object);
11293 #define ObDereferenceObject ObfDereferenceObject
11294
11295 NTKERNELAPI
11296 NTSTATUS
11297 NTAPI
11298 ObGetObjectSecurity(
11299 IN PVOID Object,
11300 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
11301 OUT PBOOLEAN MemoryAllocated);
11302
11303 NTKERNELAPI
11304 LONG_PTR
11305 FASTCALL
11306 ObfReferenceObject(
11307 IN PVOID Object);
11308 #define ObReferenceObject ObfReferenceObject
11309
11310 NTKERNELAPI
11311 NTSTATUS
11312 NTAPI
11313 ObReferenceObjectByHandle(
11314 IN HANDLE Handle,
11315 IN ACCESS_MASK DesiredAccess,
11316 IN POBJECT_TYPE ObjectType OPTIONAL,
11317 IN KPROCESSOR_MODE AccessMode,
11318 OUT PVOID *Object,
11319 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
11320
11321 NTKERNELAPI
11322 NTSTATUS
11323 NTAPI
11324 ObReferenceObjectByPointer(
11325 IN PVOID Object,
11326 IN ACCESS_MASK DesiredAccess,
11327 IN POBJECT_TYPE ObjectType OPTIONAL,
11328 IN KPROCESSOR_MODE AccessMode);
11329
11330 NTKERNELAPI
11331 VOID
11332 NTAPI
11333 ObReleaseObjectSecurity(
11334 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
11335 IN BOOLEAN MemoryAllocated);
11336
11337 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11338
11339 #if (NTDDI_VERSION >= NTDDI_VISTA)
11340 NTKERNELAPI
11341 VOID
11342 NTAPI
11343 ObDereferenceObjectDeferDelete(
11344 IN PVOID Object);
11345 #endif
11346
11347 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
11348 NTKERNELAPI
11349 NTSTATUS
11350 NTAPI
11351 ObRegisterCallbacks(
11352 IN POB_CALLBACK_REGISTRATION CallbackRegistration,
11353 OUT PVOID *RegistrationHandle);
11354
11355 NTKERNELAPI
11356 VOID
11357 NTAPI
11358 ObUnRegisterCallbacks(
11359 IN PVOID RegistrationHandle);
11360
11361 NTKERNELAPI
11362 USHORT
11363 NTAPI
11364 ObGetFilterVersion(VOID);
11365
11366 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
11367
11368 #if (NTDDI_VERSION >= NTDDI_WIN7)
11369
11370 NTKERNELAPI
11371 NTSTATUS
11372 NTAPI
11373 ObReferenceObjectByHandleWithTag(
11374 IN HANDLE Handle,
11375 IN ACCESS_MASK DesiredAccess,
11376 IN POBJECT_TYPE ObjectType OPTIONAL,
11377 IN KPROCESSOR_MODE AccessMode,
11378 IN ULONG Tag,
11379 OUT PVOID *Object,
11380 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
11381
11382 NTKERNELAPI
11383 LONG_PTR
11384 FASTCALL
11385 ObfReferenceObjectWithTag(
11386 IN PVOID Object,
11387 IN ULONG Tag);
11388
11389 NTKERNELAPI
11390 NTSTATUS
11391 NTAPI
11392 ObReferenceObjectByPointerWithTag(
11393 IN PVOID Object,
11394 IN ACCESS_MASK DesiredAccess,
11395 IN POBJECT_TYPE ObjectType OPTIONAL,
11396 IN KPROCESSOR_MODE AccessMode,
11397 IN ULONG Tag);
11398
11399 NTKERNELAPI
11400 LONG_PTR
11401 FASTCALL
11402 ObfDereferenceObjectWithTag(
11403 IN PVOID Object,
11404 IN ULONG Tag);
11405
11406 NTKERNELAPI
11407 VOID
11408 NTAPI
11409 ObDereferenceObjectDeferDeleteWithTag(
11410 IN PVOID Object,
11411 IN ULONG Tag);
11412
11413 #define ObDereferenceObject ObfDereferenceObject
11414 #define ObReferenceObject ObfReferenceObject
11415 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
11416 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
11417
11418 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
11419
11420
11421 /******************************************************************************
11422 * Process Manager Functions *
11423 ******************************************************************************/
11424
11425 NTKERNELAPI
11426 NTSTATUS
11427 NTAPI
11428 PsWrapApcWow64Thread(
11429 IN OUT PVOID *ApcContext,
11430 IN OUT PVOID *ApcRoutine);
11431
11432 /*
11433 * PEPROCESS
11434 * PsGetCurrentProcess(VOID)
11435 */
11436 #define PsGetCurrentProcess IoGetCurrentProcess
11437
11438 #if !defined(_PSGETCURRENTTHREAD_)
11439 #define _PSGETCURRENTTHREAD_
11440 FORCEINLINE
11441 PETHREAD
11442 NTAPI
11443 PsGetCurrentThread(VOID)
11444 {
11445 return (PETHREAD)KeGetCurrentThread();
11446 }
11447 #endif /* !_PSGETCURRENTTHREAD_ */
11448
11449
11450 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11451
11452 NTKERNELAPI
11453 NTSTATUS
11454 NTAPI
11455 PsCreateSystemThread(
11456 OUT PHANDLE ThreadHandle,
11457 IN ULONG DesiredAccess,
11458 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
11459 IN HANDLE ProcessHandle OPTIONAL,
11460 OUT PCLIENT_ID ClientId OPTIONAL,
11461 IN PKSTART_ROUTINE StartRoutine,
11462 IN PVOID StartContext OPTIONAL);
11463
11464 NTKERNELAPI
11465 NTSTATUS
11466 NTAPI
11467 PsTerminateSystemThread(
11468 IN NTSTATUS ExitStatus);
11469
11470
11471 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11472
11473 /******************************************************************************
11474 * WMI Library Support Functions *
11475 ******************************************************************************/
11476
11477 #ifdef RUN_WPP
11478 #if (NTDDI_VERSION >= NTDDI_WINXP)
11479 NTKERNELAPI
11480 NTSTATUS
11481 __cdecl
11482 WmiTraceMessage(
11483 IN TRACEHANDLE LoggerHandle,
11484 IN ULONG MessageFlags,
11485 IN LPGUID MessageGuid,
11486 IN USHORT MessageNumber,
11487 IN ...);
11488 #endif
11489 #endif /* RUN_WPP */
11490
11491 #if (NTDDI_VERSION >= NTDDI_WINXP)
11492
11493 NTKERNELAPI
11494 NTSTATUS
11495 NTAPI
11496 WmiQueryTraceInformation(
11497 IN TRACE_INFORMATION_CLASS TraceInformationClass,
11498 OUT PVOID TraceInformation,
11499 IN ULONG TraceInformationLength,
11500 OUT PULONG RequiredLength OPTIONAL,
11501 IN PVOID Buffer OPTIONAL);
11502
11503 #if 0
11504 /* FIXME: Get va_list from where? */
11505 NTKERNELAPI
11506 NTSTATUS
11507 __cdecl
11508 WmiTraceMessageVa(
11509 IN TRACEHANDLE LoggerHandle,
11510 IN ULONG MessageFlags,
11511 IN LPGUID MessageGuid,
11512 IN USHORT MessageNumber,
11513 IN va_list MessageArgList);
11514 #endif
11515
11516 #endif
11517
11518 /******************************************************************************
11519 * Kernel Debugger Functions *
11520 ******************************************************************************/
11521
11522 #ifndef _DBGNT_
11523
11524 ULONG
11525 __cdecl
11526 DbgPrint(
11527 IN PCSTR Format,
11528 IN ...);
11529 #endif
11530
11531 #if DBG
11532
11533 #define KdPrint(_x_) DbgPrint _x_
11534 #define KdPrintEx(_x_) DbgPrintEx _x_
11535 #define vKdPrintEx(_x_) vDbgPrintEx _x_
11536 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
11537 #define KdBreakPoint() DbgBreakPoint()
11538 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
11539
11540 #else /* !DBG */
11541
11542 #define KdPrint(_x_)
11543 #define KdPrintEx(_x_)
11544 #define vKdPrintEx(_x_)
11545 #define vKdPrintExWithPrefix(_x_)
11546 #define KdBreakPoint()
11547 #define KdBreakPointWithStatus(s)
11548
11549 #endif /* !DBG */
11550
11551 #if defined(__GNUC__)
11552
11553 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
11554 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
11555 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11556 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11557
11558 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
11559
11560 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
11561 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
11562 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
11563 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
11564
11565 #else
11566
11567 extern BOOLEAN KdDebuggerNotPresent;
11568 extern BOOLEAN KdDebuggerEnabled;
11569 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11570 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11571
11572 #endif
11573
11574 #ifdef _VA_LIST_DEFINED
11575 #if (NTDDI_VERSION >= NTDDI_WINXP)
11576
11577 NTSYSAPI
11578 ULONG
11579 NTAPI
11580 vDbgPrintEx(
11581 IN ULONG ComponentId,
11582 IN ULONG Level,
11583 IN PCCH Format,
11584 IN va_list ap);
11585
11586 NTSYSAPI
11587 ULONG
11588 NTAPI
11589 vDbgPrintExWithPrefix(
11590 IN PCCH Prefix,
11591 IN ULONG ComponentId,
11592 IN ULONG Level,
11593 IN PCCH Format,
11594 IN va_list ap);
11595
11596 #endif
11597 #endif // _VA_LIST_DEFINED
11598
11599 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11600
11601 NTKERNELAPI
11602 NTSTATUS
11603 NTAPI
11604 KdDisableDebugger(VOID);
11605
11606 NTKERNELAPI
11607 NTSTATUS
11608 NTAPI
11609 KdEnableDebugger(VOID);
11610
11611 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
11612 #define DbgBreakPoint __debugbreak
11613 #else
11614 VOID
11615 NTAPI
11616 DbgBreakPoint(VOID);
11617 #endif
11618
11619 NTSYSAPI
11620 VOID
11621 NTAPI
11622 DbgBreakPointWithStatus(
11623 IN ULONG Status);
11624
11625 NTSYSAPI
11626 ULONG
11627 _cdecl
11628 DbgPrintReturnControlC(
11629 IN PCCH Format,
11630 IN ...);
11631
11632 #endif
11633
11634 #if (NTDDI_VERSION >= NTDDI_WINXP)
11635
11636 NTSYSAPI
11637 ULONG
11638 _cdecl
11639 DbgPrintEx(
11640 IN ULONG ComponentId,
11641 IN ULONG Level,
11642 IN PCSTR Format,
11643 IN ...);
11644
11645 NTSYSAPI
11646 NTSTATUS
11647 NTAPI
11648 DbgQueryDebugFilterState(
11649 IN ULONG ComponentId,
11650 IN ULONG Level);
11651
11652 NTSYSAPI
11653 NTSTATUS
11654 NTAPI
11655 DbgSetDebugFilterState(
11656 IN ULONG ComponentId,
11657 IN ULONG Level,
11658 IN BOOLEAN State);
11659
11660 #endif
11661
11662 #if (NTDDI_VERSION >= NTDDI_WS03)
11663 NTKERNELAPI
11664 BOOLEAN
11665 NTAPI
11666 KdRefreshDebuggerNotPresent(VOID);
11667 #endif
11668
11669 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11670 NTKERNELAPI
11671 NTSTATUS
11672 NTAPI
11673 KdChangeOption(
11674 IN KD_OPTION Option,
11675 IN ULONG InBufferBytes OPTIONAL,
11676 IN PVOID InBuffer,
11677 IN ULONG OutBufferBytes OPTIONAL,
11678 OUT PVOID OutBuffer,
11679 OUT PULONG OutBufferNeeded OPTIONAL);
11680 #endif
11681
11682 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11683
11684 FORCEINLINE
11685 PVOID
11686 NTAPI
11687 HalAllocateCommonBuffer(
11688 IN PDMA_ADAPTER DmaAdapter,
11689 IN ULONG Length,
11690 OUT PPHYSICAL_ADDRESS LogicalAddress,
11691 IN BOOLEAN CacheEnabled)
11692 {
11693 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
11694 PVOID commonBuffer;
11695
11696 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
11697 ASSERT( allocateCommonBuffer != NULL );
11698 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
11699 return commonBuffer;
11700 }
11701
11702 FORCEINLINE
11703 VOID
11704 NTAPI
11705 HalFreeCommonBuffer(
11706 IN PDMA_ADAPTER DmaAdapter,
11707 IN ULONG Length,
11708 IN PHYSICAL_ADDRESS LogicalAddress,
11709 IN PVOID VirtualAddress,
11710 IN BOOLEAN CacheEnabled)
11711 {
11712 PFREE_COMMON_BUFFER freeCommonBuffer;
11713
11714 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
11715 ASSERT( freeCommonBuffer != NULL );
11716 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
11717 }
11718
11719 FORCEINLINE
11720 ULONG
11721 NTAPI
11722 HalReadDmaCounter(
11723 IN PDMA_ADAPTER DmaAdapter)
11724 {
11725 PREAD_DMA_COUNTER readDmaCounter;
11726 ULONG counter;
11727
11728 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
11729 ASSERT( readDmaCounter != NULL );
11730 counter = readDmaCounter( DmaAdapter );
11731 return counter;
11732 }
11733
11734 #endif
11735
11736
11737 #ifndef _NTTMAPI_
11738 #define _NTTMAPI_
11739
11740 #include <ktmtypes.h>
11741
11742 typedef enum _KTMOBJECT_TYPE {
11743 KTMOBJECT_TRANSACTION,
11744 KTMOBJECT_TRANSACTION_MANAGER,
11745 KTMOBJECT_RESOURCE_MANAGER,
11746 KTMOBJECT_ENLISTMENT,
11747 KTMOBJECT_INVALID
11748 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
11749
11750 typedef struct _KTMOBJECT_CURSOR {
11751 GUID LastQuery;
11752 ULONG ObjectIdCount;
11753 GUID ObjectIds[1];
11754 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
11755
11756 typedef enum _TRANSACTION_INFORMATION_CLASS {
11757 TransactionBasicInformation,
11758 TransactionPropertiesInformation,
11759 TransactionEnlistmentInformation,
11760 TransactionSuperiorEnlistmentInformation
11761 } TRANSACTION_INFORMATION_CLASS;
11762
11763 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
11764 TransactionManagerBasicInformation,
11765 TransactionManagerLogInformation,
11766 TransactionManagerLogPathInformation,
11767 TransactionManagerRecoveryInformation = 4
11768 } TRANSACTIONMANAGER_INFORMATION_CLASS;
11769
11770 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
11771 ResourceManagerBasicInformation,
11772 ResourceManagerCompletionInformation,
11773 } RESOURCEMANAGER_INFORMATION_CLASS;
11774
11775 typedef enum _ENLISTMENT_INFORMATION_CLASS {
11776 EnlistmentBasicInformation,
11777 EnlistmentRecoveryInformation,
11778 EnlistmentCrmInformation
11779 } ENLISTMENT_INFORMATION_CLASS;
11780
11781 #endif /* !_NTTMAPI_ */
11782 /******************************************************************************
11783 * ZwXxx Functions *
11784 ******************************************************************************/
11785
11786
11787 /* Constants */
11788 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
11789 #define ZwCurrentProcess() NtCurrentProcess()
11790 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
11791 #define ZwCurrentThread() NtCurrentThread()
11792
11793
11794
11795 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11796
11797
11798
11799 NTSYSAPI
11800 NTSTATUS
11801 NTAPI
11802 ZwClose(
11803 IN HANDLE Handle);
11804
11805 NTSYSAPI
11806 NTSTATUS
11807 NTAPI
11808 ZwCreateDirectoryObject(
11809 OUT PHANDLE DirectoryHandle,
11810 IN ACCESS_MASK DesiredAccess,
11811 IN POBJECT_ATTRIBUTES ObjectAttributes);
11812
11813 NTSYSAPI
11814 NTSTATUS
11815 NTAPI
11816 ZwCreateFile(
11817 OUT PHANDLE FileHandle,
11818 IN ACCESS_MASK DesiredAccess,
11819 IN POBJECT_ATTRIBUTES ObjectAttributes,
11820 OUT PIO_STATUS_BLOCK IoStatusBlock,
11821 IN PLARGE_INTEGER AllocationSize OPTIONAL,
11822 IN ULONG FileAttributes,
11823 IN ULONG ShareAccess,
11824 IN ULONG CreateDisposition,
11825 IN ULONG CreateOptions,
11826 IN PVOID EaBuffer OPTIONAL,
11827 IN ULONG EaLength);
11828
11829 NTSYSAPI
11830 NTSTATUS
11831 NTAPI
11832 ZwCreateKey(
11833 OUT PHANDLE KeyHandle,
11834 IN ACCESS_MASK DesiredAccess,
11835 IN POBJECT_ATTRIBUTES ObjectAttributes,
11836 IN ULONG TitleIndex,
11837 IN PUNICODE_STRING Class OPTIONAL,
11838 IN ULONG CreateOptions,
11839 OUT PULONG Disposition OPTIONAL);
11840
11841 NTSYSAPI
11842 NTSTATUS
11843 NTAPI
11844 ZwCreateSection(
11845 OUT PHANDLE SectionHandle,
11846 IN ACCESS_MASK DesiredAccess,
11847 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
11848 IN PLARGE_INTEGER MaximumSize OPTIONAL,
11849 IN ULONG SectionPageProtection,
11850 IN ULONG AllocationAttributes,
11851 IN HANDLE FileHandle OPTIONAL);
11852
11853 NTSYSAPI
11854 NTSTATUS
11855 NTAPI
11856 ZwDeleteKey(
11857 IN HANDLE KeyHandle);
11858
11859 NTSYSAPI
11860 NTSTATUS
11861 NTAPI
11862 ZwDeleteValueKey(
11863 IN HANDLE KeyHandle,
11864 IN PUNICODE_STRING ValueName);
11865
11866 NTSYSAPI
11867 NTSTATUS
11868 NTAPI
11869 ZwEnumerateKey(
11870 IN HANDLE KeyHandle,
11871 IN ULONG Index,
11872 IN KEY_INFORMATION_CLASS KeyInformationClass,
11873 OUT PVOID KeyInformation OPTIONAL,
11874 IN ULONG Length,
11875 OUT PULONG ResultLength);
11876
11877 NTSYSAPI
11878 NTSTATUS
11879 NTAPI
11880 ZwEnumerateValueKey(
11881 IN HANDLE KeyHandle,
11882 IN ULONG Index,
11883 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
11884 OUT PVOID KeyValueInformation OPTIONAL,
11885 IN ULONG Length,
11886 OUT PULONG ResultLength);
11887
11888 NTSYSAPI
11889 NTSTATUS
11890 NTAPI
11891 ZwFlushKey(
11892 IN HANDLE KeyHandle);
11893
11894 NTSYSAPI
11895 NTSTATUS
11896 NTAPI
11897 ZwLoadDriver(
11898 IN PUNICODE_STRING DriverServiceName);
11899
11900 NTSYSAPI
11901 NTSTATUS
11902 NTAPI
11903 ZwMakeTemporaryObject(
11904 IN HANDLE Handle);
11905
11906 NTSYSAPI
11907 NTSTATUS
11908 NTAPI
11909 ZwMapViewOfSection(
11910 IN HANDLE SectionHandle,
11911 IN HANDLE ProcessHandle,
11912 IN OUT PVOID *BaseAddress,
11913 IN ULONG_PTR ZeroBits,
11914 IN SIZE_T CommitSize,
11915 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
11916 IN OUT PSIZE_T ViewSize,
11917 IN SECTION_INHERIT InheritDisposition,
11918 IN ULONG AllocationType,
11919 IN ULONG Protect);
11920
11921 NTSYSAPI
11922 NTSTATUS
11923 NTAPI
11924 ZwOpenFile(
11925 OUT PHANDLE FileHandle,
11926 IN ACCESS_MASK DesiredAccess,
11927 IN POBJECT_ATTRIBUTES ObjectAttributes,
11928 OUT PIO_STATUS_BLOCK IoStatusBlock,
11929 IN ULONG ShareAccess,
11930 IN ULONG OpenOptions);
11931
11932 NTSYSAPI
11933 NTSTATUS
11934 NTAPI
11935 ZwOpenKey(
11936 OUT PHANDLE KeyHandle,
11937 IN ACCESS_MASK DesiredAccess,
11938 IN POBJECT_ATTRIBUTES ObjectAttributes);
11939
11940 NTSYSAPI
11941 NTSTATUS
11942 NTAPI
11943 ZwOpenSection(
11944 OUT PHANDLE SectionHandle,
11945 IN ACCESS_MASK DesiredAccess,
11946 IN POBJECT_ATTRIBUTES ObjectAttributes);
11947
11948 NTSYSAPI
11949 NTSTATUS
11950 NTAPI
11951 ZwOpenSymbolicLinkObject(
11952 OUT PHANDLE LinkHandle,
11953 IN ACCESS_MASK DesiredAccess,
11954 IN POBJECT_ATTRIBUTES ObjectAttributes);
11955
11956 NTSYSAPI
11957 NTSTATUS
11958 NTAPI
11959 ZwQueryInformationFile(
11960 IN HANDLE FileHandle,
11961 OUT PIO_STATUS_BLOCK IoStatusBlock,
11962 OUT PVOID FileInformation,
11963 IN ULONG Length,
11964 IN FILE_INFORMATION_CLASS FileInformationClass);
11965
11966 NTSYSAPI
11967 NTSTATUS
11968 NTAPI
11969 ZwQueryKey(
11970 IN HANDLE KeyHandle,
11971 IN KEY_INFORMATION_CLASS KeyInformationClass,
11972 OUT PVOID KeyInformation OPTIONAL,
11973 IN ULONG Length,
11974 OUT PULONG ResultLength);
11975
11976 NTSYSAPI
11977 NTSTATUS
11978 NTAPI
11979 ZwQuerySymbolicLinkObject(
11980 IN HANDLE LinkHandle,
11981 IN OUT PUNICODE_STRING LinkTarget,
11982 OUT PULONG ReturnedLength OPTIONAL);
11983
11984 NTSYSAPI
11985 NTSTATUS
11986 NTAPI
11987 ZwQueryValueKey(
11988 IN HANDLE KeyHandle,
11989 IN PUNICODE_STRING ValueName,
11990 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
11991 OUT PVOID KeyValueInformation OPTIONAL,
11992 IN ULONG Length,
11993 OUT PULONG ResultLength);
11994
11995 NTSYSAPI
11996 NTSTATUS
11997 NTAPI
11998 ZwReadFile(
11999 IN HANDLE FileHandle,
12000 IN HANDLE Event OPTIONAL,
12001 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
12002 IN PVOID ApcContext OPTIONAL,
12003 OUT PIO_STATUS_BLOCK IoStatusBlock,
12004 OUT PVOID Buffer,
12005 IN ULONG Length,
12006 IN PLARGE_INTEGER ByteOffset OPTIONAL,
12007 IN PULONG Key OPTIONAL);
12008
12009 NTSYSAPI
12010 NTSTATUS
12011 NTAPI
12012 ZwSetInformationFile(
12013 IN HANDLE FileHandle,
12014 OUT PIO_STATUS_BLOCK IoStatusBlock,
12015 IN PVOID FileInformation,
12016 IN ULONG Length,
12017 IN FILE_INFORMATION_CLASS FileInformationClass);
12018
12019 NTSYSAPI
12020 NTSTATUS
12021 NTAPI
12022 ZwSetValueKey(
12023 IN HANDLE KeyHandle,
12024 IN PUNICODE_STRING ValueName,
12025 IN ULONG TitleIndex OPTIONAL,
12026 IN ULONG Type,
12027 IN PVOID Data OPTIONAL,
12028 IN ULONG DataSize);
12029
12030 NTSYSAPI
12031 NTSTATUS
12032 NTAPI
12033 ZwUnloadDriver(
12034 IN PUNICODE_STRING DriverServiceName);
12035
12036 NTSYSAPI
12037 NTSTATUS
12038 NTAPI
12039 ZwUnmapViewOfSection(
12040 IN HANDLE ProcessHandle,
12041 IN PVOID BaseAddress OPTIONAL);
12042
12043 NTSYSAPI
12044 NTSTATUS
12045 NTAPI
12046 ZwWriteFile(
12047 IN HANDLE FileHandle,
12048 IN HANDLE Event OPTIONAL,
12049 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
12050 IN PVOID ApcContext OPTIONAL,
12051 OUT PIO_STATUS_BLOCK IoStatusBlock,
12052 IN PVOID Buffer,
12053 IN ULONG Length,
12054 IN PLARGE_INTEGER ByteOffset OPTIONAL,
12055 IN PULONG Key OPTIONAL);
12056
12057 NTSYSAPI
12058 NTSTATUS
12059 NTAPI
12060 ZwQueryFullAttributesFile(
12061 IN POBJECT_ATTRIBUTES ObjectAttributes,
12062 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
12063
12064
12065 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12066
12067
12068 #if (NTDDI_VERSION >= NTDDI_WS03)
12069 NTSYSCALLAPI
12070 NTSTATUS
12071 NTAPI
12072 ZwOpenEvent(
12073 OUT PHANDLE EventHandle,
12074 IN ACCESS_MASK DesiredAccess,
12075 IN POBJECT_ATTRIBUTES ObjectAttributes);
12076 #endif
12077
12078 #if (NTDDI_VERSION >= NTDDI_VISTA)
12079
12080 NTSYSAPI
12081 NTSTATUS
12082 ZwCreateKeyTransacted(
12083 OUT PHANDLE KeyHandle,
12084 IN ACCESS_MASK DesiredAccess,
12085 IN POBJECT_ATTRIBUTES ObjectAttributes,
12086 IN ULONG TitleIndex,
12087 IN PUNICODE_STRING Class OPTIONAL,
12088 IN ULONG CreateOptions,
12089 IN HANDLE TransactionHandle,
12090 OUT PULONG Disposition OPTIONAL);
12091
12092 NTSYSAPI
12093 NTSTATUS
12094 NTAPI
12095 ZwOpenKeyTransacted(
12096 OUT PHANDLE KeyHandle,
12097 IN ACCESS_MASK DesiredAccess,
12098 IN POBJECT_ATTRIBUTES ObjectAttributes,
12099 IN HANDLE TransactionHandle);
12100
12101 NTSYSCALLAPI
12102 NTSTATUS
12103 NTAPI
12104 ZwCreateTransactionManager(
12105 OUT PHANDLE TmHandle,
12106 IN ACCESS_MASK DesiredAccess,
12107 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12108 IN PUNICODE_STRING LogFileName OPTIONAL,
12109 IN ULONG CreateOptions OPTIONAL,
12110 IN ULONG CommitStrength OPTIONAL);
12111
12112 NTSYSCALLAPI
12113 NTSTATUS
12114 NTAPI
12115 ZwOpenTransactionManager(
12116 OUT PHANDLE TmHandle,
12117 IN ACCESS_MASK DesiredAccess,
12118 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12119 IN PUNICODE_STRING LogFileName OPTIONAL,
12120 IN LPGUID TmIdentity OPTIONAL,
12121 IN ULONG OpenOptions OPTIONAL);
12122
12123 NTSYSCALLAPI
12124 NTSTATUS
12125 NTAPI
12126 ZwRollforwardTransactionManager(
12127 IN HANDLE TransactionManagerHandle,
12128 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12129
12130 NTSYSCALLAPI
12131 NTSTATUS
12132 NTAPI
12133 ZwRecoverTransactionManager(
12134 IN HANDLE TransactionManagerHandle);
12135
12136 NTSYSCALLAPI
12137 NTSTATUS
12138 NTAPI
12139 ZwQueryInformationTransactionManager(
12140 IN HANDLE TransactionManagerHandle,
12141 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
12142 OUT PVOID TransactionManagerInformation,
12143 IN ULONG TransactionManagerInformationLength,
12144 OUT PULONG ReturnLength OPTIONAL);
12145
12146 NTSYSCALLAPI
12147 NTSTATUS
12148 NTAPI
12149 ZwSetInformationTransactionManager(
12150 IN HANDLE TmHandle,
12151 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
12152 IN PVOID TransactionManagerInformation,
12153 IN ULONG TransactionManagerInformationLength);
12154
12155 NTSYSCALLAPI
12156 NTSTATUS
12157 NTAPI
12158 ZwEnumerateTransactionObject(
12159 IN HANDLE RootObjectHandle OPTIONAL,
12160 IN KTMOBJECT_TYPE QueryType,
12161 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
12162 IN ULONG ObjectCursorLength,
12163 OUT PULONG ReturnLength);
12164
12165 NTSYSCALLAPI
12166 NTSTATUS
12167 NTAPI
12168 ZwCreateTransaction(
12169 OUT PHANDLE TransactionHandle,
12170 IN ACCESS_MASK DesiredAccess,
12171 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12172 IN LPGUID Uow OPTIONAL,
12173 IN HANDLE TmHandle OPTIONAL,
12174 IN ULONG CreateOptions OPTIONAL,
12175 IN ULONG IsolationLevel OPTIONAL,
12176 IN ULONG IsolationFlags OPTIONAL,
12177 IN PLARGE_INTEGER Timeout OPTIONAL,
12178 IN PUNICODE_STRING Description OPTIONAL);
12179
12180 NTSYSCALLAPI
12181 NTSTATUS
12182 NTAPI
12183 ZwOpenTransaction(
12184 OUT PHANDLE TransactionHandle,
12185 IN ACCESS_MASK DesiredAccess,
12186 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12187 IN LPGUID Uow,
12188 IN HANDLE TmHandle OPTIONAL);
12189
12190 NTSYSCALLAPI
12191 NTSTATUS
12192 NTAPI
12193 ZwQueryInformationTransaction(
12194 IN HANDLE TransactionHandle,
12195 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
12196 OUT PVOID TransactionInformation,
12197 IN ULONG TransactionInformationLength,
12198 OUT PULONG ReturnLength OPTIONAL);
12199
12200 NTSYSCALLAPI
12201 NTSTATUS
12202 NTAPI
12203 ZwSetInformationTransaction(
12204 IN HANDLE TransactionHandle,
12205 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
12206 IN PVOID TransactionInformation,
12207 IN ULONG TransactionInformationLength);
12208
12209 NTSYSCALLAPI
12210 NTSTATUS
12211 NTAPI
12212 ZwCommitTransaction(
12213 IN HANDLE TransactionHandle,
12214 IN BOOLEAN Wait);
12215
12216 NTSYSCALLAPI
12217 NTSTATUS
12218 NTAPI
12219 ZwRollbackTransaction(
12220 IN HANDLE TransactionHandle,
12221 IN BOOLEAN Wait);
12222
12223 NTSYSCALLAPI
12224 NTSTATUS
12225 NTAPI
12226 ZwCreateResourceManager(
12227 OUT PHANDLE ResourceManagerHandle,
12228 IN ACCESS_MASK DesiredAccess,
12229 IN HANDLE TmHandle,
12230 IN LPGUID ResourceManagerGuid OPTIONAL,
12231 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12232 IN ULONG CreateOptions OPTIONAL,
12233 IN PUNICODE_STRING Description OPTIONAL);
12234
12235 NTSYSCALLAPI
12236 NTSTATUS
12237 NTAPI
12238 ZwOpenResourceManager(
12239 OUT PHANDLE ResourceManagerHandle,
12240 IN ACCESS_MASK DesiredAccess,
12241 IN HANDLE TmHandle,
12242 IN LPGUID ResourceManagerGuid,
12243 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
12244
12245 NTSYSCALLAPI
12246 NTSTATUS
12247 NTAPI
12248 ZwRecoverResourceManager(
12249 IN HANDLE ResourceManagerHandle);
12250
12251 NTSYSCALLAPI
12252 NTSTATUS
12253 NTAPI
12254 ZwGetNotificationResourceManager(
12255 IN HANDLE ResourceManagerHandle,
12256 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
12257 IN ULONG NotificationLength,
12258 IN PLARGE_INTEGER Timeout,
12259 IN PULONG ReturnLength OPTIONAL,
12260 IN ULONG Asynchronous,
12261 IN ULONG_PTR AsynchronousContext OPTIONAL);
12262
12263 NTSYSCALLAPI
12264 NTSTATUS
12265 NTAPI
12266 ZwQueryInformationResourceManager(
12267 IN HANDLE ResourceManagerHandle,
12268 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
12269 OUT PVOID ResourceManagerInformation,
12270 IN ULONG ResourceManagerInformationLength,
12271 IN PULONG ReturnLength OPTIONAL);
12272
12273 NTSYSCALLAPI
12274 NTSTATUS
12275 NTAPI
12276 ZwSetInformationResourceManager(
12277 IN HANDLE ResourceManagerHandle,
12278 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
12279 IN PVOID ResourceManagerInformation,
12280 IN ULONG ResourceManagerInformationLength);
12281
12282 NTSYSCALLAPI
12283 NTSTATUS
12284 NTAPI
12285 ZwCreateEnlistment(
12286 OUT PHANDLE EnlistmentHandle,
12287 IN ACCESS_MASK DesiredAccess,
12288 IN HANDLE ResourceManagerHandle,
12289 IN HANDLE TransactionHandle,
12290 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
12291 IN ULONG CreateOptions OPTIONAL,
12292 IN NOTIFICATION_MASK NotificationMask,
12293 IN PVOID EnlistmentKey OPTIONAL);
12294
12295 NTSYSCALLAPI
12296 NTSTATUS
12297 NTAPI
12298 ZwOpenEnlistment(
12299 OUT PHANDLE EnlistmentHandle,
12300 IN ACCESS_MASK DesiredAccess,
12301 IN HANDLE RmHandle,
12302 IN LPGUID EnlistmentGuid,
12303 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
12304
12305 NTSYSCALLAPI
12306 NTSTATUS
12307 NTAPI
12308 ZwQueryInformationEnlistment(
12309 IN HANDLE EnlistmentHandle,
12310 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
12311 OUT PVOID EnlistmentInformation,
12312 IN ULONG EnlistmentInformationLength,
12313 IN PULONG ReturnLength OPTIONAL);
12314
12315 NTSYSCALLAPI
12316 NTSTATUS
12317 NTAPI
12318 ZwSetInformationEnlistment(
12319 IN HANDLE EnlistmentHandle,
12320 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
12321 IN PVOID EnlistmentInformation,
12322 IN ULONG EnlistmentInformationLength);
12323
12324 NTSYSCALLAPI
12325 NTSTATUS
12326 NTAPI
12327 ZwRecoverEnlistment(
12328 IN HANDLE EnlistmentHandle,
12329 IN PVOID EnlistmentKey OPTIONAL);
12330
12331 NTSYSCALLAPI
12332 NTSTATUS
12333 NTAPI
12334 ZwPrePrepareEnlistment(
12335 IN HANDLE EnlistmentHandle,
12336 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12337
12338 NTSYSCALLAPI
12339 NTSTATUS
12340 NTAPI
12341 ZwPrepareEnlistment(
12342 IN HANDLE EnlistmentHandle,
12343 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12344
12345 NTSYSCALLAPI
12346 NTSTATUS
12347 NTAPI
12348 ZwCommitEnlistment(
12349 IN HANDLE EnlistmentHandle,
12350 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12351
12352 NTSYSCALLAPI
12353 NTSTATUS
12354 NTAPI
12355 ZwRollbackEnlistment(
12356 IN HANDLE EnlistmentHandle,
12357 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12358
12359 NTSYSCALLAPI
12360 NTSTATUS
12361 NTAPI
12362 ZwPrePrepareComplete(
12363 IN HANDLE EnlistmentHandle,
12364 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12365
12366 NTSYSCALLAPI
12367 NTSTATUS
12368 NTAPI
12369 ZwPrepareComplete(
12370 IN HANDLE EnlistmentHandle,
12371 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12372
12373 NTSYSCALLAPI
12374 NTSTATUS
12375 NTAPI
12376 ZwCommitComplete(
12377 IN HANDLE EnlistmentHandle,
12378 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12379
12380 NTSYSCALLAPI
12381 NTSTATUS
12382 NTAPI
12383 ZwReadOnlyEnlistment(
12384 IN HANDLE EnlistmentHandle,
12385 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12386
12387 NTSYSCALLAPI
12388 NTSTATUS
12389 NTAPI
12390 ZwRollbackComplete(
12391 IN HANDLE EnlistmentHandle,
12392 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12393
12394 NTSYSCALLAPI
12395 NTSTATUS
12396 NTAPI
12397 ZwSinglePhaseReject(
12398 IN HANDLE EnlistmentHandle,
12399 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
12400
12401
12402 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12403
12404
12405 #if (NTDDI_VERSION >= NTDDI_WIN7)
12406
12407
12408
12409 NTSYSAPI
12410 NTSTATUS
12411 NTAPI
12412 ZwOpenKeyEx(
12413 OUT PHANDLE KeyHandle,
12414 IN ACCESS_MASK DesiredAccess,
12415 IN POBJECT_ATTRIBUTES ObjectAttributes,
12416 IN ULONG OpenOptions);
12417
12418 NTSYSAPI
12419 NTSTATUS
12420 NTAPI
12421 ZwOpenKeyTransactedEx(
12422 OUT PHANDLE KeyHandle,
12423 IN ACCESS_MASK DesiredAccess,
12424 IN POBJECT_ATTRIBUTES ObjectAttributes,
12425 IN ULONG OpenOptions,
12426 IN HANDLE TransactionHandle);
12427
12428 NTSYSAPI
12429 NTSTATUS
12430 NTAPI
12431 ZwNotifyChangeMultipleKeys(
12432 IN HANDLE MasterKeyHandle,
12433 IN ULONG Count OPTIONAL,
12434 IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
12435 IN HANDLE Event OPTIONAL,
12436 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
12437 IN PVOID ApcContext OPTIONAL,
12438 OUT PIO_STATUS_BLOCK IoStatusBlock,
12439 IN ULONG CompletionFilter,
12440 IN BOOLEAN WatchTree,
12441 OUT PVOID Buffer OPTIONAL,
12442 IN ULONG BufferSize,
12443 IN BOOLEAN Asynchronous);
12444
12445 NTSYSAPI
12446 NTSTATUS
12447 NTAPI
12448 ZwQueryMultipleValueKey(
12449 IN HANDLE KeyHandle,
12450 IN OUT PKEY_VALUE_ENTRY ValueEntries,
12451 IN ULONG EntryCount,
12452 OUT PVOID ValueBuffer,
12453 IN OUT PULONG BufferLength,
12454 OUT PULONG RequiredBufferLength OPTIONAL);
12455
12456 NTSYSAPI
12457 NTSTATUS
12458 NTAPI
12459 ZwRenameKey(
12460 IN HANDLE KeyHandle,
12461 IN PUNICODE_STRING NewName);
12462
12463 NTSYSAPI
12464 NTSTATUS
12465 NTAPI
12466 ZwSetInformationKey(
12467 IN HANDLE KeyHandle,
12468 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
12469 IN PVOID KeySetInformation,
12470 IN ULONG KeySetInformationLength);
12471
12472 #endif
12473
12474 /******************************************************************************
12475 * Unsorted *
12476 ******************************************************************************/
12477
12478 /* GUID Comparison */
12479 #ifndef __IID_ALIGNED__
12480 #define __IID_ALIGNED__
12481 #ifdef __cplusplus
12482 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
12483 {
12484 return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
12485 (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
12486 }
12487 #else
12488 #define IsEqualGUIDAligned(guid1, guid2) \
12489 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
12490 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
12491 #endif /* __cplusplus */
12492 #endif /* !__IID_ALIGNED__ */
12493
12494 typedef enum {
12495 LT_DONT_CARE,
12496 LT_LOWEST_LATENCY
12497 } LATENCY_TIME;
12498
12499 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
12500
12501 #define MAXIMUM_FILENAME_LENGTH 256
12502
12503 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
12504
12505 #define OBJECT_TYPE_CREATE (0x0001)
12506 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
12507
12508 #define DIRECTORY_QUERY (0x0001)
12509 #define DIRECTORY_TRAVERSE (0x0002)
12510 #define DIRECTORY_CREATE_OBJECT (0x0004)
12511 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
12512 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
12513
12514 #define EVENT_QUERY_STATE (0x0001)
12515 #define EVENT_MODIFY_STATE (0x0002)
12516 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
12517
12518 #define SEMAPHORE_QUERY_STATE (0x0001)
12519 #define SEMAPHORE_MODIFY_STATE (0x0002)
12520 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
12521
12522 #define SYMBOLIC_LINK_QUERY 0x0001
12523 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
12524
12525 #define DUPLICATE_CLOSE_SOURCE 0x00000001
12526 #define DUPLICATE_SAME_ACCESS 0x00000002
12527 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
12528
12529 /* Global debug flag */
12530 extern ULONG NtGlobalFlag;
12531
12532 /* Service Start Types */
12533 #define SERVICE_BOOT_START 0x00000000
12534 #define SERVICE_SYSTEM_START 0x00000001
12535 #define SERVICE_AUTO_START 0x00000002
12536 #define SERVICE_DEMAND_START 0x00000003
12537 #define SERVICE_DISABLED 0x00000004
12538
12539 #ifndef _TRACEHANDLE_DEFINED
12540 #define _TRACEHANDLE_DEFINED
12541 typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
12542 #endif
12543
12544
12545
12546 #ifdef __cplusplus
12547 }
12548 #endif
12549
12550 #endif /* !_WDMDDK_ */