PspSetProcessAffinitySafe

NTSTATUS __stdcall PspSetProcessAffinitySafe(
        _EPROCESS *Process,
        UINT64 AffinityFlags,
        _KAFFINITY_EX *Affinity,
        _GROUP_AFFINITY *LegacyAffinity,
        UINT64 *AffinitySet){
  char v6; 
  int v9; 
  int v10; 
  __int64 Group; 
  unsigned __int64 Mask; 
  unsigned int v13; 
  _EJOB *volatile Job; 
  int v15; 
  int v16; 
  _KAFFINITY_EX Affinity1; 

  v6 = AffinityFlags;
  memset(&Affinity1, 0i64, sizeof(Affinity1));
  v9 = 0;
  v10 = 1;
  if( LegacyAffinity )
  {
    *(_DWORD *)&Affinity1.Count = 1310721;
    memset(&Affinity1.Reserved, 0i64, 0xA4u);
    Group = LegacyAffinity->Group;
    Mask = LegacyAffinity->Mask;
    if( (_WORD)Group )
      Affinity1.Count = Group + 1;
    Affinity1.Bitmap[Group] |= Mask;
    Affinity = &Affinity1;
    v13 = 1;
  }
  else
  {
    v13 = 0;
    if( (v6 & 2) != 0 )
      v13 = 2;
  }
  if( (v6 & 1) != 0 || (Process->Flags3 & 0x1000) != 0 )
  {
    Job = 0i64;
  }
  else
  {
    Job = Process->Job;
    if( Job )
    {
      ExAcquireResourceSharedLite((UINT64)Job + 56, 1);
      v15 = *((_DWORD *)Job + 212);
      if( (v15 & 0x10) != 0 )
      {
        if( (v15 & 0x4000) == 0 || (KeIsSubsetAffinityEx(Affinity, (_KAFFINITY_EX *)((char *)Job + 616)), !v16) )
        {
          v10 = 0;
          goto LABEL_16;
        }
      }
    }
  }
  v9 = KeSetAffinityProcess(&Process->Pcb, v13, Affinity);
LABEL_16:
  if( Job )
    ExReleaseResourceLite((PERESOURCE)((char *)Job + 56));
  if( v9 >= 0 )
    *(_DWORD *)AffinitySet = v10;
  return v9;
}

Referenced by:

NtSetInformationProcess
PspAllocateProcess
PspApplyJobLimitsToProcess
PspUpdateSingleProcessAffinity