MiComputeSystemTrimCriteria
NTSTATUS __stdcall MiComputeSystemTrimCriteria(_MI_PARTITION *Partition, _MMWS_TRIM_CRITERIA *Criteria){
void *WorkingSetControl;
NTSTATUS v5;
unsigned __int64 v6;
unsigned __int64 v7;
_MI_PARTITION *v8;
NTSTATUS StandbyRepurposed;
int v10;
unsigned int v11;
unsigned int v12;
int v13;
unsigned int v14;
bool v15;
unsigned __int64 v16;
unsigned __int8 v17;
unsigned int v18;
unsigned __int64 v19;
unsigned __int64 v20;
__int64 v21;
int v22;
unsigned __int64 v23;
unsigned __int64 v24;
__int64 v25;
NTSTATUS v26;
unsigned __int64 v27;
int v28;
NTSTATUS v29;
unsigned int v30;
unsigned __int64 v31;
unsigned __int8 v32;
unsigned __int64 v33;
unsigned __int16 v34;
unsigned __int64 v35;
UINT16 v37;
unsigned __int64 v38;
unsigned __int64 v39;
unsigned __int64 v40;
unsigned __int64 AvailablePages;
__int64 v42;
unsigned __int64 v43;
unsigned __int64 v44;
unsigned __int64 v45;
volatile unsigned __int64 v46;
int v47;
unsigned int v48;
unsigned __int64 v49;
WorkingSetControl = Partition->WorkingSetControl;
v47 = 0;
v5 = *((_DWORD *)WorkingSetControl + 10);
LODWORD(v6) = MiGetAvailablePagesBelowPriority(Partition, 6ui64);
v7 = v6;
StandbyRepurposed = MiGetStandbyRepurposed(v8, 1ui64);
v11 = *((_DWORD *)WorkingSetControl + 11);
v12 = StandbyRepurposed;
v13 = *((_DWORD *)WorkingSetControl + 30);
v14 = StandbyRepurposed - v11;
v15 = v11 < v12;
*((_DWORD *)WorkingSetControl + 11) = v12;
v16 = *((_QWORD *)WorkingSetControl + 300);
v17 = 0;
v18 = v15 ? v14 : 0;
v19 = v16 - v7;
v48 = v18;
v20 = 0i64;
if( v7 > v16 )
v19 = v7 - v16;
v21 = v13 & 7;
*((_QWORD *)WorkingSetControl + 275) += (v19 >> 3) - (*((_QWORD *)WorkingSetControl + v21 + 276) >> 3);
*((_QWORD *)WorkingSetControl + v21 + 276) = v19;
if( *((_DWORD *)WorkingSetControl + 20) == 4
&& *((_WORD *)WorkingSetControl + 1174)
&& *((_BYTE *)WorkingSetControl + 2350)
&& *((_BYTE *)WorkingSetControl + 2351) )
{
v22 = v10;
}
else
{
v10 = 0;
v22 = 1;
if( v7 <= 0x120 )
v10 = 1;
}
v23 = *((_QWORD *)WorkingSetControl + 300);
v24 = v23;
if( v10 == v22 )
{
v25 = 0i64;
}
else
{
v10 = 0;
v25 = v7 - *((_QWORD *)WorkingSetControl + 296);
v24 = v23 >> 2;
}
if( v7 < v24 )
{
v38 = v23 - v25;
}
else
{
if( v7 >= 4 * v23 )
goto LABEL_10;
if( v25 >= 0 )
goto LABEL_10;
v38 = v23 - v25;
if( v7 >= v23 - v25 )
goto LABEL_10;
}
v20 = *((_QWORD *)WorkingSetControl + 298);
v39 = v38 - v7;
v17 = v22;
if( v39 <= v20 )
v20 = v39;
LABEL_10:
v49 = v18;
if( v18 >= v7 >> 2 )
{
v40 = v18 - (v7 >> 2);
if( v40 > v20 && v20 < 0x2000 && !v10 )
{
v20 = v18 - (v7 >> 2);
v17 = 3;
if( v40 > 0x2000 )
v20 = 0x2000i64;
}
}
v26 = MiGetStandbyRepurposed(Partition, 4ui64);
v29 = v26;
if( v20 )
{
if( v20 < 0x1000 && !v28 )
v20 = 4096i64;
}
else if( !v28 )
{
v30 = v26 - *((_DWORD *)WorkingSetControl + 12);
if( v30 > 0x20000 )
{
AvailablePages = Partition->Vp.AvailablePages;
if( AvailablePages >= 0x100000 || AvailablePages >= Partition->Vp.NumberOfPhysicalPages >> 2 )
{
*((_DWORD *)WorkingSetControl + 12) = v26;
}
else
{
v20 = 0x8000i64;
v17 = 2;
}
}
else if( v48 && v30 > 0x18000 && *((_QWORD *)WorkingSetControl + 301) < 0x20000ui64 )
{
v47 = 1;
}
}
if( v7 < 4 * v27 )
{
v42 = *((_QWORD *)WorkingSetControl + 275);
v43 = 4 * v42;
if( 4 * v42 >= v27 )
{
v45 = 2 * v42;
if( 2 * v42 <= v27 )
goto LABEL_18;
v44 = *((_QWORD *)WorkingSetControl + 298);
*((_QWORD *)WorkingSetControl + 300) = v45;
if( v45 <= v44 )
goto LABEL_18;
}
else
{
v44 = *((_QWORD *)WorkingSetControl + 297);
*((_QWORD *)WorkingSetControl + 300) = v43;
if( v43 >= v44 )
goto LABEL_18;
}
*((_QWORD *)WorkingSetControl + 300) = v44;
goto LABEL_18;
}
if( v7 > 16 * v27 )
*((_QWORD *)WorkingSetControl + 300) = *((_QWORD *)WorkingSetControl + 299);
LABEL_18:
*((_QWORD *)WorkingSetControl + 296) = v7;
if( !v20 )
{
v31 = *((_QWORD *)WorkingSetControl + 295);
v32 = 0;
if( v31 )
{
if( v31 > *((_QWORD *)WorkingSetControl + 301) )
{
v33 = v49;
v32 = 10;
if( *((_WORD *)WorkingSetControl + 1173) < 0xFAu )
*((_WORD *)WorkingSetControl + 1173) = 250;
goto LABEL_25;
}
*((_QWORD *)WorkingSetControl + 295) = 0i64;
}
if( *((_QWORD *)WorkingSetControl + 301) >= (unsigned __int64)(4i64 * *((_QWORD *)WorkingSetControl + 298)) )
goto LABEL_48;
if( !*((_WORD *)WorkingSetControl + 1173) )
goto LABEL_22;
v37 = MiComputeAgeDistribution(Partition, 1ui64);
*((_WORD *)WorkingSetControl + 1173) = v37;
if( v37 )
v32 = 11;
if( v32 )
{
LABEL_48:
v33 = v49;
}
else
{
LABEL_22:
v33 = v49;
if( v49 >= v7 >> 4 )
{
v32 = 9;
}
else if( v47 == 1 )
{
v32 = 8;
}
}
LABEL_25:
v34 = *((_WORD *)WorkingSetControl + 1174);
if( v34 )
{
if( *((_WORD *)WorkingSetControl + 1173) < v34 )
*((_WORD *)WorkingSetControl + 1173) = v34;
if( !v32 )
{
v32 = 12;
*((_WORD *)WorkingSetControl + 1173) = v34;
}
}
Criteria->_bf_0 = 0;
*(_QWORD *)&Criteria[1].PagesToTrim = 0i64;
*(_QWORD *)&Criteria[1].ClaimDistribution[4] = 0i64;
*(_QWORD *)&Criteria[1].ClaimDistribution[2] = Partition->Vp.AvailablePages;
*(_QWORD *)&Criteria[1].PagesTrimmed = 0i64;
Criteria->TrimReason = v32;
*(_OWORD *)Criteria->ClaimDistribution = 0i64;
*(_OWORD *)&Criteria->ClaimDistribution[4] = 0i64;
*(_OWORD *)&Criteria->PagesToTrim = 0i64;
*(_OWORD *)&Criteria[1]._bf_0 = 0i64;
if( v32 )
{
++*((_DWORD *)WorkingSetControl + v32 + 622);
v5 |= 2u;
}
else if( *((_BYTE *)WorkingSetControl + 55) == 1 )
{
v5 |= 0x80u;
*((_WORD *)WorkingSetControl + 1173) = 10;
}
else if( !v5 )
{
v5 = 64;
}
goto LABEL_32;
}
MiPulseLowAvailableEvent(Partition);
if( (unsigned __int8)(v17 - 2) <= 1u )
*((_QWORD *)WorkingSetControl + 295) = v20;
*(_QWORD *)&Criteria[1].ClaimDistribution[4] = v20;
Criteria->_bf_0 = 0;
*(_QWORD *)&Criteria[1].PagesToTrim = 0i64;
v5 |= 1u;
v46 = Partition->Vp.AvailablePages;
*(_QWORD *)&Criteria[1].PagesTrimmed = 0i64;
*(_QWORD *)&Criteria[1].ClaimDistribution[2] = v20 + v46;
v33 = v49;
Criteria->TrimReason = v17;
*(_OWORD *)Criteria->ClaimDistribution = 0i64;
*(_OWORD *)&Criteria->ClaimDistribution[4] = 0i64;
*(_OWORD *)&Criteria->PagesToTrim = 0i64;
*(_OWORD *)&Criteria[1]._bf_0 = 0i64;
*((_DWORD *)WorkingSetControl + 12) = v29;
++*((_DWORD *)WorkingSetControl + v17 + 622);
LABEL_32:
if( v7 && v33 < v7 )
v35 = 100 * v48 / v7;
else
LOBYTE(v35) = 100;
Criteria->StandbyRemovedPercentage = v35;
if( (v5 & 1) == 0 )
Criteria->AgingPolicy = 1;
return v5;
}Referenced by:
MiProcessWorkingSets