KiReadyThread
void __fastcall KiReadyThread(struct _KPRCB *a1, __int64 a2){
int v2;
INT64 v5;
INT64 v6;
__int64 v7;
signed __int64 *v8;
signed __int64 v9;
signed __int64 v10;
__int64 v11;
INT64 a3;
v2 = *(_DWORD *)(a2 + 120);
if( (v2 & 0x20000) != 0 )
{
if( (v2 & 0x100000) != 0 )
{
_interlockedbittestandreset((volatile signed __int32 *)(a2 + 120), 0x14u);
if( (_InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(a2 + 184) + 840i64), 8u) & 7) != 0 )
{
v11 = *(_QWORD *)(a2 + 184);
KiAcquireKobjectLockSafe((PVOID)v11);
if( (*(_DWORD *)(v11 + 840) & 7) != 0 )
{
KiRequestProcessInSwap((_KTHREAD *)a2, (_KPROCESS *)v11);
return;
}
_InterlockedAnd((volatile signed __int32 *)v11, 0xFFFFFF7F);
}
}
v5 = a2 + 216;
v6 = 0i64;
*(_QWORD *)(a2 + 216) = 0i64;
while( 1 )
{
a3 = v6;
KiDeferredReadySingleThread((INT64)a1, v5 - 216, (INT64)&a3);
v5 = a3;
if( !a3 )
break;
v6 = *(_QWORD *)a3;
}
}
else
{
v7 = *(_QWORD *)(a2 + 184);
KiAcquireKobjectLockSafe((PVOID)v7);
if( (*(_DWORD *)(v7 + 840) & 7) != 0 )
{
KiRequestProcessInSwap((_KTHREAD *)a2, (_KPROCESS *)v7);
}
else
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v7 + 840), 8u);
_InterlockedAnd((volatile signed __int32 *)v7, 0xFFFFFF7F);
_interlockedbittestandreset((volatile signed __int32 *)(a2 + 120), 0x14u);
*(_BYTE *)(a2 + 388) = 6;
v8 = (signed __int64 *)(a2 + 216);
_m_prefetchw(&KiStackInSwapListHead);
v9 = KiStackInSwapListHead;
do
{
*v8 = v9;
v10 = v9;
v9 = _InterlockedCompareExchange64(&KiStackInSwapListHead, (signed __int64)v8, v9);
}
while( v9 != v10 );
if( !v9 )
KeSetEvent(&KiSwapEvent, 10);
}
}
}Referenced by:
KiProcessExpiredTimerList
KiProcessThreadWaitList
KiReadyOutSwappedThreads