MiEmptyWorkingSetHelper
NTSTATUS __stdcall MiEmptyWorkingSetHelper(
_MMSUPPORT_INSTANCE *Vm,
_MMPTE *PointerPte,
UINT64 WorkingSetIndex,
_MMWSLE_FLUSH_LIST *WsleFlushList){
unsigned __int64 PteBase;
unsigned int v5;
unsigned __int64 v9;
UINT64 v10;
UINT64 v11;
_MMPFN *v12;
int v13;
_MMPTE *v14;
UINT64 v16;
PteBase = (unsigned __int64)MmGetPteBase();
v5 = (unsigned int)WsleFlushList;
v9 = (__int64)(((_QWORD)PointerPte << 25) - (PteBase << 25)) >> 16;
LODWORD(v10) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
v16 = v10;
v11 = v10;
MiPteInShadowRange((UINT64)&v16);
v12 = &MmGetPfnDb()[(v11 >> 12) & 0xFFFFFFFFFi64];
v13 = v9 < PteBase || v9 > (unsigned __int64)MmGetPteLimit();
if( !(unsigned int)MiWalkVaCheckCommon(Vm, PointerPte, v12, v13, (__int64)&v16)
|| v12->u3.ReferenceCount > 1u && (Vm->Flags._bf_0 & 7) != 0 )
{
return 0;
}
if( *(&stru_140C4DB30 + 654) )
MI_WSLE_LOG_ACCESS(Vm, (_MMWSLE *)PointerPte, v14);
MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)WorkingSetIndex, (VOID *)v9, 1ui64, 0i64);
if( *(_DWORD *)(WorkingSetIndex + 12) == *(_DWORD *)(WorkingSetIndex + 8) )
MiFreeWsleList(Vm, (_MMWSLE_FLUSH_LIST *)WorkingSetIndex, v5);
return 1;
}Referenced by:
MiEmptyPte
MiUpdateOldPteWorker