PspNotifyProcessBackgroundTransition

_QWORD *__fastcall PspNotifyProcessBackgroundTransition(__int64 a1, int a2){
  _ETHREAD *CurrentThread; 
  INT64 *v5; 
  unsigned __int8 CurrentIrql; 
  __int64 v7; 
  __int64 *i; 
  int v9; 
  int v10; 
  if( a2 )
    _interlockedbittestandset((volatile signed __int32 *)(a1 + 1124), 0x14u);
  else
    _interlockedbittestandreset((volatile signed __int32 *)(a1 + 1124), 0x14u);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v5 = (INT64 *)(a1 + 2144);
  ExAcquirePushLockSharedEx(a1 + 2144, 0i64);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v7 = a1 + 1504;
  for( i = *(__int64 **)(a1 + 1504); i != (__int64 *)v7; i = (__int64 *)*i )
  {
    if( (*((char *)i - 464) | *((char *)i - 386)) != 63 )
    {
      v9 = (*((_DWORD *)i + 10) >> 9) & 7;
      if( a2 )
      {
        v10 = (*((_DWORD *)i + 10) >> 9) & 7;
        v9 = 0;
      }
      else
      {
        v10 = 0;
      }
      if( v10 != v9 )
        KeAbProcessBaseIoPriorityChange((__int64)(i - 157), v10, v9);
    }
  }
  __writecr8(CurrentIrql);
  if( _InterlockedCompareExchange64(v5, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(v5);
  KeAbPostRelease(v5);
  return KeLeaveCriticalRegionThread((__int64)CurrentThread);
}

Referenced by:

PspApplyJobChainLimitsToProcess
PspSetProcessBackgroundCountCallback