MiDeprioritizeVirtualAddresses
INT64 __fastcall MiDeprioritizeVirtualAddresses(UINT64 a1, INT64 a2, INT64 a3, CHAR a4){
int v8;
_MMPTE *PteBase;
unsigned __int64 v10;
MMPTE *v11;
INT64 v12;
UINT8 v13;
unsigned __int64 v14;
char *v15;
__int64 v16;
char v17;
__int64 v18;
UINT8 v20;
UINT64 SpinCount;
unsigned __int64 v22;
INT64 *v23;
int result;
__int16 result_4;
int v26;
int v27;
__int64 v28;
__int64 v29;
memset((INT64)&result, 0i64);
v8 = MiTbFlushType(a3);
v28 = 0i64;
v29 = 0i64;
result = v8;
HIDWORD(SpinCount) = dword_140C4E568;
result_4 = 4;
v26 = 20;
PteBase = MmGetPteBase();
v10 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
v11 = 0i64;
v22 = v10 + 8 * a2;
v13 = MiLockWorkingSetShared(v12);
v20 = v13;
if( v10 < v22 )
{
do
{
v14 = v10 >> 9;
if( v11 )
{
if( v11 != (_MMPTE *)((char *)PteBase + (v14 & 0x7FFFFFFFF8i64)) )
{
if( v27 )
MiFreeWsleList(a3, (INT64)&result, 0);
MiUnlockPageTableInternal(a3, (UINT64)v11);
v11 = 0i64;
}
if( v11 )
goto LABEL_10;
}
v11 = MiLockLowestValidPageTable(a3, (INT64 *)v10, &v23);
if( v11 == (_MMPTE *)((char *)PteBase + (v14 & 0x7FFFFFFFF8i64)) )
{
LABEL_10:
if( (*(_BYTE *)v10 & 1) != 0 )
{
v15 = (char *)MmGetPfnDb() + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE(v10) >> 12) & 0xFFFFFFFFFi64);
v16 = (__int64)((v10 << 25) - ((_QWORD)PteBase << 25)) >> 16;
v17 = MiGetWsleContents(0xFFFFFFFFFi64, v16) & 0xF;
if( v17 != 9 )
{
if( (*((_QWORD *)v15 + 5) & 0x1000000000i64) == 0 )
{
v18 = *((_QWORD *)v15 + 1);
if( v18 > 0 )
MiDemoteCombinedPte((_MMSUPPORT_INSTANCE *)a3, (_MMPTE *)v10, (_MMPTE *)(v18 | 0x8000000000000000ui64));
}
if( (a4 & 8) == 0 && (a4 & 7) != (unsigned int)MiGetPfnPriority((INT64)v15) )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v15 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v15 + 3) < 0 );
}
MiUpdatePfnPriority((INT64)v15);
_InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
if( (a4 & 0x10) != 0 && v17 != 8 )
{
if( HIDWORD(SpinCount) )
MI_WSLE_LOG_ACCESS(a3, v10);
MiInsertTbFlushEntry((INT64)&result, v16, 1i64, 0i64);
if( v27 == v26 )
MiFreeWsleList(a3, (INT64)&result, 0);
}
}
PteBase = MmGetPteBase();
}
}
else
{
MiUnlockPageTableInternal(a3, (UINT64)v11);
v11 = 0i64;
v10 = (v10 & 0xFFFFFFFFFFFFF000ui64) + 4088;
}
v10 += 8i64;
}
while( v10 < v22 );
if( v11 )
{
if( v27 )
MiFreeWsleList(a3, (INT64)&result, 0);
MiUnlockPageTableInternal(a3, (UINT64)v11);
}
v13 = v20;
}
return MiUnlockWorkingSetShared(a3, v13);
}Referenced by:
HvTrimHive
MiDeprioritizeVad