MiRelocateImageAgain

INT64 __fastcall MiRelocateImageAgain(INT64 a1, INT64 rdx0){
  __int64 v2; 
  int v3; 
  __int64 v5; 
  __int64 v6; 
  _MMPTE *v7; 
  int v8; 
  void *v10; 
  UINT64 v11; 
  void *v12; 
  INT64 v13; 
  int v14; 
  unsigned int SessionId; 
  INT64 v16; 
  __int128 v17; 
  INT64 a2; 
  _ETHREAD *CurrentThread; 
  v2 = *(_QWORD *)(a1 + 96);
  v3 = rdx0;
  a2 = 0i64;
  v5 = *(_QWORD *)(v2 + 32);
  if( !v5 )
    return 0i64;
  v16 = -1i64;
  v6 = *(_QWORD *)a1;
  v17 = 0i64;
  v7 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = 0;
  MI_LOCK_RELOCATIONS_EXCLUSIVE((__int64)CurrentThread, v5);
  if( (*(_DWORD *)(a1 + 92) & 0x400000) == 0 )
  {
    v10 = *(void **)(v6 + 32);
    v7 = (_MMPTE *)MiReservePtes((INT64)&qword_140C4EC80, 1ui64);
    if( !v7 )
    {
      *(_DWORD *)(a1 + 92) |= 0x400000u;
      goto LABEL_3;
    }
    v8 = MiSelectImageBase(v6, v5, v3, 0, &a2);
    if( v8 >= 0 )
    {
      *(_DWORD *)(a1 + 92) |= 0x400000u;
      LODWORD(v11) = MiGetControlAreaLoadConfig((LARGE_INTEGER *)a1);
      v12 = (void *)a2;
      MiUpdateCfgSystemWideBitmap(v13, a2, v11);
      v8 = v14;
      if( v14 >= 0 )
      {
        if( v12 == v10 )
        {
LABEL_10:
          v8 = 0;
          goto LABEL_3;
        }
        if( (MiFlags & 0x4000) == 0 || (*(_DWORD *)(a1 + 92) & 0xC0000) == 0 )
        {
LABEL_13:
          if( v3 )
          {
            SessionId = -1;
          }
          else
          {
            SessionId = MmGetSessionIdEx(*((_QWORD *)KeGetCurrentThread() + 23));
            v12 = (void *)a2;
          }
          MiSwitchBaseAddress((_CONTROL_AREA *)a1, v12, v7, SessionId);
          goto LABEL_10;
        }
        if( qword_140C1D940 )
        {
          v8 = qword_140C1D940(*(_QWORD *)(v2 + 40) & 0xFFFFFFFFFFFFFFF8ui64, v12);
          if( v8 >= 0 )
            goto LABEL_13;
        }
        else
        {
          v8 = -1073741637;
        }
      }
      MiImageUnused(a1, 0i64, (INT64)&v16);
    }
  }
LABEL_3:
  MI_UNLOCK_RELOCATIONS_EXCLUSIVE((__int64)CurrentThread, v5);
  if( v7 )
    MiReleasePtes((INT64)&qword_140C4EC80, (INT64)v7, 1ui64);
  MiReturnImageBase((INT64)&v16);
  return(unsigned int)v8;
}

Referenced by:

MiValidateExistingImage