PspEnforceLimitsJobPostCallback

NTSTATUS __fastcall PspEnforceLimitsJobPostCallback(_EJOB *Job, INT64 a2){
  _ETHREAD *v2; 
  int v4; 
  __int64 v6; 
  __int64 v7; 
  __int128 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int128 v12; 
  __int128 v13; 
  __int128 v14; 
  _EJOB *v15; 
  int v16; 
  int v17; 
  int v18; 
  int v19; 
  int v20; 
  int v21; 
  __int64 v22; 
  UINT64 v23; 
  bool v24; 
  _EJOB *v25; 
  _ETHREAD *v26; 
  _EJOB *v27; 
  __int128 v29; 
  __int128 v30; 
  __int128 v31; 
  __int64 v32; 
  _QWORD *v33; 
  int v34; 
  __int64 v35; 
  int v36; 
  int v37; 
  __int64 v38; 
  int v39; 
  int v40; 
  __int64 v41; 
  int v42; 
  int v43; 
  int v44; 
  int v45; 
  int v46; 
  int v47; 
  _EPROCESS *v48; 
  _ETHREAD *v49; 
  int v50; 
  _ETHREAD *CurrentThread; 
  int v52; 
  unsigned __int64 v53; 
  UINT64 SystemNoWakeCharge; 
  UINT64 NoWakeCharge; 
  __int64 v56; 
  INT64 a2a[3]; 
  __int128 v58; 
  __int128 v59; 
  __int128 v60; 
  __int128 v61; 
  __int128 v62; 
  __int128 v63; 
  __int64 v64; 
  __int128 v65[4]; 

  v2 = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0;
  CurrentThread = v2;
  NoWakeCharge = 0i64;
  SystemNoWakeCharge = 0i64;
  PspLockJobShared(Job, v2);
  v6 = *((_QWORD *)Job + 123);
  if( v6 )
  {
    v29 = *(_OWORD *)(v6 + 24);
    v65[0] = *(_OWORD *)(v6 + 8);
    v30 = *(_OWORD *)(v6 + 40);
    v65[1] = v29;
    v31 = *(_OWORD *)(v6 + 56);
    v65[2] = v30;
    v65[3] = v31;
  }
  else
  {
    memset(v65, 0i64, sizeof(v65));
  }
  v7 = *((_QWORD *)Job + 23);
  v8 = *((_OWORD *)Job + 71);
  v9 = *((_QWORD *)Job + 64);
  v10 = *((_QWORD *)Job + 65);
  v11 = *((_QWORD *)Job + 20);
  v58 = *((_OWORD *)Job + 70);
  v12 = *((_OWORD *)Job + 72);
  v56 = v7;
  LODWORD(v7) = *((_DWORD *)Job + 113);
  v59 = v8;
  v13 = *((_OWORD *)Job + 73);
  v52 = v7;
  LODWORD(v7) = *((_DWORD *)Job + 64);
  v60 = v12;
  v61 = v13;
  v14 = *((_OWORD *)Job + 75);
  v62 = *((_OWORD *)Job + 74);
  v64 = *((_QWORD *)Job + 152);
  v63 = v14;
  if( (v7 & 4) != 0 )
    v53 = *((_QWORD *)Job + 29);
  else
    v53 = 0i64;
  PspGetEffectiveNoWakeCharge(Job, &NoWakeCharge, &SystemNoWakeCharge);
  PspUnlockJob(v15, v2);
  v50 = 0;
  if( *(_QWORD *)&v65[0] )
  {
    if( (unsigned __int64)(v9 + v62) > *(_QWORD *)&v65[0] )
      v4 = 0x10000;
    v50 = v4;
  }
  if( *((_QWORD *)&v65[0] + 1) && (unsigned __int64)(v10 + *((_QWORD *)&v62 + 1)) > *((_QWORD *)&v65[0] + 1) )
  {
    v4 |= 0x20000u;
    v50 = v4;
  }
  if( *(_QWORD *)&v65[1] && (unsigned __int64)(v11 + *((_QWORD *)&v58 + 1)) > *(_QWORD *)&v65[1] )
  {
    v4 |= 4u;
    v50 = v4;
  }
  if( *(__int128 *)((char *)&v65[1] + 8) != 0 )
  {
    PspLockJobMemoryLimitsShared(Job, v2);
    v50 = PspGetJobMemoryUsageNotificationViolations(
            Job,
            *((_QWORD *)Job + 122),
            *((_QWORD *)Job + 122) + *((_QWORD *)Job + 167),
            0x8200ui64) | v4;
    PspUnlockJobMemoryLimitsShared(Job, v2);
  }
  v16 = DWORD2(v65[2]);
  v17 = DWORD1(v65[3]);
  if( DWORD2(v65[2]) && *(_DWORD *)(a2 + 32) == DWORD1(v65[3]) && *(_DWORD *)(a2 + 44) >= DWORD2(v65[2]) )
  {
    v18 = PspRateControlLimitFlag(PspJobMinRateControl) | v50;
    v50 = v18;
  }
  else
  {
    v18 = v50;
  }
  v19 = HIDWORD(v65[2]);
  if( HIDWORD(v65[2]) && *(_DWORD *)(a2 + 36) == DWORD2(v65[3]) && *(_DWORD *)(a2 + 48) >= HIDWORD(v65[2]) )
  {
    v43 = PspRateControlLimitFlag(PspJobIoRateControl);
    v18 = v43 | v44;
    v50 = v18;
  }
  v20 = v65[3];
  v21 = HIDWORD(v65[3]);
  if( LODWORD(v65[3]) && *(_DWORD *)(a2 + 40) == HIDWORD(v65[3]) && *(_DWORD *)(a2 + 52) >= LODWORD(v65[3]) )
  {
    v45 = PspRateControlLimitFlag(PspJobCpuRateControl);
    v18 = v45 | v46;
    v50 = v18;
  }
  if( v18 )
  {
    PspLockJobExclusive(Job, CurrentThread);
    v32 = *((_QWORD *)Job + 123);
    if( v32 )
    {
      *(_DWORD *)(v32 + 4) |= v50;
      v33 = (_QWORD *)*((_QWORD *)Job + 123);
      if( (v50 & 0x10000) != 0 )
        v33[9] = *(_QWORD *)&v65[0];
      if( (v50 & 0x20000) != 0 )
        v33[10] = *((_QWORD *)&v65[0] + 1);
      if( (v50 & 4) != 0 )
        v33[11] = *(_QWORD *)&v65[1];
      if( (v50 & 0x200) != 0 )
        v33[13] = *(_QWORD *)&v65[2];
      if( (v50 & 0x8000) != 0 )
        v33[12] = *((_QWORD *)&v65[1] + 1);
      v34 = PspRateControlLimitFlag(PspJobMinRateControl);
      if( (v34 & v36) != 0 )
      {
        *(_DWORD *)(v35 + 112) = v16;
        *(_DWORD *)(v35 + 124) = v17;
      }
      v37 = PspRateControlLimitFlag(PspJobIoRateControl);
      if( (v37 & v39) != 0 )
      {
        v47 = DWORD2(v65[3]);
        *(_DWORD *)(v38 + 116) = v19;
        *(_DWORD *)(v38 + 128) = v47;
      }
      v40 = PspRateControlLimitFlag(PspJobCpuRateControl);
      if( (v40 & v42) != 0 )
      {
        *(_DWORD *)(v41 + 120) = v20;
        *(_DWORD *)(v41 + 132) = v21;
      }
    }
    if( *((_QWORD *)Job + 57) && (*((_DWORD *)Job + 219) & 0x800) != 0 && (*((_DWORD *)Job + 330) & 4) == 0 )
      PspSendReliableJobNotification(Job, 0xBui64);
    PspUnlockJob(Job, CurrentThread);
  }
  v22 = *(_QWORD *)(a2 + 16);
  if( v22 )
  {
    if( (*(_DWORD *)(v22 + 1120) & 1) == 0 )
    {
      _InterlockedAnd((volatile signed __int32 *)(v22 + 1120), 0xFFFFFFDF);
      v48 = *(_EPROCESS **)(a2 + 16);
      a2a[0] = *(_QWORD *)(a2 + 8);
      a2a[1] = 2i64;
      a2a[2] = (INT64)v48->UniqueProcessId;
      PspRemoveProcessFromJobChain(v48, (INT64)a2a, 14, 0xC0000044ui64);
      v22 = *(_QWORD *)(a2 + 16);
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)v22);
  }
  if( v53 && *((_QWORD *)&v58 + 1) + v56 > v53 )
  {
    if( v52 )
    {
      if( v52 != 1 )
        goto LABEL_17;
      v49 = CurrentThread;
      PspLockJobShared(Job, CurrentThread);
      if( !*((_QWORD *)Job + 57) || (*((_DWORD *)Job + 219) & 2) == 0 )
      {
        PspUnlockJob(Job, CurrentThread);
        PspTerminateAllProcessesInJobHierarchy(Job, 3221225540i64, 1u);
        goto LABEL_17;
      }
      if( PspSendJobNotification(Job, 1ui64, 0i64, 0) >= 0 )
      {
        *((_DWORD *)Job + 64) &= ~4u;
        *((_QWORD *)Job + 29) = 0i64;
      }
    }
    else
    {
      if( !PspTerminateAllProcessesInJobHierarchy(Job, 3221225540i64, 1u) )
        goto LABEL_17;
      v49 = CurrentThread;
      PspLockJobExclusive(Job, CurrentThread);
      if( !*((_DWORD *)Job + 54) && *((_QWORD *)Job + 57) && (*((_DWORD *)Job + 219) & 2) != 0 )
        PspSendJobNotification(Job, 1ui64, 0i64, 0);
    }
    PspUnlockJob(Job, v49);
  }
