PspSetProcessForegroundBackgroundRequest

VOID __fastcall PspSetProcessForegroundBackgroundRequest(_EPROCESS *Process, CHAR a2, CHAR a3){
  _ETHREAD *CurrentThread; 
  unsigned int v7; 
  _BOOL4 v8; 
  _EX_PUSH_LOCK *p_ProcessLock; 
  unsigned int Flags3; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = a3 != 0 ? 0x20000 : 0x10000;
  v8 = 1;
  --CurrentThread->Tcb.KernelApcDisable;
  p_ProcessLock = &Process->ProcessLock;
  ExAcquirePushLockExclusiveEx(&Process->ProcessLock, 0i64);
  if( a2 )
  {
    _InterlockedOr((volatile signed __int32 *)&Process->2172, v7);
  }
  else
  {
    Flags3 = Process->Flags3;
    _InterlockedAnd((volatile signed __int32 *)&Process->2172, ~v7);
    v8 = (Flags3 & (a3 != 0 ? 0x10000 : 0x20000)) != 0;
  }
  PspSetProcessPriorityByClass(&Process->Pcb, (PSPROCESSPRIORITYMODE)v8);
  if( (_InterlockedExchangeAdd64(&p_ProcessLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(p_ProcessLock);
  KeAbPostRelease(p_ProcessLock);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}

Referenced by:

NtSetInformationProcess
PsSetProcessPriorityByClass