KiComputeThreadAffinity

UINT64 __stdcall KiComputeThreadAffinity(_ETHREAD *Thread){
  unsigned int v1; 
  $041662087374B0E8167C762F8350D020 *v3; 
  __int64 v4; 
  unsigned __int64 Mask; 
  __int64 TickLock; 
  UINT64 v7; 
  __int64 UserIdealProcessor; 
  __int64 v10; 
  _KNODE *v11; 
  _GROUP_AFFINITY GroupAffinity; 

  v1 = 0;
  GroupAffinity = 0i64;
  if( (Thread->Tcb._bf_0 & 8) != 0 )
  {
    TickLock = RtlBeginReadTickLock(&KiCpuSetSequence);
  }
  else
  {
    v3 = &Thread->Tcb.576;
    do
    {
      v4 = RtlBeginReadTickLock(&KiCpuSetSequence);
      Mask = Thread->Tcb.UserAffinity.Mask;
      TickLock = v4;
      if( ((Mask - 1) & Mask) != 0 )
      {
        v7 = KiComputeCpuSetAffinity(&Thread->Tcb);
        if( (v7 & Mask) != 0 )
          Mask &= v7;
      }
      if( v3->Affinity.Mask != Mask )
      {
        UserIdealProcessor = Thread->Tcb.UserIdealProcessor;
        v3->Affinity.Mask = Mask;
        if( !(unsigned int)KiPrcbInGroupAffinity(*(&KiProcessorBlock + UserIdealProcessor), &v3->Affinity) )
        {
          *(_QWORD *)&GroupAffinity.Group = Thread->Tcb.Affinity.Group;
          GroupAffinity.Mask = Mask;
          v11 = KeSelectNodeForAffinity(&GroupAffinity);
          v10 = (unsigned __int16)KeSelectIdealProcessor(v11, &GroupAffinity, 0i64);
        }
        Thread->Tcb.IdealProcessor = v10;
        KiUpdateSharedReadyQueueAffinityThread(*(&KiProcessorBlock + v10), &Thread->Tcb);
        KiUpdateNodeAffinitizedFlag(&Thread->Tcb);
        v1 = 1;
      }
    }
    while( KiCpuSetSequence != TickLock );
  }
  Thread->Tcb.AffinityVersion = TickLock;
  return v1;
}

Referenced by:

KiDeferredReadySingleThread
KiQueueReadyThread
KiSetAffinityThread
KiSetSystemAffinityThread
KiUpdateGlobalCpuSetConfiguration
KiUpdateThreadCpuSets