MiReloadBootLoadedDrivers
VOID __fastcall MiReloadBootLoadedDrivers(_LOADER_PARAMETER_BLOCK *LoaderBlock){
ULONG_PTR *v2;
INT64 i;
ULONG_PTR *k;
ULONG_PTR v5;
PVOID v6;
unsigned __int64 v7;
IMAGE_NT_HEADERS *v8;
INT64 v9;
int v10;
ULONG_PTR j;
INT64 a6;
INT64 v13;
INT64 result[2];
char v15;
INT64 v16;
int v17;
__int64 v18;
memset((INT64)&v16, 0i64);
v18 = 0i64;
v17 = 20;
MmAcquireLoadLock();
v2 = (ULONG_PTR *)((char *)LoaderBlock + 16);
for( i = *((_QWORD *)LoaderBlock + 2); (ULONG_PTR *)i != v2; i = *(_QWORD *)i )
{
if( PsNtosImageBase != *(_QWORD *)(i + 48) )
MiProcessLoadConfigForDriver((_KLDR_DATA_TABLE_ENTRY *)i, 0i64);
MiHandleBootImage((INT64)LoaderBlock, i, (INT64)&v16);
}
MiFlushTbList((__int64)&v16);
if( (KiSpeculationFeatures & 0x2000000) != 0 )
{
v5 = *v2;
if( (ULONG_PTR *)*v2 != v2 )
{
do
{
v6 = *(PVOID *)(v5 + 48);
v7 = ((unsigned __int64)*(unsigned int *)(v5 + 64) + 4095) >> 12;
v8 = RtlImageNtHeader(v6);
MiLogRetpolineImageLoadEvents(v5);
if( (KiSpeculationFeatures & 0x2000000) != 0
&& v6 != (PVOID)PsNtosImageBase
&& v6 != PsHalImageBase
&& (v8->FileHeader.Characteristics & 1) == 0
&& v8->OptionalHeader.NumberOfRvaAndSizes > 5 )
{
if( !(unsigned int)MI_IS_PHYSICAL_ADDRESS(*(PVOID *)(v5 + 48)) )
{
v9 = MiMapRetpolineStubs((UINT64)v6, v7);
if( (MiFlags & 0x10000) != 0 )
{
memset((INT64)result, 0i64);
result[1] = (INT64)v6;
v15 = 1;
v10 = VslpEnterIumSecureMode(2u, 221, 0i64, (INT64)result);
}
else
{
LODWORD(v13) = 0;
LODWORD(a6) = 1;
v10 = RtlPerformRetpolineRelocationsOnImageEx(
v6,
(INT64)v6,
*(unsigned int *)(v5 + 64),
v9,
(INT64)Base,
a6,
0i64,
0i64,
v13);
}
if( (int)(v10 + 0x80000000) >= 0 && v10 != -1073741637 )
KeBugCheckEx(0x1Au, 0x1080ui64, v5, *(_QWORD *)(v5 + 48), v10);
}
if( (unsigned int)RtlIsImageFullyRetpolined(*(VOID **)(v5 + 48)) )
MiMarkRetpolineBits(*(_QWORD *)(v5 + 48));
}
v5 = *(_QWORD *)v5;
}
while( (ULONG_PTR *)v5 != v2 );
for( j = *((_QWORD *)LoaderBlock + 2); (ULONG_PTR *)j != v2; j = *(_QWORD *)j )
{
if( (*(_DWORD *)(j + 104) & 0x1000000) == 0 && !(unsigned int)RtlIsImageFullyRetpolined(*(VOID **)(j + 48)) )
MiMarkRetpolineBits(*(_QWORD *)(j + 48));
}
}
}
MiApplyImportOptimizationToBootDrivers((INT64)LoaderBlock);
if( (MiFlags & 0x8000) != 0 )
{
for( k = (ULONG_PTR *)*v2; k != v2; k = (ULONG_PTR *)*k )
VslReserveProtectedPages(0i64, k[6], 0i64, 2ui64);
}
MmReleaseLoadLock((_ETHREAD *)KeGetCurrentThread());
}Referenced by:
MiInitializeDriverImages