MiApplyRetpolineFixupsToKernelAndHal

INT64 __fastcall MiApplyRetpolineFixupsToKernelAndHal(INT64 a1){
  __int64 v1; 
  __int64 v3; 
  __int64 *v4; 
  unsigned int(*v5)(void); 
  unsigned int v6; 
  int updated; 
  char *v9; 
  IMAGE_NT_HEADERS *v10; 
  const CHAR *v11; 
  unsigned int v12; 
  int v13; 
  unsigned int v14; 
  INT64 v15; 
  __int64 v16; 
  IMAGE_NT_HEADERS *v17; 
  const CHAR *v18; 
  int v19; 
  __int64 *v20; 
  unsigned int v21; 
  __int64 v22; 
  const CHAR *v23; 
  PVOID a5; 
  UINT64 v25; 
  int v26; 
  INT64 a6; 
  INT64 a9; 
  __int64 v29; 
  INT64 a8; 
  INT64 a7[2]; 
  INT64 result[14]; 
  v1 = *(_QWORD *)(a1 + 240);
  v29 = 0i64;
  v3 = *(_QWORD *)(a1 + 16);
  dword_140C4C98C = *(_DWORD *)(v1 + 3468) >> 12;
  if( (KiSpeculationFeatures & 0x2000000) != 0
    && (v29 = v3,
        v9 = *(char **)(v3 + 48),
        v10 = RtlImageNtHeader(v9),
        v11 = RtlLookupImageSectionByName((INT64)v10, "RETPOL"),
        v12 = *((_DWORD *)v11 + 2),
        Base = &v9[*((unsigned int *)v11 + 3)],
        dword_140C4C9C8 = (v12 >> 12) + ((v12 & 0xFFF) != 0),
        dword_140C4C9C8 > (unsigned int)dword_140C4C98C) )
  {
    updated = -1073741811;
  }
  else if( ((KiSpeculationFeatures & 0x2000000) != 0 || (KiSpeculationFeatures & 0x4000000) != 0)
         && (MiFlags & 0x10000) != 0 )
  {
    v13 = KiSpeculationFeatures;
    v14 = (KiSpeculationFeatures >> 25) & 1;
    memset((INT64)result, 0i64);
    v15 = v14 | 2;
    if( (v13 & 0x4000000) == 0 )
      v15 = v14;
    result[1] = v15;
    updated = VslpEnterIumSecureMode(2u, 220, 0i64, (INT64)result);
  }
  else if( (KiSpeculationFeatures & 0x2000000) != 0 )
  {
    v16 = v29;
    v17 = RtlImageNtHeader(*(PVOID *)(v29 + 48));
    v18 = RtlLookupImageSectionByName((INT64)v17, "INITKDBG");
    v19 = 0;
    v20 = &v29;
    LODWORD(a7[0]) = *((_DWORD *)v18 + 3);
    v21 = 1;
    LODWORD(a8) = *((_DWORD *)v18 + 2);
    while( 1 )
    {
      v22 = *v20;
      v23 = RtlLookupImageSectionByName((INT64)v17, "MINIEX");
      a5 = Base;
      v25 = *(unsigned int *)(v22 + 64);
      v26 = *((_DWORD *)v23 + 3);
      *((_DWORD *)&a7[-1] + v21) = *((_DWORD *)v23 + 2);
      LODWORD(a9) = v21 + 1;
      *((_DWORD *)a7 + v21) = v26;
      LODWORD(a6) = 1;
      updated = RtlPerformRetpolineRelocationsOnImageEx(
                  *(PVOID *)(v22 + 48),
                  *(_QWORD *)(v22 + 48),
                  v25,
                  (INT64)a5,
                  (INT64)a5,
                  a6,
                  (INT64)a7,
                  (INT64)&a8,
                  a9);
      if( updated < 0 )
        break;
      v21 = 0;
      ++v19;
      ++v20;
      if( v19 )
      {
        updated = RtlCopyRetpolineStubsUnwindInfo(
                    *(VOID **)(v16 + 48),
                    *(_QWORD *)(v16 + 48),
                    (UINT64 *)Base,
                    (INT64)Base);
        if( updated < 0 )
          break;
        goto LABEL_6;
      }
    }
  }
  else
  {
LABEL_6:
    if( (KiSpeculationFeatures & 0x4000000) != 0 )
    {
      v4 = *(__int64 **)(a1 + 16);
      v5 = (unsigned int(*)(void))((unsigned __int64)MiIsBootImageTargetFullyRetpolined & -(__int64)((KiSpeculationFeatures & 0x2000000) != 0));
      v6 = 0;
      while( 1 )
      {
        updated = RtlUpdateImportRelocationsInImage(
                    (PVOID)v4[6],
                    v4[6],
                    *((unsigned int *)v4 + 16),
                    v5,
                    (__int64)Base,
                    (__int64)Base,
                    1,
                    (KiSpeculationFeatures & 0x2000000) == 0);
        if( ((updated + 0x80000000) & 0x80000000) == 0 && updated != -1073741637 )
          break;
        *((_DWORD *)v4 + 26) |= 0x80u;
        ++v6;
        v4 = (__int64 *)*v4;
        if( v6 >= 2 )
          goto LABEL_10;
      }
    }
    else
    {
LABEL_10:
      updated = 0;
    }
  }
  dword_140C4C9CC = updated;
  return(unsigned int)updated;
}

Referenced by:

MiRebaseDynamicRelocationRegions