PspChangeJobMemoryUsageByProcess

UINT8 __stdcall PspChangeJobMemoryUsageByProcess(UINT64 Flags, INT64 Amount, _EPROCESS *Process, _EJOB *TerminatingJob){
  char v5; 
  UINT8 v6; 
  _ETHREAD *CurrentThread; 
  _EJOB *v8; 
  _EJOB *CommitChargeJob; 
  _EJOB *v10; 
  unsigned __int64 CommitCharge; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  int v14; 
  int v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  unsigned __int64 v20; 
  int v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  _EJOB *v25; 
  _EJOB *v26; 
  _EJOB *i; 
  int v28; 
  _EJOB *v29; 
  _EJOB *RootJob; 
  _EJOB *RootJoba; 
  unsigned __int64 v32; 
  char v33; 
  _EPROCESS *v34; 
  _EJOB *v35; 

  v35 = TerminatingJob;
  v34 = Process;
  v33 = Flags;
  v5 = Flags;
  if( (Flags & 2) == 0 || !Process->Job )
    return 1;
  v6 = 1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v28 = 0;
  v29 = 0i64;
  RootJob = (_EJOB *)*((_QWORD *)Process->CommitChargeJob + 135);
  if( CurrentThread )
    --CurrentThread->Tcb.SpecialApcDisable;
  if( RootJob )
  {
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)RootJob + 129, 0i64);
    TerminatingJob = v35;
    Process = v34;
  }
  v8 = RootJob;
  if( (v5 & 4) != 0 )
  {
    CommitChargeJob = TerminatingJob;
    TerminatingJob = 0i64;
    v35 = 0i64;
  }
  else
  {
    CommitChargeJob = Process->CommitChargeJob;
  }
  RootJoba = CommitChargeJob;
  v10 = CommitChargeJob;
  if( CommitChargeJob != TerminatingJob )
  {
    while( 1 )
    {
      CommitCharge = 0i64;
      if( v10 != v8 )
        ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v10 + 129, 0i64);
      v12 = *((_QWORD *)v10 + 122);
      v13 = v12 + Amount;
      if( Amount <= 0 )
      {
        if( v13 > v12 )
        {
          PspUnlockJobMemoryLimitsExclusive(v10, v8, 0i64);
          v26 = v10;
          if( !v6 )
            v26 = v29;
          v6 = 0;
          v29 = v26;
          goto LABEL_28;
        }
      }
      else if( v13 < v12 )
      {
        PspUnlockJobMemoryLimitsExclusive(v10, v8, 0i64);
        v25 = v10;
        if( !v6 )
          v25 = v29;
        v6 = 0;
        v29 = v25;
        goto LABEL_28;
      }
      v14 = 0;
      v15 = *((_DWORD *)v10 + 64);
      v16 = v13 + *((_QWORD *)v10 + 167);
      v32 = v16;
      if( (v15 & 0x200000) != 0 && v16 > *((_QWORD *)v10 + 74) && Amount > 0 )
        v14 = 1;
      if( (v15 & 0x200) != 0 && v13 > *((_QWORD *)v10 + 73) && Amount > 0 || v14 )
        break;
      if( v6 )
      {
        *((_QWORD *)v10 + 122) = v13;
LABEL_19:
        if( v6 )
        {
          v17 = *((_QWORD *)v10 + 123);
          if( v17 )
          {
            v20 = *(_QWORD *)(v17 + 40);
            if( (*(_DWORD *)v17 & 0x200000) == 0 )
              v16 = v13;
            v21 = 0;
            if( v20 && Amount > 0 && v16 > v20 )
              v21 = 512;
            v22 = *(_QWORD *)(v17 + 32);
            if( v22 && Amount <= 0 && v16 < v22 )
              v21 |= 0x8000u;
            v28 |= v21;
          }
        }
      }
      if( Amount > 0 )
      {
        if( v13 > *((_QWORD *)v10 + 76) )
          *((_QWORD *)v10 + 76) = v13;
        CommitCharge = v34->CommitCharge;
      }
      if( v10 != v8 )
      {
        if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v10 + 129, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((_EX_PUSH_LOCK *)v10 + 129);
        KeAbPostRelease((char *)v10 + 1032);
      }
      if( CommitCharge && CommitCharge > *((_QWORD *)v10 + 75) )
      {
        _m_prefetchw((char *)v10 + 600);
        v23 = *((_QWORD *)v10 + 75);
        do
        {
          v24 = v23;
          v23 = _InterlockedCompareExchange64((volatile signed __int64 *)v10 + 75, CommitCharge, v23);
        }
        while( v23 != v24 && CommitCharge > v23 );
      }
LABEL_28:
      v10 = (_EJOB *)*((_QWORD *)v10 + 134);
      if( v10 == v35 )
      {
        if( v6 )
        {
          if( v28 )
            PspScheduleEnforcementWorker(v8);
        }
        else
        {
          for( i = RootJoba; i != v29; i = (_EJOB *)*((_QWORD *)i + 134) )
          {
            if( i != v8 )
              ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)i + 129, 0i64);
            *((_QWORD *)i + 122) -= Amount;
            PspUnlockJobMemoryLimitsExclusive(i, v8, 0i64);
          }
        }
        goto LABEL_32;
      }
    }
    if( (v33 & 1) != 0 )
    {
      *((_QWORD *)v10 + 122) = v13;
    }
    else if( v6 )
    {
      v29 = v10;
      v6 = 0;
    }
    if( *((_QWORD *)v10 + 57) && (*((_DWORD *)v10 + 219) & 0x200) != 0 && (v34->Flags2 & 0x24) == 4 )
    {
      _InterlockedOr((volatile signed __int32 *)&v34->1120, 0x20u);
      PspSendJobNotification(v10, 0xAui64, v34->UniqueProcessId, 1u);
      v16 = v32;
    }
    goto LABEL_19;
  }
LABEL_32:
  if( v8 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v8 + 129, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)v8 + 129);
    KeAbPostRelease((char *)v8 + 1032);
  }
  if( CurrentThread )
  {
    if( CurrentThread->Tcb.SpecialApcDisable++ == -1
      && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
    {
      KiCheckForKernelApcDelivery();
    }
  }
  return v6;
}

Referenced by:

MiChargeFullProcessCommitment
MiReturnFullProcessCharges
MmAssignProcessToJob
MmDeleteProcessAddressSpace