MiPerformFixups
__int64 __fastcall MiPerformFixups(
ULONG_PTR BugCheckParameter3,
ULONG_PTR BugCheckParameter2,
unsigned int a3,
__int64 a4,
__int64 a5,
int a6){
__int64 result;
__int64 v8;
ULONG_PTR v9;
INT64 v11;
unsigned int v12;
_OWORD *v13;
unsigned __int64 v14;
INT64 v15;
__int64 v16;
bool v17;
int v18;
int v19;
ULONG_PTR v20;
__int64 v21;
UINT64 v22;
__int128 v23;
__int128 v24;
__int64 v25;
int SystemRegionType;
INT64 v27;
INT64 v28;
__int64 v29;
INT64 a7;
INT64 v31[2];
__int64 v32;
__int64 v33;
__int128 v34;
result = *(_QWORD *)(BugCheckParameter2 + 96);
v8 = a3;
v9 = BugCheckParameter2;
v11 = *(_QWORD *)(result + 32);
if( (unsigned __int64)a3 < *(_QWORD *)(v11 + 56) )
{
v12 = a3 << 12;
while( 1 )
{
result = *(_QWORD *)v11;
v13 = *(_OWORD **)(v11 + 96);
v14 = *(_QWORD *)(*(_QWORD *)v11 + 8 * v8);
if( v13 )
v15 = *((_QWORD *)v13 + v8 + 7);
else
v15 = 0i64;
if( v14 )
{
if( v14 > 1 )
{
v16 = *(_QWORD *)(*(_QWORD *)v11 + 8 * v8);
if( *(_BYTE *)(v11 + 68) )
MiApplyCompressedFixups(v9, BugCheckParameter3, v16, a4);
else
MiApplyRawFixups(v9, BugCheckParameter3, v16, a4);
}
LABEL_9:
v17 = (v14 & 1) == 0;
v18 = a6;
if( !v17 )
MiApplyStraddleFixups(v11, (CHAR *)BugCheckParameter3, v12, a4, a5, a6);
if( v15 )
{
v21 = *(_QWORD *)(*(_QWORD *)BugCheckParameter2 + 32i64);
if( a5 )
{
v29 = a5;
if( (a6 & 1) == 0 )
v29 = a4;
v22 = v21 + v29;
}
else
{
v22 = v21 + a4;
if( (a6 & 1) == 0 )
v22 = *(_QWORD *)(*(_QWORD *)BugCheckParameter2 + 32i64);
}
v23 = v13[1];
*(_OWORD *)v31 = *v13;
v24 = v13[2];
v25 = v23;
if( a5 )
v25 = 0i64;
v33 = *((_QWORD *)&v23 + 1);
v32 = v25;
v34 = v24;
SystemRegionType = MiGetSystemRegionType(v22);
if( SystemRegionType != 12 && SystemRegionType != 1 )
v18 = a6 | 1;
LODWORD(a7) = v18;
MiApplyRetpolineFixups(BugCheckParameter3, v27, v28, v12, (INT64)v31, v15, a7);
}
v19 = *(_DWORD *)(v11 + 64);
result = v19 & 0xFFFFF000;
if( (_DWORD)result == v12 )
{
v20 = BugCheckParameter3 + (v19 & 0xFFF);
if( (v20 & 1) != 0 )
*(_DWORD *)(v20 - 1) += a4;
else
*(_QWORD *)v20 += a4;
}
BugCheckParameter3 += 4096i64;
if( (BugCheckParameter3 & 0xFFF) == 0 )
return result;
v9 = BugCheckParameter2;
v8 = (unsigned int)(v8 + 1);
v12 += 4096;
}
else
{
if( v15 )
goto LABEL_9;
BugCheckParameter3 += 4096i64;
if( (BugCheckParameter3 & 0xFFF) == 0 )
return result;
v8 = (unsigned int)(v8 + 1);
v12 += 4096;
}
}
}
return result;
}Referenced by:
MiRelocateImagePfn
MiRevertRelocatedImagePfn
MiRevertRelocations