RtlPerformRetpolineRelocationsOnImageEx

INT64 __fastcall RtlPerformRetpolineRelocationsOnImageEx(
        PVOID Base,
        INT64 a2,
        UINT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9){
  char *v9; 
  INT64 v10; 
  unsigned __int64 v11; 
  _DWORD *v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned int v15; 
  INT64 result; 
  char *v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned int *v21; 
  unsigned int v22; 
  unsigned __int64 v23; 
  UINT64 *v24; 
  INT64 v25; 
  unsigned __int64 v26; 
  unsigned int *v27; 
  unsigned __int64 v28; 
  UINT16 *v29; 
  INT64 v30; 
  unsigned int v31; 
  unsigned __int64 v32; 
  unsigned int *v33; 
  unsigned __int64 v34; 
  unsigned int *v35; 
  unsigned int v36; 
  INT64 v37; 
  INT64 v38; 
  unsigned int v39; 
  unsigned __int64 v40; 
  unsigned __int64 v41; 
  unsigned __int64 v42; 
  _DWORD a2a[4]; 
  __int128 v44; 
  __int128 v45; 
  INT64 v46; 
  int v47; 
  __int16 v48; 
  INT64 v49; 
  int v50; 
  __int16 v51; 
  LODWORD(v46) = 0;
  v9 = (char *)Base;
  v10 = a7;
  v11 = 0i64;
  v12 = (_DWORD *)a8;
  v13 = 0i64;
  v49 = (INT64)Base;
  v14 = 0i64;
  v15 = a3;
  v39 = a3;
  *(_OWORD *)a2a = 0i64;
  v44 = 0i64;
  v45 = 0i64;
  result = RtlpCaptureRetpolineBinaryInfoForImage(
             Base,
             a2,
             a3,
             a4 & -(__int64)((_DWORD)a6 != 0),
             a5 & -(__int64)((_DWORD)a6 != 0),
             (INT64)a2a);
  if( (int)result >= 0 )
  {
    result = RtlpCaptureDynamicRelocationTableRva(v9, v15, &v46);
    if( (int)result >= 0 )
    {
      v17 = &v9[(unsigned int)v46];
      v18 = (unsigned __int64)&v17[*((unsigned int *)v17 + 1) + 8];
      v19 = (unsigned __int64)(v17 + 8);
      if( v19 >= v18 )
        return 3221225659i64;
      do
      {
        switch( *(_QWORD *)v19 )
        {
          case 3i64:
            v11 = v19;
            break;
          case 4i64:
            v13 = v19;
            break;
          case 5i64:
            v14 = v19;
            break;
        }
        v19 += *(unsigned int *)(v19 + 8) + 12i64;
      }
      while( v19 < v18 );
      v42 = v14;
      if( v11 )
      {
        v20 = *(unsigned int *)(v11 + 8) + v11 + 12;
        v21 = (unsigned int *)(v11 + 12);
        v46 = v20;
        if( (unsigned __int64)v21 < v20 )
        {
          v22 = v15;
          do
          {
            if( !RtlpIsAddressInIgnoreRegion(*v21, v10, v12, (unsigned int)a9) )
            {
              v23 = (unsigned __int64)v21 + v21[1];
              v24 = (UINT64 *)(v21 + 2);
              if( (unsigned __int64)(v21 + 2) < v23 )
              {
                v25 = v49;
                do
                {
                  if( (*(_DWORD *)v24 & 0xFFF) != 0 || v24 == (UINT64 *)(v21 + 2) )
                  {
                    LODWORD(v38) = a6;
                    LODWORD(v37) = *v21;
                    RtlApplyImportRelocationToImage(v25, v22, (INT64)a2a, a5, v37, v24, v38, 0);
                  }
                  v24 = (UINT64 *)((char *)v24 + 4);
                }
                while( (unsigned __int64)v24 < v23 );
                v20 = v46;
              }
              v12 = (_DWORD *)a8;
              v10 = a7;
            }
            v21 = (unsigned int *)((char *)v21 + v21[1]);
          }
          while( (unsigned __int64)v21 < v20 );
          v14 = v42;
        }
        if( !v13 )
          goto LABEL_42;
      }
      else if( !v13 )
      {
        if( !v14 )
          return 3221225659i64;
        goto LABEL_44;
      }
      v26 = *(unsigned int *)(v13 + 8) + v13 + 12;
      v27 = (unsigned int *)(v13 + 12);
      v40 = v26;
      if( v13 + 12 < v26 )
      {
        do
        {
          if( !RtlpIsAddressInIgnoreRegion(*v27, v10, v12, (unsigned int)a9) )
          {
            v28 = (unsigned __int64)v27 + v27[1];
            v29 = (UINT16 *)(v27 + 2);
            if( (unsigned __int64)(v27 + 2) < v28 )
            {
              v30 = v49;
              do
              {
                if( (*v29 & 0xFFF) != 0 || v29 == (UINT16 *)(v27 + 2) )
                {
                  v31 = (*v29 & 0xFFF) + *v27;
                  v46 = 0i64;
                  v47 = 0;
                  v48 = 0;
                  LODWORD(v37) = a6;
                  RtlpConstructIndirectRelocationFixup(v31, a2a, a5, v29, v37, (INT64)&v46);
                  RtlpApplyGenericRetpolineFixup(v30, v39, &v46, v31);
                }
                ++v29;
              }
              while( (unsigned __int64)v29 < v28 );
              v26 = v40;
            }
            v12 = (_DWORD *)a8;
            v10 = a7;
          }
          v27 = (unsigned int *)((char *)v27 + v27[1]);
        }
        while( (unsigned __int64)v27 < v26 );
        v14 = v42;
      }
LABEL_42:
      if( !v14 )
        return 0i64;
      v9 = (char *)v49;
LABEL_44:
      v32 = *(unsigned int *)(v14 + 8) + v14 + 12;
      v33 = (unsigned int *)(v14 + 12);
      v41 = v32;
      while( (unsigned __int64)v33 < v32 )
      {
        if( !RtlpIsAddressInIgnoreRegion(*v33, v10, (_DWORD *)a8, (unsigned int)a9) )
        {
          v34 = (unsigned __int64)v33 + v33[1];
          v35 = v33 + 2;
          if( (unsigned __int64)(v33 + 2) < v34 )
          {
            do
            {
              if( (*(_WORD *)v35 & 0xFFF) != 0 || v35 == v33 + 2 )
              {
                v36 = (*(_WORD *)v35 & 0xFFF) + *v33;
                v49 = 0i64;
                v50 = 0;
                v51 = 0;
                LODWORD(v37) = a6;
                RtlpConstructSwitchJumpRelocationFixup(v36, a2a, a5, v35, v37, (INT64)&v49);
                RtlpApplyGenericRetpolineFixup((UINT64)v9, v39, &v49, v36);
              }
              v35 = (unsigned int *)((char *)v35 + 2);
            }
            while( (unsigned __int64)v35 < v34 );
            v32 = v41;
          }
          v10 = a7;
        }
        v33 = (unsigned int *)((char *)v33 + v33[1]);
      }
      return 0i64;
    }
  }
  return result;
}

Referenced by:

MiApplyRetpolineFixupsToKernelAndHal
MiReloadBootLoadedDrivers
RtlPerformRetpolineRelocationsOnImage