MiCreateRetpolineRelocationInformation
INT64 __fastcall MiCreateRetpolineRelocationInformation(INT64 a1, INT64 a2, UINT64 a3, _QWORD *a4){
unsigned int v4;
int v5;
unsigned int v6;
unsigned int v8;
_QWORD *v10;
_QWORD *v11;
int v12;
CHAR *v13;
int RetpolineRelocationInformation;
int v15;
UINT64 v17;
UINT64 v18;
v4 = a3;
v5 = a2;
v6 = (unsigned int)a3 >> 12;
v8 = 8 * ((unsigned int)a3 >> 12);
LODWORD(v10) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
v11 = v10;
if( v10 )
{
v12 = 4 * (*(_DWORD *)(a1 + 4) + 3 * v6);
LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
v11[6] = v13;
if( v13 )
{
LODWORD(v18) = v8;
LODWORD(v17) = v12;
RetpolineRelocationInformation = RtlCreateRetpolineRelocationInformation(
v4,
*(unsigned int *)(a1 + 4),
*(_QWORD *)(a1 + 8),
*(_QWORD *)(a1 + 16),
*(_QWORD *)(a1 + 24),
v13,
v17,
(INT64)(v11 + 7),
v18);
if( RetpolineRelocationInformation >= 0 )
{
*((_DWORD *)v11 + 2) = *(_DWORD *)a1;
v15 = dword_140C4C9F0 + 4095;
*((_DWORD *)v11 + 1) = v5;
*(_DWORD *)v11 = ((v4 + 4095) & 0xFFFFF000) + (v15 & 0xFFFFF000);
*a4 = v11;
v11 = 0i64;
RetpolineRelocationInformation = 0;
}
}
else
{
RetpolineRelocationInformation = -1073741670;
}
if( v11 )
MiFreeRetpolineRelocationInformation(v11);
}
else
{
return(unsigned int)-1073741670;
}
return(unsigned int)RetpolineRelocationInformation;
}Referenced by:
MiCaptureBootDriverRetpolineInfo
MiParseImageLoadConfig