KiExitThreadWait
VOID __stdcall KiExitThreadWait(_KPRCB *Prcb, _ETHREAD *Thread, UINT8 ExitScheduler){
unsigned __int64 WaitIrql;
_KWAIT_STATUS_REGISTER v5;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
WaitIrql = Thread->Tcb.WaitIrql;
v5.Flags = (unsigned __int8)Thread->Tcb.WaitRegister;
if( (v5.Flags & 0x38) != 0 )
{
if( (v5.Flags & 0x18) != 0 )
{
if( (v5.Flags & 8) != 0 )
_interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xCu);
ReadyList.Next = 0i64;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Prcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Prcb->PrcbLock );
}
if( !Prcb->NextThread )
KiSelectNextThread(Prcb, &ReadyList);
_InterlockedAnd64((volatile signed __int64 *)&Prcb->PrcbLock, 0i64);
KiProcessDeferredReadyList(Prcb, &ReadyList, WaitIrql);
}
else
{
KiCheckForThreadDispatch(Prcb, 1u);
KiDeliverApc(0, 0i64, 0i64);
__writecr8(0i64);
}
}
else if( ExitScheduler )
{
KiCheckForThreadDispatch(Prcb, Thread->Tcb.WaitIrql);
}
else
{
__writecr8(WaitIrql);
}
}Referenced by:
KiCommitThreadWait
KiFastExitThreadWait
KiSatisfyThreadWait