27#define KeEnterGuardedRegionThread(_Thread) \
30 ASSERT(KeGetCurrentIrql() <= APC_LEVEL); \
31 ASSERT((_Thread) == KeGetCurrentThread()); \
32 ASSERT(((_Thread)->SpecialApcDisable <= 0) && \
33 ((_Thread)->SpecialApcDisable != -32768)); \
36 (_Thread)->SpecialApcDisable--; \
39#define KeEnterGuardedRegion() \
41 PKTHREAD _Thread = KeGetCurrentThread(); \
42 KeEnterGuardedRegionThread(_Thread); \
48#define KeLeaveGuardedRegionThread(_Thread) \
51 ASSERT(KeGetCurrentIrql() <= APC_LEVEL); \
52 ASSERT((_Thread) == KeGetCurrentThread()); \
53 ASSERT((_Thread)->SpecialApcDisable < 0); \
56 if (!(++(_Thread)->SpecialApcDisable)) \
59 if (!IsListEmpty(&(_Thread)->ApcState. \
60 ApcListHead[KernelMode])) \
63 KiCheckForKernelApcDelivery(); \
68#define KeLeaveGuardedRegion() \
70 PKTHREAD _Thread = KeGetCurrentThread(); \
71 KeLeaveGuardedRegionThread(_Thread); \
77#define KeEnterCriticalRegionThread(_Thread) \
80 ASSERT((_Thread) == KeGetCurrentThread()); \
81 ASSERT(((_Thread)->KernelApcDisable <= 0) && \
82 ((_Thread)->KernelApcDisable != -32768)); \
85 (_Thread)->KernelApcDisable--; \
88#define KeEnterCriticalRegion() \
90 PKTHREAD _Thread = KeGetCurrentThread(); \
91 KeEnterCriticalRegionThread(_Thread); \
97#define KeLeaveCriticalRegionThread(_Thread) \
100 ASSERT((_Thread) == KeGetCurrentThread()); \
101 ASSERT((_Thread)->KernelApcDisable < 0); \
104 (_Thread)->KernelApcDisable++; \
107 if (!((_Thread)->KernelApcDisable)) \
110 if (!(IsListEmpty(&(_Thread)->ApcState.ApcListHead[KernelMode])) && \
111 !((_Thread)->SpecialApcDisable)) \
114 KiCheckForKernelApcDelivery(); \
119#define KeLeaveCriticalRegion() \
121 PKTHREAD _Thread = KeGetCurrentThread(); \
122 KeLeaveCriticalRegionThread(_Thread); \
189 Thread->DeferredProcessor = 0;
333 OldValue) != OldValue);
456 }
while (Prcb->PrcbLock);
473 ASSERT(Prcb->PrcbLock != 0);
568 KeAcquireQueuedSpinLockAtDpcLevel(LockQueue);
579 KeReleaseQueuedSpinLockFromDpcLevel(LockQueue);
694#define KiSatisfyMutantWait(Object, Thread) \
697 (Object)->Header.SignalState--; \
700 if (!(Object)->Header.SignalState) \
703 (Object)->OwnerThread = Thread; \
706 Thread->KernelApcDisable = Thread->KernelApcDisable - \
707 (Object)->ApcDisable; \
710 if ((Object)->Abandoned) \
713 (Object)->Abandoned = FALSE; \
716 Thread->WaitStatus = STATUS_ABANDONED; \
720 InsertHeadList(Thread->MutantListHead.Blink, \
721 &(Object)->MutantListEntry); \
728#define KiSatisfyNonMutantWait(Object) \
730 if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) == \
731 EventSynchronizationObject) \
734 (Object)->Header.SignalState = 0; \
736 else if ((Object)->Header.Type == SemaphoreObject) \
739 (Object)->Header.SignalState--; \
746#define KiSatisfyObjectWait(Object, Thread) \
749 if ((Object)->Header.Type == MutantObject) \
751 KiSatisfyMutantWait((Object), (Thread)); \
755 KiSatisfyNonMutantWait(Object); \
769 if (OriginalDueTime->QuadPart >= 0)
return OriginalDueTime;
773 NewDueTime->QuadPart -=
DueTime->QuadPart;
787 (
Thread->EnableStackSwap) &&
803#define KiAddThreadToWaitList(Thread, Swappable) \
809 InsertTailList(&KeGetCurrentPrcb()->WaitListHead, \
810 &Thread->WaitListEntry); \
828 if (
Thread->Alerted[WaitMode])
877 Hand =
Timer->Header.Hand;
953 Timer->Header.Hand = 0;
954 Timer->DueTime.QuadPart = 0;
1033 Timer->DueTime.QuadPart = 0;
1035 Timer->Header.Hand = 0;
1055#define KxDelayThreadWait() \
1058 Thread->WaitBlockList = TimerBlock; \
1061 KxSetTimerForThreadWait(Timer, *Interval, &Hand); \
1064 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1067 TimerBlock->NextWaitBlock = TimerBlock; \
1068 Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry; \
1069 Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry; \
1072 Thread->WaitStatus = STATUS_SUCCESS; \
1075 Thread->Alertable = Alertable; \
1076 Thread->WaitReason = DelayExecution; \
1077 Thread->WaitMode = WaitMode; \
1080 Thread->WaitListEntry.Flink = NULL; \
1081 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1084 Thread->WaitTime = KeTickCount.LowPart;
1086#define KxMultiThreadWait() \
1088 Thread->WaitBlockList = WaitBlockArray; \
1097 WaitBlock = &WaitBlockArray[Index]; \
1098 WaitBlock->Object = Object[Index]; \
1099 WaitBlock->WaitKey = (USHORT)Index; \
1100 WaitBlock->WaitType = WaitType; \
1101 WaitBlock->Thread = Thread; \
1104 WaitBlock->NextWaitBlock = &WaitBlockArray[Index + 1]; \
1106 } while (Index < Count); \
1109 WaitBlock->NextWaitBlock = WaitBlockArray; \
1112 Thread->WaitStatus = STATUS_WAIT_0; \
1118 TimerBlock->NextWaitBlock = WaitBlockArray; \
1121 KxSetTimerForThreadWait(Timer, *Timeout, &Hand); \
1124 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1127 InitializeListHead(&Timer->Header.WaitListHead); \
1131 Thread->Alertable = Alertable; \
1132 Thread->WaitMode = WaitMode; \
1133 Thread->WaitReason = WaitReason; \
1136 Thread->WaitListEntry.Flink = NULL; \
1137 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1140 Thread->WaitTime = KeTickCount.LowPart;
1142#define KxSingleThreadWait() \
1144 Thread->WaitBlockList = WaitBlock; \
1145 WaitBlock->WaitKey = STATUS_SUCCESS; \
1146 WaitBlock->Object = Object; \
1147 WaitBlock->WaitType = WaitAny; \
1150 Thread->WaitStatus = STATUS_SUCCESS; \
1156 KxSetTimerForThreadWait(Timer, *Timeout, &Hand); \
1159 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1162 WaitBlock->NextWaitBlock = TimerBlock; \
1163 TimerBlock->NextWaitBlock = WaitBlock; \
1166 Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry; \
1167 Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry; \
1172 WaitBlock->NextWaitBlock = WaitBlock; \
1176 Thread->Alertable = Alertable; \
1177 Thread->WaitMode = WaitMode; \
1178 Thread->WaitReason = WaitReason; \
1181 Thread->WaitListEntry.Flink = NULL; \
1182 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1185 Thread->WaitTime = KeTickCount.LowPart;
1187#define KxQueueThreadWait() \
1189 Thread->WaitBlockList = WaitBlock; \
1190 WaitBlock->WaitKey = STATUS_SUCCESS; \
1191 WaitBlock->Object = Queue; \
1192 WaitBlock->WaitType = WaitAny; \
1193 WaitBlock->Thread = Thread; \
1196 Thread->WaitStatus = STATUS_SUCCESS; \
1202 KxSetTimerForThreadWait(Timer, *Timeout, &Hand); \
1205 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1208 WaitBlock->NextWaitBlock = TimerBlock; \
1209 TimerBlock->NextWaitBlock = WaitBlock; \
1212 Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry; \
1213 Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry; \
1218 WaitBlock->NextWaitBlock = WaitBlock; \
1222 Thread->Alertable = FALSE; \
1223 Thread->WaitMode = WaitMode; \
1224 Thread->WaitReason = WrQueue; \
1227 Thread->WaitListEntry.Flink = NULL; \
1228 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1231 Thread->WaitTime = KeTickCount.LowPart;
1247 WaitList = &
Object->WaitListHead;
1249 WaitEntry = WaitList->
Flink;
1256 WaitThread = WaitBlock->
Thread;
1274 WaitEntry = WaitList->
Flink;
1275 }
while (WaitEntry != WaitList);
1291 WaitList = &
Event->Header.WaitListHead;
1293 WaitEntry = WaitList->
Flink;
1300 WaitThread = WaitBlock->
Thread;
1306 Event->Header.SignalState = 0;
1317 WaitEntry = WaitList->
Flink;
1318 }
while (WaitEntry != WaitList);
1342 ASSERT(Prcb->PrcbLock != 0);
1349 if ((
Thread->Affinity) & (Prcb->SetMember))
1359 Preempted =
Thread->Preempted;
1370 &
Thread->WaitListEntry) :
1387 Thread->DeferredProcessor = Prcb->Number;
1410 PrioritySet = Prcb->ReadySummary >>
Priority;
1411 if (!PrioritySet)
goto Quickie;
1422 ListEntry = Prcb->DispatcherReadyListHead[HighPriority].
Flink;
1440 (
Thread->BasePriority == 0) ||
1441 (
Thread->Priority != 0));
1470 if (Priority < Thread->BasePriority)
Priority =
Thread->BasePriority;
1473 Thread->PriorityDecrement = 0;
1492 GuardedMutex->Owner =
NULL;
1493 GuardedMutex->Contention = 0;
1507 (
Thread->SpecialApcDisable < 0) ||
1520 GuardedMutex->Owner =
Thread;
1527 LONG OldValue, NewValue;
1537 GuardedMutex->Owner =
NULL;
1556 OldValue) == OldValue)
1585 GuardedMutex->Owner =
Thread;
1586 GuardedMutex->SpecialApcDisable =
Thread->SpecialApcDisable;
1594 LONG OldValue, NewValue;
1599 ASSERT(
Thread->SpecialApcDisable == GuardedMutex->SpecialApcDisable);
1602 GuardedMutex->Owner =
NULL;
1621 OldValue) == OldValue)
1653 GuardedMutex->Owner =
Thread;
1654 GuardedMutex->SpecialApcDisable =
Thread->SpecialApcDisable;
1673#if defined(_M_IX86) || defined(_M_AMD64)
1703 return EThread->CycleTime;
1712 if (CycleTimeAsULI.
HighPart == EThread->CycleTimeHigh)
1731 EThread->CycleTime = NewCycleTime;
1735 NewCycleTimeAsULI.
QuadPart = NewCycleTime;
1737 EThread->CycleTimeHigh = NewCycleTimeAsULI.
HighPart;
#define MM_SYSTEM_RANGE_START
#define InterlockedExchange
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
#define _Requires_lock_held_(lock)
#define _Releases_lock_(lock)
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
#define KeQuerySystemTime(t)
#define KeGetCurrentIrql()
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
VOID FASTCALL HalRequestSoftwareInterrupt(IN KIRQL Irql)
KIRQL FASTCALL KfRaiseIrql(IN KIRQL NewIrql)
VOID FASTCALL KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle)
KIRQL FASTCALL KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
VOID FASTCALL KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle)
VOID FASTCALL KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
#define KeGetCurrentThread
_In_ UCXUSBDEVICE _In_ UCXENDPOINT _In_ ULONG Priority
#define LOW_REALTIME_PRIORITY
#define InterlockedExchangeAdd
#define InterlockedCompareExchange
#define InterlockedBitTestAndReset
PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType)
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
FORCEINLINE VOID _KeAcquireGuardedMutexUnsafe(IN OUT PKGUARDED_MUTEX GuardedMutex)
FORCEINLINE VOID KiAcquireNmiListLock(OUT PKIRQL OldIrql)
FORCEINLINE VOID KiAcquireApcLockRaiseToSynch(IN PKTHREAD Thread, IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE BOOLEAN KiComputeDueTime(IN PKTIMER Timer, IN LARGE_INTEGER DueTime, OUT PULONG Hand)
FORCEINLINE VOID KiReleaseDispatcherLock(IN KIRQL OldIrql)
FORCEINLINE VOID KiCheckDeferredReadyList(IN PKPRCB Prcb)
FORCEINLINE VOID KiAcquireApcLockRaiseToDpc(IN PKTHREAD Thread, IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE VOID _KeReleaseGuardedMutexUnsafe(IN OUT PKGUARDED_MUTEX GuardedMutex)
FORCEINLINE PKTHREAD KiSelectReadyThread(IN KPRIORITY Priority, IN PKPRCB Prcb)
#define KeEnterGuardedRegionThread(_Thread)
FORCEINLINE VOID KiSetThreadSwapBusy(IN PKTHREAD Thread)
FORCEINLINE VOID KxRemoveTreeTimer(IN PKTIMER Timer)
FORCEINLINE VOID KiWriteThreadCycleTime(_Inout_ PKTHREAD Thread, _In_ ULONG64 NewCycleTime)
FORCEINLINE BOOLEAN KiTryToAcquireThreadLock(IN PKTHREAD Thread)
FORCEINLINE VOID KiRemoveEntryTimer(IN PKTIMER Timer)
FORCEINLINE VOID KiReleaseProcessLockFromSynchLevel(IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE VOID KiReleaseTimerLock(IN PKSPIN_LOCK_QUEUE LockQueue)
FORCEINLINE PLARGE_INTEGER KiRecalculateDueTime(IN PLARGE_INTEGER OriginalDueTime, IN PLARGE_INTEGER DueTime, IN OUT PLARGE_INTEGER NewDueTime)
FORCEINLINE VOID KiRequestApcInterrupt(IN BOOLEAN NeedApc, IN UCHAR Processor)
FORCEINLINE VOID KiReleasePrcbLock(IN PKPRCB Prcb)
FORCEINLINE ULONG KiComputeTimerTableIndex(IN ULONGLONG DueTime)
FORCEINLINE VOID KiAcquireThreadLock(IN PKTHREAD Thread)
FORCEINLINE ULONG64 KiReadThreadCycleTime(_In_ PKTHREAD Thread)
FORCEINLINE VOID KxUnwaitThread(IN DISPATCHER_HEADER *Object, IN KPRIORITY Increment)
FORCEINLINE BOOLEAN _KeTryToAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
FORCEINLINE VOID _KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
FORCEINLINE VOID KiReleaseNmiListLock(IN KIRQL OldIrql)
FORCEINLINE PKSPIN_LOCK_QUEUE KiAcquireTimerLock(IN ULONG Hand)
FORCEINLINE VOID KiReleaseDispatcherObject(IN DISPATCHER_HEADER *Object)
FORCEINLINE VOID _KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex)
FORCEINLINE VOID KiInsertDeferredReadyList(IN PKTHREAD Thread)
FORCEINLINE VOID _KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
FORCEINLINE BOOLEAN KiCheckThreadStackSwap(IN PKTHREAD Thread, IN KPROCESSOR_MODE WaitMode)
#define KeLeaveGuardedRegionThread(_Thread)
FORCEINLINE VOID KiAcquireDispatcherObject(IN DISPATCHER_HEADER *Object)
FORCEINLINE VOID KiReleaseDispatcherLockFromSynchLevel(VOID)
FORCEINLINE VOID KiReleaseProcessLock(IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE VOID KiReleaseThreadLock(IN PKTHREAD Thread)
FORCEINLINE VOID KxSetTimerForThreadWait(IN PKTIMER Timer, IN LARGE_INTEGER Interval, OUT PULONG Hand)
FORCEINLINE VOID KiAcquireDispatcherLockAtSynchLevel(VOID)
FORCEINLINE VOID KiAcquireApcLockAtSynchLevel(IN PKTHREAD Thread, IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE VOID KiRescheduleThread(IN BOOLEAN NewThread, IN ULONG Cpu)
FORCEINLINE VOID KiReleaseApcLockFromSynchLevel(IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE VOID KiAcquirePrcbLock(IN PKPRCB Prcb)
FORCEINLINE VOID KiAcquireDeviceQueueLock(IN PKDEVICE_QUEUE DeviceQueue, IN PKLOCK_QUEUE_HANDLE DeviceLock)
FORCEINLINE KIRQL KiAcquireDispatcherLock(VOID)
FORCEINLINE VOID KiAcquireProcessLockRaiseToSynch(IN PKPROCESS Process, IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE VOID KxInsertTimer(IN PKTIMER Timer, IN ULONG Hand)
FORCEINLINE NTSTATUS KiCheckAlertability(IN PKTHREAD Thread, IN BOOLEAN Alertable, IN KPROCESSOR_MODE WaitMode)
FORCEINLINE SCHAR KiComputeNewPriority(IN PKTHREAD Thread, IN SCHAR Adjustment)
FORCEINLINE VOID KiReleaseApcLock(IN PKLOCK_QUEUE_HANDLE Handle)
FORCEINLINE VOID KiReleaseDeviceQueueLock(IN PKLOCK_QUEUE_HANDLE DeviceLock)
FORCEINLINE VOID KxUnwaitThreadForEvent(IN PKEVENT Event, IN KPRIORITY Increment)
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
#define KeGetPreviousMode()
_In_ PVOID _In_ BOOLEAN Alertable
FORCEINLINE KAFFINITY AFFINITY_MASK(ULONG Index)
struct _ETHREAD * PETHREAD
#define UNREFERENCED_PARAMETER(P)
NTKERNELAPI volatile KSYSTEM_TIME KeTickCount
KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE]
#define PRIORITY_MASK(Priority)
VOID FASTCALL KiCompleteTimer(IN PKTIMER Timer, IN PKSPIN_LOCK_QUEUE LockQueue)
VOID FASTCALL KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
KSPIN_LOCK KiNmiCallbackListLock
VOID FASTCALL KiProcessDeferredReadyList(IN PKPRCB Prcb)
BOOLEAN FASTCALL KiInsertTimerTable(IN PKTIMER Timer, IN ULONG Hand)
VOID FASTCALL KiDeferredReadyThread(IN PKTHREAD Thread)
VOID FASTCALL KiIpiSend(KAFFINITY TargetSet, ULONG IpiRequest)
VOID FASTCALL KeSignalGateBoostPriority(PKGATE Gate)
VOID FASTCALL KeInitializeGate(PKGATE Gate)
VOID FASTCALL KiUnwaitThread(IN PKTHREAD Thread, IN LONG_PTR WaitStatus, IN KPRIORITY Increment)
VOID FASTCALL KiExitDispatcher(KIRQL OldIrql)
VOID FASTCALL KeAcquireInStackQueuedSpinLockAtDpcLevel(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle)
VOID FASTCALL KeReleaseInStackQueuedSpinLockFromDpcLevel(IN PKLOCK_QUEUE_HANDLE LockHandle)
BOOLEAN FASTCALL KeTryToAcquireSpinLockAtDpcLevel(IN OUT PKSPIN_LOCK SpinLock)
#define STATUS_KERNEL_APC
#define KeQueryInterruptTime()
SINGLE_LIST_ENTRY DeferredReadyListHead
struct _LIST_ENTRY * Flink
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ WDFTIMER _In_ LONGLONG DueTime
_Must_inspect_result_ typedef _In_ ULONG TableEntry
_In_ KPRIORITY _In_ LONG Adjustment
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define GM_LOCK_WAITER_WOKEN
#define LOCK_QUEUE_TIMER_TABLE_LOCKS
#define LOCK_QUEUE_TIMER_LOCK_SHIFT
@ LockQueueTimerTableLock
@ LockQueueDispatcherLock
#define GM_LOCK_WAITER_INC
FORCEINLINE VOID PushEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry)