1 /******************************************************************************
3 ******************************************************************************/
17 IN OUT PRKEVENT Event
);
24 KeInvalidateRangeAllCaches(
32 KeGetProcessorNumberFromIndex(
34 OUT PPROCESSOR_NUMBER ProcNumber
);
38 KeGetProcessorIndexFromNumber(
39 IN PPROCESSOR_NUMBER ProcNumber
);
42 #if (NTDDI_VERSION >= NTDDI_WIN2K)
45 #if defined(_NTDDK_) || defined(_NTIFS_)
50 IN CONST VOID
*Address
, /* CONST is added */
53 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
70 IN KDPC_IMPORTANCE Importance
);
76 IN OUT PRKEVENT Event
,
77 IN KPRIORITY Increment
,
83 KeSetBasePriorityThread(
84 IN OUT PRKTHREAD Thread
,
90 KeEnterCriticalRegion(VOID
);
95 KeLeaveCriticalRegion(VOID
);
102 IN ULONG BugCheckCode
);
104 $
if (_WDMDDK_
|| _NTDDK_
)
105 #if defined(SINGLE_GROUP_LEGACY_API)
112 KeRevertToUserAffinityThread(VOID
);
117 KeSetSystemAffinityThread(
118 IN KAFFINITY Affinity
);
123 KeSetTargetProcessorDpc(
130 KeQueryActiveProcessors(VOID
);
137 KeSetTargetProcessorDpc(
144 KeQueryActiveProcessors(VOID
);
146 $
if (_WDMDDK_
|| _NTDDK_
)
147 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
151 #if !defined(_M_AMD64)
155 KeQueryInterruptTime(VOID
);
161 OUT PLARGE_INTEGER CurrentTime
);
162 #endif /* !_M_AMD64 */
168 KeAcquireSpinLockRaiseToDpc(
169 IN OUT PKSPIN_LOCK SpinLock
);
171 #define KeAcquireSpinLock(SpinLock, OldIrql) \
172 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
177 KeAcquireSpinLockAtDpcLevel(
178 IN OUT PKSPIN_LOCK SpinLock
);
184 IN OUT PKSPIN_LOCK SpinLock
,
190 KeReleaseSpinLockFromDpcLevel(
191 IN OUT PKSPIN_LOCK SpinLock
);
194 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
198 KeInitializeSpinLock(
199 IN PKSPIN_LOCK SpinLock
);
203 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
215 IN ULONG BugCheckCode
,
216 IN ULONG_PTR BugCheckParameter1
,
217 IN ULONG_PTR BugCheckParameter2
,
218 IN ULONG_PTR BugCheckParameter3
,
219 IN ULONG_PTR BugCheckParameter4
);
230 KeDelayExecutionThread(
231 IN KPROCESSOR_MODE WaitMode
,
232 IN BOOLEAN Alertable
,
233 IN PLARGE_INTEGER Interval
);
238 KeDeregisterBugCheckCallback(
239 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
244 KeEnterCriticalRegion(VOID
);
249 KeInitializeDeviceQueue(
250 OUT PKDEVICE_QUEUE DeviceQueue
);
257 IN PKDEFERRED_ROUTINE DeferredRoutine
,
258 IN PVOID DeferredContext OPTIONAL
);
270 KeInitializeSemaphore(
271 OUT PRKSEMAPHORE Semaphore
,
291 KeInsertByKeyDeviceQueue(
292 IN OUT PKDEVICE_QUEUE DeviceQueue
,
293 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
300 IN OUT PKDEVICE_QUEUE DeviceQueue
,
301 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
308 IN PVOID SystemArgument1 OPTIONAL
,
309 IN PVOID SystemArgument2 OPTIONAL
);
314 KeLeaveCriticalRegion(VOID
);
319 KeQueryPerformanceCounter(
320 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
325 KeQueryPriorityThread(
326 IN PRKTHREAD Thread
);
331 KeQueryTimeIncrement(VOID
);
348 KeReadStateSemaphore(
349 IN PRKSEMAPHORE Semaphore
);
360 KeRegisterBugCheckCallback(
361 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
362 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
365 IN PUCHAR Component
);
371 IN OUT PRKMUTEX Mutex
,
378 IN OUT PRKSEMAPHORE Semaphore
,
379 IN KPRIORITY Increment
,
386 KeRemoveByKeyDeviceQueue(
387 IN OUT PKDEVICE_QUEUE DeviceQueue
,
394 IN OUT PKDEVICE_QUEUE DeviceQueue
);
399 KeRemoveEntryDeviceQueue(
400 IN OUT PKDEVICE_QUEUE DeviceQueue
,
401 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
413 IN OUT PRKEVENT Event
);
419 IN OUT PRKEVENT Event
,
420 IN KPRIORITY Increment
,
428 IN KDPC_IMPORTANCE Importance
);
434 IN OUT PKTHREAD Thread
,
435 IN KPRIORITY Priority
);
441 IN OUT PKTIMER Timer
,
442 IN LARGE_INTEGER DueTime
,
443 IN PKDPC Dpc OPTIONAL
);
449 IN OUT PKTIMER Timer
,
450 IN LARGE_INTEGER DueTime
,
451 IN LONG Period OPTIONAL
,
452 IN PKDPC Dpc OPTIONAL
);
457 KeStallExecutionProcessor(
458 IN ULONG MicroSeconds
);
463 KeSynchronizeExecution(
464 IN OUT PKINTERRUPT Interrupt
,
465 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
466 IN PVOID SynchronizeContext OPTIONAL
);
471 KeWaitForMultipleObjects(
474 IN WAIT_TYPE WaitType
,
475 IN KWAIT_REASON WaitReason
,
476 IN KPROCESSOR_MODE WaitMode
,
477 IN BOOLEAN Alertable
,
478 IN PLARGE_INTEGER Timeout OPTIONAL
,
479 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
481 #define KeWaitForMutexObject KeWaitForSingleObject
486 KeWaitForSingleObject(
488 IN KWAIT_REASON WaitReason
,
489 IN KPROCESSOR_MODE WaitMode
,
490 IN BOOLEAN Alertable
,
491 IN PLARGE_INTEGER Timeout OPTIONAL
);
499 OUT PRKMUTANT Mutant
,
500 IN BOOLEAN InitialOwner
);
506 IN PRKMUTANT Mutant
);
512 IN OUT PRKMUTANT Mutant
,
513 IN KPRIORITY Increment
,
514 IN BOOLEAN Abandoned
,
534 IN OUT PRKQUEUE Queue
,
535 IN OUT PLIST_ENTRY Entry
);
541 IN OUT PRKQUEUE Queue
,
542 IN OUT PLIST_ENTRY Entry
);
548 IN OUT PRKQUEUE Queue
,
549 IN KPROCESSOR_MODE WaitMode
,
550 IN PLARGE_INTEGER Timeout OPTIONAL
);
556 IN OUT PKPROCESS Process
);
568 IN OUT PRKQUEUE Queue
);
573 KeStackAttachProcess(
574 IN OUT PKPROCESS Process
,
575 OUT PKAPC_STATE ApcState
);
580 KeUnstackDetachProcess(
581 IN PKAPC_STATE ApcState
);
586 KeSetIdealProcessorThread(
587 IN OUT PKTHREAD Thread
,
593 KeSetKernelStackSwapEnable(
600 KeAcquireSpinLockRaiseToSynch(
601 IN OUT PKSPIN_LOCK SpinLock
);
605 KeAcquireSpinLockRaiseToSynch(
606 IN OUT PKSPIN_LOCK SpinLock
);
610 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
612 #if (NTDDI_VERSION >= NTDDI_WINXP)
618 KeAcquireInStackQueuedSpinLock(
619 IN OUT PKSPIN_LOCK SpinLock
,
620 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
625 KeAcquireInStackQueuedSpinLockAtDpcLevel(
626 IN OUT PKSPIN_LOCK SpinLock
,
627 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
632 KeAcquireInterruptSpinLock(
633 IN OUT PKINTERRUPT Interrupt
);
638 KeAreApcsDisabled(VOID
);
643 KeGetRecommendedSharedDataAlignment(VOID
);
648 KeQueryRuntimeThread(
650 OUT PULONG UserTime
);
655 KeReleaseInStackQueuedSpinLockFromDpcLevel(
656 IN PKLOCK_QUEUE_HANDLE LockHandle
);
661 KeReleaseInterruptSpinLock(
662 IN OUT PKINTERRUPT Interrupt
,
668 KeRemoveByKeyDeviceQueueIfBusy(
669 IN OUT PKDEVICE_QUEUE DeviceQueue
,
675 KeReleaseInStackQueuedSpinLock(
676 IN PKLOCK_QUEUE_HANDLE LockHandle
);
682 KeAreApcsDisabled(VOID
);
689 KeAcquireQueuedSpinLock(
690 IN OUT KSPIN_LOCK_QUEUE_NUMBER Number
);
695 KeReleaseQueuedSpinLock(
696 IN OUT KSPIN_LOCK_QUEUE_NUMBER Number
,
702 KeTryToAcquireQueuedSpinLock(
703 IN KSPIN_LOCK_QUEUE_NUMBER Number
,
707 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
710 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
715 KeDeregisterBugCheckReasonCallback(
716 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
721 KeRegisterBugCheckReasonCallback(
722 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
723 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
724 IN KBUGCHECK_CALLBACK_REASON Reason
,
725 IN PUCHAR Component
);
727 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
729 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
733 KeFlushQueuedDpcs(VOID
);
734 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
736 $
if (_WDMDDK_
|| _NTDDK_
)
737 #if (NTDDI_VERSION >= NTDDI_WS03)
744 KeRegisterNmiCallback(
745 IN PNMI_CALLBACK CallbackRoutine
,
746 IN PVOID Context OPTIONAL
);
751 KeDeregisterNmiCallback(
757 KeInitializeThreadedDpc(
759 IN PKDEFERRED_ROUTINE DeferredRoutine
,
760 IN PVOID DeferredContext OPTIONAL
);
766 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
767 IN ULONG_PTR Context
);
772 KeAcquireSpinLockForDpc(
773 IN OUT PKSPIN_LOCK SpinLock
);
778 KeReleaseSpinLockForDpc(
779 IN OUT PKSPIN_LOCK SpinLock
,
786 IN PKSPIN_LOCK SpinLock
);
793 KeInvalidateAllCaches(VOID
);
795 $
if (_WDMDDK_
|| _NTDDK_
)
796 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
798 $
if (_WDMDDK_
|| _NTDDK_
)
799 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
806 KeTryToAcquireSpinLockAtDpcLevel(
807 IN OUT PKSPIN_LOCK SpinLock
);
812 KeAreAllApcsDisabled(VOID
);
817 KeAcquireGuardedMutex(
818 IN OUT PKGUARDED_MUTEX GuardedMutex
);
823 KeAcquireGuardedMutexUnsafe(
824 IN OUT PKGUARDED_MUTEX GuardedMutex
);
829 KeEnterGuardedRegion(VOID
);
834 KeLeaveGuardedRegion(VOID
);
839 KeInitializeGuardedMutex(
840 OUT PKGUARDED_MUTEX GuardedMutex
);
845 KeReleaseGuardedMutexUnsafe(
846 IN OUT PKGUARDED_MUTEX GuardedMutex
);
851 KeReleaseGuardedMutex(
852 IN OUT PKGUARDED_MUTEX GuardedMutex
);
857 KeTryToAcquireGuardedMutex(
858 IN OUT PKGUARDED_MUTEX GuardedMutex
);
864 KeExpandKernelStackAndCallout(
865 IN PEXPAND_STACK_CALLOUT Callout
,
866 IN PVOID Parameter OPTIONAL
,
872 KeEnterGuardedRegion(VOID
);
877 KeLeaveGuardedRegion(VOID
);
879 $
if (_WDMDDK_
|| _NTDDK_
)
880 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
883 #if (NTDDI_VERSION >= NTDDI_VISTA)
888 KeAcquireInStackQueuedSpinLockForDpc(
889 IN OUT PKSPIN_LOCK SpinLock
,
890 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
895 KeReleaseInStackQueuedSpinLockForDpc(
896 IN PKLOCK_QUEUE_HANDLE LockHandle
);
901 KeQueryDpcWatchdogInformation(
902 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
904 $
if (_WDMDDK_
|| _NTDDK_
)
905 #if defined(SINGLE_GROUP_LEGACY_API)
912 KeSetSystemAffinityThreadEx(
913 IN KAFFINITY Affinity
);
918 KeRevertToUserAffinityThreadEx(
919 IN KAFFINITY Affinity
);
924 KeQueryActiveProcessorCount(
925 OUT PKAFFINITY ActiveProcessors OPTIONAL
);
930 KeQueryMaximumProcessorCount(VOID
);
936 KeQueryActiveProcessorCount(
937 OUT PKAFFINITY ActiveProcessors OPTIONAL
);
942 KeQueryMaximumProcessorCount(VOID
);
944 $
if (_WDMDDK_
|| _NTDDK_
)
945 #endif /* SINGLE_GROUP_LEGACY_API */
952 OUT PCLIENT_ID ClientId
);
957 IN OUT PKQUEUE Queue
,
958 IN KPROCESSOR_MODE WaitMode
,
959 IN BOOLEAN Alertable
,
960 IN PLARGE_INTEGER Timeout OPTIONAL
,
961 OUT PLIST_ENTRY
*EntryArray
,
965 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
968 #if (NTDDI_VERSION >= NTDDI_WS08)
971 KeRegisterProcessorChangeCallback(
972 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
973 IN PVOID CallbackContext OPTIONAL
,
977 KeDeregisterProcessorChangeCallback(
978 IN PVOID CallbackHandle
);
980 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
982 $
if (_WDMDDK_
|| _NTDDK_
)
983 #if (NTDDI_VERSION >= NTDDI_WIN7)
989 KeQueryTotalCycleTimeProcess(
990 IN OUT PKPROCESS Process
,
991 OUT PULONG64 CycleTimeStamp
);
995 KeQueryTotalCycleTimeThread(
996 IN OUT PKTHREAD Thread
,
997 OUT PULONG64 CycleTimeStamp
);
1002 KeSetTargetProcessorDpcEx(
1004 IN PPROCESSOR_NUMBER ProcNumber
);
1009 KeSetSystemGroupAffinityThread(
1010 IN PGROUP_AFFINITY Affinity
,
1011 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL
);
1016 KeRevertToUserGroupAffinityThread(
1017 IN PGROUP_AFFINITY PreviousAffinity
);
1022 KeSetCoalescableTimer(
1023 IN OUT PKTIMER Timer
,
1024 IN LARGE_INTEGER DueTime
,
1026 IN ULONG TolerableDelay
,
1027 IN PKDPC Dpc OPTIONAL
);
1032 KeQueryUnbiasedInterruptTime(VOID
);
1037 KeQueryActiveProcessorCountEx(
1038 IN USHORT GroupNumber
);
1043 KeQueryMaximumProcessorCountEx(
1044 IN USHORT GroupNumber
);
1049 KeQueryActiveGroupCount(VOID
);
1054 KeQueryMaximumGroupCount(VOID
);
1059 KeQueryGroupAffinity(
1060 IN USHORT GroupNumber
);
1065 KeGetCurrentProcessorNumberEx(
1066 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL
);
1071 KeQueryNodeActiveAffinity(
1072 IN USHORT NodeNumber
,
1073 OUT PGROUP_AFFINITY Affinity OPTIONAL
,
1074 OUT PUSHORT Count OPTIONAL
);
1079 KeQueryNodeMaximumProcessorCount(
1080 IN USHORT NodeNumber
);
1085 KeQueryHighestNodeNumber(VOID
);
1090 KeGetCurrentNodeNumber(VOID
);
1095 KeQueryLogicalProcessorRelationship(
1096 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
1097 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
1098 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL
,
1099 IN OUT PULONG Length
);
1104 KeSaveExtendedProcessorState(
1106 OUT PXSTATE_SAVE XStateSave
);
1111 KeRestoreExtendedProcessorState(
1112 IN PXSTATE_SAVE XStateSave
);
1116 KeGetProcessorNumberFromIndex(
1118 OUT PPROCESSOR_NUMBER ProcNumber
);
1122 KeGetProcessorIndexFromNumber(
1123 IN PPROCESSOR_NUMBER ProcNumber
);
1129 KeQueryActiveProcessorCountEx(
1130 IN USHORT GroupNumber
);
1135 KeQueryMaximumProcessorCountEx(
1136 IN USHORT GroupNumber
);
1141 KeQueryActiveGroupCount(VOID
);
1146 KeQueryMaximumGroupCount(VOID
);
1151 KeQueryGroupAffinity(
1152 IN USHORT GroupNumber
);
1157 KeGetCurrentProcessorNumberEx(
1158 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL
);
1163 KeQueryNodeActiveAffinity(
1164 IN USHORT NodeNumber
,
1165 OUT PGROUP_AFFINITY Affinity OPTIONAL
,
1166 OUT PUSHORT Count OPTIONAL
);
1171 KeQueryNodeMaximumProcessorCount(
1172 IN USHORT NodeNumber
);
1177 KeQueryHighestNodeNumber(VOID
);
1182 KeGetCurrentNodeNumber(VOID
);
1187 KeQueryLogicalProcessorRelationship(
1188 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
1189 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
1190 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL
,
1191 IN OUT PULONG Length
);
1196 KeSetHardwareCounterConfiguration(
1197 IN PHARDWARE_COUNTER CounterArray
,
1203 KeQueryHardwareCounterConfiguration(
1204 OUT PHARDWARE_COUNTER CounterArray
,
1205 IN ULONG MaximumCount
,
1208 $
if (_WDMDDK_
|| _NTDDK_
)
1209 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1212 #if !defined(_IA64_)
1216 KeFlushWriteBuffer(VOID
);
1220 * KeInitializeCallbackRecord(
1221 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1223 #define KeInitializeCallbackRecord(CallbackRecord) \
1224 CallbackRecord->State = BufferEmpty;
1228 #if (NTDDI_VERSION >= NTDDI_VISTA)
1229 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
1231 #define PAGED_ASSERT( exp ) ASSERT( exp )
1234 #define PAGED_CODE() { \
1235 if (KeGetCurrentIrql() > APC_LEVEL) { \
1236 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
1237 PAGED_ASSERT(FALSE); \
1243 #define PAGED_CODE()
1247 #define PAGED_CODE_LOCKED() NOP_FUNCTION;