RtlPerformRetpolineRelocationsOnImageEx
NTSTATUS __stdcall RtlPerformRetpolineRelocationsOnImageEx(
VOID *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;
NTSTATUS result;
char *v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned int *v21;
unsigned int v22;
unsigned __int64 v23;
UINT64 *v24;
UINT64 v25;
unsigned __int64 v26;
unsigned int *v27;
unsigned __int64 v28;
UINT16 *v29;
UINT64 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;
INT64 v43[2];
__int128 v44;
__int128 v45;
INT64 a3a;
int v47;
__int16 v48;
UINT64 v49;
int v50;
__int16 v51;
LODWORD(a3a) = 0;
v9 = (char *)Base;
v10 = a7;
v11 = 0i64;
v12 = (_DWORD *)a8;
v13 = 0i64;
v49 = (UINT64)Base;
v14 = 0i64;
v15 = a3;
v39 = a3;
*(_OWORD *)v43 = 0i64;
v44 = 0i64;
v45 = 0i64;
result = RtlpCaptureRetpolineBinaryInfoForImage(
Base,
a2,
a3,
a4 & -(__int64)((_DWORD)a6 != 0),
a5 & -(__int64)((_DWORD)a6 != 0),
(INT64)v43);
if( result >= 0 )
{
result = RtlpCaptureDynamicRelocationTableRva(v9, v15, &a3a);
if( result >= 0 )
{
v17 = &v9[(unsigned int)a3a];
v18 = (unsigned __int64)&v17[*((unsigned int *)v17 + 1) + 8];
v19 = (unsigned __int64)(v17 + 8);
if( v19 >= v18 )
return -1073741637;
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);
a3a = v20;
if( (unsigned __int64)v21 < v20 )
{
v22 = v15;
do
{
if( !RtlpIsAddressInIgnoreRegion(*v21, v10, v12, 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)v43, a5, v37, v24, v38, 0);
}
v24 = (UINT64 *)((char *)v24 + 4);
}
while( (unsigned __int64)v24 < v23 );
v20 = a3a;
}
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 -1073741637;
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, 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;
a3a = 0i64;
v47 = 0;
v48 = 0;
RtlpConstructIndirectRelocationFixup(v31, v43, a5, v29, a6, (__int64)&a3a);
RtlpApplyGenericRetpolineFixup(v30, v39, &a3a, 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 0;
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, 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;
RtlpConstructSwitchJumpRelocationFixup(v36, v43, a5, v35, a6, (__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 0;
}
}
return result;
}Referenced by:
MiApplyRetpolineFixupsToKernelAndHal
MiReloadBootLoadedDrivers
RtlPerformRetpolineRelocationsOnImage