RtlpCaptureRetpolineBinaryInfoForImage
NTSTATUS __stdcall RtlpCaptureRetpolineBinaryInfoForImage(
VOID *Base,
INT64 a2,
UINT64 a3,
INT64 a4,
INT64 a5,
INT64 a6){
__int64 v7;
_DWORD *v10;
NTSTATUS v11;
VOID *v12;
INT64 v14;
unsigned int v15;
unsigned int v16;
unsigned int *v17;
__int64 v18;
unsigned int v19;
__int64 v20;
__int64 Size[5];
v7 = (unsigned int)a3;
*(_OWORD *)a6 = 0i64;
*(_OWORD *)(a6 + 16) = 0i64;
*(_OWORD *)(a6 + 32) = 0i64;
LODWORD(v10) = LdrImageDirectoryEntryToLoadConfig(Base);
v11 = 0;
if( !v10 || *v10 < 0xC8u )
return -1073741637;
if( *((_QWORD *)v10 + 15) )
*(_DWORD *)(a6 + 4) = v10[30] - a2;
v12 = RtlImageDirectoryEntryToData(Base, 1u, 0xCu, (UINT64 *)Size);
if( v12 )
*(_DWORD *)(a6 + 8) = (_DWORD)v12 - (_DWORD)Base;
if( a4 )
{
v14 = a4 - a2;
v15 = *(_DWORD *)(a5 + 72);
v16 = *(_DWORD *)(a5 + 76);
if( v15 <= *(_DWORD *)(a5 + 68) )
v15 = *(_DWORD *)(a5 + 68);
if( v16 <= v15 )
v16 = v15;
v17 = (unsigned int *)(a5 + 4);
v18 = 16i64;
do
{
v19 = v16;
v16 = *v17++;
if( v16 <= v19 )
v16 = v19;
--v18;
}
while( v18 );
v20 = v14 + v16;
if( __OFSUB__(v20, v14) || v20 > 0x7FFFFFFF || v14 - v7 < (__int64)0xFFFFFFFF80000000ui64 )
return -1073741776;
else
*(_DWORD *)a6 = v14;
}
return v11;
}Referenced by:
RtlPerformRetpolineRelocationsOnImageEx
RtlUpdateImportRelocationsInImage