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