KiFindReadyThread
_QWORD *__fastcall KiFindReadyThread(__int64 a1, __int64 a2, __int64 a3, unsigned int a4){
__int64 v4;
__int64 v5;
__int64 v7;
int v8;
unsigned int v9;
_QWORD **v10;
_QWORD *v11;
_KHETERO_CPU_POLICY v12;
_QWORD *v13;
__int64 v14;
_QWORD *result;
__int64 v16;
__int64 v17;
__int64 v18;
__int64 v19;
__int64 v21;
char v23;
v21 = a2;
v4 = *(_QWORD *)(a1 + 200);
v5 = a2 + 31872;
if( !a2 )
v5 = a3 + 16;
v7 = a1;
v8 = 64;
LABEL_4:
_BitScanReverse(&v9, a4);
a4 ^= 1 << v9;
v10 = (_QWORD **)(v5 + 16i64 * v9);
v23 = v9;
v11 = *v10;
while( 1 )
{
v12 = *((unsigned __int8 *)v11 - 91);
v13 = v11 - 27;
v14 = v11[45];
if( (unsigned int)v12 >= KHeteroCpuPolicyDynamic )
{
v12 = KiConvertDynamicHeteroPolicy((_KTHREAD *)(v11 - 27), (_KHETERO_CPU_POLICY)a2, (_KPRCB *)v7);
v7 = a1;
}
if( v12 )
{
a2 = *(_QWORD *)(v7 + 192);
v19 = v14 & *(_QWORD *)(a2 + 24i64 * (int)v12 + 200);
if( v19 )
v14 = v19;
}
if( (v4 & v14) != 0 )
{
v16 = v13[13];
if( !v16 )
break;
v18 = *(unsigned int *)(v7 + 216) + v16;
if( !v18 || !KiCheckForMaxOverQuotaScb(v18) )
break;
}
v11 = (_QWORD *)*v11;
--v8;
if( v11 == v10 || !v8 )
{
if( !a4 || !v8 )
return 0i64;
goto LABEL_4;
}
}
if( v21 )
KiRemoveThreadFromReadyQueue(v21, (__int64)v11, v23);
else
KiRemoveThreadFromSharedReadyQueue(a3, (__int64)(v11 - 27), v23);
result = v11 - 27;
*((_DWORD *)v13 + 134) = *(_DWORD *)(v17 + 36);
return result;
}Referenced by:
KiSearchForNewThreadOnProcessor