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