KeSelectNodeForAffinity

_KNODE *__stdcall KeSelectNodeForAffinity(_GROUP_AFFINITY *GroupAffinity){
  unsigned __int16 v2; 
  unsigned int v3; 
  __int64 v4; 
  unsigned int v6; 
  if( KeNumberNodes == 1 )
    return *(_KNODE **)&KeNodeBlock;
  v2 = KiProcessNodeSeed++;
  if( (unsigned __int16)KiProcessNodeSeed >= (unsigned __int16)KeNumberNodes )
    KiProcessNodeSeed = 0;
  v3 = 0;
  while( 1 )
  {
    if( v2 >= (unsigned __int16)KeNumberNodes )
      v2 = 0;
    v4 = *((_QWORD *)&KeNodeBlock + v2);
    if( (*(_BYTE *)(v4 + 181) & 0x10) == 0
      && *(_WORD *)(v4 + 144) == GroupAffinity->Group
      && (*(_QWORD *)(v4 + 136) & GroupAffinity->Mask) != 0 )
    {
      break;
    }
    ++v3;
    ++v2;
    if( v3 >= (unsigned __int16)KeNumberNodes )
    {
      v6 = 0;
      while( 1 )
      {
        if( v2 >= (unsigned __int16)KeNumberNodes )
          v2 = 0;
        v4 = *((_QWORD *)&KeNodeBlock + v2);
        if( *(_WORD *)(v4 + 144) == GroupAffinity->Group && (*(_QWORD *)(v4 + 136) & GroupAffinity->Mask) != 0 )
          break;
        ++v6;
        ++v2;
        if( v6 >= (unsigned __int16)KeNumberNodes )
          return 0i64;
      }
      return(_KNODE *)v4;
    }
  }
  return(_KNODE *)v4;
}

Referenced by:

KeStartThread
KiComputeThreadAffinity
KiSetAffinityThread
KiSetIdealNodeProcessByGroup
PspAllocateProcess
PspAllocateThread