ST_STORE::StCompactionPerformEmergency
__int64 __fastcall ST_STORE::StCompactionPerformEmergency(__int64 a1){
int v1;
int v2;
int v3;
unsigned int v5;
int v6;
UINT64 UnbiasedInterruptTime;
__int64 v8;
_WORD *v9;
_WORD *v10;
_WORD *v11;
unsigned __int64 v12;
unsigned int v13;
__int64 v15;
unsigned int v16;
unsigned int v17;
__int64 v18;
__int64 v19;
unsigned int v20;
__int64 v21;
unsigned int v23;
int v24;
_WORD *v25;
UINT64 v26;
v1 = *(_DWORD *)(a1 + 784);
v2 = 0;
v24 = v1;
v3 = 0;
ST_STORE::StDmLazyRegionsWorker(a1, 0, 0i64);
v5 = (unsigned int)(v1 - 4096) >> 4;
v6 = 0;
v23 = v5;
UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
v8 = *(_QWORD *)(a1 + 1032);
v26 = UnbiasedInterruptTime;
v9 = (_WORD *)(v8 + 2i64 * *(unsigned int *)(a1 + 1096));
v25 = v9;
v10 = (_WORD *)(v8 + 2i64 * *(unsigned int *)(a1 + 856));
while( 2 )
{
v11 = v9;
if( v9 >= v10 )
goto LABEL_29;
do
{
if( *(_DWORD *)(*(_QWORD *)(a1 + 800) + 6100i64)
+ *(_DWORD *)(*(_QWORD *)(a1 + 800) + 6592i64)
+ *(_DWORD *)(*(_QWORD *)(a1 + 800) + 6096i64)
&& (v6 & 7) == 0
&& v6 )
{
v12 = KiQueryUnbiasedInterruptTime(1u) - v26;
if( !(v13 >= 0x40 ? v12 < 0x1C9C380 : v12 < 0x2FAF080) )
break;
}
if( (*v11 & 0x1FFF) == 0 || (*v11 & 0x1FFFu) > v5 )
goto LABEL_27;
v15 = ((__int64)v11 - *(_QWORD *)(a1 + 1032)) >> 1;
if( !SMKM_STORE::SmStIsRegionBusy(*(_QWORD *)(a1 + 800), v15) )
{
v17 = v16 >> 13;
if( *(_BYTE *)(a1 + 776) )
v17 = 0;
if( (_DWORD)v15 == *(_DWORD *)(a1 + 16 * (v17 + 78i64)) )
goto LABEL_26;
++v6;
if( (int)ST_STORE::StCompactRegions(a1, 0i64, v15, 0i64, v15, 0) >= 0 )
goto LABEL_24;
if( (unsigned int)ST_STORE::StDmCheckForCompaction(a1, 2) != 2 )
break;
v18 = ST_STORE::StMapAndLockRegion(a1, v15, 0, 1i64);
if( v18 )
{
if( v18 != -1 )
{
if( (int)ST_STORE::StCompactRegions(a1, v18, v15, v18, v15, 0) < 0 )
NT_ASSERT("(((NTSTATUS)(Status)) >= 0)");
ST_STORE::StUnlockAndUnmapRegion(a1, v15, v19);
LABEL_24:
v21 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 800) + 6216i64) + 8i64 * (unsigned int)v15);
if( v21 >= 0 )
{
v20 = (16 * (*v11 & 0x1FFF) + 4095) & 0xFFFFF000;
MmStoreDecommitVirtualMemory((PVOID)(v20 + (v21 & 0x7FFFFFFFFFFF0000i64)), v24 - v20);
}
goto LABEL_26;
}
}
}
v3 = 1;
LABEL_26:
v5 = v23;
LABEL_27:
++v11;
}
while( v11 < v10 );
v9 = v25;
v5 = v23;
LABEL_29:
if( v11 == v10 )
{
if( v9 != *(_WORD **)(a1 + 1032) )
{
v10 = v9;
v25 = *(_WORD **)(a1 + 1032);
v9 = v25;
continue;
}
}
else
{
v2 = ((__int64)v11 - *(_QWORD *)(a1 + 1032)) >> 1;
}
break;
}
*(_DWORD *)(a1 + 1096) = v2;
return v3 != 0 ? 0xC000022D : 0;
}
Referenced by:
No references.