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