KeSelectNodeForAffinity
_KNODE *__stdcall KeSelectNodeForAffinity(_GROUP_AFFINITY *GroupAffinity){
unsigned __int16 v2;
unsigned int v3;
_KNODE *v4;
unsigned int v6;
if( KeNumberNodes == 1 )
return(_KNODE *)KeNodeBlock[0];
v2 = KiProcessNodeSeed++;
if( (unsigned __int16)KiProcessNodeSeed >= (unsigned __int16)KeNumberNodes )
KiProcessNodeSeed = 0;
v3 = 0;
while( 1 )
{
if( v2 >= (unsigned __int16)KeNumberNodes )
v2 = 0;
v4 = (_KNODE *)KeNodeBlock[v2];
if( (v4->Flags._bf_0 & 0x10) == 0
&& v4->Affinity.Group == GroupAffinity->Group
&& (v4->Affinity.Mask & GroupAffinity->Mask) != 0 )
{
break;
}
++v3;
++v2;
if( v3 >= (unsigned __int16)KeNumberNodes )
{
v6 = 0;
while( 1 )
{
if( v2 >= (unsigned __int16)KeNumberNodes )
v2 = 0;
v4 = (_KNODE *)KeNodeBlock[v2];
if( v4->Affinity.Group == GroupAffinity->Group && (v4->Affinity.Mask & GroupAffinity->Mask) != 0 )
break;
++v6;
++v2;
if( v6 >= (unsigned __int16)KeNumberNodes )
return 0i64;
}
return v4;
}
}
return v4;
}Referenced by:
KeStartThread
KiComputeThreadAffinity
KiSetAffinityThread
KiSetIdealNodeProcessByGroup
PspAllocateProcess
PspAllocateThread