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