MxMapVa

UINT64 __stdcall MxMapVa(_MX_MAP_PACKET *MapPacket){
  int v1; 
  UINT64 v3; 
  _MX_MAP_PACKET i; 
  UINT64 v5; 
  INT64 NextPage; 
  __int64 v8; 
  __int64 v9; 
  int v10; 
  _MMPTE *PteBase; 
  _MX_MAP_PACKET v12; 
  void *v13; 
  __int64 v14; 
  __int64 v15; 
  int v16; 
  __int64 v17[2]; 
  __int128 v18; 

  v1 = 0;
  v3 = *(_QWORD *)MapPacket;
  *(_OWORD *)v17 = 0i64;
  if( *(&stru_140C50B28 + 853) > 0x20000ui64 )
    v1 = 1;
  v18 = 0i64;
  MiFillPteHierarchy(v3, (UINT64 *)v17);
  for( i = 3; ; --i )
  {
    v5 = v17[i];
    if( (*(_QWORD *)v5 & 1) == 0 )
      break;
    if( !i )
      return 1i64;
    if( (*(_QWORD *)v5 & 0x80u) != 0i64 )
    {
      MapPacket[8] = i;
      return 1i64;
    }
LABEL_7:
    if( !i )
      return 1i64;
  }
  if( i == 1 && v1 == 1 )
  {
    NextPage = MxGetNextPage((unsigned int)MapPacket[2], 1ui64);
    if( NextPage != -1 )
    {
      *(&stru_140C4DB30 + 573) += 512i64;
      LODWORD(v8) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v5, NextPage, 3019898884i64);
      v9 = v8;
      LOBYTE(v10) = MiPteInShadowRange(v5);
      if( v10 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v9 & 1) != 0 )
        v9 |= 0x8000000000000000ui64;
      *(_QWORD *)v5 = v9;
      PteBase = MmGetPteBase();
      v12 = MapPacket[3];
      if( !v12 )
      {
        if( (_MMPTE *)v5 != (_MMPTE *)((char *)PteBase + ((*((_QWORD *)MapPacket + 2) >> 9) & 0x7FFFFFFFF8i64))
          && (_MMPTE *)v5 != (_MMPTE *)((char *)PteBase + ((*((_QWORD *)MapPacket + 3) >> 9) & 0x7FFFFFFFF8i64)) )
        {
          goto LABEL_18;
        }
        v12 = 1;
      }
      if( v12 == 1 )
        KeZeroPages(
          (VOID *)((((__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16 << 25) - ((_QWORD)PteBase << 25)) >> 16),
          0x200000ui64);
LABEL_18:
      MapPacket[8] = 1;
      return 1i64;
    }
  }
  v13 = (void *)MxGetNextPage((unsigned int)MapPacket[2], 0i64);
  if( v13 != (void *)-1i64 )
  {
    ++*(&stru_140C4DB30 + 573);
    if( i || MapPacket[3] == 1 )
      MiFillPhysicalPages(v13);
    LODWORD(v14) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v5, (INT64)v13, i != 0 ? -1744830460 : -1342177276);
    v15 = v14;
    LOBYTE(v16) = MiPteInShadowRange(v5);
    if( v16 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v15 & 1) != 0 )
      v15 |= 0x8000000000000000ui64;
    *(_QWORD *)v5 = v15;
    goto LABEL_7;
  }
  return 0i64;
}

Referenced by:

MxMapPfnRange