MiConvertAndFlushWsleVas
VOID __stdcall MiConvertAndFlushWsleVas(_MMSUPPORT_INSTANCE *Vm, _MMWSLE_FLUSH_LIST *WsleFlushList){
unsigned __int64 v4;
__int64 v5;
char v6;
char v7;
_MMPTE *v8;
__int64 v9;
_MMPTE *PteBase;
UINT64 v11;
INT64 v12;
INT64 v13;
unsigned __int64 v14;
__int64 v15;
_MMPFN *PfnDb;
UINT64 v17;
char v18;
INT64 v19;
_MMPTE *v20;
if( WsleFlushList->FlushIndex[2] )
{
v4 = *(_QWORD *)&WsleFlushList->FlushIndex[5];
v5 = 0i64;
MiLockWorkingSetShared();
v7 = v6;
v18 = v6;
v8 = MiLockLowestValidPageTable(
(INT64)Vm,
(INT64 *)((char *)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64)),
(INT64 **)&v19);
v20 = v8;
if( v8 == (_MMPTE *)((char *)MmGetPdeBase() + ((v4 >> 18) & 0x3FFFFFF8)) )
{
v9 = 0i64;
if( WsleFlushList->FlushIndex[2] )
{
PteBase = MmGetPteBase();
do
{
v11 = *(_QWORD *)&WsleFlushList->FlushIndex[2 * v9 + 5];
LODWORD(v12) = MI_READ_PTE_LOCK_FREE((INT64)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64));
v19 = v12;
if( (v12 & 1) != 0 && (MiGetWsleContents(v13, v11) & 0xF) != 10 )
{
LODWORD(v14) = MI_READ_PTE_LOCK_FREE((INT64)&v19);
v15 = (v14 >> 12) & 0xFFFFFFFFFi64;
PfnDb = MmGetPfnDb();
if( (PfnDb[v15].u4._bf_0 & 0x1000000000i64) != 0 || (__int64)PfnDb[v15].ListEntry.Blink <= 0 )
{
*(_QWORD *)&WsleFlushList->FlushIndex[2 * v5 + 5] = *(_QWORD *)&WsleFlushList->FlushIndex[2 * v9 + 5];
v5 = (unsigned int)(v5 + 1);
}
}
v9 = (unsigned int)(v9 + 1);
}
while( (unsigned int)v9 < WsleFlushList->FlushIndex[2] );
v8 = v20;
v7 = v18;
}
if( (_DWORD)v5 )
{
WsleFlushList->FlushIndex[2] = v5;
MiFreeWsleList(Vm, WsleFlushList, 0i64);
}
else
{
WsleFlushList->FlushIndex[2] = 0;
}
}
else
{
WsleFlushList->FlushIndex[2] = 0;
}
MiUnlockPageTableInternal((INT64)Vm, (UINT64)v8);
LOBYTE(v17) = v7;
MiUnlockWorkingSetShared(Vm, v17);
}
}Referenced by:
MiEliminateZeroPages