MiSelectImageBase

__int64 __fastcall MiSelectImageBase(__int64 a1, __int64 a2, int a3, int a4, __int64 *a5){
  INT64 v5; 
  int v6; 
  int v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  UINT64 v15; 
  unsigned int v16; 
  bool v17; 
  UINT64 v18; 
  UINT64 v19; 
  __int64 v20; 
  int v21; 
  int ImageWowSubsystemIndex; 
  unsigned __int64 v24; 
  INT64 v25; 
  unsigned __int64 v26; 
  unsigned int v27; 
  UINT64 Bias; 
  RTL_BITMAP *Bitmap[2]; 
  __int64 v30; 
  unsigned int v31; 
  v31 = a3;
  v5 = *(_QWORD *)a1;
  v6 = 0;
  v8 = a4;
  Bias = 0i64;
  v9 = *(_QWORD *)(a1 + 56);
  v10 = a2;
  v11 = 0i64;
  v30 = v9;
  if( (*(_BYTE *)(a1 + 14) & 0x40) == 0 )
  {
    if( (*(_BYTE *)(v9 + 51) & 0x10) != 0 && (*(_WORD *)(v9 + 44) & 0x2000) != 0 )
    {
      v12 = 2;
      goto LABEL_6;
    }
    if( *(_QWORD *)(a1 + 32) < 0x100000000ui64 )
    {
      v12 = 1;
LABEL_6:
      *(_DWORD *)(v5 + 92) ^= (*(_DWORD *)(v5 + 92) ^ (v12 << 20)) & 0x300000;
      v9 = *(_QWORD *)(a1 + 56);
      v30 = v9;
      goto LABEL_7;
    }
    v12 = 0;
LABEL_5:
    v30 = v9;
    if( v12 == 4 )
      goto LABEL_7;
    goto LABEL_6;
  }
  ImageWowSubsystemIndex = MiGetImageWowSubsystemIndex(a1);
  if( ImageWowSubsystemIndex != -1 )
  {
    v12 = ImageWowSubsystemIndex + 3;
    goto LABEL_5;
  }
  v12 = 4;
LABEL_7:
  LODWORD(v13) = *(_DWORD *)(a1 + 8);
  if( !a3 )
  {
    if( !dword_140C4C9F0 )
      goto LABEL_9;
    v27 = ((unsigned int)MiUserHotPatchReserveSize >> 12) + ((MiUserHotPatchReserveSize & 0xFFF) != 0);
    if( !v27 )
      goto LABEL_9;
    if( v27 + (unsigned int)v13 >= (unsigned int)v13 )
    {
      LODWORD(v13) = v27 + v13;
      goto LABEL_9;
    }
    return 3221225503i64;
  }
  LOBYTE(v24) = MiBytesToMapSystemImage((_FAST_MUTEX *)(unsigned int)((_DWORD)v13 << 12));
  if( !v24 )
    return 3221225503i64;
  a3 = v31;
  v13 = v24 >> 12;
LABEL_9:
  v14 = -1i64;
  if( v8 == 1 )
  {
    LOWORD(v16) = 0;
    v11 = *(_QWORD *)(a1 + 32);
    goto LABEL_27;
  }
  v15 = *(_QWORD *)(a1 + 32) - *(_QWORD *)(v10 + 40);
  v16 = (unsigned int)(v13 + 15) >> 4;
  if( !a3 )
  {
    if( (*(_WORD *)(v9 + 44) & 0x2000) != 0 )
    {
      *(_OWORD *)Bitmap = 0i64;
      v17 = v12 != 4;
      if( dword_140CFA190 && MiImageCanUseHighOverflowArea(a1, v15) )
        v17 = 0;
      if( v17 )
      {
        MiGetImageBitMapInfo((RTL_BITMAP **)v12, (UINT64 *)Bitmap, &Bias);
        MiSelectRelocationStartHint(Bitmap, v16, 0i64, 0i64);
        v14 = v18;
        if( v18 == -1i64 )
        {
          v9 = v30;
        }
        else
        {
          MiObtainRelocationBits(Bitmap, v16, v18, v19);
          v9 = v30;
          v14 = v20;
          if( v20 != -1 )
            v11 = Bias - ((v20 + (unsigned __int16)v16) << 16);
        }
      }
    }
    if( v14 != -1 )
      goto LABEL_18;
    v21 = *(_DWORD *)(v5 + 92);
    if( (v21 & 0x800000) != 0 )
    {
      v11 = *(_QWORD *)(a1 + 32);
      v6 = 1;
      goto LABEL_20;
    }
    if( v12 )
    {
      if( (*(_WORD *)(v9 + 44) & 0x2000) != 0 )
      {
        v11 = MiSelectOverflowDllBase(a1, v15);
      }
      else
      {
        v26 = (unsigned __int64)(unsigned __int8)ExGenRandom(1i64) << 16;
        v11 = v15 - v26;
        if( v15 < 0x1000000 )
          v11 = v26 + 0x10000;
      }
    }
    else
    {
      v11 = ((unsigned int)ExGenRandom(1i64) % (131073i64 - (unsigned __int16)v16) + 2146828288) << 16;
    }
LABEL_27:
    v6 = 1;
LABEL_18:
    *(_DWORD *)(v5 + 88) = v14;
    *(_WORD *)(v5 + 92) = v16;
LABEL_19:
    v21 = *(_DWORD *)(v5 + 92);
LABEL_20:
    *(_DWORD *)(v5 + 92) = (v6 << 23) | v21 & 0xFF7FFFFF;
    *a5 = v11;
    return 0i64;
  }
  v25 = MiSelectSystemImageAddress((unsigned int)a3, (unsigned int)v13);
  v11 = v25;
  if( v25 )
  {
    *(_WORD *)(v5 + 92) = v16;
    *(_DWORD *)(v5 + 88) = (unsigned __int64)(v25 + 0x800000000000i64) >> 16;
    MiSetControlAreaSystemVa(v5, v31);
    goto LABEL_19;
  }
  return 3221225626i64;
}

Referenced by:

MiRelocateImage
MiRelocateImageAgain