KiSelectIdealProcessor
UINT64 __stdcall KiSelectIdealProcessor(_KNODE *Node, UINT64 Seed, _GROUP_AFFINITY *Affinity){
int Lowest_low;
int Highest_low;
unsigned __int64 Mask;
int v8;
__int64 v9;
unsigned __int64 StrideMask;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 i;
__int64 j;
unsigned __int64 v15;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
__int64 v20;
unsigned __int64 v21;
Lowest_low = LOWORD(Node->Lowest);
Highest_low = LOWORD(Node->Highest);
if( (_WORD)Lowest_low == (_WORD)Highest_low )
return(unsigned __int16)Lowest_low;
Mask = Node->Affinity.Mask;
v8 = KiProcessorIndexToNumberMappingTable[(unsigned __int16)(Lowest_low
+ ((unsigned __int16)Seed - Lowest_low)
% (Highest_low - Lowest_low + 1))];
v9 = 1i64 << (v8 & 0x3F);
if( (Mask & v9) == 0 )
{
_BitScanForward64(&v21, __ROR8__(Mask, v8 & 0x3F));
v9 = 1i64 << (((v8 & 0x3F) + v21) & 0x3F);
}
StrideMask = Node->StrideMask;
v11 = StrideMask;
v12 = ~Mask;
for( i = StrideMask & Mask; (v9 & i) == 0; i = v11 & ~v12 )
{
v12 |= v11;
v11 *= 2i64;
}
for( j = ~(v9 | (v9 - 1)) & i; (j & (unsigned __int64)Affinity) == 0; j = v11 & ~v12 )
{
v17 = v11 | v12;
v18 = ~(v11 | v12);
v12 = ~Mask;
v19 = Mask & v18;
if( v19 )
v12 = v17;
v20 = 2 * v11;
v11 = StrideMask;
if( v19 )
v11 = v20;
}
_BitScanForward64(&v15, (unsigned __int64)Affinity & j);
return LOWORD(KiProcessorNumberToIndexMappingTable[(unsigned int)v15 + (v8 & 0xFFFFFFC0)]);
}Referenced by:
KeSelectIdealProcessor