KiSelectLowestRankedThread
_KTHREAD *__stdcall KiSelectLowestRankedThread(_KPRCB *Prcb){
_ETHREAD *v2;
_RTL_RB_TREE *i;
_RTL_BALANCED_NODE *Min;
__int64 v5;
__int64 v7;
unsigned __int64 v8;
unsigned __int64 GroupSetMember;
unsigned __int64 CoreProcessorSet;
unsigned __int64 v11;
unsigned __int64 v12;
if( KiPerfIsoEnabled )
{
v8 = Prcb->ParentNode->IdleNonParkedCpuSet - ((Prcb->ParentNode->IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64);
if( (unsigned int)((0x101010101010101i64
* (((v8 & 0x3333333333333333i64)
+ ((v8 >> 2) & 0x3333333333333333i64)
+ (((v8 & 0x3333333333333333i64) + ((v8 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 < KiPerfIsoEnabled )
return 0i64;
GroupSetMember = Prcb->GroupSetMember;
CoreProcessorSet = Prcb->CoreProcessorSet;
if( GroupSetMember != CoreProcessorSet )
{
v11 = CoreProcessorSet & ~GroupSetMember;
if( (Prcb->ParentNode->IdleCpuSet & v11) == 0 )
{
_BitScanForward64(&v12, v11);
if( ((*(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * Prcb->Group + (int)v12]))->PrcbFlags._bf_0 & 0x400) == 0 )
return 0i64;
}
}
}
v2 = 0i64;
for( i = &Prcb->ScbQueue; ; i = (_RTL_RB_TREE *)(v7 + 392) )
{
Min = i->Min;
if( ((unsigned __int8)Min & 1) != 0 )
{
if( Min == (_RTL_BALANCED_NODE *)1 )
return &v2->Tcb;
v5 = (unsigned __int64)Min ^ ((unsigned __int64)i | 1);
}
else
{
v5 = (__int64)i->Min;
}
if( !v5 )
break;
v7 = v5 - 88;
v2 = KiSelectThreadFromSchedulingGroup(Prcb, (_KSCB *)(v5 - 88), 0i64);
if( v2 )
break;
}
return &v2->Tcb;
}Referenced by:
KiSelectNextThread
KiSelectReadyThreadEx