1 /******************************************************************************
3 ******************************************************************************/
7 #elif defined(_M_AMD64)
13 #elif defined(_M_MIPS)
18 #error Unknown Architecture
29 _IRQL_requires_max_(DISPATCH_LEVEL
)
34 _Inout_ PRKEVENT Event
);
38 _IRQL_requires_min_(PASSIVE_LEVEL
)
39 _IRQL_requires_max_(DISPATCH_LEVEL
)
43 KeInvalidateRangeAllCaches(
44 _In_ PVOID BaseAddress
,
51 KeGetProcessorNumberFromIndex(
53 _Out_ PPROCESSOR_NUMBER ProcNumber
);
57 KeGetProcessorIndexFromNumber(
58 _In_ PPROCESSOR_NUMBER ProcNumber
);
61 #if (NTDDI_VERSION >= NTDDI_WIN2K)
64 #if defined(_NTDDK_) || defined(_NTIFS_)
65 _Maybe_raises_SEH_exception_
66 _IRQL_requires_max_(APC_LEVEL
)
71 __in_data_source(USER_MODE
) _In_reads_bytes_(Length
) CONST VOID
*Address
, /* CONST is added */
73 _In_ ULONG Alignment
);
74 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
76 _Maybe_raises_SEH_exception_
77 _IRQL_requires_max_(APC_LEVEL
)
82 __in_data_source(USER_MODE
) _Out_writes_bytes_(Length
) PVOID Address
,
84 _In_ ULONG Alignment
);
93 _In_ KDPC_IMPORTANCE Importance
);
95 _IRQL_requires_max_(DISPATCH_LEVEL
)
100 _Inout_ PRKEVENT Event
,
101 _In_ KPRIORITY Increment
,
104 _IRQL_requires_min_(PASSIVE_LEVEL
)
105 _IRQL_requires_max_(DISPATCH_LEVEL
)
109 KeSetBasePriorityThread(
110 _Inout_ PRKTHREAD Thread
,
111 _In_ LONG Increment
);
113 _Acquires_lock_(_Global_critical_region_
)
114 _IRQL_requires_max_(APC_LEVEL
)
118 KeEnterCriticalRegion(VOID
);
120 _Releases_lock_(_Global_critical_region_
)
121 _IRQL_requires_max_(APC_LEVEL
)
125 KeLeaveCriticalRegion(VOID
);
132 _In_ ULONG BugCheckCode
);
134 $
if (_WDMDDK_
|| _NTDDK_
)
135 #if defined(SINGLE_GROUP_LEGACY_API)
136 $
endif (_WDMDDK_
|| _NTDDK_
)
139 _IRQL_requires_min_(PASSIVE_LEVEL
)
140 _IRQL_requires_max_(APC_LEVEL
)
144 KeRevertToUserAffinityThread(VOID
);
146 _IRQL_requires_min_(PASSIVE_LEVEL
)
147 _IRQL_requires_max_(APC_LEVEL
)
151 KeSetSystemAffinityThread(
152 _In_ KAFFINITY Affinity
);
157 KeSetTargetProcessorDpc(
164 KeQueryActiveProcessors(VOID
);
171 KeSetTargetProcessorDpc(
178 KeQueryActiveProcessors(VOID
);
180 $
if (_WDMDDK_
|| _NTDDK_
)
181 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
182 $
endif (_WDMDDK_
|| _NTDDK_
)
185 #if !defined(_M_AMD64)
189 KeQueryInterruptTime(VOID
);
195 _Out_ PLARGE_INTEGER CurrentTime
);
196 #endif /* !_M_AMD64 */
198 #if !defined(_X86_) && !defined(_M_ARM)
199 _Requires_lock_not_held_(*SpinLock
)
200 _Acquires_lock_(*SpinLock
)
201 _IRQL_requires_max_(DISPATCH_LEVEL
)
203 _IRQL_raises_(DISPATCH_LEVEL
)
207 KeAcquireSpinLockRaiseToDpc(
208 _Inout_ PKSPIN_LOCK SpinLock
);
210 #define KeAcquireSpinLock(SpinLock, OldIrql) \
211 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
213 _Requires_lock_not_held_(*SpinLock
)
214 _Acquires_lock_(*SpinLock
)
215 _IRQL_requires_min_(DISPATCH_LEVEL
)
219 KeAcquireSpinLockAtDpcLevel(
220 _Inout_ PKSPIN_LOCK SpinLock
);
222 _Requires_lock_held_(*SpinLock
)
223 _Releases_lock_(*SpinLock
)
224 _IRQL_requires_(DISPATCH_LEVEL
)
229 _Inout_ PKSPIN_LOCK SpinLock
,
230 _In_ _IRQL_restores_ KIRQL NewIrql
);
232 _Requires_lock_held_(*SpinLock
)
233 _Releases_lock_(*SpinLock
)
234 _IRQL_requires_min_(DISPATCH_LEVEL
)
238 KeReleaseSpinLockFromDpcLevel(
239 _Inout_ PKSPIN_LOCK SpinLock
);
242 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
246 KeInitializeSpinLock(
247 _Out_ PKSPIN_LOCK SpinLock
);
251 KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock
)
263 _In_ ULONG BugCheckCode
,
264 _In_ ULONG_PTR BugCheckParameter1
,
265 _In_ ULONG_PTR BugCheckParameter2
,
266 _In_ ULONG_PTR BugCheckParameter3
,
267 _In_ ULONG_PTR BugCheckParameter4
);
269 _IRQL_requires_max_(DISPATCH_LEVEL
)
276 _IRQL_requires_min_(PASSIVE_LEVEL
)
277 _IRQL_requires_max_(APC_LEVEL
)
281 KeDelayExecutionThread(
282 _In_ KPROCESSOR_MODE WaitMode
,
283 _In_ BOOLEAN Alertable
,
284 _In_ PLARGE_INTEGER Interval
);
286 _Must_inspect_result_
290 KeDeregisterBugCheckCallback(
291 _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
293 _Acquires_lock_(_Global_critical_region_
)
294 _IRQL_requires_max_(APC_LEVEL
)
298 KeEnterCriticalRegion(VOID
);
300 _IRQL_requires_max_(DISPATCH_LEVEL
)
304 KeInitializeDeviceQueue(
305 _Out_ PKDEVICE_QUEUE DeviceQueue
);
311 _Out_ __drv_aliasesMem PRKDPC Dpc
,
312 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
313 _In_opt_ __drv_aliasesMem PVOID DeferredContext
);
319 _Out_ PRKMUTEX Mutex
,
322 _IRQL_requires_max_(PASSIVE_LEVEL
)
326 KeInitializeSemaphore(
327 _Out_ PRKSEMAPHORE Semaphore
,
331 _IRQL_requires_max_(DISPATCH_LEVEL
)
336 _Out_ PKTIMER Timer
);
338 _IRQL_requires_max_(DISPATCH_LEVEL
)
344 _In_ TIMER_TYPE Type
);
346 _IRQL_requires_(DISPATCH_LEVEL
)
350 KeInsertByKeyDeviceQueue(
351 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
352 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
355 _IRQL_requires_(DISPATCH_LEVEL
)
360 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
361 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
368 _In_opt_ PVOID SystemArgument1
,
369 _In_opt_ PVOID SystemArgument2
);
371 _Releases_lock_(_Global_critical_region_
)
372 _IRQL_requires_max_(APC_LEVEL
)
376 KeLeaveCriticalRegion(VOID
);
381 KeQueryPerformanceCounter(
382 _Out_opt_ PLARGE_INTEGER PerformanceFrequency
);
384 _IRQL_requires_max_(PASSIVE_LEVEL
)
388 KeQueryPriorityThread(
389 _In_ PRKTHREAD Thread
);
394 KeQueryTimeIncrement(VOID
);
396 _IRQL_requires_max_(DISPATCH_LEVEL
)
401 _In_ PRKEVENT Event
);
403 _IRQL_requires_max_(DISPATCH_LEVEL
)
408 _In_ PRKMUTEX Mutex
);
410 _IRQL_requires_max_(DISPATCH_LEVEL
)
414 KeReadStateSemaphore(
415 _In_ PRKSEMAPHORE Semaphore
);
417 _IRQL_requires_max_(DISPATCH_LEVEL
)
424 _Must_inspect_result_
428 KeRegisterBugCheckCallback(
429 _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
430 _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
431 _In_reads_bytes_opt_(Length
) PVOID Buffer
,
433 _In_ PUCHAR Component
);
435 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
436 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
441 _Inout_ PRKMUTEX Mutex
,
444 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
445 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
450 _Inout_ PRKSEMAPHORE Semaphore
,
451 _In_ KPRIORITY Increment
,
452 _In_ LONG Adjustment
,
453 _In_ _Literal_ BOOLEAN Wait
);
455 _IRQL_requires_(DISPATCH_LEVEL
)
459 KeRemoveByKeyDeviceQueue(
460 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
463 _IRQL_requires_(DISPATCH_LEVEL
)
468 _Inout_ PKDEVICE_QUEUE DeviceQueue
);
470 _IRQL_requires_max_(DISPATCH_LEVEL
)
474 KeRemoveEntryDeviceQueue(
475 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
476 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
478 _IRQL_requires_max_(HIGH_LEVEL
)
485 _IRQL_requires_max_(DISPATCH_LEVEL
)
490 _Inout_ PRKEVENT Event
);
492 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
493 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
498 _Inout_ PRKEVENT Event
,
499 _In_ KPRIORITY Increment
,
500 _In_ _Literal_ BOOLEAN Wait
);
507 _In_ KDPC_IMPORTANCE Importance
);
509 _IRQL_requires_min_(PASSIVE_LEVEL
)
510 _IRQL_requires_max_(DISPATCH_LEVEL
)
515 _Inout_ PKTHREAD Thread
,
516 _In_ KPRIORITY Priority
);
518 _IRQL_requires_max_(DISPATCH_LEVEL
)
523 _Inout_ PKTIMER Timer
,
524 _In_ LARGE_INTEGER DueTime
,
527 _IRQL_requires_max_(DISPATCH_LEVEL
)
532 _Inout_ PKTIMER Timer
,
533 _In_ LARGE_INTEGER DueTime
,
534 _In_ LONG Period OPTIONAL
,
540 KeStallExecutionProcessor(
541 _In_ ULONG MicroSeconds
);
543 _IRQL_requires_max_(HIGH_LEVEL
)
547 KeSynchronizeExecution(
548 _Inout_ PKINTERRUPT Interrupt
,
549 _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
550 _In_opt_ __drv_aliasesMem PVOID SynchronizeContext
);
552 _IRQL_requires_min_(PASSIVE_LEVEL
)
553 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
554 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
558 KeWaitForMultipleObjects(
560 _In_reads_(Count
) PVOID Object
[],
561 _In_
__drv_strictTypeMatch(__drv_typeConst
) WAIT_TYPE WaitType
,
562 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
563 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
564 _In_ BOOLEAN Alertable
,
565 _In_opt_ PLARGE_INTEGER Timeout
,
566 _Out_opt_ PKWAIT_BLOCK WaitBlockArray
);
568 #define KeWaitForMutexObject KeWaitForSingleObject
570 _IRQL_requires_min_(PASSIVE_LEVEL
)
571 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
572 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
576 KeWaitForSingleObject(
577 _In_ _Points_to_data_ PVOID Object
,
578 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
579 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
580 _In_ BOOLEAN Alertable
,
581 _In_opt_ PLARGE_INTEGER Timeout
);
589 _Out_ PRKMUTANT Mutant
,
590 _In_ BOOLEAN InitialOwner
);
592 _IRQL_requires_max_(DISPATCH_LEVEL
)
597 _In_ PRKMUTANT Mutant
);
599 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
600 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
605 _Inout_ PRKMUTANT Mutant
,
606 _In_ KPRIORITY Increment
,
607 _In_ BOOLEAN Abandoned
,
614 _Out_ PRKQUEUE Queue
,
617 _IRQL_requires_max_(DISPATCH_LEVEL
)
622 _In_ PRKQUEUE Queue
);
624 _IRQL_requires_min_(PASSIVE_LEVEL
)
625 _IRQL_requires_max_(DISPATCH_LEVEL
)
630 _Inout_ PRKQUEUE Queue
,
631 _Inout_ PLIST_ENTRY Entry
);
633 _IRQL_requires_min_(PASSIVE_LEVEL
)
634 _IRQL_requires_max_(DISPATCH_LEVEL
)
639 _Inout_ PRKQUEUE Queue
,
640 _Inout_ PLIST_ENTRY Entry
);
642 _IRQL_requires_min_(PASSIVE_LEVEL
)
643 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
644 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
649 _Inout_ PRKQUEUE Queue
,
650 _In_ KPROCESSOR_MODE WaitMode
,
651 _In_opt_ PLARGE_INTEGER Timeout
);
653 _IRQL_requires_max_(APC_LEVEL
)
658 _Inout_ PKPROCESS Process
);
660 _IRQL_requires_max_(APC_LEVEL
)
664 KeDetachProcess(VOID
);
666 _IRQL_requires_max_(DISPATCH_LEVEL
)
671 _Inout_ PRKQUEUE Queue
);
673 _IRQL_requires_max_(APC_LEVEL
)
677 KeStackAttachProcess(
678 _Inout_ PKPROCESS Process
,
679 _Out_ PKAPC_STATE ApcState
);
681 _IRQL_requires_max_(APC_LEVEL
)
685 KeUnstackDetachProcess(
686 _In_ PKAPC_STATE ApcState
);
688 _IRQL_requires_min_(PASSIVE_LEVEL
)
689 _IRQL_requires_max_(DISPATCH_LEVEL
)
693 KeSetIdealProcessorThread(
694 _Inout_ PKTHREAD Thread
,
695 _In_ UCHAR Processor
);
697 _IRQL_requires_max_(APC_LEVEL
)
701 KeSetKernelStackSwapEnable(
702 _In_ BOOLEAN Enable
);
705 _Requires_lock_not_held_(*SpinLock
)
706 _Acquires_lock_(*SpinLock
)
707 _IRQL_raises_(SYNCH_LEVEL
)
712 KeAcquireSpinLockRaiseToSynch(
713 _Inout_ PKSPIN_LOCK SpinLock
);
715 _Requires_lock_not_held_(*SpinLock
)
716 _Acquires_lock_(*SpinLock
)
717 _IRQL_raises_(SYNCH_LEVEL
)
721 KeAcquireSpinLockRaiseToSynch(
722 _Inout_ PKSPIN_LOCK SpinLock
);
726 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
728 #if (NTDDI_VERSION >= NTDDI_WINXP)
731 _Requires_lock_not_held_(*LockHandle
)
732 _Acquires_lock_(*LockHandle
)
733 _Post_same_lock_(*SpinLock
, *LockHandle
)
734 _IRQL_requires_max_(DISPATCH_LEVEL
)
735 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
736 _IRQL_raises_(DISPATCH_LEVEL
)
740 KeAcquireInStackQueuedSpinLock(
741 _Inout_ PKSPIN_LOCK SpinLock
,
742 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
744 _Requires_lock_not_held_(*LockHandle
)
745 _Acquires_lock_(*LockHandle
)
746 _Post_same_lock_(*SpinLock
, *LockHandle
)
747 _IRQL_requires_min_(DISPATCH_LEVEL
)
751 KeAcquireInStackQueuedSpinLockAtDpcLevel(
752 _Inout_ PKSPIN_LOCK SpinLock
,
753 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
755 _Requires_lock_not_held_(*Interrupt
->ActualLock
)
756 _Acquires_lock_(*Interrupt
->ActualLock
)
757 _IRQL_requires_max_(HIGH_LEVEL
)
759 _IRQL_raises_(HIGH_LEVEL
)
763 KeAcquireInterruptSpinLock(
764 _Inout_ PKINTERRUPT Interrupt
);
766 _IRQL_requires_min_(PASSIVE_LEVEL
)
767 _IRQL_requires_max_(DISPATCH_LEVEL
)
771 KeAreApcsDisabled(VOID
);
776 KeGetRecommendedSharedDataAlignment(VOID
);
778 _IRQL_requires_max_(PASSIVE_LEVEL
)
782 KeQueryRuntimeThread(
783 _In_ PKTHREAD Thread
,
784 _Out_ PULONG UserTime
);
786 _Requires_lock_held_(*LockHandle
)
787 _Releases_lock_(*LockHandle
)
788 _IRQL_requires_(DISPATCH_LEVEL
)
792 KeReleaseInStackQueuedSpinLockFromDpcLevel(
793 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
795 _Requires_lock_held_(*Interrupt
->ActualLock
)
796 _Releases_lock_(*Interrupt
->ActualLock
)
797 _IRQL_requires_(HIGH_LEVEL
)
801 KeReleaseInterruptSpinLock(
802 _Inout_ PKINTERRUPT Interrupt
,
803 _In_ _IRQL_restores_ KIRQL OldIrql
);
805 _IRQL_requires_(DISPATCH_LEVEL
)
809 KeRemoveByKeyDeviceQueueIfBusy(
810 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
813 _Requires_lock_held_(*LockHandle
)
814 _Releases_lock_(*LockHandle
)
815 _IRQL_requires_(DISPATCH_LEVEL
)
816 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
820 KeReleaseInStackQueuedSpinLock(
821 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
824 _IRQL_requires_min_(PASSIVE_LEVEL
)
825 _IRQL_requires_max_(DISPATCH_LEVEL
)
829 KeAreApcsDisabled(VOID
);
833 _Requires_lock_not_held_(Number
)
834 _Acquires_lock_(Number
)
835 _IRQL_raises_(DISPATCH_LEVEL
)
839 KeAcquireQueuedSpinLock(
840 _In_ KSPIN_LOCK_QUEUE_NUMBER Number
);
842 _Requires_lock_held_(Number
)
843 _Releases_lock_(Number
)
847 KeReleaseQueuedSpinLock(
848 _In_ KSPIN_LOCK_QUEUE_NUMBER Number
,
851 _Must_inspect_result_
852 _Post_satisfies_(return == 1 || return == 0)
856 KeTryToAcquireQueuedSpinLock(
857 _In_ KSPIN_LOCK_QUEUE_NUMBER Number
,
858 _Out_
_At_(*OldIrql
, _IRQL_saves_
) PKIRQL OldIrql
);
861 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
864 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
866 _Must_inspect_result_
870 KeDeregisterBugCheckReasonCallback(
871 _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
873 _Must_inspect_result_
877 KeRegisterBugCheckReasonCallback(
878 _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
879 _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
880 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
881 _In_ PUCHAR Component
);
883 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
885 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
886 _IRQL_requires_max_(APC_LEVEL
)
890 KeFlushQueuedDpcs(VOID
);
891 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
893 $
if (_WDMDDK_
|| _NTDDK_
)
894 #if (NTDDI_VERSION >= NTDDI_WS03)
895 $
endif (_WDMDDK_
|| _NTDDK_
)
898 _IRQL_requires_max_(APC_LEVEL
)
902 KeRegisterNmiCallback(
903 _In_ PNMI_CALLBACK CallbackRoutine
,
904 _In_opt_ PVOID Context
);
906 _IRQL_requires_max_(APC_LEVEL
)
910 KeDeregisterNmiCallback(
916 KeInitializeThreadedDpc(
918 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
919 _In_opt_ PVOID DeferredContext
);
921 _IRQL_requires_min_(PASSIVE_LEVEL
)
922 _IRQL_requires_max_(IPI_LEVEL
-1)
927 _In_ PKIPI_BROADCAST_WORKER BroadcastFunction
,
928 _In_ ULONG_PTR Context
);
930 _Requires_lock_not_held_(*SpinLock
)
931 _Acquires_lock_(*SpinLock
)
932 _IRQL_requires_max_(DISPATCH_LEVEL
)
937 KeAcquireSpinLockForDpc(
938 _Inout_ PKSPIN_LOCK SpinLock
);
940 _Requires_lock_held_(*SpinLock
)
941 _Releases_lock_(*SpinLock
)
942 _IRQL_requires_(DISPATCH_LEVEL
)
946 KeReleaseSpinLockForDpc(
947 _Inout_ PKSPIN_LOCK SpinLock
,
948 _In_ _IRQL_restores_ KIRQL OldIrql
);
950 _Must_inspect_result_
955 _In_ PKSPIN_LOCK SpinLock
);
962 KeInvalidateAllCaches(VOID
);
964 $
if (_WDMDDK_
|| _NTDDK_
)
965 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
966 $
endif (_WDMDDK_
|| _NTDDK_
)
967 $
if (_WDMDDK_
|| _NTDDK_
)
968 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
969 $
endif (_WDMDDK_
|| _NTDDK_
)
972 _Must_inspect_result_
973 _IRQL_requires_min_(DISPATCH_LEVEL
)
974 _Post_satisfies_(return == 1 || return == 0)
978 KeTryToAcquireSpinLockAtDpcLevel(
979 _Inout_
_Requires_lock_not_held_(*_Curr_
)
980 _When_(return!=0, _Acquires_lock_(*_Curr_
))
981 PKSPIN_LOCK SpinLock
);
983 _IRQL_requires_min_(PASSIVE_LEVEL
)
984 _IRQL_requires_max_(DISPATCH_LEVEL
)
988 KeAreAllApcsDisabled(VOID
);
990 _Acquires_lock_(_Global_critical_region_
)
991 _Requires_lock_not_held_(*Mutex
)
992 _Acquires_lock_(*Mutex
)
993 _IRQL_requires_max_(APC_LEVEL
)
994 _IRQL_requires_min_(PASSIVE_LEVEL
)
998 KeAcquireGuardedMutex(
999 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1001 _Requires_lock_not_held_(*FastMutex
)
1002 _Acquires_lock_(*FastMutex
)
1003 _IRQL_requires_max_(APC_LEVEL
)
1004 _IRQL_requires_min_(PASSIVE_LEVEL
)
1008 KeAcquireGuardedMutexUnsafe(
1009 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1011 _Acquires_lock_(_Global_critical_region_
)
1012 _IRQL_requires_max_(APC_LEVEL
)
1016 KeEnterGuardedRegion(VOID
);
1018 _Releases_lock_(_Global_critical_region_
)
1019 _IRQL_requires_max_(APC_LEVEL
)
1023 KeLeaveGuardedRegion(VOID
);
1025 _IRQL_requires_max_(APC_LEVEL
)
1026 _IRQL_requires_min_(PASSIVE_LEVEL
)
1030 KeInitializeGuardedMutex(
1031 _Out_ PKGUARDED_MUTEX GuardedMutex
);
1033 _Requires_lock_held_(*FastMutex
)
1034 _Releases_lock_(*FastMutex
)
1035 _IRQL_requires_max_(APC_LEVEL
)
1039 KeReleaseGuardedMutexUnsafe(
1040 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1042 _Releases_lock_(_Global_critical_region_
)
1043 _Requires_lock_held_(*Mutex
)
1044 _Releases_lock_(*Mutex
)
1045 _IRQL_requires_max_(APC_LEVEL
)
1049 KeReleaseGuardedMutex(
1050 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1052 _Must_inspect_result_
1053 _Success_(return != FALSE
)
1054 _IRQL_requires_max_(APC_LEVEL
)
1055 _Post_satisfies_(return == 1 || return == 0)
1059 KeTryToAcquireGuardedMutex(
1060 _When_ (return, _Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)) _Acquires_lock_(_Global_critical_region_
)
1061 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1064 _Must_inspect_result_
1065 _IRQL_requires_max_(APC_LEVEL
)
1069 KeExpandKernelStackAndCallout(
1070 _In_ PEXPAND_STACK_CALLOUT Callout
,
1071 _In_opt_ PVOID Parameter
,
1074 _Acquires_lock_(_Global_critical_region_
)
1075 _IRQL_requires_max_(APC_LEVEL
)
1079 KeEnterGuardedRegion(VOID
);
1081 _Releases_lock_(_Global_critical_region_
)
1082 _IRQL_requires_max_(APC_LEVEL
)
1086 KeLeaveGuardedRegion(VOID
);
1088 $
if (_WDMDDK_
|| _NTDDK_
)
1089 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
1090 $
endif (_WDMDDK_
|| _NTDDK_
)
1092 #if (NTDDI_VERSION >= NTDDI_VISTA)
1094 _Requires_lock_not_held_(*LockHandle
)
1095 _Acquires_lock_(*LockHandle
)
1096 _Post_same_lock_(*SpinLock
, *LockHandle
)
1097 _IRQL_requires_max_(DISPATCH_LEVEL
)
1098 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
1102 KeAcquireInStackQueuedSpinLockForDpc(
1103 _Inout_ PKSPIN_LOCK SpinLock
,
1104 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
1106 _Requires_lock_held_(*LockHandle
)
1107 _Releases_lock_(*LockHandle
)
1108 _IRQL_requires_(DISPATCH_LEVEL
)
1109 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
1113 KeReleaseInStackQueuedSpinLockForDpc(
1114 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
1116 _IRQL_requires_(DISPATCH_LEVEL
)
1120 KeQueryDpcWatchdogInformation(
1121 _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
1123 $
if (_WDMDDK_
|| _NTDDK_
)
1124 #if defined(SINGLE_GROUP_LEGACY_API)
1125 $
endif (_WDMDDK_
|| _NTDDK_
)
1128 _IRQL_requires_min_(PASSIVE_LEVEL
)
1129 _IRQL_requires_max_(APC_LEVEL
)
1133 KeSetSystemAffinityThreadEx(
1134 _In_ KAFFINITY Affinity
);
1136 _IRQL_requires_min_(PASSIVE_LEVEL
)
1137 _IRQL_requires_max_(APC_LEVEL
)
1141 KeRevertToUserAffinityThreadEx(
1142 _In_ KAFFINITY Affinity
);
1147 KeQueryActiveProcessorCount(
1148 _Out_opt_ PKAFFINITY ActiveProcessors
);
1153 KeQueryMaximumProcessorCount(VOID
);
1159 KeQueryActiveProcessorCount(
1160 _Out_opt_ PKAFFINITY ActiveProcessors
);
1165 KeQueryMaximumProcessorCount(VOID
);
1167 $
if (_WDMDDK_
|| _NTDDK_
)
1168 #endif /* SINGLE_GROUP_LEGACY_API */
1169 $
endif (_WDMDDK_
|| _NTDDK_
)
1171 _IRQL_requires_max_(DISPATCH_LEVEL
)
1175 _In_ PKMUTANT Mutant
,
1176 _Out_ PCLIENT_ID ClientId
);
1178 _IRQL_requires_min_(PASSIVE_LEVEL
)
1179 _When_((Timeout
==NULL
|| *Timeout
!=0), _IRQL_requires_max_(APC_LEVEL
))
1180 _When_((Timeout
!=NULL
&& *Timeout
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
1185 _Inout_ PKQUEUE Queue
,
1186 _In_ KPROCESSOR_MODE WaitMode
,
1187 _In_ BOOLEAN Alertable
,
1188 _In_opt_ PLARGE_INTEGER Timeout
,
1189 _Out_writes_to_(Count
, return) PLIST_ENTRY
*EntryArray
,
1193 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1196 #if (NTDDI_VERSION >= NTDDI_WS08)
1198 _IRQL_requires_max_(APC_LEVEL
)
1201 KeRegisterProcessorChangeCallback(
1202 _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
1203 _In_opt_ PVOID CallbackContext
,
1206 _IRQL_requires_max_(APC_LEVEL
)
1209 KeDeregisterProcessorChangeCallback(
1210 _In_ PVOID CallbackHandle
);
1212 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
1214 $
if (_WDMDDK_
|| _NTDDK_
)
1215 #if (NTDDI_VERSION >= NTDDI_WIN7)
1216 $
endif (_WDMDDK_
|| _NTDDK_
)
1219 _IRQL_requires_max_(DISPATCH_LEVEL
)
1220 _IRQL_requires_min_(PASSIVE_LEVEL
)
1221 _IRQL_requires_same_
1224 KeQueryTotalCycleTimeProcess(
1225 _Inout_ PKPROCESS Process
,
1226 _Out_ PULONG64 CycleTimeStamp
);
1228 _IRQL_requires_max_(APC_LEVEL
)
1229 _IRQL_requires_min_(PASSIVE_LEVEL
)
1230 _IRQL_requires_same_
1233 KeQueryTotalCycleTimeThread(
1234 _Inout_ PKTHREAD Thread
,
1235 _Out_ PULONG64 CycleTimeStamp
);
1237 _Must_inspect_result_
1241 KeSetTargetProcessorDpcEx(
1243 _In_ PPROCESSOR_NUMBER ProcNumber
);
1245 _IRQL_requires_min_(PASSIVE_LEVEL
)
1246 _IRQL_requires_max_(APC_LEVEL
)
1250 KeSetSystemGroupAffinityThread(
1251 _In_ PGROUP_AFFINITY Affinity
,
1252 _Out_opt_ PGROUP_AFFINITY PreviousAffinity
);
1254 _IRQL_requires_min_(PASSIVE_LEVEL
)
1255 _IRQL_requires_max_(APC_LEVEL
)
1259 KeRevertToUserGroupAffinityThread(
1260 _In_ PGROUP_AFFINITY PreviousAffinity
);
1262 _IRQL_requires_max_(DISPATCH_LEVEL
)
1266 KeSetCoalescableTimer(
1267 _Inout_ PKTIMER Timer
,
1268 _In_ LARGE_INTEGER DueTime
,
1270 _In_ ULONG TolerableDelay
,
1271 _In_opt_ PKDPC Dpc
);
1276 KeQueryUnbiasedInterruptTime(VOID
);
1281 KeQueryActiveProcessorCountEx(
1282 _In_ USHORT GroupNumber
);
1287 KeQueryMaximumProcessorCountEx(
1288 _In_ USHORT GroupNumber
);
1293 KeQueryActiveGroupCount(VOID
);
1298 KeQueryMaximumGroupCount(VOID
);
1303 KeQueryGroupAffinity(
1304 _In_ USHORT GroupNumber
);
1309 KeGetCurrentProcessorNumberEx(
1310 _Out_opt_ PPROCESSOR_NUMBER ProcNumber
);
1315 KeQueryNodeActiveAffinity(
1316 _In_ USHORT NodeNumber
,
1317 _Out_opt_ PGROUP_AFFINITY Affinity
,
1318 _Out_opt_ PUSHORT Count
);
1323 KeQueryNodeMaximumProcessorCount(
1324 _In_ USHORT NodeNumber
);
1329 KeQueryHighestNodeNumber(VOID
);
1334 KeGetCurrentNodeNumber(VOID
);
1336 _IRQL_requires_max_(DISPATCH_LEVEL
)
1340 KeQueryLogicalProcessorRelationship(
1341 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
1342 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
1343 _Out_writes_bytes_opt_(*Length
) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information
,
1344 _Inout_ PULONG Length
);
1346 _Must_inspect_result_
1347 _IRQL_requires_max_(DISPATCH_LEVEL
)
1349 _When_(return==0, _Kernel_float_saved_
)
1353 KeSaveExtendedProcessorState(
1355 _Out_
_Requires_lock_not_held_(*_Curr_
)
1356 _When_(return==0, _Acquires_lock_(*_Curr_
))
1357 PXSTATE_SAVE XStateSave
);
1359 _Kernel_float_restored_
1363 KeRestoreExtendedProcessorState(
1364 _In_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
1365 PXSTATE_SAVE XStateSave
);
1369 KeGetProcessorNumberFromIndex(
1370 _In_ ULONG ProcIndex
,
1371 _Out_ PPROCESSOR_NUMBER ProcNumber
);
1375 KeGetProcessorIndexFromNumber(
1376 _In_ PPROCESSOR_NUMBER ProcNumber
);
1382 KeQueryActiveProcessorCountEx(
1383 _In_ USHORT GroupNumber
);
1388 KeQueryMaximumProcessorCountEx(
1389 _In_ USHORT GroupNumber
);
1394 KeQueryActiveGroupCount(VOID
);
1399 KeQueryMaximumGroupCount(VOID
);
1404 KeQueryGroupAffinity(
1405 _In_ USHORT GroupNumber
);
1410 KeGetCurrentProcessorNumberEx(
1411 _Out_opt_ PPROCESSOR_NUMBER ProcNumber
);
1416 KeQueryNodeActiveAffinity(
1417 _In_ USHORT NodeNumber
,
1418 _Out_opt_ PGROUP_AFFINITY Affinity
,
1419 _Out_opt_ PUSHORT Count
);
1424 KeQueryNodeMaximumProcessorCount(
1425 _In_ USHORT NodeNumber
);
1430 KeQueryHighestNodeNumber(VOID
);
1435 KeGetCurrentNodeNumber(VOID
);
1437 _IRQL_requires_max_(DISPATCH_LEVEL
)
1441 KeQueryLogicalProcessorRelationship(
1442 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber
,
1443 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
1444 _Out_writes_bytes_opt_(*Length
) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information
,
1445 _Inout_ PULONG Length
);
1447 _IRQL_requires_max_(APC_LEVEL
)
1451 KeSetHardwareCounterConfiguration(
1452 _In_reads_(Count
) PHARDWARE_COUNTER CounterArray
,
1455 _IRQL_requires_max_(APC_LEVEL
)
1459 KeQueryHardwareCounterConfiguration(
1460 _Out_writes_to_(MaximumCount
, *Count
) PHARDWARE_COUNTER CounterArray
,
1461 _In_ ULONG MaximumCount
,
1462 _Out_ PULONG Count
);
1464 $
if (_WDMDDK_
|| _NTDDK_
)
1465 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1466 $
endif (_WDMDDK_
|| _NTDDK_
)
1468 #if !defined(_IA64_)
1472 KeFlushWriteBuffer(VOID
);
1476 * KeInitializeCallbackRecord(
1477 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1479 #define KeInitializeCallbackRecord(CallbackRecord) \
1480 CallbackRecord->State = BufferEmpty;
1482 #if defined(_PREFAST_)
1484 void __PREfastPagedCode(void);
1485 void __PREfastPagedCodeLocked(void);
1486 #define PAGED_CODE() __PREfastPagedCode();
1487 #define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked();
1491 #if (NTDDI_VERSION >= NTDDI_VISTA)
1492 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
1494 #define PAGED_ASSERT( exp ) ASSERT( exp )
1497 #define PAGED_CODE() { \
1498 if (KeGetCurrentIrql() > APC_LEVEL) { \
1499 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
1500 PAGED_ASSERT(FALSE); \
1504 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
1508 #define PAGED_CODE() NOP_FUNCTION;
1509 #define PAGED_CODE_LOCKED() NOP_FUNCTION;