PspNotifyProcessBackgroundTransition

VOID __stdcall PspNotifyProcessBackgroundTransition(_EPROCESS *Process, UINT64 EnteredBackground){
  int v2; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *p_ThreadListLock; 
  unsigned __int8 CurrentIrql; 
  _LIST_ENTRY *p_ThreadListHead; 
  _LIST_ENTRY *i; 
  int v9; 
  int v10; 

  v2 = EnteredBackground;
  if( (_DWORD)EnteredBackground )
    _interlockedbittestandset((volatile signed __int32 *)&Process->1124, 0x14u);
  else
    _interlockedbittestandreset((volatile signed __int32 *)&Process->1124, 0x14u);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  p_ThreadListLock = &Process->ThreadListLock;
  ExAcquirePushLockSharedEx(&Process->ThreadListLock, 0i64);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  p_ThreadListHead = &Process->ThreadListHead;
  for( i = Process->ThreadListHead.Flink; i != p_ThreadListHead; i = i->Flink )
  {
    if( (SLOBYTE(i[-29].Flink) | SBYTE6(i[-25].Blink)) != 63 )
    {
      v9 = (LODWORD(i[2].Blink) >> 9) & 7;
      if( v2 )
      {
        v10 = (LODWORD(i[2].Blink) >> 9) & 7;
        v9 = 0;
      }
      else
      {
        v10 = 0;
      }
      if( v10 != v9 )
        KeAbProcessBaseIoPriorityChange((_KTHREAD *)&i[-79].Blink, (_IO_PRIORITY_HINT)v10, (_IO_PRIORITY_HINT)v9);
    }
  }
  __writecr8(CurrentIrql);
  if( _InterlockedCompareExchange64(&p_ThreadListLock->_bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(p_ThreadListLock);
  KeAbPostRelease(p_ThreadListLock);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}

Referenced by:

PspApplyJobChainLimitsToProcess
PspSetProcessBackgroundCountCallback