KiSelectLowestRankedThread
_KTHREAD *__fastcall KiSelectLowestRankedThread(__int64 a1){
_KTHREAD *v2;
__int64 i;
__int64 v4;
__int64 v5;
__int64 v7;
unsigned __int64 v8;
__int64 v9;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
if( KiPerfIsoEnabled )
{
v8 = **(_QWORD **)(a1 + 192) - ((**(_QWORD **)(a1 + 192) >> 1) & 0x5555555555555555i64);
if( (unsigned int)((0x101010101010101i64
* (((v8 & 0x3333333333333333i64)
+ ((v8 >> 2) & 0x3333333333333333i64)
+ (((v8 & 0x3333333333333333i64) + ((v8 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 < KiPerfIsoEnabled )
return 0i64;
v9 = *(_QWORD *)(a1 + 200);
v10 = *(_QWORD *)(a1 + 33880);
if( v9 != v10 )
{
v11 = v10 & ~v9;
if( (*(_QWORD *)(*(_QWORD *)(a1 + 192) + 24i64) & v11) == 0 )
{
_BitScanForward64(&v12, v11);
if( (*((_DWORD *)*(&KiProcessorBlock
+ (unsigned int)KiProcessorNumberToIndexMappingTable[64 * *(unsigned __int8 *)(a1 + 208)
+ (int)v12])
+ 59) & 0x400) == 0 )
return 0i64;
}
}
}
v2 = 0i64;
for( i = a1 + 31856; ; i = v7 + 392 )
{
v4 = *(_QWORD *)(i + 8);
if( (v4 & 1) != 0 )
{
if( v4 == 1 )
return(_KTHREAD *)v2;
v5 = v4 ^ (i | 1);
}
else
{
v5 = *(_QWORD *)(i + 8);
}
if( !v5 )
break;
v7 = v5 - 88;
v2 = (_ETHREAD *)KiSelectThreadFromSchedulingGroup((_KPRCB *)a1, (_KSCB *)(v5 - 88), 0i64);
if( v2 )
break;
}
return(_KTHREAD *)v2;
}Referenced by:
KiSelectNextThread
KiSelectReadyThreadEx