MiMakeSystemAddressValid
CHAR __fastcall MiMakeSystemAddressValid(UINT64 P4, INT64 a2, UINT64 a3, UINT8 a4, CHAR a5){
__int64 v5;
CHAR v6;
__int64 v8;
ULONG_PTR v9;
CHAR *AnyMultiplexedVm;
unsigned __int64 PteBase;
unsigned __int64 v12;
BOOL v13;
int v14;
_MMPTE *v15;
NTSTATUS v16;
ULONG_PTR v17;
_MMPTE *v18;
UINT64 v19;
INT64 *SharedVm;
INT64 *v22;
INT64 v23;
UINT8 v24;
v24 = a4;
v23 = a2;
v5 = a2;
v6 = a5;
v8 = (unsigned int)a3;
v9 = *((_QWORD *)KeGetCurrentThread() + 23);
if( (a5 & 4) != 0 )
AnyMultiplexedVm = MiGetAnyMultiplexedVm(2i64);
else
AnyMultiplexedVm = (CHAR *)(v9 + 1664);
PteBase = (unsigned __int64)MmGetPteBase();
v12 = (__int64)((P4 << 25) - (PteBase << 25)) >> 16;
v13 = v12 < PteBase || v12 > (unsigned __int64)MmGetPteLimit();
v14 = v6 & 1;
while( v14 )
{
LOBYTE(v15) = MmIsAddressValidEx(P4);
if( (_BYTE)v15 )
return(char)v15;
LABEL_13:
if( v5 )
MiFlushTbList(v5);
if( v14 )
MiUnlockWorkingSetExclusive((INT64)AnyMultiplexedVm, v24);
else
MiUnlockWorkingSetShared((INT64)AnyMultiplexedVm, v24);
v16 = MmAccessFault((v8 << 57) | 0x100000000000002i64, (PVOID)P4, 0, 0i64);
v17 = v16;
if( v16 < 0 )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x7Au, 1ui64, v17, v9, P4);
}
if( v14 )
{
SharedVm = MiGetSharedVm((INT64)AnyMultiplexedVm);
ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
}
else
{
MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
}
v5 = v23;
}
if( v13 )
{
LODWORD(v15) = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v12);
if( (_DWORD)v15 )
{
if( (_DWORD)v15 == 1 )
return(char)v15;
v18 = MmGetPteBase();
v19 = (UINT64)v18 + ((P4 >> 9) & 0x7FFFFFFFF8i64);
while( (int)v15 != 1i64 )
v19 = (UINT64)v18 + ((v19 >> 9) & 0x7FFFFFFFF8i64);
MiUnlockPageTable((INT64)AnyMultiplexedVm, v19);
}
}
v15 = MiLockLowestValidPageTable((INT64)AnyMultiplexedVm, (INT64 *)P4, &v22);
if( v15 != (_MMPTE *)((char *)MmGetPteBase() + ((P4 >> 9) & 0x7FFFFFFFF8i64)) )
{
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, (UINT64)v15);
goto LABEL_13;
}
return(char)v15;
}Referenced by:
MiAddPagesToEnclave
MiBuildForkPte
MiCaptureDeleteHierarchy
MiCommitEnclavePages
MiCommitHotPatchTable
MiCopyToUserVa
MiDecommitHardwareEnclavePages
MiDecommitPages
MiFillHyperPtes
MiHandleForkTransitionPte
MiInsertViewOfPhysicalSection
MiLockPageTableRange
MiLockPagedAddress
MiMakeProtoLeafValid
MiMapLockedPagesInUserSpaceHelper
MiMapUserLargePages
MiPrepareImagePagesForHotPatch
MiProtectEnclavePages
MiProtectPrivateMemory
MiSetReadOnlyOnSectionView
MiSoftFaultMappedView
MiSplitPrivatePage
MiUpdateForkMaps
MiUpdatePrivateDemandZeroView
MiWorkingSetInfoCheckPageTable
MiWriteAwePtes
MiWriteEnclavePte
NtLockVirtualMemory