PspRemoveProcessFromJobChain

VOID __fastcall PspRemoveProcessFromJobChain(_EPROCESS *Process, INT64 a2, CHAR a3, UINT64 a4){
  char v4; 
  unsigned int v5; 
  bool v6; 
  CHAR v7; 
  _ETHREAD *CurrentThread; 
  bool v10; 
  int v11; 
  _EJOB *v12; 
  _QWORD *v13; 
  char v14; 
  _EJOB *RootJob; 
  _EJOB *ImmediateJob; 
  _ETHREAD *v17; 
  _EPROCESS_VALUES Values; 

  v4 = 0;
  v5 = a4;
  v6 = (Process->Flags3 & 0x1000) == 0;
  v7 = a3;
  ImmediateJob = 0i64;
  RootJob = 0i64;
  if( v6 || (a3 & 1) != 0 )
  {
    memset(&Values, 0i64, sizeof(Values));
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v17 = CurrentThread;
    v10 = !_interlockedbittestandset((volatile signed __int32 *)&Process->1120, 0);
    v14 = 0;
    if( (v7 & 2) != 0 && (Process->Flags & 0x4000000) != 0 && (Process->Flags3 & 0x40) == 0 )
    {
      PsTerminateProcess((ULONG_PTR)Process, v5);
      v14 = 1;
    }
    v11 = 1;
    PspLockRootJobFromProcess(Process, CurrentThread, &ImmediateJob, &RootJob);
    if( (v7 & 4) != 0 && !_interlockedbittestandset((volatile signed __int32 *)&Process->1120, 1u) )
    {
      _InterlockedAnd((volatile signed __int32 *)&Process->1120, 0xFFFFFFDF);
      PsQueryStatisticsProcess(Process, &Values);
      v4 = 1;
    }
    v12 = ImmediateJob;
    if( ImmediateJob )
    {
      do
      {
        PspLockJobConditionally(v12, &RootJob);
        if( v10 )
        {
          --*((_DWORD *)v12 + 54);
          if( (Process->Flags3 & 0x20) != 0 )
            --*((_DWORD *)v12 + 307);
        }
        if( (v7 & 8) != 0 && v10 )
          ++*((_DWORD *)v12 + 55);
        if( a2
          && (!*(_QWORD *)a2 || *(_EJOB **)a2 == v12)
          && *((_QWORD *)v12 + 57)
          && ((1 << *(_QWORD *)(a2 + 8)) & *((_DWORD *)v12 + 219)) != 0 )
        {
          PspSendJobNotification(v12, *(_QWORD *)(a2 + 8), *(VOID **)(a2 + 16), 0);
        }
        if( v4 )
        {
          PspFoldProcessAccountingIntoJob(v12, Process, &Values);
          if( v12 == Process->Job && *((_DWORD *)v12 + 308) != PspEnforcementSequenceNumber )
            v11 = 0;
          if( v11 == 1 )
          {
            v13 = (_QWORD *)((char *)v12 + 1120);
            if( (char *)v12 + 1120 < (char *)v12 + 1224 )
            {
              while( !*v13 )
              {
                if( ++v13 >= (_QWORD *)v12 + 153 )
                  goto LABEL_11;
              }
              PspSubtractAccountingValues((_EPROCESS_VALUES *)((char *)v12 + 1120), &Values);
              v11 = 2;
            }
          }
        }
LABEL_11:
        PspUnlockJobConditionally(v12, &RootJob);
        v12 = (_EJOB *)*((_QWORD *)v12 + 134);
      }
      while( v12 );
      v12 = ImmediateJob;
      CurrentThread = v17;
      v7 = a3;
    }
    PspLockJobConditionally(v12, &RootJob);
    if( (v7 & 1) != 0 )
    {
      PspUnlinkJobProcess(v12, Process);
      PspUnlockJobConditionally(v12, &RootJob);
      PspUnlockJob(RootJob, CurrentThread);
    }
    else
    {
      if( v10 && (Process->Flags2 & 4) != 0 && !v14 )
        PspRequestProcessExecutionState((INT64)Process, 0i64, 0);
      PspUnlockJobConditionally(v12, &RootJob);
      PspUnlockJob(RootJob, CurrentThread);
      --CurrentThread->Tcb.KernelApcDisable;
      PspChangeProcessExecutionState(Process);
      KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
    }
  }
}

Referenced by:

PspAssignProcessToJob
PspEnforceLimitsJobPostCallback
PspRundownSingleProcess
PspTerminateProcessesJobCallback