MiValidVirtualizationFault
__int64 __fastcall MiValidVirtualizationFault(unsigned __int64 *a1, __int64 a2, __int64 a3){
UINT64 *VirtualFaultPageInfo;
INT64 v7;
INT64 v8;
int v9;
INT64 v10;
unsigned int v12;
_MMPFN *PfnDb;
__int64 v14;
int v15;
unsigned int v16;
unsigned __int64 v17;
INT64 v18;
__int64 v19;
VirtualFaultPageInfo = (UINT64 *)MiGetVirtualFaultPageInfo(a2, *a1);
v7 = MI_READ_PTE_LOCK_FREE(a3);
v9 = *(_DWORD *)(a2 + 56);
v10 = v7;
v18 = v7;
if( (v9 & 1) != 0 && (v7 & 0x42) == 0 )
return 0i64;
v12 = 1;
if( (v9 & 0x20) != 0 )
{
PfnDb = MmGetPfnDb();
v14 = (__int64)PfnDb + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v18) >> 12) & 0xFFFFFFFFFi64);
v19 = v14;
if( (*(_QWORD *)(v14 + 40) & 0x1000000000i64) == 0 && *(__int64 *)(v14 + 8) > 0 )
{
v15 = MiCopyOnWrite(((a3 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, (UINT64 *)a3, -1i64, 0i64);
if( v15 < 0 )
{
MiSetFaultPacketDirectives((INT64)a1, (unsigned int)v15);
return 0i64;
}
v18 = MI_READ_PTE_LOCK_FREE(a3);
v19 = (__int64)PfnDb + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v18) >> 12) & 0xFFFFFFFFFi64);
}
v16 = MiCompleteSecureProcessFault(&v19, &v18, (__int64 *)(a2 + 48));
v10 = v18;
v12 = v16;
}
if( (v10 & 0x20) == 0 )
{
MiPerformSafePdeWrite(v8, (INT64 *)a3, v10, 1);
v10 = MI_READ_PTE_LOCK_FREE(a3);
v18 = v10;
}
if( v12 )
{
v17 = MI_READ_PTE_LOCK_FREE((INT64)&v18);
MiFillVirtualFaultInfo(VirtualFaultPageInfo, (v17 >> 12) & 0xFFFFFFFFFi64, v10);
}
return v12;
}Referenced by:
MiLargePageFault
MiValidFault