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);
589 KeAcquireQueuedSpinLockAtDpcLevel(LockQueue);
600 KeReleaseQueuedSpinLockFromDpcLevel(LockQueue);
715#define KiSatisfyMutantWait(Object, Thread) \
718 (Object)->Header.SignalState--; \
721 if (!(Object)->Header.SignalState) \
724 (Object)->OwnerThread = Thread; \
727 Thread->KernelApcDisable = Thread->KernelApcDisable - \
728 (Object)->ApcDisable; \
731 if ((Object)->Abandoned) \
734 (Object)->Abandoned = FALSE; \
737 Thread->WaitStatus = STATUS_ABANDONED; \
741 InsertHeadList(Thread->MutantListHead.Blink, \
742 &(Object)->MutantListEntry); \
749#define KiSatisfyNonMutantWait(Object) \
751 if (((Object)->Header.Type & TIMER_OR_EVENT_TYPE) == \
752 EventSynchronizationObject) \
755 (Object)->Header.SignalState = 0; \
757 else if ((Object)->Header.Type == SemaphoreObject) \
760 (Object)->Header.SignalState--; \
767#define KiSatisfyObjectWait(Object, Thread) \
770 if ((Object)->Header.Type == MutantObject) \
772 KiSatisfyMutantWait((Object), (Thread)); \
776 KiSatisfyNonMutantWait(Object); \
790 if (OriginalDueTime->QuadPart >= 0)
return OriginalDueTime;
794 NewDueTime->QuadPart -=
DueTime->QuadPart;
808 (
Thread->EnableStackSwap) &&
824#define KiAddThreadToWaitList(Thread, Swappable) \
830 InsertTailList(&KeGetCurrentPrcb()->WaitListHead, \
831 &Thread->WaitListEntry); \
849 if (
Thread->Alerted[WaitMode])
898 Hand =
Timer->Header.Hand;
974 Timer->Header.Hand = 0;
975 Timer->DueTime.QuadPart = 0;
1054 Timer->DueTime.QuadPart = 0;
1056 Timer->Header.Hand = 0;
1076#define KxDelayThreadWait() \
1079 Thread->WaitBlockList = TimerBlock; \
1082 KxSetTimerForThreadWait(Timer, *Interval, &Hand); \
1085 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1088 TimerBlock->NextWaitBlock = TimerBlock; \
1089 Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry; \
1090 Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry; \
1093 Thread->WaitStatus = STATUS_SUCCESS; \
1096 Thread->Alertable = Alertable; \
1097 Thread->WaitReason = DelayExecution; \
1098 Thread->WaitMode = WaitMode; \
1101 Thread->WaitListEntry.Flink = NULL; \
1102 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1105 Thread->WaitTime = KeTickCount.LowPart;
1107#define KxMultiThreadWait() \
1109 Thread->WaitBlockList = WaitBlockArray; \
1118 WaitBlock = &WaitBlockArray[Index]; \
1119 WaitBlock->Object = Object[Index]; \
1120 WaitBlock->WaitKey = (USHORT)Index; \
1121 WaitBlock->WaitType = WaitType; \
1122 WaitBlock->Thread = Thread; \
1125 WaitBlock->NextWaitBlock = &WaitBlockArray[Index + 1]; \
1127 } while (Index < Count); \
1130 WaitBlock->NextWaitBlock = WaitBlockArray; \
1133 Thread->WaitStatus = STATUS_WAIT_0; \
1139 TimerBlock->NextWaitBlock = WaitBlockArray; \
1142 KxSetTimerForThreadWait(Timer, *Timeout, &Hand); \
1145 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1148 InitializeListHead(&Timer->Header.WaitListHead); \
1152 Thread->Alertable = Alertable; \
1153 Thread->WaitMode = WaitMode; \
1154 Thread->WaitReason = WaitReason; \
1157 Thread->WaitListEntry.Flink = NULL; \
1158 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1161 Thread->WaitTime = KeTickCount.LowPart;
1163#define KxSingleThreadWait() \
1165 Thread->WaitBlockList = WaitBlock; \
1166 WaitBlock->WaitKey = STATUS_SUCCESS; \
1167 WaitBlock->Object = Object; \
1168 WaitBlock->WaitType = WaitAny; \
1171 Thread->WaitStatus = STATUS_SUCCESS; \
1177 KxSetTimerForThreadWait(Timer, *Timeout, &Hand); \
1180 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1183 WaitBlock->NextWaitBlock = TimerBlock; \
1184 TimerBlock->NextWaitBlock = WaitBlock; \
1187 Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry; \
1188 Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry; \
1193 WaitBlock->NextWaitBlock = WaitBlock; \
1197 Thread->Alertable = Alertable; \
1198 Thread->WaitMode = WaitMode; \
1199 Thread->WaitReason = WaitReason; \
1202 Thread->WaitListEntry.Flink = NULL; \
1203 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1206 Thread->WaitTime = KeTickCount.LowPart;
1208#define KxQueueThreadWait() \
1210 Thread->WaitBlockList = WaitBlock; \
1211 WaitBlock->WaitKey = STATUS_SUCCESS; \
1212 WaitBlock->Object = Queue; \
1213 WaitBlock->WaitType = WaitAny; \
1214 WaitBlock->Thread = Thread; \
1217 Thread->WaitStatus = STATUS_SUCCESS; \
1223 KxSetTimerForThreadWait(Timer, *Timeout, &Hand); \
1226 DueTime.QuadPart = Timer->DueTime.QuadPart; \
1229 WaitBlock->NextWaitBlock = TimerBlock; \
1230 TimerBlock->NextWaitBlock = WaitBlock; \
1233 Timer->Header.WaitListHead.Flink = &TimerBlock->WaitListEntry; \
1234 Timer->Header.WaitListHead.Blink = &TimerBlock->WaitListEntry; \
1239 WaitBlock->NextWaitBlock = WaitBlock; \
1243 Thread->Alertable = FALSE; \
1244 Thread->WaitMode = WaitMode; \
1245 Thread->WaitReason = WrQueue; \
1248 Thread->WaitListEntry.Flink = NULL; \
1249 Swappable = KiCheckThreadStackSwap(Thread, WaitMode); \
1252 Thread->WaitTime = KeTickCount.LowPart;
1268 WaitList = &
Object->WaitListHead;
1270 WaitEntry = WaitList->
Flink;
1277 WaitThread = WaitBlock->
Thread;
1295 WaitEntry = WaitList->
Flink;
1296 }
while (WaitEntry != WaitList);
1312 WaitList = &
Event->Header.WaitListHead;
1314 WaitEntry = WaitList->
Flink;
1321 WaitThread = WaitBlock->
Thread;
1327 Event->Header.SignalState = 0;
1338 WaitEntry = WaitList->
Flink;
1339 }
while (WaitEntry != WaitList);
1363 ASSERT(Prcb->PrcbLock != 0);
1370 if ((
Thread->Affinity) & (Prcb->SetMember))
1380 Preempted =
Thread->Preempted;
1391 &
Thread->WaitListEntry) :
1408 Thread->DeferredProcessor = Prcb->Number;
1431 PrioritySet = Prcb->ReadySummary >>
Priority;
1432 if (!PrioritySet)
goto Quickie;
1443 ListEntry = Prcb->DispatcherReadyListHead[HighPriority].
Flink;
1461 (
Thread->BasePriority == 0) ||
1462 (
Thread->Priority != 0));
1491 if (Priority < Thread->BasePriority)
Priority =
Thread->BasePriority;
1494 Thread->PriorityDecrement = 0;
1513 GuardedMutex->Owner =
NULL;
1514 GuardedMutex->Contention = 0;
1528 (
Thread->SpecialApcDisable < 0) ||
1541 GuardedMutex->Owner =
Thread;
1548 LONG OldValue, NewValue;
1558 GuardedMutex->Owner =
NULL;
1577 OldValue) == OldValue)
1606 GuardedMutex->Owner =
Thread;
1607 GuardedMutex->SpecialApcDisable =
Thread->SpecialApcDisable;
1615 LONG OldValue, NewValue;
1620 ASSERT(
Thread->SpecialApcDisable == GuardedMutex->SpecialApcDisable);
1623 GuardedMutex->Owner =
NULL;
1642 OldValue) == OldValue)
1674 GuardedMutex->Owner =
Thread;
1675 GuardedMutex->SpecialApcDisable =
Thread->SpecialApcDisable;
1694#if defined(_M_IX86) || defined(_M_AMD64)
#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)
#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
#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 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 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 BOOLEAN KiTryThreadLock(IN PKTHREAD Thread)
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
#define KeGetPreviousMode()
_In_ PVOID _In_ BOOLEAN Alertable
FORCEINLINE KAFFINITY AFFINITY_MASK(ULONG Index)
#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)
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
#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_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_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)