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.