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