RtlpConstructIndirectRelocationFixup
INT16 __fastcall RtlpConstructIndirectRelocationFixup(INT64 a1, _DWORD *a2, INT64 a3, UINT16 *a4, INT64 a5, INT64 a6){
unsigned __int64 v9;
UINT16 v10;
int v11;
int v12;
unsigned int v13;
__int64 v14;
__int16 v15;
int v16;
INT16 result;
INT16 *v18;
*(_QWORD *)a6 = 0i64;
*(_DWORD *)(a6 + 8) = 0;
*(_WORD *)(a6 + 12) = 0;
v9 = 0xCCCCCCCCCCCCCCCCui64;
if( (*a4 & 0x1000) != 0 )
v9 = 0x9090909090909090ui64;
*(_QWORD *)(a6 + 2) = v9;
*(_DWORD *)(a6 + 10) = v9;
v10 = *a4;
if( (_DWORD)a5 )
{
if( (v10 & 0x4000) != 0 )
v11 = *(_DWORD *)(a3 + 68);
else
v11 = *(_DWORD *)(a3 + 72);
v12 = *a2 + v11 - (a1 + 5);
*(_BYTE *)(a6 + 2) = ((v10 & 0x1000) == 0) | 0xE8;
*(_DWORD *)(a6 + 3) = v12;
}
else
{
v13 = 0;
if( (v10 & 0x2000) != 0 )
{
*(_BYTE *)(a6 + 2) = 72;
v13 = 1;
v10 = *a4;
}
v14 = v13 + 1;
*(_BYTE *)(v13 + a6 + 2) = -1;
v15 = *a4 & 0x1000;
if( (v10 & 0x4000) != 0 )
{
*(_BYTE *)(v14 + a6 + 2) = v15 != 0 ? 21 : 37;
v16 = a2[1] - (v13 + a1 + 6);
*(_BYTE *)(v13 + 2 + a6 + 2) = v16;
*(_BYTE *)(v13 + 3 + a6 + 2) = BYTE1(v16);
*(_BYTE *)(v13 + 4 + a6 + 2) = BYTE2(v16);
*(_BYTE *)(v13 + 5 + a6 + 2) = HIBYTE(v16);
}
else
{
*(_BYTE *)(v14 + a6 + 2) = v15 != 0 ? -48 : -32;
if( (*a4 & 0x1000) != 0 )
{
*(_BYTE *)(v13 + 2 + a6 + 2) = 15;
*(_BYTE *)(v13 + 3 + a6 + 2) = 31;
*(_BYTE *)(v13 + 4 + a6 + 2) = 0;
}
}
}
result = (1 << RtlSizeOfRetpolineIndirectFixup(a4)) - 1;
*v18 = result;
return result;
}Referenced by:
RtlApplyIndirectRelocationToPage
RtlPerformRetpolineRelocationsOnImageEx