MiApplyRetpolineFixups
BYTE *__fastcall MiApplyRetpolineFixups(UINT64 a1, INT64 a2, INT64 a3, UINT64 a4, INT64 a5, INT64 a6, INT64 a7){
unsigned int v7;
BOOL v9;
int v10;
BYTE *result;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
UINT64 *v15;
unsigned int v16;
INT64 a5a;
INT64 a6a;
INT64 a7a;
unsigned __int64 v20;
unsigned __int64 v21;
INT64 v22;
int v23;
__int16 v24;
v7 = a4;
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(a7a) = 1;
LODWORD(a6a) = v9;
RtlApplyImportRelocationToPage(a1, (unsigned int)a4, a5, (INT64)Base, (UINT64 *)(a6 + 8), a6a, a7a, v10);
break;
case 4:
LODWORD(a7a) = 1;
LODWORD(a6a) = v9;
RtlApplyIndirectRelocationToPage(a1, (unsigned int)a4, (_DWORD *)a5, (INT64)Base, a6 + 8, a6a, a7a);
break;
case 5:
LODWORD(a7a) = 1;
LODWORD(a6a) = v9;
RtlApplySwitchJumpRelocationToPage(a1, (unsigned int)a4, (_DWORD *)a5, (INT64)Base, a6 + 8, a6a, a7a);
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(a5a) = v9;
RtlpConstructImportRelocationFixup(v16 + v7, a5, (INT64)Base, v15, a5a, 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 )
{
LODWORD(a7a) = 0;
LODWORD(a6a) = v9;
result = RtlApplyIndirectRelocationToPage(a1, v7, (_DWORD *)a5, (INT64)Base, v12, a6a, a7a);
v12 += 2i64;
}
while( v13 < v14 )
{
LODWORD(a7a) = 0;
LODWORD(a6a) = v9;
result = RtlApplySwitchJumpRelocationToPage(a1, v7, (_DWORD *)a5, (INT64)Base, v13, a6a, a7a);
v13 += 2i64;
}
return result;
}Referenced by:
MiPerformFixups
MmRemoveImportOptimizationWorker