MiTrimWorkingSet
NTSTATUS __stdcall MiTrimWorkingSet(
_MMSUPPORT_INSTANCE *WsInfo,
UINT64 DesiredReduction,
UINT8 WsIrql,
UINT64 MinimumTrimAge,
UINT64 TrimFlags){
__int64 v6;
int v9;
unsigned __int64 WorkingSetSize;
_KTBFLUSH_TYPE v11;
int v12;
int v13;
bool v14;
_MMWSL_INSTANCE *VmWorkingSetList;
__int64 v16;
unsigned __int64 *v17;
__int64 v18;
CHAR *RandomPte;
INT64 v20;
INT64 v22;
INT64 v23[22];
__int64 v24[52];
int v25[68];
v6 = (unsigned int)MinimumTrimAge;
memset(v24, 0i64, 0x198u);
memset(v23, 0i64, sizeof(v23));
memset(v25, 0i64, 0x108u);
v9 = v6 & 0xF;
LODWORD(v24[0]) = v9;
if( (TrimFlags & 2) != 0 )
{
v9 |= 0x20u;
LODWORD(v24[0]) = v9;
}
if( (TrimFlags & 4) != 0 )
{
v9 |= 0x40u;
LODWORD(v24[0]) = v9;
}
if( (TrimFlags & 1) != 0 )
{
v9 |= 0x80u;
LODWORD(v24[0]) = v9;
}
if( (TrimFlags & 8) != 0 )
{
v9 |= 0x100u;
LODWORD(v24[0]) = v9;
}
if( (TrimFlags & 0x40) != 0 )
{
v9 |= 0x1000u;
LODWORD(v24[0]) = v9;
}
if( (TrimFlags & 0x10) != 0 )
{
WorkingSetSize = WsInfo->WorkingSetSize;
v9 |= 0x400u;
LODWORD(v24[0]) = v9;
v24[6] = WorkingSetSize;
if( DesiredReduction > WorkingSetSize )
DesiredReduction = WorkingSetSize;
if( (TrimFlags & 0x20) != 0 )
{
v9 |= 0x800u;
LODWORD(v24[0]) = v9;
}
}
if( *(&stru_140C4DB30 + 654) )
LODWORD(v24[0]) = v9 | 0x10;
v24[8] = 20i64;
v11 = MiTbFlushType(WsInfo);
v14 = (WsInfo->Flags._bf_0 & 7) == 0;
LODWORD(v24[7]) = v11;
WORD2(v24[7]) = 4;
v24[9] = 0i64;
v24[10] = 0i64;
if( v14 && WsInfo[3].AgeDistribution[1] )
{
v25[1] = 32;
v24[30] = (__int64)v25;
}
VmWorkingSetList = WsInfo->VmWorkingSetList;
v16 = 0i64;
if( (unsigned int)v6 >= 8 )
return 0;
v17 = &WsInfo->AgeDistribution[v6];
v18 = (unsigned int)(8 - v6);
do
{
v16 += *v17++;
--v18;
}
while( v18 );
v24[5] = v16;
if( !v16 )
return 0;
v24[1] = DesiredReduction;
BYTE4(v23[0]) = v24[0] & 0xF;
v23[21] = (INT64)v24;
LOWORD(v23[0]) = 22;
v23[19] = (INT64)MiTrimPte;
v23[20] = (INT64)MiTrimWorkingSetTail;
v23[3] = (INT64)WsInfo;
BYTE6(v23[0]) = WsIrql;
if( (v12 & v13) != 0 )
{
RandomPte = MiGenerateRandomPte((INT64)v23);
v23[7] = (INT64)RandomPte;
}
else
{
RandomPte = (CHAR *)VmWorkingSetList->NextPteToTrim;
v23[7] = (INT64)VmWorkingSetList->NextPteToTrim;
}
v20 = v23[5];
if( !RandomPte )
v20 = -1i64;
v23[5] = v20;
MiWalkPageTables((INT64)v23);
LODWORD(v22) = TrimFlags;
MiLogTrimWs((INT64)WsInfo, v24[4], v24[2], (unsigned int)v6, v22);
return v24[2];
}Referenced by:
MiForcedTrim
MiReduceWs
MiTrimOrAgeWorkingSet