1 /******************************************************************************
3 ******************************************************************************/
7 #elif defined(_M_AMD64)
13 #elif defined(_M_MIPS)
17 #elif defined(_M_ARM64)
20 #error Unknown Architecture
31 _IRQL_requires_max_(DISPATCH_LEVEL
)
36 _Inout_ PRKEVENT Event
);
40 _IRQL_requires_min_(PASSIVE_LEVEL
)
41 _IRQL_requires_max_(DISPATCH_LEVEL
)
45 KeInvalidateRangeAllCaches(
46 _In_ PVOID BaseAddress
,
50 #if (NTDDI_VERSION >= NTDDI_WIN2K)
53 #if defined(_NTDDK_) || defined(_NTIFS_)
54 _Maybe_raises_SEH_exception_
55 _IRQL_requires_max_(APC_LEVEL
)
60 __in_data_source(USER_MODE
) _In_reads_bytes_(Length
) CONST VOID
*Address
, /* CONST is added */
62 _In_ ULONG Alignment
);
63 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
65 _Maybe_raises_SEH_exception_
66 _IRQL_requires_max_(APC_LEVEL
)
71 __in_data_source(USER_MODE
) _Out_writes_bytes_(Length
) PVOID Address
,
73 _In_ ULONG Alignment
);
82 _In_ KDPC_IMPORTANCE Importance
);
84 _IRQL_requires_max_(DISPATCH_LEVEL
)
89 _Inout_ PRKEVENT Event
,
90 _In_ KPRIORITY Increment
,
93 _IRQL_requires_min_(PASSIVE_LEVEL
)
94 _IRQL_requires_max_(DISPATCH_LEVEL
)
98 KeSetBasePriorityThread(
99 _Inout_ PRKTHREAD Thread
,
100 _In_ LONG Increment
);
102 _Acquires_lock_(_Global_critical_region_
)
103 _IRQL_requires_max_(APC_LEVEL
)
107 KeEnterCriticalRegion(VOID
);
109 _Releases_lock_(_Global_critical_region_
)
110 _IRQL_requires_max_(APC_LEVEL
)
114 KeLeaveCriticalRegion(VOID
);
121 _In_ ULONG BugCheckCode
);
123 $
if (_WDMDDK_
|| _NTDDK_
)
124 #if defined(SINGLE_GROUP_LEGACY_API)
125 $
endif (_WDMDDK_
|| _NTDDK_
)
128 _IRQL_requires_min_(PASSIVE_LEVEL
)
129 _IRQL_requires_max_(APC_LEVEL
)
133 KeRevertToUserAffinityThread(VOID
);
135 _IRQL_requires_min_(PASSIVE_LEVEL
)
136 _IRQL_requires_max_(APC_LEVEL
)
140 KeSetSystemAffinityThread(
141 _In_ KAFFINITY Affinity
);
144 $
if (_WDMDDK_
|| _NTDDK_
)
148 KeSetTargetProcessorDpc(
155 KeQueryActiveProcessors(VOID
);
156 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
157 $
endif (_WDMDDK_
|| _NTDDK_
)
160 #if !defined(_M_AMD64)
164 KeQueryInterruptTime(VOID
);
170 _Out_ PLARGE_INTEGER CurrentTime
);
171 #endif /* !_M_AMD64 */
173 #if !defined(_X86_) && !defined(_M_ARM)
174 _Requires_lock_not_held_(*SpinLock
)
175 _Acquires_lock_(*SpinLock
)
176 _IRQL_requires_max_(DISPATCH_LEVEL
)
178 _IRQL_raises_(DISPATCH_LEVEL
)
182 KeAcquireSpinLockRaiseToDpc(
183 _Inout_ PKSPIN_LOCK SpinLock
);
185 #define KeAcquireSpinLock(SpinLock, OldIrql) \
186 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
188 _Requires_lock_not_held_(*SpinLock
)
189 _Acquires_lock_(*SpinLock
)
190 _IRQL_requires_min_(DISPATCH_LEVEL
)
194 KeAcquireSpinLockAtDpcLevel(
195 _Inout_ PKSPIN_LOCK SpinLock
);
197 _Requires_lock_held_(*SpinLock
)
198 _Releases_lock_(*SpinLock
)
199 _IRQL_requires_(DISPATCH_LEVEL
)
204 _Inout_ PKSPIN_LOCK SpinLock
,
205 _In_ _IRQL_restores_ KIRQL NewIrql
);
207 _Requires_lock_held_(*SpinLock
)
208 _Releases_lock_(*SpinLock
)
209 _IRQL_requires_min_(DISPATCH_LEVEL
)
213 KeReleaseSpinLockFromDpcLevel(
214 _Inout_ PKSPIN_LOCK SpinLock
);
217 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
221 KeInitializeSpinLock(
222 _Out_ PKSPIN_LOCK SpinLock
);
226 KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock
)
238 _In_ ULONG BugCheckCode
,
239 _In_ ULONG_PTR BugCheckParameter1
,
240 _In_ ULONG_PTR BugCheckParameter2
,
241 _In_ ULONG_PTR BugCheckParameter3
,
242 _In_ ULONG_PTR BugCheckParameter4
);
244 _IRQL_requires_max_(DISPATCH_LEVEL
)
251 _IRQL_requires_min_(PASSIVE_LEVEL
)
252 _IRQL_requires_max_(APC_LEVEL
)
256 KeDelayExecutionThread(
257 _In_ KPROCESSOR_MODE WaitMode
,
258 _In_ BOOLEAN Alertable
,
259 _In_ PLARGE_INTEGER Interval
);
261 _Must_inspect_result_
265 KeDeregisterBugCheckCallback(
266 _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
268 _Acquires_lock_(_Global_critical_region_
)
269 _IRQL_requires_max_(APC_LEVEL
)
273 KeEnterCriticalRegion(VOID
);
275 _IRQL_requires_max_(DISPATCH_LEVEL
)
279 KeInitializeDeviceQueue(
280 _Out_ PKDEVICE_QUEUE DeviceQueue
);
286 _Out_ __drv_aliasesMem PRKDPC Dpc
,
287 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
288 _In_opt_ __drv_aliasesMem PVOID DeferredContext
);
294 _Out_ PRKMUTEX Mutex
,
297 _IRQL_requires_max_(PASSIVE_LEVEL
)
301 KeInitializeSemaphore(
302 _Out_ PRKSEMAPHORE Semaphore
,
306 _IRQL_requires_max_(DISPATCH_LEVEL
)
311 _Out_ PKTIMER Timer
);
313 _IRQL_requires_max_(DISPATCH_LEVEL
)
319 _In_ TIMER_TYPE Type
);
321 _IRQL_requires_(DISPATCH_LEVEL
)
325 KeInsertByKeyDeviceQueue(
326 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
327 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
330 _IRQL_requires_(DISPATCH_LEVEL
)
335 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
336 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
343 _In_opt_ PVOID SystemArgument1
,
344 _In_opt_ PVOID SystemArgument2
);
346 _Releases_lock_(_Global_critical_region_
)
347 _IRQL_requires_max_(APC_LEVEL
)
351 KeLeaveCriticalRegion(VOID
);
356 KeQueryPerformanceCounter(
357 _Out_opt_ PLARGE_INTEGER PerformanceFrequency
);
359 _IRQL_requires_max_(PASSIVE_LEVEL
)
363 KeQueryPriorityThread(
364 _In_ PRKTHREAD Thread
);
369 KeQueryTimeIncrement(VOID
);
371 _IRQL_requires_max_(DISPATCH_LEVEL
)
376 _In_ PRKEVENT Event
);
378 _IRQL_requires_max_(DISPATCH_LEVEL
)
383 _In_ PRKMUTEX Mutex
);
385 _IRQL_requires_max_(DISPATCH_LEVEL
)
389 KeReadStateSemaphore(
390 _In_ PRKSEMAPHORE Semaphore
);
392 _IRQL_requires_max_(DISPATCH_LEVEL
)
399 _Must_inspect_result_
403 KeRegisterBugCheckCallback(
404 _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
405 _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
406 _In_reads_bytes_opt_(Length
) PVOID Buffer
,
408 _In_ PUCHAR Component
);
410 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
411 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
416 _Inout_ PRKMUTEX Mutex
,
419 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
420 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
425 _Inout_ PRKSEMAPHORE Semaphore
,
426 _In_ KPRIORITY Increment
,
427 _In_ LONG Adjustment
,
428 _In_ _Literal_ BOOLEAN Wait
);
430 _IRQL_requires_(DISPATCH_LEVEL
)
434 KeRemoveByKeyDeviceQueue(
435 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
438 _IRQL_requires_(DISPATCH_LEVEL
)
443 _Inout_ PKDEVICE_QUEUE DeviceQueue
);
445 _IRQL_requires_max_(DISPATCH_LEVEL
)
449 KeRemoveEntryDeviceQueue(
450 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
451 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
453 _IRQL_requires_max_(HIGH_LEVEL
)
460 _IRQL_requires_max_(DISPATCH_LEVEL
)
465 _Inout_ PRKEVENT Event
);
467 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
468 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
473 _Inout_ PRKEVENT Event
,
474 _In_ KPRIORITY Increment
,
475 _In_ _Literal_ BOOLEAN Wait
);
482 _In_ KDPC_IMPORTANCE Importance
);
484 _IRQL_requires_min_(PASSIVE_LEVEL
)
485 _IRQL_requires_max_(DISPATCH_LEVEL
)
490 _Inout_ PKTHREAD Thread
,
491 _In_ KPRIORITY Priority
);
493 _IRQL_requires_max_(DISPATCH_LEVEL
)
498 _Inout_ PKTIMER Timer
,
499 _In_ LARGE_INTEGER DueTime
,
502 _IRQL_requires_max_(DISPATCH_LEVEL
)
507 _Inout_ PKTIMER Timer
,
508 _In_ LARGE_INTEGER DueTime
,
509 _In_ LONG Period OPTIONAL
,
515 KeStallExecutionProcessor(
516 _In_ ULONG MicroSeconds
);
518 _IRQL_requires_max_(HIGH_LEVEL
)
522 KeSynchronizeExecution(
523 _Inout_ PKINTERRUPT Interrupt
,
524 _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
525 _In_opt_ __drv_aliasesMem PVOID SynchronizeContext
);
527 _IRQL_requires_min_(PASSIVE_LEVEL
)
528 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
529 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
533 KeWaitForMultipleObjects(
535 _In_reads_(Count
) PVOID Object
[],
536 _In_
__drv_strictTypeMatch(__drv_typeConst
) WAIT_TYPE WaitType
,
537 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
538 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
539 _In_ BOOLEAN Alertable
,
540 _In_opt_ PLARGE_INTEGER Timeout
,
541 _Out_opt_ PKWAIT_BLOCK WaitBlockArray
);
543 #define KeWaitForMutexObject KeWaitForSingleObject
545 _IRQL_requires_min_(PASSIVE_LEVEL
)
546 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
547 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
551 KeWaitForSingleObject(
552 _In_ _Points_to_data_ PVOID Object
,
553 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
554 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
555 _In_ BOOLEAN Alertable
,
556 _In_opt_ PLARGE_INTEGER Timeout
);
564 _Out_ PRKMUTANT Mutant
,
565 _In_ BOOLEAN InitialOwner
);
567 _IRQL_requires_max_(DISPATCH_LEVEL
)
572 _In_ PRKMUTANT Mutant
);
574 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
575 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
580 _Inout_ PRKMUTANT Mutant
,
581 _In_ KPRIORITY Increment
,
582 _In_ BOOLEAN Abandoned
,
589 _Out_ PRKQUEUE Queue
,
592 _IRQL_requires_max_(DISPATCH_LEVEL
)
597 _In_ PRKQUEUE Queue
);
599 _IRQL_requires_min_(PASSIVE_LEVEL
)
600 _IRQL_requires_max_(DISPATCH_LEVEL
)
605 _Inout_ PRKQUEUE Queue
,
606 _Inout_ PLIST_ENTRY Entry
);
608 _IRQL_requires_min_(PASSIVE_LEVEL
)
609 _IRQL_requires_max_(DISPATCH_LEVEL
)
614 _Inout_ PRKQUEUE Queue
,
615 _Inout_ PLIST_ENTRY Entry
);
617 _IRQL_requires_min_(PASSIVE_LEVEL
)
618 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
619 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
624 _Inout_ PRKQUEUE Queue
,
625 _In_ KPROCESSOR_MODE WaitMode
,
626 _In_opt_ PLARGE_INTEGER Timeout
);
628 _IRQL_requires_max_(APC_LEVEL
)
633 _Inout_ PKPROCESS Process
);
635 _IRQL_requires_max_(APC_LEVEL
)
639 KeDetachProcess(VOID
);
641 _IRQL_requires_max_(DISPATCH_LEVEL
)
646 _Inout_ PRKQUEUE Queue
);
648 _IRQL_requires_max_(APC_LEVEL
)
652 KeStackAttachProcess(
653 _Inout_ PKPROCESS Process
,
654 _Out_ PKAPC_STATE ApcState
);
656 _IRQL_requires_max_(APC_LEVEL
)
660 KeUnstackDetachProcess(
661 _In_ PKAPC_STATE ApcState
);
663 _IRQL_requires_min_(PASSIVE_LEVEL
)
664 _IRQL_requires_max_(DISPATCH_LEVEL
)
668 KeSetIdealProcessorThread(
669 _Inout_ PKTHREAD Thread
,
670 _In_ UCHAR Processor
);
672 _IRQL_requires_max_(APC_LEVEL
)
676 KeSetKernelStackSwapEnable(
677 _In_ BOOLEAN Enable
);
680 _Requires_lock_not_held_(*SpinLock
)
681 _Acquires_lock_(*SpinLock
)
682 _IRQL_raises_(SYNCH_LEVEL
)
687 KeAcquireSpinLockRaiseToSynch(
688 _Inout_ PKSPIN_LOCK SpinLock
);
690 _Requires_lock_not_held_(*SpinLock
)
691 _Acquires_lock_(*SpinLock
)
692 _IRQL_raises_(SYNCH_LEVEL
)
696 KeAcquireSpinLockRaiseToSynch(
697 _Inout_ PKSPIN_LOCK SpinLock
);
701 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
703 #if (NTDDI_VERSION >= NTDDI_WINXP)
706 _Requires_lock_not_held_(*LockHandle
)
707 _Acquires_lock_(*LockHandle
)
708 _Post_same_lock_(*SpinLock
, *LockHandle
)
709 _IRQL_requires_max_(DISPATCH_LEVEL
)
710 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
711 _IRQL_raises_(DISPATCH_LEVEL
)
715 KeAcquireInStackQueuedSpinLock(
716 _Inout_ PKSPIN_LOCK SpinLock
,
717 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
719 _Requires_lock_not_held_(*LockHandle
)
720 _Acquires_lock_(*LockHandle
)
721 _Post_same_lock_(*SpinLock
, *LockHandle
)
722 _IRQL_requires_min_(DISPATCH_LEVEL
)
726 KeAcquireInStackQueuedSpinLockAtDpcLevel(
727 _Inout_ PKSPIN_LOCK SpinLock
,
728 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
730 _Requires_lock_not_held_(*Interrupt
->ActualLock
)
731 _Acquires_lock_(*Interrupt
->ActualLock
)
732 _IRQL_requires_max_(HIGH_LEVEL
)
734 _IRQL_raises_(HIGH_LEVEL
)
738 KeAcquireInterruptSpinLock(
739 _Inout_ PKINTERRUPT Interrupt
);
741 _IRQL_requires_min_(PASSIVE_LEVEL
)
742 _IRQL_requires_max_(DISPATCH_LEVEL
)
746 KeAreApcsDisabled(VOID
);
751 KeGetRecommendedSharedDataAlignment(VOID
);
753 _IRQL_requires_max_(PASSIVE_LEVEL
)
757 KeQueryRuntimeThread(
758 _In_ PKTHREAD Thread
,
759 _Out_ PULONG UserTime
);
761 _Requires_lock_held_(*LockHandle
)
762 _Releases_lock_(*LockHandle
)
763 _IRQL_requires_(DISPATCH_LEVEL
)
767 KeReleaseInStackQueuedSpinLockFromDpcLevel(
768 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
770 _Requires_lock_held_(*Interrupt
->ActualLock
)
771 _Releases_lock_(*Interrupt
->ActualLock
)
772 _IRQL_requires_(HIGH_LEVEL
)
776 KeReleaseInterruptSpinLock(
777 _Inout_ PKINTERRUPT Interrupt
,
778 _In_ _IRQL_restores_ KIRQL OldIrql
);
780 _IRQL_requires_(DISPATCH_LEVEL
)
784 KeRemoveByKeyDeviceQueueIfBusy(
785 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
788 _Requires_lock_held_(*LockHandle
)
789 _Releases_lock_(*LockHandle
)
790 _IRQL_requires_(DISPATCH_LEVEL
)
791 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
795 KeReleaseInStackQueuedSpinLock(
796 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
799 _IRQL_requires_min_(PASSIVE_LEVEL
)
800 _IRQL_requires_max_(DISPATCH_LEVEL
)
804 KeAreApcsDisabled(VOID
);
808 _Requires_lock_not_held_(Number
)
809 _Acquires_lock_(Number
)
810 _IRQL_raises_(DISPATCH_LEVEL
)
814 KeAcquireQueuedSpinLock(
815 _In_ KSPIN_LOCK_QUEUE_NUMBER Number
);
817 _Requires_lock_held_(Number
)
818 _Releases_lock_(Number
)
822 KeReleaseQueuedSpinLock(
823 _In_ KSPIN_LOCK_QUEUE_NUMBER Number
,
826 _Must_inspect_result_
827 _Post_satisfies_(return == 1 || return == 0)
831 KeTryToAcquireQueuedSpinLock(
832 _In_ KSPIN_LOCK_QUEUE_NUMBER Number
,
833 _Out_
_At_(*OldIrql
, _IRQL_saves_
) PKIRQL OldIrql
);
836 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
839 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
841 _Must_inspect_result_
845 KeDeregisterBugCheckReasonCallback(
846 _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
848 _Must_inspect_result_
852 KeRegisterBugCheckReasonCallback(
853 _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
854 _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
855 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
856 _In_ PUCHAR Component
);
858 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
860 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
861 _IRQL_requires_max_(APC_LEVEL
)
865 KeFlushQueuedDpcs(VOID
);
866 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
868 $
if (_WDMDDK_
|| _NTDDK_
)
869 #if (NTDDI_VERSION >= NTDDI_WS03)
870 $
endif (_WDMDDK_
|| _NTDDK_
)
873 _IRQL_requires_max_(APC_LEVEL
)
877 KeRegisterNmiCallback(
878 _In_ PNMI_CALLBACK CallbackRoutine
,
879 _In_opt_ PVOID Context
);
881 _IRQL_requires_max_(APC_LEVEL
)
885 KeDeregisterNmiCallback(
891 KeInitializeThreadedDpc(
893 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
894 _In_opt_ PVOID DeferredContext
);
896 _IRQL_requires_min_(PASSIVE_LEVEL
)
897 _IRQL_requires_max_(IPI_LEVEL
-1)
902 _In_ PKIPI_BROADCAST_WORKER BroadcastFunction
,
903 _In_ ULONG_PTR Context
);
905 _Requires_lock_not_held_(*SpinLock
)
906 _Acquires_lock_(*SpinLock
)
907 _IRQL_requires_max_(DISPATCH_LEVEL
)
912 KeAcquireSpinLockForDpc(
913 _Inout_ PKSPIN_LOCK SpinLock
);
915 _Requires_lock_held_(*SpinLock
)
916 _Releases_lock_(*SpinLock
)
917 _IRQL_requires_(DISPATCH_LEVEL
)
921 KeReleaseSpinLockForDpc(
922 _Inout_ PKSPIN_LOCK SpinLock
,
923 _In_ _IRQL_restores_ KIRQL OldIrql
);
925 _Must_inspect_result_
930 _In_ PKSPIN_LOCK SpinLock
);
937 KeInvalidateAllCaches(VOID
);
939 $
if (_WDMDDK_
|| _NTDDK_
)
940 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
941 $
endif (_WDMDDK_
|| _NTDDK_
)
942 $
if (_WDMDDK_
|| _NTDDK_
)
943 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
944 $
endif (_WDMDDK_
|| _NTDDK_
)
947 _Must_inspect_result_
948 _IRQL_requires_min_(DISPATCH_LEVEL
)
949 _Post_satisfies_(return == 1 || return == 0)
953 KeTryToAcquireSpinLockAtDpcLevel(
954 _Inout_
_Requires_lock_not_held_(*_Curr_
)
955 _When_(return!=0, _Acquires_lock_(*_Curr_
))
956 PKSPIN_LOCK SpinLock
);
958 _IRQL_requires_min_(PASSIVE_LEVEL
)
959 _IRQL_requires_max_(DISPATCH_LEVEL
)
963 KeAreAllApcsDisabled(VOID
);
965 _Acquires_lock_(_Global_critical_region_
)
966 _Requires_lock_not_held_(*Mutex
)
967 _Acquires_lock_(*Mutex
)
968 _IRQL_requires_max_(APC_LEVEL
)
969 _IRQL_requires_min_(PASSIVE_LEVEL
)
973 KeAcquireGuardedMutex(
974 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
976 _Requires_lock_not_held_(*FastMutex
)
977 _Acquires_lock_(*FastMutex
)
978 _IRQL_requires_max_(APC_LEVEL
)
979 _IRQL_requires_min_(PASSIVE_LEVEL
)
983 KeAcquireGuardedMutexUnsafe(
984 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
986 _Acquires_lock_(_Global_critical_region_
)
987 _IRQL_requires_max_(APC_LEVEL
)
991 KeEnterGuardedRegion(VOID
);
993 _Releases_lock_(_Global_critical_region_
)
994 _IRQL_requires_max_(APC_LEVEL
)
998 KeLeaveGuardedRegion(VOID
);
1000 _IRQL_requires_max_(APC_LEVEL
)
1001 _IRQL_requires_min_(PASSIVE_LEVEL
)
1005 KeInitializeGuardedMutex(
1006 _Out_ PKGUARDED_MUTEX GuardedMutex
);
1008 _Requires_lock_held_(*FastMutex
)
1009 _Releases_lock_(*FastMutex
)
1010 _IRQL_requires_max_(APC_LEVEL
)
1014 KeReleaseGuardedMutexUnsafe(
1015 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1017 _Releases_lock_(_Global_critical_region_
)
1018 _Requires_lock_held_(*Mutex
)
1019 _Releases_lock_(*Mutex
)
1020 _IRQL_requires_max_(APC_LEVEL
)
1024 KeReleaseGuardedMutex(
1025 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1027 _Must_inspect_result_
1028 _Success_(return != FALSE
)
1029 _IRQL_requires_max_(APC_LEVEL
)
1030 _Post_satisfies_(return == 1 || return == 0)
1034 KeTryToAcquireGuardedMutex(
1035 _When_ (return, _Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)) _Acquires_lock_(_Global_critical_region_
)
1036 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
1039 _Must_inspect_result_
1040 _IRQL_requires_max_(APC_LEVEL
)
1044 KeExpandKernelStackAndCallout(
1045 _In_ PEXPAND_STACK_CALLOUT Callout
,
1046 _In_opt_ PVOID Parameter
,
1049 _Acquires_lock_(_Global_critical_region_
)
1050 _IRQL_requires_max_(APC_LEVEL
)
1054 KeEnterGuardedRegion(VOID
);
1056 _Releases_lock_(_Global_critical_region_
)
1057 _IRQL_requires_max_(APC_LEVEL
)
1061 KeLeaveGuardedRegion(VOID
);
1063 $
if (_WDMDDK_
|| _NTDDK_
)
1064 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
1065 $
endif (_WDMDDK_
|| _NTDDK_
)
1067 #if (NTDDI_VERSION >= NTDDI_VISTA)
1069 _Requires_lock_not_held_(*LockHandle
)
1070 _Acquires_lock_(*LockHandle
)
1071 _Post_same_lock_(*SpinLock
, *LockHandle
)
1072 _IRQL_requires_max_(DISPATCH_LEVEL
)
1073 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
1077 KeAcquireInStackQueuedSpinLockForDpc(
1078 _Inout_ PKSPIN_LOCK SpinLock
,
1079 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
1081 _Requires_lock_held_(*LockHandle
)
1082 _Releases_lock_(*LockHandle
)
1083 _IRQL_requires_(DISPATCH_LEVEL
)
1084 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
1088 KeReleaseInStackQueuedSpinLockForDpc(
1089 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
1091 _IRQL_requires_(DISPATCH_LEVEL
)
1095 KeQueryDpcWatchdogInformation(
1096 _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
1098 $
if (_WDMDDK_
|| _NTDDK_
)
1099 #if defined(SINGLE_GROUP_LEGACY_API)
1100 $
endif (_WDMDDK_
|| _NTDDK_
)
1103 _IRQL_requires_min_(PASSIVE_LEVEL
)
1104 _IRQL_requires_max_(APC_LEVEL
)
1108 KeSetSystemAffinityThreadEx(
1109 _In_ KAFFINITY Affinity
);
1111 _IRQL_requires_min_(PASSIVE_LEVEL
)
1112 _IRQL_requires_max_(APC_LEVEL
)
1116 KeRevertToUserAffinityThreadEx(
1117 _In_ KAFFINITY Affinity
);
1122 KeQueryActiveProcessorCount(
1123 _Out_opt_ PKAFFINITY ActiveProcessors
);
1128 KeQueryMaximumProcessorCount(VOID
);
1134 KeQueryActiveProcessorCount(
1135 _Out_opt_ PKAFFINITY ActiveProcessors
);
1140 KeQueryMaximumProcessorCount(VOID
);
1142 $
if (_WDMDDK_
|| _NTDDK_
)
1143 #endif /* SINGLE_GROUP_LEGACY_API */
1144 $
endif (_WDMDDK_
|| _NTDDK_
)
1146 _IRQL_requires_max_(DISPATCH_LEVEL
)
1150 _In_ PKMUTANT Mutant
,
1151 _Out_ PCLIENT_ID ClientId
);
1153 _IRQL_requires_min_(PASSIVE_LEVEL
)
1154 _When_((Timeout
==NULL
|| *Timeout
!=0), _IRQL_requires_max_(APC_LEVEL
))
1155 _When_((Timeout
!=NULL
&& *Timeout
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
1160 _Inout_ PKQUEUE Queue
,
1161 _In_ KPROCESSOR_MODE WaitMode
,
1162 _In_ BOOLEAN Alertable
,
1163 _In_opt_ PLARGE_INTEGER Timeout
,
1164 _Out_writes_to_(Count
, return) PLIST_ENTRY
*EntryArray
,
1168 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1171 #if (NTDDI_VERSION >= NTDDI_WS08)
1173 _IRQL_requires_max_(APC_LEVEL
)
1176 KeRegisterProcessorChangeCallback(
1177 _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
1178 _In_opt_ PVOID CallbackContext
,
1181 _IRQL_requires_max_(APC_LEVEL
)
1184 KeDeregisterProcessorChangeCallback(
1185 _In_ PVOID CallbackHandle
);
1187 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
1189 $
if (_WDMDDK_
|| _NTDDK_
)
1190 #if (NTDDI_VERSION >= NTDDI_WIN7)
1195 KeQueryActiveProcessorCountEx(
1196 _In_ USHORT GroupNumber
);
1201 KeQueryMaximumProcessorCountEx(
1202 _In_ USHORT GroupNumber
);
1207 KeQueryActiveGroupCount(VOID
);
1212 KeQueryMaximumGroupCount(VOID
);
1217 KeQueryGroupAffinity(
1218 _In_ USHORT GroupNumber
);
1223 KeGetCurrentProcessorNumberEx(
1224 _Out_opt_ PPROCESSOR_NUMBER ProcNumber
);
1229 KeQueryNodeActiveAffinity(
1230 _In_ USHORT NodeNumber
,
1231 _Out_opt_ PGROUP_AFFINITY Affinity
,
1232 _Out_opt_ PUSHORT Count
);
1237 KeQueryNodeMaximumProcessorCount(
1238 _In_ USHORT NodeNumber
);
1243 KeQueryHighestNodeNumber(VOID
);
1248 KeGetCurrentNodeNumber(VOID
);
1250 _IRQL_requires_max_(DISPATCH_LEVEL
)
1254 KeQueryLogicalProcessorRelationship(
1255 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
1256 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
1257 _Out_writes_bytes_opt_(*Length
) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information
,
1258 _Inout_ PULONG Length
);
1260 $
endif (_WDMDDK_
|| _NTDDK_
)
1263 _IRQL_requires_max_(DISPATCH_LEVEL
)
1264 _IRQL_requires_min_(PASSIVE_LEVEL
)
1265 _IRQL_requires_same_
1268 KeQueryTotalCycleTimeProcess(
1269 _Inout_ PKPROCESS Process
,
1270 _Out_ PULONG64 CycleTimeStamp
);
1272 _IRQL_requires_max_(APC_LEVEL
)
1273 _IRQL_requires_min_(PASSIVE_LEVEL
)
1274 _IRQL_requires_same_
1277 KeQueryTotalCycleTimeThread(
1278 _Inout_ PKTHREAD Thread
,
1279 _Out_ PULONG64 CycleTimeStamp
);
1281 _Must_inspect_result_
1285 KeSetTargetProcessorDpcEx(
1287 _In_ PPROCESSOR_NUMBER ProcNumber
);
1289 _IRQL_requires_min_(PASSIVE_LEVEL
)
1290 _IRQL_requires_max_(APC_LEVEL
)
1294 KeSetSystemGroupAffinityThread(
1295 _In_ PGROUP_AFFINITY Affinity
,
1296 _Out_opt_ PGROUP_AFFINITY PreviousAffinity
);
1298 _IRQL_requires_min_(PASSIVE_LEVEL
)
1299 _IRQL_requires_max_(APC_LEVEL
)
1303 KeRevertToUserGroupAffinityThread(
1304 _In_ PGROUP_AFFINITY PreviousAffinity
);
1306 _IRQL_requires_max_(DISPATCH_LEVEL
)
1310 KeSetCoalescableTimer(
1311 _Inout_ PKTIMER Timer
,
1312 _In_ LARGE_INTEGER DueTime
,
1314 _In_ ULONG TolerableDelay
,
1315 _In_opt_ PKDPC Dpc
);
1320 KeQueryUnbiasedInterruptTime(VOID
);
1322 _Must_inspect_result_
1323 _IRQL_requires_max_(DISPATCH_LEVEL
)
1325 _When_(return==0, _Kernel_float_saved_
)
1329 KeSaveExtendedProcessorState(
1331 _Out_
_Requires_lock_not_held_(*_Curr_
)
1332 _When_(return==0, _Acquires_lock_(*_Curr_
))
1333 PXSTATE_SAVE XStateSave
);
1335 _Kernel_float_restored_
1339 KeRestoreExtendedProcessorState(
1340 _In_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
1341 PXSTATE_SAVE XStateSave
);
1345 KeGetProcessorNumberFromIndex(
1346 _In_ ULONG ProcIndex
,
1347 _Out_ PPROCESSOR_NUMBER ProcNumber
);
1351 KeGetProcessorIndexFromNumber(
1352 _In_ PPROCESSOR_NUMBER ProcNumber
);
1355 _IRQL_requires_max_(APC_LEVEL
)
1359 KeSetHardwareCounterConfiguration(
1360 _In_reads_(Count
) PHARDWARE_COUNTER CounterArray
,
1363 _IRQL_requires_max_(APC_LEVEL
)
1367 KeQueryHardwareCounterConfiguration(
1368 _Out_writes_to_(MaximumCount
, *Count
) PHARDWARE_COUNTER CounterArray
,
1369 _In_ ULONG MaximumCount
,
1370 _Out_ PULONG Count
);
1372 $
if (_WDMDDK_
|| _NTDDK_
)
1373 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1374 $
endif (_WDMDDK_
|| _NTDDK_
)
1376 #if !defined(_IA64_)
1380 KeFlushWriteBuffer(VOID
);
1384 * KeInitializeCallbackRecord(
1385 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1387 #define KeInitializeCallbackRecord(CallbackRecord) \
1388 (CallbackRecord)->State = BufferEmpty;
1390 #if defined(_PREFAST_)
1392 void __PREfastPagedCode(void);
1393 void __PREfastPagedCodeLocked(void);
1394 #define PAGED_CODE() __PREfastPagedCode();
1395 #define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked();
1399 #if (NTDDI_VERSION >= NTDDI_VISTA)
1400 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
1402 #define PAGED_ASSERT( exp ) ASSERT( exp )
1405 #define PAGED_CODE() { \
1406 if (KeGetCurrentIrql() > APC_LEVEL) { \
1407 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
1408 PAGED_ASSERT(FALSE); \
1412 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
1416 #define PAGED_CODE() NOP_FUNCTION;
1417 #define PAGED_CODE_LOCKED() NOP_FUNCTION;