MiApplyRetpolineFixups
_BYTE *__fastcall MiApplyRetpolineFixups(
UINT64 a1,
__int64 a2,
__int64 a3,
unsigned int a4,
INT64 a5,
__int64 a6,
int a7){
int v9;
int v10;
_BYTE *result;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
UINT64 *v15;
unsigned int v16;
INT64 v17;
INT64 v18;
INT64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
INT64 v22;
int v23;
__int16 v24;
v9 = 0;
v10 = (a7 & 8) != 0 ? 2 : 0;
if( (a7 & 8) == 0 )
v9 = (a7 & 1) == 0;
if( (KiSpeculationFeatures & 0x2000000) == 0 )
LOBYTE(v10) = v10 | 1;
switch( *(_WORD *)(a6 + 6) )
{
case 3:
LODWORD(v19) = 1;
LODWORD(v18) = v9;
RtlApplyImportRelocationToPage(a1, a4, a5, qword_140C4C9A8, (UINT64 *)(a6 + 8), v18, v19, v10);
break;
case 4:
RtlApplyIndirectRelocationToPage(a1, a4, (_DWORD *)a5, qword_140C4C9A8, a6 + 8, v9, 1);
break;
case 5:
RtlApplySwitchJumpRelocationToPage(a1, a4, (_DWORD *)a5, qword_140C4C9A8, a6 + 8, v9, 1);
break;
}
result = (_BYTE *)(a6 + 12);
v12 = a6 + 12 + *(unsigned __int16 *)a6;
v13 = v12 + *(unsigned __int16 *)(a6 + 2);
v14 = v13 + *(unsigned __int16 *)(a6 + 4);
v20 = v13;
v21 = v14;
if( a6 + 12 < v12 )
{
v15 = (UINT64 *)(a6 + 12);
do
{
v16 = *(_DWORD *)v15 & 0xFFF;
v22 = 0i64;
v23 = 0;
v24 = 0;
LODWORD(v17) = v9;
RtlpConstructImportRelocationFixup(v16 + a4, a5, qword_140C4C9A8, v15, v17, v10, (INT64)&v22);
result = RtlpApplyGenericRetpolineFixup(a1, 0x1000ui64, &v22, v16);
v15 = (UINT64 *)((char *)v15 + 4);
}
while( (unsigned __int64)v15 < v12 );
v13 = v20;
v14 = v21;
}
while( v12 < v13 )
{
result = RtlApplyIndirectRelocationToPage(a1, a4, (_DWORD *)a5, qword_140C4C9A8, v12, v9, 0);
v12 += 2i64;
}
while( v13 < v14 )
{
result = RtlApplySwitchJumpRelocationToPage(a1, a4, (_DWORD *)a5, qword_140C4C9A8, v13, v9, 0);
v13 += 2i64;
}
return result;
}Referenced by:
MiPerformFixups
MmRemoveImportOptimizationWorker