KiReadyThread
VOID __stdcall KiReadyThread(_KPRCB *Prcb, _ETHREAD *Thread){
int v2;
int v5;
INT64 v6;
_EPROCESS *v7;
_BYTE *v8;
signed __int64 v9;
signed __int64 v10;
_EPROCESS *Process;
INT64 r8_0;
v2 = *(&Thread->Tcb.MiscFlags + 1);
if( (v2 & 0x20000) != 0 )
{
if( (v2 & 0x100000) != 0 )
{
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0x14u);
if( (_InterlockedExchangeAdd(&Thread->Tcb.ApcState.Process->Pcb.StackCount.Value, 8u) & 7) != 0 )
{
Process = Thread->Tcb.ApcState.Process;
KiAcquireKobjectLockSafe(Process);
if( (Process->Pcb.StackCount.Value & 7) != 0 )
{
KiRequestProcessInSwap(&Thread->Tcb, &Process->Pcb);
return;
}
_InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
}
}
v5 = (_DWORD)Thread + 216;
v6 = 0i64;
*(_QWORD *)Thread->Tcb.gapD8 = 0i64;
while( 1 )
{
r8_0 = v6;
KiDeferredReadySingleThread((INT64)Prcb, v5 - 216, (INT64)&r8_0);
v5 = r8_0;
if( !r8_0 )
break;
v6 = *(_QWORD *)r8_0;
}
}
else
{
v7 = Thread->Tcb.ApcState.Process;
KiAcquireKobjectLockSafe(v7);
if( (v7->Pcb.StackCount.Value & 7) != 0 )
{
KiRequestProcessInSwap(&Thread->Tcb, &v7->Pcb);
}
else
{
_InterlockedExchangeAdd(&v7->Pcb.StackCount.Value, 8u);
_InterlockedAnd((volatile signed __int32 *)v7, 0xFFFFFF7F);
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0x14u);
Thread->Tcb.WaitBlockFill6[68] = 6;
v8 = Thread->Tcb.gapD8;
_m_prefetchw(&KiStackInSwapListHead);
v9 = KiStackInSwapListHead;
do
{
*(_QWORD *)v8 = v9;
v10 = v9;
v9 = _InterlockedCompareExchange64(&KiStackInSwapListHead, (signed __int64)v8, v9);
}
while( v9 != v10 );
if( !v9 )
KeSetEvent((PRKEVENT)&KiSwapEvent, 10, 0);
}
}
}Referenced by:
KiProcessExpiredTimerList
KiProcessThreadWaitList
KiReadyOutSwappedThreads