PspSetProcessAffinityUpdateMode

INT64 __fastcall PspSetProcessAffinityUpdateMode(INT64 a1, INT64 *a2){
  __int64 v3; 
  int v4; 
  int v5; 
  int v6; 
  signed __int32 v7; 
  signed __int32 v8; 
  bool v9; 
  v3 = *((_QWORD *)KeGetCurrentThread() + 23);
  v4 = *(_DWORD *)a2;
  v5 = (*(_DWORD *)a2 & 2) << 17;
  v6 = v5 | 0x80000;
  if( (v4 & 1) == 0 )
    v6 = v5;
  _m_prefetchw((const void *)(v3 + 1120));
  v7 = *(_DWORD *)(v3 + 1120);
  v8 = v7;
  do
  {
    if( (v8 & 0xC0000) == v6 )
      break;
    if( (v7 & 0x40000) != 0 )
      return 3221225473i64;
    v8 = _InterlockedCompareExchange((volatile signed __int32 *)(v3 + 1120), v6 | v7 & 0xFFF3FFFF, v7);
    v9 = v7 == v8;
    v7 = v8;
  }
  while( !v9 );
  if( v6 == 0x40000 )
  {
    PspLockUnlockProcessExclusive(v3, a1);
  }
  else if( (v6 & 0x80000) != 0 && KeDynamicPartitioningSupported )
  {
    --*(_WORD *)(a1 + 484);
    ExAcquirePushLockSharedEx((UINT64)&PspAffinityUpdateLock, 0i64);
    if( !(unsigned int)KeIsEmptyAffinityEx(&PspLastUpdateAffinityMask) )
      PspUpdateSingleProcessAffinity(a1, v3, &PspLastUpdateAffinityMask.Count);
    if( _InterlockedCompareExchange64((volatile signed __int64 *)&PspAffinityUpdateLock, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)&PspAffinityUpdateLock);
    KeAbPostRelease(&PspAffinityUpdateLock);
    KeLeaveCriticalRegionThread(a1);
  }
  return 0i64;
}

Referenced by:

NtSetInformationProcess