MiMapContiguousMemory

INT8 *__fastcall MiMapContiguousMemory(unsigned __int64 a1, _EPROCESS *a2, unsigned int a3, INT64 a4){
  char v4; 
  unsigned int v5; 
  char *v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned int v10; 
  int v11; 
  _MMPTE *v12; 
  int v13; 
  _KTBFLUSH_TYPE v14; 
  INT8 *v15; 
  unsigned int v16; 
  UINT64 v18; 
  _MI_PFN_CACHE_ATTRIBUTE v19; 
  void *v20; 
  unsigned int v21; 
  INT64 a5; 
  int a6; 
  int v24; 
  INT64 a3a; 
  unsigned __int64 v26; 
  _EPROCESS *v27; 
  _MDL MemoryDescriptorList; 
  unsigned __int64 v29; 

  v27 = a2;
  v4 = a4;
  v5 = a3;
  if( a3 == -1 )
    return 0i64;
  if( a3 == 24 )
    return 0i64;
  if( (a3 & 5) == 5 )
    return 0i64;
  if( (a3 & 0xFFFFFFF8) == 16 )
    return 0i64;
  v7 = &a2->Pcb.gap0[a1];
  if( (unsigned __int64)v7 <= a1 )
  {
    if( v7 )
      return 0i64;
  }
  v26 = a1 & 0xFFF;
  v8 = ((unsigned __int64)&a2[1].SecurityPort + v26 + 7) >> 12;
  v9 = (a1 >> 12) & 0xFFFFFFFFFi64;
  if( a1 >> 12 < 0x1000000000i64 )
    v9 = a1 >> 12;
  a3a = v9;
  if( (a3 & 2) != 0 && (MiFlags & 0x10000) != 0 )
    v5 = a3 & 0xFFFFFFFD;
  a6 = 0;
  if( (a1 & 0x1FFFFF) != 0
    || (unsigned __int64)a2 < 0x200000
    || (v11 = a4 & 1, (a4 & 1) != 0)
    || (v15 = MiMapContiguousMemoryLarge(
                v9,
                ((unsigned __int64)&a2[1].SecurityPort + (a1 & 0xFFF) + 7) >> 12,
                v5,
                a4,
                (INT64)&a6)) == 0i64 )
  {
    v24 = 0;
    v10 = v8;
    v11 = v4 & 1;
    if( (v4 & 1) != 0 )
    {
      v10 = v8 + 1;
      if( (_DWORD)v8 == -1 )
        return 0i64;
      v24 = 1;
    }
    v12 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v10);
    if( v12 )
    {
      v13 = v24 | 2;
      if( (v4 & 2) == 0 )
        v13 = v24;
      LODWORD(a5) = v13;
      if( MiFillSystemPtes((UINT64)v12, v8, a3a, v5, a5, (INT64)&a6) >= 0 )
      {
        v15 = (INT8 *)(v26 + ((__int64)(((_QWORD)v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
        goto LABEL_16;
      }
      MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v12, v10, v14);
    }
    return 0i64;
  }
LABEL_16:
  v16 = a6 & 1;
  if( (a6 & 1) != 0 )
    MiMappingHasIoReferences(v15);
  if( (dword_140CFA17C & 1) != 0 )
  {
    MemoryDescriptorList.Next = 0i64;
    *(_QWORD *)&MemoryDescriptorList.Size = 0i64;
    MemoryDescriptorList.ByteCount = 0;
    v18 = v16 | 2;
    v29 = a1 >> 12;
    v19 = MiCached;
    MemoryDescriptorList.MappedSystemVa = v15;
    v20 = (void *)(a1 & 0xFFFFFFFFFFFFF000ui64);
    v21 = a1 & 0xFFF;
    MemoryDescriptorList.StartVa = v20;
    MemoryDescriptorList.Process = v27;
    if( !v11 )
      v18 = v16;
    MemoryDescriptorList.ByteOffset = v21;
    if( v5 >> 3 == 1 )
    {
      v19 = MiNonCached;
    }
    else if( v5 >> 3 == 3 && (v5 & 7) != 0 )
    {
      v19 = MiWriteCombined;
    }
    MiInsertPteTracker(&MemoryDescriptorList, MiPteTrackerContiguous, v18, v19);
  }
  return v15;
}

Referenced by:

MiAllocateContiguousMemory
MmMapIoSpaceEx