PspEnforceLimitsJobPostCallback
INT64 __fastcall PspEnforceLimitsJobPostCallback(INT64 a1, INT64 a2){
_ETHREAD *CurrentThread;
int v4;
__int64 v6;
__int64 v7;
__int128 v8;
__int64 v9;
__int64 v10;
__int64 v11;
__int128 v12;
__int128 v13;
__int128 v14;
__int64 v15;
__int32 v16;
int v17;
int v18;
__int32 v19;
int v20;
int v21;
__int64 v22;
UINT64 v23;
bool v24;
__int64 v25;
__int64 v26;
__int64 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;
ULONG_PTR v48;
__int64 v49;
int v50;
__int64 v51;
int v52;
unsigned __int64 v53;
UINT64 SystemNoWakeCharge;
UINT64 NoWakeCharge;
__int64 v56;
__int64 v57[3];
__int128 v58;
__int128 v59;
__int128 v60;
__int128 v61;
__int128 v62;
__int128 v63;
__int64 v64;
INT64 result[2];
__m256i v66;
__int128 v67;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0;
v51 = (__int64)CurrentThread;
NoWakeCharge = 0i64;
SystemNoWakeCharge = 0i64;
PspLockJobShared(a1, (__int64)CurrentThread);
v6 = *(_QWORD *)(a1 + 984);
if( v6 )
{
v29 = *(_OWORD *)(v6 + 24);
*(_OWORD *)result = *(_OWORD *)(v6 + 8);
v30 = *(_OWORD *)(v6 + 40);
*(_OWORD *)v66.m256i_i8 = v29;
v31 = *(_OWORD *)(v6 + 56);
*(_OWORD *)&v66.m256i_u64[2] = v30;
v67 = v31;
}
else
{
memset((INT64)result, 0i64);
}
v7 = *(_QWORD *)(a1 + 184);
v8 = *(_OWORD *)(a1 + 1136);
v9 = *(_QWORD *)(a1 + 512);
v10 = *(_QWORD *)(a1 + 520);
v11 = *(_QWORD *)(a1 + 160);
v58 = *(_OWORD *)(a1 + 1120);
v12 = *(_OWORD *)(a1 + 1152);
v56 = v7;
LODWORD(v7) = *(_DWORD *)(a1 + 452);
v59 = v8;
v13 = *(_OWORD *)(a1 + 1168);
v52 = v7;
LODWORD(v7) = *(_DWORD *)(a1 + 256);
v60 = v12;
v61 = v13;
v14 = *(_OWORD *)(a1 + 1200);
v62 = *(_OWORD *)(a1 + 1184);
v64 = *(_QWORD *)(a1 + 1216);
v63 = v14;
if( (v7 & 4) != 0 )
v53 = *(_QWORD *)(a1 + 232);
else
v53 = 0i64;
PspGetEffectiveNoWakeCharge((_EJOB *)a1, &NoWakeCharge, &SystemNoWakeCharge);
PspUnlockJob(v15, (__int64)CurrentThread);
v50 = 0;
if( result[0] )
{
if( (unsigned __int64)(v9 + v62) > result[0] )
v4 = 0x10000;
v50 = v4;
}
if( result[1] && (unsigned __int64)(v10 + *((_QWORD *)&v62 + 1)) > result[1] )
{
v4 |= 0x20000u;
v50 = v4;
}
if( v66.m256i_i64[0] && (unsigned __int64)(v11 + *((_QWORD *)&v58 + 1)) > v66.m256i_i64[0] )
{
v4 |= 4u;
v50 = v4;
}
if( *(_OWORD *)&v66.m256i_u64[1] != 0i64 )
{
PspLockJobMemoryLimitsShared(a1, (__int64)CurrentThread);
v50 = PspGetJobMemoryUsageNotificationViolations(
a1,
*(_QWORD *)(a1 + 976),
*(_QWORD *)(a1 + 976) + *(_QWORD *)(a1 + 1336),
33280) | v4;
PspUnlockJobMemoryLimitsShared(a1, (__int64)CurrentThread);
}
v16 = v66.m256i_i32[6];
v17 = DWORD1(v67);
if( v66.m256i_i32[6] && *(_DWORD *)(a2 + 32) == DWORD1(v67) && *(_DWORD *)(a2 + 44) >= v66.m256i_i32[6] )
{
v18 = PspRateControlLimitFlag(0i64) | v50;
v50 = v18;
}
else
{
v18 = v50;
}
v19 = v66.m256i_i32[7];
if( v66.m256i_i32[7] && *(_DWORD *)(a2 + 36) == DWORD2(v67) && *(_DWORD *)(a2 + 48) >= v66.m256i_i32[7] )
{
v43 = PspRateControlLimitFlag(1i64);
v18 = v43 | v44;
v50 = v18;
}
v20 = v67;
v21 = HIDWORD(v67);
if( (_DWORD)v67 && *(_DWORD *)(a2 + 40) == HIDWORD(v67) && *(_DWORD *)(a2 + 52) >= (unsigned int)v67 )
{
v45 = PspRateControlLimitFlag(2i64);
v18 = v45 | v46;
v50 = v18;
}
if( v18 )
{
PspLockJobExclusive(a1, v51);
v32 = *(_QWORD *)(a1 + 984);
if( v32 )
{
*(_DWORD *)(v32 + 4) |= v50;
v33 = *(_QWORD **)(a1 + 984);
if( (v50 & 0x10000) != 0 )
v33[9] = result[0];
if( (v50 & 0x20000) != 0 )
v33[10] = result[1];
if( (v50 & 4) != 0 )
v33[11] = v66.m256i_i64[0];
if( (v50 & 0x200) != 0 )
v33[13] = v66.m256i_i64[2];
if( (v50 & 0x8000) != 0 )
v33[12] = v66.m256i_i64[1];
v34 = PspRateControlLimitFlag(0i64);
if( (v34 & v36) != 0 )
{
*(_DWORD *)(v35 + 112) = v16;
*(_DWORD *)(v35 + 124) = v17;
}
v37 = PspRateControlLimitFlag(1i64);
if( (v37 & v39) != 0 )
{
v47 = DWORD2(v67);
*(_DWORD *)(v38 + 116) = v19;
*(_DWORD *)(v38 + 128) = v47;
}
v40 = PspRateControlLimitFlag(2i64);
if( (v40 & v42) != 0 )
{
*(_DWORD *)(v41 + 120) = v20;
*(_DWORD *)(v41 + 132) = v21;
}
}
if( *(_QWORD *)(a1 + 456) && (*(_DWORD *)(a1 + 876) & 0x800) != 0 && (*(_DWORD *)(a1 + 1320) & 4) == 0 )
PspSendReliableJobNotification((_EJOB *)a1, 0xBui64);
PspUnlockJob(a1, v51);
}
v22 = *(_QWORD *)(a2 + 16);
if( v22 )
{
if( (*(_DWORD *)(v22 + 1120) & 1) == 0 )
{
_InterlockedAnd((volatile signed __int32 *)(v22 + 1120), 0xFFFFFFDF);
v48 = *(_QWORD *)(a2 + 16);
v57[0] = *(_QWORD *)(a2 + 8);
v57[1] = 2i64;
v57[2] = *(_QWORD *)(v48 + 1088);
PspRemoveProcessFromJobChain(v48, v57, 14, 0xC0000044);
v22 = *(_QWORD *)(a2 + 16);
}
HalPutDmaAdapter((PADAPTER_OBJECT)v22);
}
if( v53 && *((_QWORD *)&v58 + 1) + v56 > v53 )
{
if( v52 )
{
if( v52 != 1 )
goto LABEL_17;
v49 = v51;
PspLockJobShared(a1, v51);
if( !*(_QWORD *)(a1 + 456) || (*(_DWORD *)(a1 + 876) & 2) == 0 )
{
PspUnlockJob(a1, v51);
PspTerminateAllProcessesInJobHierarchy((_EJOB *)a1, 3221225540i64, 1u);
goto LABEL_17;
}
if( PspSendJobNotification((_EJOB *)a1, 1ui64, 0i64, 0) >= 0 )
{
*(_DWORD *)(a1 + 256) &= ~4u;
*(_QWORD *)(a1 + 232) = 0i64;
}
}
else
{
if( !PspTerminateAllProcessesInJobHierarchy((_EJOB *)a1, 3221225540i64, 1u) )
goto LABEL_17;
v49 = v51;
PspLockJobExclusive(a1, v51);
if( !*(_DWORD *)(a1 + 216) && *(_QWORD *)(a1 + 456) && (*(_DWORD *)(a1 + 876) & 2) != 0 )
PspSendJobNotification((_EJOB *)a1, 1ui64, 0i64, 0);
}
PspUnlockJob(a1, 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((_EJOB *)a1);
}
}
v25 = *(_QWORD *)(a1 + 1072);
if( v25 )
{
PspLockJobExclusive(v25, v51);
PspLockJobExclusive(a1, v51);
PspAddAccountingValues((_QWORD *)(*(_QWORD *)(a1 + 1072) + 1120i64), (CHAR *)(a1 + 1120));
memset(a1 + 1120, 0i64);
PspUnlockJob(a1, v51);
v27 = *(_QWORD *)(a1 + 1072);
v26 = v51;
}
else
{
PspLockJobExclusive(a1, v51);
memset(a1 + 1120, 0i64);
v26 = v51;
v27 = a1;
}
PspUnlockJob(v27, v26);
return 0i64;
}Referenced by:
No references.