KiExitThreadWait
VOID __stdcall KiExitThreadWait(_KPRCB *Prcb, _ETHREAD *Thread, UINT8 ExitScheduler){
unsigned __int64 v3;
char v5;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
v3 = *((unsigned __int8 *)Thread + 390);
v5 = *((_BYTE *)Thread + 112);
if( (v5 & 0x38) != 0 )
{
if( (v5 & 0x18) != 0 )
{
if( (v5 & 8) != 0 )
_interlockedbittestandset((volatile signed __int32 *)Thread + 30, 0xCu);
ReadyList.Next = 0i64;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Prcb + 6) );
}
if( !*((_QWORD *)Prcb + 2) )
KiSelectNextThread(Prcb, &ReadyList);
_InterlockedAnd64((volatile signed __int64 *)Prcb + 6, 0i64);
KiProcessDeferredReadyList((__int64)Prcb, &ReadyList, v3);
}
else
{
KiCheckForThreadDispatch(Prcb, 1u);
KiDeliverApc(0, 0i64, 0i64);
__writecr8(0i64);
}
}
else if( ExitScheduler )
{
KiCheckForThreadDispatch(Prcb, *((_BYTE *)Thread + 390));
}
else
{
__writecr8(v3);
}
}Referenced by:
KiCommitThreadWait
KiFastExitThreadWait
KiSatisfyThreadWait