MiMapSystemImage

VOID __fastcall MiMapSystemImage(_SECTION *Section, VOID *MappedBase, UINT64 LoadFlags){
  _SECTION *v6; 
  _CONTROL_AREA *v7; 
  UINT64 TotalNumberOfPtes; 
  char v9; 
  int v10; 
  unsigned int v11; 
  _MMPTE *v12; 
  char *v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned int v16; 
  INT64 v17; 
  INT64 v18; 
  _MMPTE *PteAddress; 
  _MMPTE *v20; 
  int v21; 
  _MMPTE *v22; 
  UINT64 SessionId; 
  INT64 v24; 
  _MMPTE *v25; 
  _LARGE_INTEGER SectionOffset; 

  SectionOffset.QuadPart = 0i64;
  v7 = MiSectionControlArea(Section);
  TotalNumberOfPtes = v7->Segment->TotalNumberOfPtes;
  if( (v9 & 1) == 0 )
  {
    v10 = 1;
    v11 = -1;
    if( MiChargeSystemImageCommitment(v6, 1ui64) < 0 )
      return;
    goto LABEL_3;
  }
  LOBYTE(v14) = MiBytesToMapSystemImage((_FAST_MUTEX *)(TotalNumberOfPtes << 12));
  v15 = v14;
  if( !v14 )
    return;
  v10 = 0;
  v16 = MmGetSessionIdEx(KeGetCurrentThread()->ApcState.Process);
  v11 = v16;
  if( (v7->u.LongFlags & 0x4000000) != 0 )
  {
    MiCreatePerSessionProtos(v7, v16, v17, v18, SessionId, v24);
    if( v21 < 0 )
      return;
  }
  MiGetPteAddress((char *)MappedBase + v15 - 1);
  PteAddress = MiGetPteAddress(MappedBase);
  if( MiMakeZeroedPageTables(PteAddress, v20, 1ui64, MiVaSessionSpace) )
  {
LABEL_3:
    v12 = MiGetPteAddress(MappedBase);
    v13 = 0i64;
    v25 = v12;
    if( LoadFlags )
    {
      v13 = (char *)MappedBase + 4096 * (unsigned __int64)v7->Segment->TotalNumberOfPtes;
      if( MiMapPatchTable(v13, LoadFlags) < 0 )
      {
LABEL_22:
        if( v10 == 1 )
        {
          MiChargeSystemImageCommitment(Section, 0i64);
        }
        else if( (v7->u.LongFlags & 0x4000000) != 0 )
        {
          MiDereferencePerSessionProtos(v7, v11);
        }
        if( MiGetSystemRegionType((UINT64)MappedBase) == 1 && MappedBase != v7->Segment->BasedAddress )
          MiDeleteSessionDriverProtos(v7);
        return;
      }
      v12 = v25;
    }
    LODWORD(SessionId) = v11;
    if( MiAddMappedPtes(v12, TotalNumberOfPtes, v7, &SectionOffset, SessionId) >= 0 )
    {
      if( v10 == 1 )
        _InterlockedExchangeAdd((_DWORD *)&xmmword_140C4CA88 + 3, TotalNumberOfPtes);
      return;
    }
    if( v13 )
    {
      v22 = MiGetPteAddress(v13);
      MiUnmapPatchTable((UINT64)v22);
    }
    goto LABEL_22;
  }
  if( (v7->u.LongFlags & 0x4000000) != 0 )
    MiDereferencePerSessionProtos(v7, v11);
}

Referenced by:

MiApplyHotPatchToLoadedDriver
MmLoadSystemImageEx