KiCheckPreferredHeteroProcessor

UINT64 __stdcall KiCheckPreferredHeteroProcessor(_ETHREAD *Thread, _KPRCB *Prcb){
  int v2; 
  unsigned int v3; 
  unsigned int v4; 
  int v5; 
  _KHETERO_CPU_POLICY v8; 
  _KNODE *v9; 
  unsigned int v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v14; 
  unsigned __int8 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  unsigned __int8 v18; 
  UINT64 AvailableSetOut; 
  UINT64 PreferredSetOut; 
  UINT64 IdealSetOut; 
  v3 = *((unsigned __int8 *)Thread + 125);
  v4 = 0;
  AvailableSetOut = 0i64;
  v5 = v2;
  IdealSetOut = 0i64;
  PreferredSetOut = 0i64;
  if( !(_BYTE)v3 )
    return 0i64;
  v8 = v3;
  if( v3 >= 5 )
    v8 = KiConvertDynamicHeteroPolicy((_KTHREAD *)Thread, (_KHETERO_CPU_POLICY)Prcb, Prcb);
  v9 = (_KNODE *)*((_QWORD *)Prcb + 24);
  KiGenerateHeteroSets(v9, *((_QWORD *)Thread + 72), v8, &IdealSetOut, &PreferredSetOut, &AvailableSetOut);
  v10 = 1;
  if( (AvailableSetOut & *((_QWORD *)Prcb + 25)) != 0
    && (!KiIsQosGroupingActive()
     || (v11 & v12) == 0
     || (unsigned __int8)*((_DWORD *)Thread + 128) - v10 > v10
     || (v11 & *((_QWORD *)Prcb + 25)) != 0) )
  {
    if( (IdealSetOut & *((_QWORD *)Prcb + 25)) == 0 )
    {
      if( !v5 )
      {
        LOBYTE(v4) = (*((_QWORD *)KeGetCurrentPrcb() + 25) & IdealSetOut) != 0;
        return v4;
      }
      if( (v12 & v9->IdleSmtSet) != 0 )
        v12 &= v9->IdleSmtSet;
      if( (v12 & IdealSetOut) != 0 )
        return v10;
      v14 = v12 & PreferredSetOut & ~IdealSetOut;
      v15 = v8 - 3 <= v10 ? *((_BYTE *)Prcb + 33210) : *((_BYTE *)Prcb + 33209);
      if( v14 )
      {
        while( 1 )
        {
          _BitScanReverse64(&v16, v14);
          v17 = (__int64)*(&KiProcessorBlock
                         + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * v9->Affinity.Group + (int)v16]);
          v18 = v8 - 3 <= v10 ? *(_BYTE *)(v17 + 33210) : *(_BYTE *)(v17 + 33209);
          if( v18 > v15 )
            break;
          v14 &= ~*(_QWORD *)(v17 + 200);
          if( !v14 )
            return 0i64;
        }
        return v10;
      }
    }
    return 0i64;
  }
  return v10;
}

Referenced by:

KiQuantumEnd
KiSendHeteroRescheduleIntRequestHelper