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