PspSetProcessAffinityUpdateMode

NTSTATUS __stdcall PspSetProcessAffinityUpdateMode(_ETHREAD *CurrentThread, PROCESS_AFFINITY_UPDATE_MODE *AffinityMode){
  _EPROCESS *Process; 
  PROCESS_AFFINITY_UPDATE_MODE v4; 
  int v5; 
  int v6; 
  signed __int32 bf_0; 
  signed __int32 v8; 
  bool v9; 

  Process = KeGetCurrentThread()->ApcState.Process;
  v4 = *AffinityMode;
  v5 = (*AffinityMode & 2) << 17;
  v6 = v5 | 0x80000;
  if( (v4 & 1) == 0 )
    v6 = v5;
  _m_prefetchw(&Process->1120);
  bf_0 = Process->$4E3DFAFA17165B33969DFF4E60E4EB31::_bf_0;
  v8 = bf_0;
  do
  {
    if( (v8 & 0xC0000) == v6 )
      break;
    if( (bf_0 & 0x40000) != 0 )
      return -1073741823;
    v8 = _InterlockedCompareExchange((volatile signed __int32 *)&Process->1120, v6 | bf_0 & 0xFFF3FFFF, bf_0);
    v9 = bf_0 == v8;
    bf_0 = v8;
  }
  while( !v9 );
  if( v6 == 0x40000 )
  {
    PspLockUnlockProcessExclusive(Process, CurrentThread);
  }
  else if( (v6 & 0x80000) != 0 && KeDynamicPartitioningSupported )
  {
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockSharedEx(&PspAffinityUpdateLock, 0i64);
    if( !KeIsEmptyAffinityEx(&PspLastUpdateAffinityMask.Count) )
      PspUpdateSingleProcessAffinity(CurrentThread, Process, &PspLastUpdateAffinityMask);
    if( _InterlockedCompareExchange64(&PspAffinityUpdateLock._bf_0, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(&PspAffinityUpdateLock);
    KeAbPostRelease(&PspAffinityUpdateLock);
    KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  }
  return 0;
}

Referenced by:

NtSetInformationProcess