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