KiSelectProcessorToPreempt
_KPRCB *__stdcall KiSelectProcessorToPreempt(_ETHREAD *Thread, _KPRCB *IdealPrcb, UINT64 Affinity, UINT64 PreferredSet){
unsigned __int64 v5;
_KSHARED_READY_QUEUE *SharedReadyQueue;
__int64 LowProcIndex;
char *v10;
unsigned __int64 SmtSet;
INT8 IsQosGroupingActive;
int v13;
unsigned int v14;
char v15;
__int64 v16;
unsigned int v17;
char *v18;
unsigned int v19;
char *v20;
_BYTE v22[64];
v5 = IdealPrcb->SharedReadyQueueMask & Affinity;
if( ((v5 - 1) & v5) != 0 )
{
SharedReadyQueue = IdealPrcb->SharedReadyQueue;
LowProcIndex = SharedReadyQueue->LowProcIndex;
v10 = &v22[LowProcIndex];
memmove(&v22[LowProcIndex], SharedReadyQueue->RunningSummary, SharedReadyQueue->Span);
SmtSet = IdealPrcb->ParentNode->QosGroupingSets.SmtSet;
IsQosGroupingActive = KiIsQosGroupingActive();
v16 = (unsigned int)(v13 + 2);
if( IsQosGroupingActive )
{
if( (SmtSet & v5) != 0 && (unsigned __int8)Thread->Tcb.ThreadFlags2 - (unsigned int)v16 <= (unsigned int)v16 )
{
v17 = LowProcIndex;
if( (unsigned int)LowProcIndex < v14 )
{
v18 = &v22[LowProcIndex];
do
{
if( ((v16 << v17) & SmtSet & 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 * IdealPrcb->Group + v13]);
v19 = LowProcIndex;
if( (unsigned int)LowProcIndex < v14 )
{
v20 = &v22[LowProcIndex];
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 * IdealPrcb->Group + v13]);
while( (unsigned int)LowProcIndex < v14 )
{
if( ((v16 << LowProcIndex) & v5) != 0 && *v10 < v15 )
{
v15 = *v10;
v13 = LowProcIndex;
}
LODWORD(LowProcIndex) = v16 + LowProcIndex;
v10 += v16;
}
if( v13 >= 0 )
return *(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * IdealPrcb->Group + v13]);
}
return IdealPrcb;
}Referenced by:
KiHeteroChooseTargetProcessor