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