MiEvictPageTableLock
INT64 __fastcall MiEvictPageTableLock(INT64 a1, volatile UINT64 *a2, INT64 a3, CHAR a4){
__int64 v8;
volatile UINT64 v10;
__int64 v11;
__int64 v12;
INT16 v13;
MiLockPageTableInternal(a1, (UINT64)a2, 0i64);
if( MiGetLeafVa((UINT64)a2) > 0x7FFFFFFEFFFFi64 )
{
v10 = *a2;
MiPteInShadowRange((UINT64)a2);
if( (unsigned __int16)*((_DWORD *)MmGetPfnDb() + 12 * ((v10 >> 12) & 0xFFFFFFFFFi64) + 6) == 1 )
{
v11 = (_QWORD)MmGetPteBase() << 25;
if( (a4 & 1) == 0 || RtlCompareMemoryUlong((PVOID)((((_QWORD)a2 << 25) - v11) >> 16), 0x1000ui64, 0) == 4096 )
{
if( (a4 & 2) == 0 )
goto LABEL_3;
v12 = (((_QWORD)a2 << 25) - v11) >> 16;
while( 1 )
{
v13 = MI_READ_PTE_LOCK_FREE(v12);
if( (unsigned int)MiIsPoolPteInUse(v13) )
break;
v12 += 8i64;
if( (v12 & 0xFFF) == 0 )
goto LABEL_3;
}
}
}
}
else
{
v8 = (_QWORD)MmGetPteBase() << 25;
if( (*((_DWORD *)MiGetUsedPtesHandle((((((_QWORD)a2 << 25) - v8) >> 16 << 25) - v8) >> 16) + 4) & 0x3FF0000) == 0 )
{
LABEL_3:
MiUnlockNestedPageTableWritePte(a1, (volatile INT64 *)a2, a3, 0i64);
return 1i64;
}
}
MiUnlockPageTableInternal(a1, (UINT64)a2);
return 0i64;
}Referenced by:
MiDeleteNonPagedPoolPte
MiDeleteSystemPageTable
MiDeleteVa
MiTerminateWsle