KiUpdateNodeAffinitizedFlag

VOID __stdcall KiUpdateNodeAffinitizedFlag(_ETHREAD *Thread){
  unsigned __int64 Mask; 
  __int64 Group; 
  int v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 

  Mask = Thread->Tcb.Affinity.Mask;
  Group = Thread->Tcb.Affinity.Group;
  if( Mask == KeActiveProcessors.Bitmap[Group] )
  {
LABEL_2:
    v4 = 1;
  }
  else if( (unsigned __int16)KeNumberNodes <= 1u )
  {
    v4 = 0;
  }
  else
  {
    v4 = 0;
    while( 1 )
    {
      _BitScanReverse64(&v5, Mask);
      v6 = (*(&KiProcessorBlock
            + (unsigned int)KiProcessorNumberToIndexMappingTable[(unsigned int)(((_DWORD)Group << 6) + v5)]))->ParentNode->Affinity.Mask;
      if( (Mask & v6) != v6 )
        break;
      Mask &= ~v6;
      if( !Mask )
        goto LABEL_2;
    }
  }
  if( v4 == (((unsigned __int8)Thread->Tcb.gap0[2] >> 3) & 1) )
    _InterlockedXor((volatile signed __int32 *)Thread, 0x80000u);
}

Referenced by:

KeStartThread
KiComputeThreadAffinity
KiSetAffinityThread
KiSetSystemAffinityThread