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