MiDeprioritizeVirtualAddresses
void __fastcall MiDeprioritizeVirtualAddresses(unsigned __int64 a1, __int64 a2, _MMSUPPORT_INSTANCE *a3, char a4){
_KTBFLUSH_TYPE v8;
_MMPTE *PteBase;
unsigned __int64 v10;
_MMPTE *v11;
char v12;
UINT64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
_MMPFN *v16;
__int64 v17;
__int64 Blink;
char v19;
char v20;
UINT64 DesiredPriority;
int v22;
unsigned __int64 v23;
INT64 *v24;
char WsleFlushList[184];
memset(WsleFlushList, 0i64, sizeof(WsleFlushList));
v8 = MiTbFlushType(a3);
*(_QWORD *)&WsleFlushList[16] = 0i64;
*(_QWORD *)&WsleFlushList[24] = 0i64;
*(_DWORD *)WsleFlushList = v8;
v22 = *(&stru_140C4DB30 + 654);
*(_WORD *)&WsleFlushList[4] = 4;
*(_DWORD *)&WsleFlushList[8] = 20;
PteBase = MmGetPteBase();
v10 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
v11 = 0i64;
v23 = v10 + 8 * a2;
MiLockWorkingSetShared();
v20 = v12;
if( v10 < v23 )
{
do
{
v14 = v10 >> 9;
if( v11 )
{
if( v11 != (_MMPTE *)((char *)PteBase + (v14 & 0x7FFFFFFFF8i64)) )
{
if( *(_DWORD *)&WsleFlushList[12] )
MiFreeWsleList(a3, (_MMWSLE_FLUSH_LIST *)WsleFlushList, 0i64);
MiUnlockPageTableInternal((INT64)a3, (UINT64)v11);
v11 = 0i64;
}
if( v11 )
goto LABEL_10;
}
v11 = MiLockLowestValidPageTable((INT64)a3, (INT64 *)v10, &v24);
if( v11 == (_MMPTE *)((char *)PteBase + (v14 & 0x7FFFFFFFF8i64)) )
{
LABEL_10:
if( (*(_BYTE *)v10 & 1) != 0 )
{
LODWORD(v15) = MI_READ_PTE_LOCK_FREE(v10);
v16 = &MmGetPfnDb()[(v15 >> 12) & 0xFFFFFFFFFi64];
v17 = (__int64)((v10 << 25) - ((_QWORD)PteBase << 25)) >> 16;
v19 = MiGetWsleContents(0xFFFFFFFFFi64, v17) & 0xF;
if( v19 != 9 )
{
if( (v16->u4._bf_0 & 0x1000000000i64) == 0 )
{
Blink = (__int64)v16->ListEntry.Blink;
if( Blink > 0 )
MiDemoteCombinedPte(a3, (_MMPTE *)v10, (_MMPTE *)(Blink | 0x8000000000000000ui64));
}
if( (a4 & 8) == 0 && (a4 & 7) != MiGetPfnPriority(v16) )
{
HIDWORD(DesiredPriority) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v16->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&DesiredPriority + 4));
while( v16->u2._bf_0 < 0 );
}
MiUpdatePfnPriority(v16, a4 & 7, 1ui64);
_InterlockedAnd64(&v16->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
if( (a4 & 0x10) != 0 && v19 != 8 )
{
if( v22 )
MI_WSLE_LOG_ACCESS(a3, (_MMWSLE *)v10, (_MMPTE *)Blink);
MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)WsleFlushList, (VOID *)v17, 1ui64, 0i64);
if( *(_DWORD *)&WsleFlushList[12] == *(_DWORD *)&WsleFlushList[8] )
MiFreeWsleList(a3, (_MMWSLE_FLUSH_LIST *)WsleFlushList, 0i64);
}
}
PteBase = MmGetPteBase();
}
}
else
{
MiUnlockPageTableInternal((INT64)a3, (UINT64)v11);
v11 = 0i64;
v10 = (v10 & 0xFFFFFFFFFFFFF000ui64) + 4088;
}
v10 += 8i64;
}
while( v10 < v23 );
if( v11 )
{
if( *(_DWORD *)&WsleFlushList[12] )
MiFreeWsleList(a3, (_MMWSLE_FLUSH_LIST *)WsleFlushList, 0i64);
MiUnlockPageTableInternal((INT64)a3, (UINT64)v11);
}
v12 = v20;
}
LOBYTE(v13) = v12;
MiUnlockWorkingSetShared(a3, v13);
}Referenced by:
HvTrimHive
MiDeprioritizeVad