LABEL_17:
  v23 = *(_QWORD *)(a2 + 24) + SystemNoWakeCharge;
  v24 = *(_BYTE *)(a2 + 56) == 0;
  *(_QWORD *)(a2 + 24) = v23;
  if( v24 )
  {
    if( v23 >= (unsigned int)PspSystemNoWakeChargeLimit )
    {
      PspSendNoWakeChargeLimitNotification(0i64);
      *(_BYTE *)(a2 + 56) = 1;
    }
    else if( NoWakeCharge >= (unsigned int)PspJobNoWakeChargeLimit )
    {
      PspSendNoWakeChargeLimitNotification(Job);
    }
  }
  v25 = (_EJOB *)*((_QWORD *)Job + 134);
  if( v25 )
  {
    PspLockJobExclusive(v25, CurrentThread);
    PspLockJobExclusive(Job, CurrentThread);
    PspAddAccountingValues(
      (_EPROCESS_VALUES *)(*((_QWORD *)Job + 134) + 1120i64),
      (_EPROCESS_VALUES *)((char *)Job + 1120));
    memset((char *)Job + 1120, 0i64, 0x68u);
    PspUnlockJob(Job, CurrentThread);
    v27 = (_EJOB *)*((_QWORD *)Job + 134);
    v26 = CurrentThread;
  }
  else
  {
    PspLockJobExclusive(Job, CurrentThread);
    memset((char *)Job + 1120, 0i64, 0x68u);
    v26 = CurrentThread;
    v27 = Job;
  }
  PspUnlockJob(v27, v26);
  return 0;
}

Referenced by:

No references.