MiFreeWsleList
NTSTATUS __stdcall MiFreeWsleList(_MMSUPPORT_INSTANCE *Vm, _MMWSLE_FLUSH_LIST *WsleFlushList, UINT64 Flags){
CHAR v3;
unsigned __int64 v6;
_KTBFLUSH_TYPE v7;
bool v8;
__int64 v9;
unsigned int i;
unsigned __int64 j;
CHAR *v12;
unsigned __int64 v13;
__int64 v14;
CHAR *v15;
__int64 v16;
INT64 v18;
__int64 v19;
__int64 v20;
__int64 v21;
char v22[152];
CHAR v23[8];
v3 = Flags;
memset(v22, 0i64, sizeof(v22));
v6 = WsleFlushList->FlushIndex[2];
v19 = 20i64;
v7 = MiTbFlushType(Vm);
v8 = (Vm->Flags._bf_0 & 7) == 0;
v9 = 0i64;
v18 = (unsigned int)v7;
v20 = 0i64;
v21 = 0i64;
if( v8 && KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[9].NextPteToTrim )
v3 |= 2u;
for( i = 0; i < 2; ++i )
{
for( j = 0i64; j < v6; ++j )
{
v12 = &v23[8 * j + 1];
v13 = *(_QWORD *)&v12[(char *)WsleFlushList - &v23[1] + 24] & 0xFFFFFFFFFFFFF000ui64;
if( i )
{
if( *(_QWORD *)&v23[8 * j] )
*(_WORD *)&v23[8 * j] = MiWsleFree((INT64)Vm, v13, v3);
else
*v12 &= ~1u;
}
else
{
LODWORD(v14) = MiWsleFlush((INT64)Vm, v13, v3, (INT64)&v18);
*(_QWORD *)&v23[8 * j] = v14;
if( !v14 )
++v9;
}
}
if( !i )
MiFlushTbList((_MI_TB_FLUSH_LIST *)&v18);
}
if( v9 != v6 )
{
v15 = MiRemoveWsleList((INT64)Vm, (INT64)WsleFlushList, v23, v6, v18, v19, v20, v21);
if( v15 )
{
v16 = (_QWORD)MmGetPteBase() << 25;
MiRebuildPageTableLeafAges(v16, (((((_QWORD)v15 << 25) - v16) >> 16 << 25) - v16) >> 16);
}
}
WsleFlushList->FlushIndex[2] = 0;
return v9;
}Referenced by:
MiAgePteWorker
MiAgeWorkingSetTail
MiConvertAndFlushWsleVas
MiDeprioritizeVirtualAddresses
MiEmptyWorkingSetHelper
MiEmptyWorkingSetTail
MiMakeVaRangeNoAccess
MiSetProtectionOnSection
MiSharePages
MiTrimSharedPageFromViews
MiTrimWorkingSetBuildup
MiUpdateOldWorkingSetPagesTail
MmProtectPool
NtUnlockVirtualMemory