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