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