26 PKMUTANT FirstObject = ObjectPointer;
31 WaitEntry = WaitList->
Flink;
36 WaitThread = WaitBlock->
Thread;
49 WaitEntry = WaitList->
Flink;
62 Thread->WaitStatus |= WaitStatus;
65 WaitBlock =
Thread->WaitBlockList;
72 WaitBlock = WaitBlock->NextWaitBlock;
73 }
while (WaitBlock !=
Thread->WaitBlockList);
110 FastMutex->Contention++;
124 ULONG BitsToRemove, BitsToAdd;
125 LONG OldValue, NewValue;
131 GuardedMutex->Contention++;
147 OldValue = GuardedMutex->Count;
160 NewValue = OldValue ^ BitsToRemove;
164 if (NewValue == OldValue)
return;
169 NewValue = OldValue + BitsToAdd;
173 if (NewValue == OldValue)
break;
318 if (!
Thread->WaitNext)
goto WaitStart;
331 if ((
Thread->ApcState.KernelApcPending) && !(
Thread->SpecialApcDisable) &&
441 if (!
Thread->WaitNext)
goto WaitStart;
454 if ((
Thread->ApcState.KernelApcPending) && !(
Thread->SpecialApcDisable) &&
506 Timer->DueTime.QuadPart)
612 DPRINT(
"%s called at DISPATCH_LEVEL with non-zero timeout!\n",
645 if (!
Thread->WaitNext)
goto WaitStart;
664 if ((
Thread->ApcState.KernelApcPending) && !(
Thread->SpecialApcDisable) &&
768 WaitBlock = WaitBlock->NextWaitBlock;
787 Timer->DueTime.QuadPart)
798 WaitBlock->NextWaitBlock = TimerBlock;
806 CurrentObject = WaitBlock->
Object;
813 WaitBlock = WaitBlock->NextWaitBlock;
894 DelayInterval = &SafeInterval;
#define KeGetCurrentIrql()
_In_ PVOID _In_ BOOLEAN Alertable
BOOLEAN NTAPI KeIsWaitListEmpty(IN PVOID Object)
VOID FASTCALL KiUnlinkThread(IN PKTHREAD Thread, IN LONG_PTR WaitStatus)
#define KiSatisfyNonMutantWait(Object)
#define KxDelayThreadWait()
#define KeLowerIrql(oldIrql)
FORCEINLINE VOID KiCheckDeferredReadyList(IN PKPRCB Prcb)
_In_ LARGE_INTEGER DueTime
#define KiSatisfyMutantWait(Object, Thread)
#define MAXIMUM_WAIT_OBJECTS
VOID FASTCALL KiAcquireFastMutex(IN PFAST_MUTEX FastMutex)
FORCEINLINE VOID KiSetThreadSwapBusy(IN PKTHREAD Thread)
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
VOID NTAPI KiAdjustQuantumThread(IN PKTHREAD Thread)
FORCEINLINE VOID KxRemoveTreeTimer(IN PKTIMER Timer)
#define InterlockedCompareExchange
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
KPROCESSOR_MODE NTAPI ExGetPreviousMode(VOID)
#define KxSingleThreadWait()
#define InsertTailList(ListHead, Entry)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
struct _KTHREAD * NextThread
VOID FASTCALL KiExitDispatcher(IN KIRQL OldIrql)
BOOLEAN FASTCALL KiSwapContext(IN KIRQL WaitIrql, IN PKTHREAD CurrentThread)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
struct _KMUTANT * PKMUTANT
FORCEINLINE VOID KxQueueReadyThread(IN PKTHREAD Thread, IN PKPRCB Prcb)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID FASTCALL KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
NTSTATUS NTAPI KeDelayExecutionThread(IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Interval OPTIONAL)
#define EXCEPTION_EXECUTE_HANDLER
struct _KTHREAD * CurrentThread
#define GM_LOCK_WAITER_INC
#define KiAddThreadToWaitList(Thread, Swappable)
FORCEINLINE VOID KiAcquirePrcbLock(IN PKPRCB Prcb)
VOID NTAPI KeBugCheck(ULONG BugCheckCode)
FORCEINLINE VOID KxInsertTimer(IN PKTIMER Timer, IN ULONG Hand)
#define STATUS_KERNEL_APC
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
VOID NTAPI KiReadyThread(IN PKTHREAD Thread)
VOID FASTCALL KiWaitTest(IN PVOID ObjectPointer, IN KPRIORITY Increment)
struct _LIST_ENTRY * Flink
_In_ KPROCESSOR_MODE PreviousMode
#define _SEH2_YIELD(STMT_)
NTSTATUS NTAPI NtYieldExecution(VOID)
static const UCHAR Index[8]
enum _WAIT_TYPE WAIT_TYPE
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
#define ProbeForReadLargeInteger(Ptr)
NTSTATUS NTAPI KeWaitForMultipleObjects(IN ULONG Count, IN PVOID Object[], IN WAIT_TYPE WaitType, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL, OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL)
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
VOID FASTCALL HalRequestSoftwareInterrupt(IN KIRQL Irql)
FORCEINLINE PLARGE_INTEGER KiRecalculateDueTime(IN PLARGE_INTEGER OriginalDueTime, IN PLARGE_INTEGER DueTime, IN OUT PLARGE_INTEGER NewDueTime)
FORCEINLINE VOID KiReleaseDispatcherLock(IN KIRQL OldIrql)
#define KxMultiThreadWait()
LONG_PTR FASTCALL KiSwapThread(IN PKTHREAD Thread, IN PKPRCB Prcb)
VOID FASTCALL KeWaitForGate(PKGATE Gate, KWAIT_REASON WaitReason, KPROCESSOR_MODE WaitMode)
VOID FASTCALL KiActivateWaiterQueue(IN PKQUEUE Queue)
#define KiSatisfyObjectWait(Object, Thread)
FORCEINLINE VOID KiReleaseDispatcherLockFromDpcLevel(VOID)
struct _KTHREAD *RESTRICTED_POINTER OwnerThread
enum _KWAIT_REASON KWAIT_REASON
_Must_inspect_result_ _In_ WAIT_TYPE _In_opt_ PLARGE_INTEGER _In_opt_ PKWAIT_BLOCK WaitBlockArray
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionCode()
#define KeGetCurrentThread
FORCEINLINE NTSTATUS KiCheckAlertability(IN PKTHREAD Thread, IN BOOLEAN Alertable, IN KPROCESSOR_MODE WaitMode)
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
VOID FASTCALL KiUnwaitThread(IN PKTHREAD Thread, IN LONG_PTR WaitStatus, IN KPRIORITY Increment)
VOID NTAPI KiDeliverApc(IN KPROCESSOR_MODE DeliveryMode, IN PKEXCEPTION_FRAME ExceptionFrame, IN PKTRAP_FRAME TrapFrame)
ULONGLONG NTAPI KeQueryInterruptTime(VOID)
NTSTATUS NTAPI NtDelayExecution(IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval)
#define GM_LOCK_WAITER_WOKEN
#define STATUS_MUTANT_LIMIT_EXCEEDED
#define THREAD_WAIT_OBJECTS
FORCEINLINE VOID KiAcquireDispatcherLockAtDpcLevel(VOID)
KIRQL NTAPI KeRaiseIrqlToSynchLevel(VOID)
PULONG MinorVersion OPTIONAL