MiEvictPageTableLock
NTSTATUS __stdcall MiEvictPageTableLock(INT64 a1, UINT64 *a2, INT64 a3, CHAR a4){
unsigned __int64 v8;
__int64 v9;
__int64 v10;
UINT64 v12;
__int64 v13;
__int64 v14;
INT16 v15;
__int64 v16;
MiLockPageTableInternal(a1, (UINT64)a2, 0i64);
LODWORD(v8) = MiGetLeafVa((UINT64)a2);
if( v8 > 0x7FFFFFFEFFFFi64 )
{
v12 = *a2;
MiPteInShadowRange((UINT64)a2);
if( (unsigned __int16)LODWORD(MmGetPfnDb()[(v12 >> 12) & 0xFFFFFFFFFi64].u2._bf_0) == 1 )
{
v13 = (_QWORD)MmGetPteBase() << 25;
if( (a4 & 1) == 0
|| (LODWORD(v16) = RtlCompareMemoryUlong((VOID *)((((_QWORD)a2 << 25) - v13) >> 16), 4096, 0i64), v16 == 4096) )
{
if( (a4 & 2) == 0 )
goto LABEL_3;
v14 = (((_QWORD)a2 << 25) - v13) >> 16;
while( 1 )
{
v15 = MI_READ_PTE_LOCK_FREE(v14);
if( MiIsPoolPteInUse(v15) )
break;
v14 += 8i64;
if( (v14 & 0xFFF) == 0 )
goto LABEL_3;
}
}
}
}
else
{
v9 = (_QWORD)MmGetPteBase() << 25;
LODWORD(v10) = MiGetUsedPtesHandle((PSLIST_ENTRY)((((((_QWORD)a2 << 25) - v9) >> 16 << 25) - v9) >> 16));
if( (*(_DWORD *)(v10 + 16) & 0x3FF0000) == 0 )
{
LABEL_3:
MiUnlockNestedPageTableWritePte(a1, (INT64 *)a2, a3, 0i64);
return 1;
}
}
MiUnlockPageTableInternal(a1, (UINT64)a2);
return 0;
}Referenced by:
MiDeleteNonPagedPoolPte
MiDeleteSystemPageTable
MiDeleteVa
MiTerminateWsle