KiComputeThreadAffinity

UINT64 __stdcall KiComputeThreadAffinity(_ETHREAD *Thread){
  unsigned int v1; 
  unsigned __int64 *v3; 
  INT64 v4; 
  unsigned __int64 v5; 
  INT64 TickLock; 
  __int64 v7; 
  __int64 v9; 
  __int64 v10; 
  _KNODE *v11; 
  _GROUP_AFFINITY GroupAffinity; 
  v1 = 0;
  GroupAffinity = 0i64;
  if( (*((_DWORD *)Thread + 29) & 8) != 0 )
  {
    TickLock = RtlBeginReadTickLock(&KiCpuSetSequence);
  }
  else
  {
    v3 = (unsigned __int64 *)((char *)Thread + 576);
    do
    {
      v4 = RtlBeginReadTickLock(&KiCpuSetSequence);
      v5 = *((_QWORD *)Thread + 69);
      TickLock = v4;
      if( ((v5 - 1) & v5) != 0 )
      {
        v7 = KiComputeCpuSetAffinity((__int64)Thread);
        if( (v7 & v5) != 0 )
          v5 &= v7;
      }
      if( *v3 != v5 )
      {
        v9 = *((unsigned int *)Thread + 49);
        *v3 = v5;
        if( !KiPrcbInGroupAffinity((__int64)*(&KiProcessorBlock + v9), (__int64)v3) )
        {
          *(_QWORD *)&GroupAffinity.Group = *((unsigned __int16 *)Thread + 292);
          GroupAffinity.Mask = v5;
          v11 = KeSelectNodeForAffinity(&GroupAffinity);
          v10 = (unsigned __int16)KeSelectIdealProcessor(v11, &GroupAffinity, 0i64);
        }
        *((_DWORD *)Thread + 147) = v10;
        KiUpdateSharedReadyQueueAffinityThread(*(&KiProcessorBlock + v10), (_KTHREAD *)Thread);
        KiUpdateNodeAffinitizedFlag((_KTHREAD *)Thread);
        v1 = 1;
      }
    }
    while( KiCpuSetSequence != TickLock );
  }
  *((_QWORD *)Thread + 71) = TickLock;
  return v1;
}

Referenced by:

KiDeferredReadySingleThread
KiQueueReadyThread
KiSetAffinityThread
KiSetSystemAffinityThread
KiUpdateGlobalCpuSetConfiguration
KiUpdateThreadCpuSets