MiCaptureRetpolineImportInfo
INT64 __fastcall MiCaptureRetpolineImportInfo(INT64 a1, INT64 a2){
_ETHREAD *CurrentThread;
_DWORD *v3;
__int64 v4;
__int64 v6;
__int64 v7;
unsigned int(*v8)(void);
INT64 result;
_DWORD *v10;
char v11;
ULONG v12;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0i64;
v4 = *(_QWORD *)(a2 + 96);
v12 = 0;
v6 = *(_QWORD *)(v4 + 32);
v8 = (unsigned int(*)(void))((unsigned __int64)MiIsTargetFullyRetpolined & -(__int64)MiIsRetpolineEnabled());
result = RtlCaptureRetpolineImportRvas(
*(char **)(v7 + 48),
*(_QWORD *)(v7 + 48),
*(unsigned int *)(a1 + 64),
v8,
0i64,
&v12);
if( (int)result >= 0 )
goto LABEL_5;
if( (_DWORD)result == -1073741789 )
{
LODWORD(v10) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
v3 = v10;
if( !v10 )
return 3221225495i64;
result = RtlCaptureRetpolineImportRvas(
*(char **)(a1 + 48),
*(_QWORD *)(a1 + 48),
*(unsigned int *)(a1 + 64),
v8,
v10,
&v12);
if( (int)result >= 0 )
{
LABEL_5:
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx(v6 + 24, 0i64);
*(_QWORD *)(*(_QWORD *)(v6 + 96) + 16i64) = v3;
v11 = _InterlockedExchangeAdd64((volatile signed __int64 *)(v6 + 24), 0xFFFFFFFFFFFFFFFFui64);
if( (v11 & 2) != 0 && (v11 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)(v6 + 24));
KeAbPostRelease((PVOID)(v6 + 24));
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return 0i64;
}
}
return result;
}Referenced by:
MiApplyImportOptimizationToRuntimeDriver