PspSetProcessForegroundBackgroundRequest

VOID __fastcall PspSetProcessForegroundBackgroundRequest(INT64 a1, CHAR a2, CHAR a3){
  _ETHREAD *CurrentThread; 
  unsigned int v7; 
  BOOL v8; 
  volatile INT64 *v9; 
  int v10; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = a3 != 0 ? 0x20000 : 0x10000;
  v8 = 1;
  --*((_WORD *)CurrentThread + 242);
  v9 = (volatile INT64 *)(a1 + 1080);
  ExAcquirePushLockExclusiveEx(a1 + 1080, 0i64);
  if( a2 )
  {
    _InterlockedOr((volatile signed __int32 *)(a1 + 2172), v7);
  }
  else
  {
    v10 = *(_DWORD *)(a1 + 2172);
    _InterlockedAnd((volatile signed __int32 *)(a1 + 2172), ~v7);
    v8 = (v10 & (a3 != 0 ? 0x10000 : 0x20000)) != 0;
  }
  PspSetProcessPriorityByClass(a1, v8);
  if( (_InterlockedExchangeAdd64(v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v9);
  KeAbPostRelease((PVOID)v9);
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
}

Referenced by:

NtSetInformationProcess
PsSetProcessPriorityByClass