KiSelectProcessorToPreempt
_KPRCB *__stdcall KiSelectProcessorToPreempt(_ETHREAD *Thread, _KPRCB *IdealPrcb, UINT64 Affinity, UINT64 PreferredSet){
UINT64 v5;
UINT8 *v8;
__int64 v9;
char *v10;
__int64 v11;
CHAR IsQosGroupingActive;
int v13;
unsigned int v14;
char v15;
__int64 v16;
unsigned int v17;
char *v18;
unsigned int v19;
char *v20;
_BYTE v22[64];
v5 = *((_QWORD *)IdealPrcb + 4232) & Affinity;
if( ((v5 - 1) & v5) != 0 )
{
v8 = (UINT8 *)*((_QWORD *)IdealPrcb + 4233);
v9 = v8[593];
v10 = &v22[v9];
memmove(&v22[v9], v8 + 528, v8[592]);
v11 = *(_QWORD *)(*((_QWORD *)IdealPrcb + 24) + 360i64);
IsQosGroupingActive = KiIsQosGroupingActive();
v16 = (unsigned int)(v13 + 2);
if( IsQosGroupingActive )
{
if( (v11 & v5) != 0 && (unsigned __int8)*((_DWORD *)Thread + 128) - (unsigned int)v16 <= (unsigned int)v16 )
{
v17 = v9;
if( (unsigned int)v9 < v14 )
{
v18 = &v22[v9];
do
{
if( ((v16 << v17) & v11 & v5) != 0 && *v18 < v15 )
{
v15 = *v18;
v13 = v17;
}
v17 += v16;
v18 += v16;
}
while( v17 < v14 );
}
}
}
if( PreferredSet )
{
if( v13 >= 0 )
return *(&KiProcessorBlock
+ (unsigned int)KiProcessorNumberToIndexMappingTable[64 * *((unsigned __int8 *)IdealPrcb + 208) + v13]);
v19 = v9;
if( (unsigned int)v9 < v14 )
{
v20 = &v22[v9];
do
{
if( ((v16 << v19) & PreferredSet) != 0 && *v20 < v15 )
{
v15 = *v20;
v13 = v19;
}
v19 += v16;
v20 += v16;
}
while( v19 < v14 );
}
}
if( v13 >= 0 )
return *(&KiProcessorBlock
+ (unsigned int)KiProcessorNumberToIndexMappingTable[64 * *((unsigned __int8 *)IdealPrcb + 208) + v13]);
while( (unsigned int)v9 < v14 )
{
if( ((v16 << v9) & v5) != 0 && *v10 < v15 )
{
v15 = *v10;
v13 = v9;
}
LODWORD(v9) = v16 + v9;
v10 += v16;
}
if( v13 >= 0 )
return *(&KiProcessorBlock
+ (unsigned int)KiProcessorNumberToIndexMappingTable[64 * *((unsigned __int8 *)IdealPrcb + 208) + v13]);
}
return IdealPrcb;
}Referenced by:
KiHeteroChooseTargetProcessor