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