KiComputeCpuSetAffinity

UINT64 __stdcall KiComputeCpuSetAffinity(_ETHREAD *Thread){
  _EPROCESS *Process; 
  __int64 Group; 
  $991E1CBB7797929499350D8948279CF6 *v4; 
  $7D7CAE6D41B81FF54781561F08F4E01A *v5; 
  int v6; 
  __int64 AllowedCpuSets; 
  __int64 v8; 
  $2F5B20675905D9187E7A5970F6F306B8 *v9; 
  unsigned __int64 SelectedCpuSets; 
  UINT64 result; 
  __int64 v12; 
  __int64 v13; 
  int v14; 
  unsigned __int64 v15; 

  Process = Thread->Tcb.Process;
  Group = Thread->Tcb.Affinity.Group;
  v4 = &Process->2376;
  v5 = &Process->2384;
  if( (Process->Flags3 & 0x80u) != 0 )
  {
    v4 = ($991E1CBB7797929499350D8948279CF6 *)v4->AllowedCpuSets;
    v5 = ($7D7CAE6D41B81FF54781561F08F4E01A *)v5->DefaultCpuSets;
  }
  v6 = 1;
  AllowedCpuSets = KiSystemAllowedCpuSets[2 * Group] | KiSystemAllowedCpuSets[2 * Group
                                                                            + (((unsigned __int64)Thread->SameThreadPassiveFlags >> 11) & 1)];
  if( (Process->Flags2 & 0x8000000) != 0 && (v8 = v4[Group].AllowedCpuSets) != 0 )
  {
    AllowedCpuSets = v4[Group].AllowedCpuSets;
    v6 = 0;
  }
  else
  {
    v8 = AllowedCpuSets | v4[Group].AllowedCpuSets;
  }
  if( !v8 )
    return 0i64;
  v9 = &Thread->1536;
  if( (Thread->CrossThreadFlags & 0x20000) != 0 )
    v9 = ($2F5B20675905D9187E7A5970F6F306B8 *)v9->SelectedCpuSets;
  SelectedCpuSets = v9[Group].SelectedCpuSets;
  if( !SelectedCpuSets )
  {
    SelectedCpuSets = v5[Group].DefaultCpuSets;
    if( !SelectedCpuSets )
    {
      if( !KiRestrictedSystemCpuSetsActive && v6 )
        return 0i64;
      SelectedCpuSets = AllowedCpuSets;
    }
  }
  v12 = v8 & SelectedCpuSets;
  if( v12 )
    v8 = v12;
  v13 = v8 & KiNonParkedCpuSets[Group];
  if( !v13 )
    v13 = v8;
  result = 0i64;
  v14 = (_DWORD)Group << 6;
  do
  {
    _BitScanForward64(&v15, v13);
    result |= *((_QWORD *)KiCpuSetAffinities + (unsigned int)(v14 + v15));
    v13 &= ~(1i64 << v15);
  }
  while( v13 );
  return result;
}

Referenced by:

KiComputeThreadAffinity