MiConvertAndFlushWsleVas
VOID __fastcall MiConvertAndFlushWsleVas(INT64 a1, INT64 a2){
unsigned __int64 v4;
__int64 v5;
UINT8 v6;
_MMPTE *v7;
__int64 v8;
_MMPTE *PteBase;
UINT64 v10;
INT64 v11;
unsigned __int64 v12;
_MMPFN *PfnDb;
UINT8 v14;
INT64 v15;
_MMPTE *v16;
if( *(_DWORD *)(a2 + 12) )
{
v4 = *(_QWORD *)(a2 + 24);
v5 = 0i64;
v6 = MiLockWorkingSetShared(a1);
v14 = v6;
v7 = MiLockLowestValidPageTable(
a1,
(INT64 *)((char *)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64)),
(INT64 **)&v15);
v16 = v7;
if( v7 == (_MMPTE *)((char *)MmGetPdeBase() + ((v4 >> 18) & 0x3FFFFFF8)) )
{
v8 = 0i64;
if( *(_DWORD *)(a2 + 12) )
{
PteBase = MmGetPteBase();
do
{
v10 = *(_QWORD *)(a2 + 8 * v8 + 24);
v15 = MI_READ_PTE_LOCK_FREE((INT64)PteBase + ((v10 >> 9) & 0x7FFFFFFFF8i64));
if( (v15 & 1) != 0 && (MiGetWsleContents(v11, v10) & 0xF) != 10 )
{
v12 = 6 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v15) >> 12) & 0xFFFFFFFFFi64);
PfnDb = MmGetPfnDb();
if( (*((_QWORD *)PfnDb + v12 + 5) & 0x1000000000i64) != 0 || *((__int64 *)PfnDb + v12 + 1) <= 0 )
{
*(_QWORD *)(a2 + 8 * v5 + 24) = *(_QWORD *)(a2 + 8 * v8 + 24);
v5 = (unsigned int)(v5 + 1);
}
}
v8 = (unsigned int)(v8 + 1);
}
while( (unsigned int)v8 < *(_DWORD *)(a2 + 12) );
v7 = v16;
v6 = v14;
}
if( (_DWORD)v5 )
{
*(_DWORD *)(a2 + 12) = v5;
MiFreeWsleList(a1, a2, 0);
}
else
{
*(_DWORD *)(a2 + 12) = 0;
}
}
else
{
*(_DWORD *)(a2 + 12) = 0;
}
MiUnlockPageTableInternal(a1, (UINT64)v7);
MiUnlockWorkingSetShared(a1, v6);
}
}Referenced by:
MiEliminateZeroPages