MiReloadBootLoadedDrivers
VOID __stdcall MiReloadBootLoadedDrivers(_LOADER_PARAMETER_BLOCK *LoaderBlock, _SUBSECTION *a2, UINT64 a3, INT64 a4){
INT8 v5;
INT64 v6;
_LIST_ENTRY *p_LoadOrderListHead;
_KLDR_DATA_TABLE_ENTRY *i;
_LIST_ENTRY *k;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v11;
unsigned __int64 v12;
__int64 v13;
__int64 v14;
INT64 v15;
NTSTATUS v16;
_LIST_ENTRY *j;
INT64 a6;
INT64 v19;
INT64 v20[14];
INT64 v21[24];
memset(v21, 0i64, 0xB8u);
v21[3] = 0i64;
LODWORD(v21[1]) = 20;
MmAcquireLoadLock(v6, v5);
p_LoadOrderListHead = &LoaderBlock->LoadOrderListHead;
for( i = (_KLDR_DATA_TABLE_ENTRY *)LoaderBlock->LoadOrderListHead.Flink;
i != (_KLDR_DATA_TABLE_ENTRY *)p_LoadOrderListHead;
i = (_KLDR_DATA_TABLE_ENTRY *)i->InLoadOrderLinks.Flink )
{
if( (void *)PsNtosImageBase != i->DllBase )
MiProcessLoadConfigForDriver(i, 0i64);
MiHandleBootImage((INT64)LoaderBlock, (INT64)i, (INT64)v21);
}
MiFlushTbList((_MI_TB_FLUSH_LIST *)v21);
if( (KiSpeculationFeatures & 0x2000000) != 0 )
{
Flink = p_LoadOrderListHead->Flink;
if( p_LoadOrderListHead->Flink != p_LoadOrderListHead )
{
do
{
v11 = Flink[3].Flink;
v12 = ((unsigned __int64)LODWORD(Flink[4].Flink) + 4095) >> 12;
LODWORD(v13) = RtlImageNtHeader((UINT64)v11);
v14 = v13;
MiLogRetpolineImageLoadEvents(Flink);
if( (KiSpeculationFeatures & 0x2000000) != 0
&& v11 != (_LIST_ENTRY *)PsNtosImageBase
&& v11 != PsHalImageBase
&& (*(_BYTE *)(v14 + 22) & 1) == 0
&& *(_DWORD *)(v14 + 132) > 5u )
{
if( !MI_IS_PHYSICAL_ADDRESS(Flink[3].Flink) )
{
LODWORD(v15) = MiMapRetpolineStubs((UINT64)v11, v12);
if( (MiFlags & 0x10000) != 0 )
{
memset(v20, 0i64, 0x68u);
v20[1] = (INT64)v11;
LOBYTE(v20[2]) = 1;
v16 = VslpEnterIumSecureMode(2u, 221, 0i64, (INT64)v20);
}
else
{
LODWORD(v19) = 0;
LODWORD(a6) = 1;
v16 = RtlPerformRetpolineRelocationsOnImageEx(
v11,
(INT64)v11,
LODWORD(Flink[4].Flink),
v15,
qword_140C4C9A8,
a6,
0i64,
0i64,
v19);
}
if( (int)(v16 + 0x80000000) >= 0 && v16 != -1073741637 )
KeBugCheckEx(0x1Au, (PVOID)0x1080, Flink, Flink[3].Flink, (PVOID)v16);
}
if( RtlIsImageFullyRetpolined(Flink[3].Flink) )
MiMarkRetpolineBits((INT64)Flink[3].Flink);
}
Flink = Flink->Flink;
}
while( Flink != p_LoadOrderListHead );
for( j = LoaderBlock->LoadOrderListHead.Flink; j != p_LoadOrderListHead; j = j->Flink )
{
if( ((__int64)j[6].Blink & 0x1000000) == 0 && !RtlIsImageFullyRetpolined(j[3].Flink) )
MiMarkRetpolineBits((INT64)j[3].Flink);
}
}
}
MiApplyImportOptimizationToBootDrivers((INT64)LoaderBlock);
if( (MiFlags & 0x8000) != 0 )
{
for( k = p_LoadOrderListHead->Flink; k != p_LoadOrderListHead; k = k->Flink )
VslReserveProtectedPages(0i64, (INT64)k[3].Flink, 0i64, 2ui64);
}
MmReleaseLoadLock((_ETHREAD *)KeGetCurrentThread());
}Referenced by:
MiInitializeDriverImages