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