RtlpConstructImportRelocationFixup

INT64 __fastcall RtlpConstructImportRelocationFixup(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        UINT64 *a4,
        INT64 a5,
        CHAR a6,
        INT64 a7){
  int v8; 
  int v9; 
  unsigned __int64 v12; 
  int v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  unsigned int v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  int v23; 
  int v24; 
  INT64 result; 
  unsigned int v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  unsigned int(__fastcall *v31)(__int64, unsigned __int64, __int64, __int64); 
  __int64 v32; 
  __int64 v33; 
  unsigned int(__fastcall *v34)(__int64, __int64, __int64, __int64); 
  char v35; 
  v8 = 0;
  v9 = a1;
  if( (a6 & 1) != 0 )
    v8 = 1;
  *(_QWORD *)a7 = 0i64;
  *(_DWORD *)(a7 + 8) = 0;
  *(_WORD *)(a7 + 12) = 0;
  if( (*(_DWORD *)a4 & 0x1000) != 0 )
    v12 = 0x9090909090909090ui64;
  else
    v12 = 0xCCCCCCCCCCCCCCCCui64;
  v13 = a5;
  *(_QWORD *)(a7 + 2) = v12;
  *(_DWORD *)(a7 + 10) = v12;
  if( !(_DWORD)a5 )
    goto LABEL_22;
  if( v8 )
  {
    v14 = *(unsigned int *)a4;
    if( (*(_DWORD *)a4 & 0xFFFFE000) != -8192 )
    {
      v15 = *(_QWORD *)(a2 + 16);
      if( v15 )
      {
        v16 = *(int *)(v15 + 4 * ((unsigned __int64)(unsigned int)v14 >> 13));
      }
      else
      {
        v29 = *(_QWORD *)(a2 + 24);
        if( !v29 )
          goto LABEL_30;
        v30 = *(_QWORD *)(v29 + 8 * (v14 >> 13));
        v31 = *(unsigned int(__fastcall **)(__int64, unsigned __int64, __int64, __int64))(a2 + 40);
        v16 = v30 - *(_QWORD *)(a2 + 32);
        if( v31 )
        {
          if( !v31(v30, v14, 0x80000000i64, 0xFFFFFFFFi64) )
            goto LABEL_30;
        }
      }
      if( v16 && v16 - (unsigned __int64)(unsigned int)(v9 + 12) + 0x80000000 <= 0xFFFFFFFF )
        goto LABEL_12;
    }
LABEL_30:
    v13 = 0;
  }
LABEL_12:
  if( v13 )
  {
    *(_DWORD *)a7 = -1957953529;
    *(_BYTE *)(a7 + 4) = 21;
    v17 = *(unsigned int *)a4;
    v18 = *(_DWORD *)a4;
    if( (v17 & 0xFFFFE000) != -8192 )
    {
      v19 = *(unsigned int *)(a2 + 8);
      if( (_DWORD)v19 )
      {
        v20 = v19 + 8 * (v17 >> 13) - (unsigned int)(v9 + 7);
        *(_WORD *)(a7 + 5) = v20;
        *(_BYTE *)(a7 + 7) = BYTE2(v20);
        *(_WORD *)a7 = 127;
        *(_BYTE *)(a7 + 8) = BYTE3(v20);
        v18 = *(_DWORD *)a4;
      }
    }
    if( (v18 & 0xFFFFE000) != -8192 )
    {
      v21 = *(_QWORD *)(a2 + 16);
      if( v21 )
      {
        v22 = *(int *)(v21 + 4 * ((unsigned __int64)v18 >> 13));
        goto LABEL_19;
      }
      v32 = *(_QWORD *)(a2 + 24);
      if( v32 )
      {
        v33 = *(_QWORD *)(v32 + 8 * ((unsigned __int64)v18 >> 13));
        v34 = *(unsigned int(__fastcall **)(__int64, __int64, __int64, __int64))(a2 + 40);
        v22 = v33 - *(_QWORD *)(a2 + 32);
        if( !v34 || v34(v33, v32, 0x80000000i64, 0xFFFFFFFFi64) )
        {
LABEL_19:
          if( v22 )
          {
            v23 = v9 + 12;
            if( v22 - (unsigned __int64)(unsigned int)(v9 + 12) + 0x80000000 <= 0xFFFFFFFF )
              goto LABEL_21;
          }
        }
      }
    }
    v23 = v9 + 12;
    LODWORD(v22) = *(_DWORD *)a2 + *(_DWORD *)(a3 + 76);
LABEL_21:
    v24 = v22 - v23;
    *(_BYTE *)(a7 + 9) = ((*(_DWORD *)a4 & 0x1000) == 0) | 0xE8;
    *(_BYTE *)(a7 + 11) = BYTE1(v24);
    *(_BYTE *)(a7 + 12) = BYTE2(v24);
    result = 3968i64;
    *(_BYTE *)(a7 + 10) = v24;
    *(_WORD *)a7 |= 0xF80u;
    *(_BYTE *)(a7 + 13) = HIBYTE(v24);
    return result;
  }
LABEL_22:
  if( (a6 & 2) != 0 )
  {
    *(_WORD *)(a7 + 2) = -29876;
    v35 = -46;
    *(_BYTE *)(a7 + 4) = 21;
    *(_WORD *)(a7 + 9) = -179;
    if( (*(_DWORD *)a4 & 0x1000) == 0 )
      v35 = -30;
    *(_BYTE *)(a7 + 11) = v35;
  }
  else
  {
    *(_WORD *)(a7 + 2) = -184;
    if( (*(_DWORD *)a4 & 0x1000) != 0 )
    {
      *(_BYTE *)(a7 + 4) = 21;
      *(_DWORD *)(a7 + 9) = 4464399;
      *(_BYTE *)(a7 + 13) = 0;
    }
    else
    {
      *(_BYTE *)(a7 + 4) = 37;
    }
  }
  *(_WORD *)a7 = 3975;
  v26 = *(_DWORD *)a4;
  result = *(_DWORD *)a4 & 0xFFFFE000;
  if( (_DWORD)result != -8192 )
  {
    v27 = *(unsigned int *)(a2 + 8);
    if( (_DWORD)v27 )
    {
      v28 = v27 + 8 * ((unsigned __int64)v26 >> 13) - (unsigned int)(v9 + 7);
      *(_WORD *)(a7 + 5) = v28;
      *(_BYTE *)(a7 + 7) = BYTE2(v28);
      result = 4095i64;
      *(_WORD *)a7 = 4095;
      *(_BYTE *)(a7 + 8) = ((unsigned int)v27 + 8 * (v26 >> 13) - (v9 + 7)) >> 24;
    }
  }
  return result;
}

Referenced by:

MiApplyRetpolineFixups
RtlApplyImportRelocationToImage
RtlApplyImportRelocationToPage