MiFreedUnusedPfnPagesWorker
VOID __fastcall MiFreedUnusedPfnPagesWorker(UINT64 *rcx0){
unsigned __int64 v1;
_MMPTE *PteBase;
_MMPFN *PfnDb;
unsigned __int64 v4;
unsigned __int64 v5;
UINT64 v6;
UINT64 v7;
INT64 NextNonGapPfnPage;
char *v9;
SIZE_T v10;
_MMPFN *v11;
SIZE_T v12;
unsigned __int64 v13;
char *v14;
__int64 v15;
char *v16;
char *v17;
char *v18;
UINT8 *i;
__int64 v20;
unsigned __int64 v21;
UINT64 v22;
UINT64 v23;
UINT64 v24;
unsigned __int64 v25;
if( !*rcx0 )
byte_140C50B8C = 1;
v1 = 0i64;
LABEL_4:
PteBase = MmGetPteBase();
LABEL_5:
PfnDb = MmGetPfnDb();
LABEL_6:
if( v1 != 0x1000000000i64 )
{
if( !MmPhysicalMemoryBlock )
{
LABEL_8:
v4 = 0x1000000000i64 - v1;
goto LABEL_9;
}
for( i = MmPhysicalMemoryBlock + 16; ; i += 16 )
{
if( i >= &MmPhysicalMemoryBlock[16 * *(unsigned int *)MmPhysicalMemoryBlock + 16] )
{
PfnDb = MmGetPfnDb();
goto LABEL_8;
}
v20 = *(_QWORD *)i;
if( v1 >= *(_QWORD *)i )
{
v21 = *((_QWORD *)i + 1) + v20;
if( v1 < v21 )
v1 = v21;
}
else
{
v4 = v20 - v1;
if( v20 - v1 >= 0x55 )
{
PfnDb = MmGetPfnDb();
LABEL_9:
v5 = v1;
if( v4 )
{
v1 += v4;
v25 = v1;
v6 = (UINT64)PteBase + (((48 * v5 - 0x57FFFFFF001i64) >> 9) & 0x7FFFFFFFF8i64);
v23 = v6;
v7 = (UINT64)PteBase + ((((unsigned __int64)PfnDb + 48 * v1) >> 9) & 0x7FFFFFFFF8i64);
v24 = v7;
if( v6 < v7 )
{
while( 1 )
{
v22 = (__int64)(v7 - v6) >> 3 << 12;
NextNonGapPfnPage = MiGetNextNonGapPfnPage(&v23, &v22, 2, 1i64);
PteBase = MmGetPteBase();
v9 = (char *)NextNonGapPfnPage;
if( !NextNonGapPfnPage )
goto LABEL_5;
v10 = v22 & 0xFFFFFFFFFFFFF000ui64;
if( (v22 & 0xFFFFFFFFFFFFF000ui64) == 0 )
goto LABEL_5;
v11 = MmGetPfnDb();
do
{
if( *(_QWORD *)v9 || (v12 = RtlCompareMemoryUlong(v9, v10, 0), v12 < 0x1000) )
{
v12 = 4096i64;
}
else
{
v14 = v9;
v15 = (v9 - (char *)v11) / 48;
v16 = (char *)v11 + 48 * v15;
if( v16 != v9
&& (!MmIsAddressValidEx((INT64)v11 + 48 * v15) || RtlCompareMemoryUlong(v16, 0x30ui64, 0) != 48) )
{
v14 = v9 + 4096;
}
v17 = &v9[v12 & 0xFFFFFFFFFFFFF000ui64];
v18 = (char *)v11 + 48 * ((v17 - (char *)v11) / 48);
if( v18 != v17
&& (!MmIsAddressValidEx((INT64)(v18 + 48)) || RtlCompareMemoryUlong(v18, 0x30ui64, 0) != 48) )
{
v17 -= 4096;
}
MiPfnRangeIsZero(v14, v17);
}
v13 = (v12 + 4095) & 0xFFFFFFFFFFFFF000ui64;
v9 += v13;
v10 -= v13;
}
while( v10 >= 0x1000 );
v6 = v23;
v7 = v24;
v1 = v25;
if( v23 >= v24 )
goto LABEL_4;
}
}
goto LABEL_6;
}
return;
}
v1 = v20 + *((_QWORD *)i + 1);
}
}
}
}Referenced by:
MiFreeUnusedPfnPagesDpc