PspSetProcessAffinitySafe

__int64 __fastcall PspSetProcessAffinitySafe(__int64 a1, char a2, unsigned __int16 *a3, __int64 *a4, int *a5){
  __int64 v9; 
  int v10; 
  int v11; 
  __int64 v12; 
  char v13; 
  __int64 v14; 
  int v15; 
  int result; 
  _BYTE result_4[172]; 
  memset((INT64)&result, 0i64);
  v10 = 0;
  v11 = 1;
  if( a4 )
  {
    result = 1310721;
    memset((INT64)result_4, 0i64);
    v12 = *((unsigned __int16 *)a4 + 4);
    v9 = *a4;
    if( (unsigned __int16)result <= (unsigned __int16)v12 )
      LOWORD(result) = v12 + 1;
    *(_QWORD *)&result_4[8 * v12 + 4] |= v9;
    a3 = (unsigned __int16 *)&result;
    v13 = 1;
  }
  else
  {
    v13 = 0;
    if( (a2 & 2) != 0 )
      v13 = 2;
  }
  if( (a2 & 1) != 0 || (*(_DWORD *)(a1 + 2172) & 0x1000) != 0 )
  {
    v14 = 0i64;
  }
  else
  {
    v14 = *(_QWORD *)(a1 + 1296);
    if( v14 )
    {
      LOBYTE(v9) = 1;
      ExAcquireResourceSharedLite((PERESOURCE)(v14 + 56), v9);
      v15 = *(_DWORD *)(v14 + 848);
      if( (v15 & 0x10) != 0
        && ((v15 & 0x4000) == 0 || !(unsigned int)KeIsSubsetAffinityEx(
                                                    (_KAFFINITY_EX *)a3,
                                                    (_KAFFINITY_EX *)(v14 + 616))) )
      {
        v11 = 0;
        goto LABEL_16;
      }
    }
  }
  v10 = KeSetAffinityProcess(a1, v13, a3);
LABEL_16:
  if( v14 )
    ExReleaseResourceLite((PERESOURCE)(v14 + 56));
  if( v10 >= 0 )
    *a5 = v11;
  return(unsigned int)v10;
}

Referenced by:

NtSetInformationProcess
PspAllocateProcess
PspApplyJobLimitsToProcess
PspUpdateSingleProcessAffinity