MiTrimWorkingSetBuildup
void __fastcall MiTrimWorkingSetBuildup(__int64 a1, __int64 a2){
int v2;
__int64 v4;
__int64 v5;
unsigned int v6;
__int64 v7;
__int64 v8;
__int64 v9;
int v10;
char *v11;
unsigned int v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
char *v16;
__int64 i;
unsigned __int64 v18;
unsigned int v19;
unsigned int v20;
_DWORD *v21;
unsigned int v22;
_DWORD *v23;
__int64 v24;
int v25;
__int64 v26;
unsigned int j;
unsigned int v28;
_DWORD *v29;
unsigned int SizeOfBitMap;
struct _RTL_BITMAP BitMapHeader;
INT64 v32;
v2 = 0;
v32 = *(_QWORD *)(a1 + 24);
BitMapHeader = 0i64;
while( v2 != 2 )
{
v4 = 80i64 * v2;
v5 = v4 + a2 + 248;
if( !*(_BYTE *)(v5 + 72) )
goto LABEL_4;
v6 = 0;
v7 = (_QWORD)MmGetPteBase() << 25;
v8 = v7 + ((*(_QWORD *)(v5 + 64) & 0xFFFFFFFFFFFFF000ui64) << 16);
BitMapHeader.SizeOfBitMap = 512;
BitMapHeader.Buffer = (unsigned int *)(v4 + a2 + 248);
v9 = (__int64)((v8 & 0xFFFFFFE000000000ui64) - v7) >> 16;
v10 = (((_BYTE)v4 + (_BYTE)a2 - 8) & 4) != 0i64 ? 0x20 : 0;
v11 = (char *)BitMapHeader.Buffer - ((((_BYTE)v4 + (_BYTE)a2 - 8) & 4) != 0i64 ? 4 : 0);
while( 1 )
{
v12 = v6 < BitMapHeader.SizeOfBitMap ? v6 : 0;
v13 = BitMapHeader.SizeOfBitMap - 1;
while( 1 )
{
v14 = v13 + v10;
v15 = v12 + v10;
if( v13 - v12 == -1 )
goto LABEL_41;
v16 = &v11[8 * ((unsigned __int64)v15 >> 6)];
for( i = ~*(_QWORD *)v16 | ((1i64 << (v15 & 0x3F)) - 1); i == -1; i = ~*(_QWORD *)v16 )
{
v16 += 8;
if( v16 > &v11[8 * ((unsigned __int64)v14 >> 6)] )
goto LABEL_41;
}
_BitScanForward64(&v18, ~i);
v19 = v18 + ((unsigned int)((v16 - v11) >> 3) << 6);
if( v19 > v14 )
{
LABEL_41:
v19 = -1;
}
else if( v19 != -1 )
{
break;
}
if( !v12 )
break;
SizeOfBitMap = v6 + 1;
if( v6 + 1 > BitMapHeader.SizeOfBitMap )
SizeOfBitMap = BitMapHeader.SizeOfBitMap;
v13 = SizeOfBitMap - 1;
v12 = 0;
}
v20 = v19 - v10;
if( v19 == -1 )
v20 = -1;
if( v20 < v6 || v20 == -1 )
break;
if( v20 < 0x200 )
{
v21 = (_DWORD *)(v5 + 60);
v22 = v20;
v23 = (_DWORD *)(v5 + 4 * ((unsigned __int64)v20 >> 5));
if( v23 != (_DWORD *)(v5 + 60) )
{
v24 = v20 & 0x1F;
if( (*v23 | *((_DWORD *)qword_140011CE0 + v24)) == -1 )
{
v22 = v20 - v24 + 32;
for( ++v23; v23 < v21 && *v23 == -1; ++v23 )
v22 += 32;
}
}
while( v22 < 0x200 && _bittest((const signed __int32 *)v5, v22) )
++v22;
v25 = 0;
if( v23 == v21 )
goto LABEL_32;
v26 = v22 & 0x1F;
if( (*v23 & ~*((_DWORD *)qword_140011CE0 + v26)) != 0 )
goto LABEL_32;
v25 = 32 - v26;
if( (_DWORD)v26 != 33 )
{
v29 = v23 + 1;
while( v29 < v21 && !*v29 )
{
++v29;
v25 += 32;
if( v25 == -1 )
goto LABEL_37;
}
LABEL_32:
for( j = v25 + v22; j < 0x200 && !_bittest((const signed __int32 *)v5, j) && v25 != -1; ++j )
++v25;
}
LABEL_37:
if( v25 )
goto LABEL_38;
goto LABEL_49;
}
v25 = 0;
LABEL_49:
v22 = 512;
LABEL_38:
v28 = v22 - v20;
MiSetVaAgeList(v32, v9 + (v20 << 12), (UINT8 *)v28, v2 != 0 ? 6 : 0);
RtlClearBits(&BitMapHeader, v20, v28);
v6 = v20 + v25 + v28;
if( v25 )
{
v11 = (char *)(v5 - ((v5 & 4) != 0 ? 4 : 0));
if( v6 != 512 )
continue;
}
break;
}
*(_BYTE *)(v5 + 72) = 0;
LABEL_4:
++v2;
}
if( *(_DWORD *)(a2 + 68) )
*(_QWORD *)(a2 + 16) -= MiFreeWsleList(v32, a2 + 56, BYTE1(*(_DWORD *)a2) & 1);
}Referenced by:
MiTrimPte
MiTrimPteWorker
MiTrimWorkingSetTail