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