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