MiHandleBootImage
VOID __stdcall MiHandleBootImage(INT64 a1, INT64 a2, INT64 a3){
unsigned int v3;
UINT64 v4;
unsigned int v6;
__int64 v7;
VOID *v8;
__int64 v9;
unsigned __int64 v10;
INT64 *v11;
unsigned int v12;
VOID *v13;
char v14;
int v15;
int v16;
VOID *v17;
_UNICODE_STRING *v18;
unsigned int v19;
INT64 *v20;
UINT64 v21;
int v22;
_LARGE_INTEGER *v23;
INT8 *v24;
UINT64 v26;
_MI_TB_FLUSH_LIST *TbFlushList;
__int64 v28;
TbFlushList = (_MI_TB_FLUSH_LIST *)a3;
v3 = 1;
v4 = *(_QWORD *)(a2 + 48);
v6 = ((unsigned int)dword_140C4C9F0 >> 12) + ((dword_140C4C9F0 & 0xFFF) != 0);
LODWORD(v26) = dword_140C4C98C;
LODWORD(v7) = RtlImageNtHeader(v4);
v9 = v7;
v10 = ((unsigned __int64)*(unsigned int *)(a2 + 64) + 4095) >> 12;
v11 = (INT64 *)((char *)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64));
v12 = v6;
if( v4 == PsNtosImageBase || (PVOID)v4 == PsHalImageBase )
{
if( MI_IS_PHYSICAL_ADDRESS((VOID *)v4) )
{
v3 = 3;
LODWORD(v10) = (v10 + 511) & 0xFFFFFE00;
v12 = (v6 + 511) & 0xFFFFFE00;
}
}
else
{
v12 = v6 + v26;
}
if( v12 )
MiFreeBootDriverPages(v4, (INT64)&v11[(unsigned int)v10], v12, v3, TbFlushList);
if( v4 != PsNtosImageBase && (PVOID)v4 != PsHalImageBase )
{
v13 = 0i64;
*(_QWORD *)(v9 + 48) = v4;
if( (*(_DWORD *)(a2 + 104) & 0x800000) == 0 )
{
v14 = 4;
if( (*(_BYTE *)(v9 + 22) & 1) != 0
|| *(_DWORD *)(v9 + 132) <= 5u
|| (v15 = *(_DWORD *)(v9 + 176)) != 0 && (unsigned int)(*(_DWORD *)(v9 + 180) + v15) > *(_DWORD *)(a2 + 64) )
{
v14 = 0;
}
else
{
LOBYTE(v16) = MiImportOptimizationCompatibleWithDriverRelocation(a2);
if( v16 )
{
if( !v6 )
{
if( (unsigned int)MiUseLargeDriverPage((_UNICODE_STRING *)(a2 + 88), v17, v8, v18) )
{
DbgUnLoadImageSymbolsUnicode((_UNICODE_STRING *)(a2 + 88), (VOID *)v4, 0xFFFFFFFFui64);
v14 = 6;
v24 = MiMapSystemImageWithLargePage(0i64, (unsigned int)v10, (UINT8 *)v4);
v13 = v24;
if( v24 )
{
v14 = 7;
MiBootImageRelocated((_LOADER_PARAMETER_BLOCK *)a1, a2, (_BYTE *)v4, v24, v9, v10);
MiFreeBootDriverPages(v4, (INT64)v11, (unsigned int)v10, 0i64, TbFlushList);
MiReleaseSystemImageVa(v4, (unsigned int)(v10 + v26));
}
}
}
}
}
if( (v14 & 1) == 0 )
{
v28 = 0i64;
v13 = (VOID *)v4;
v19 = 0;
v20 = &v11[(unsigned int)v10];
if( v11 < v20 )
{
MiPteInShadowRange((UINT64)&v26);
do
{
LODWORD(v21) = MI_READ_PTE_LOCK_FREE((INT64)v11);
v26 = v21;
LOBYTE(v22) = MiIsPfnFromSlabAllocation((INT64)&MmGetPfnDb()[(v21 >> 12) & 0xFFFFFFFFFi64]);
if( !v22 )
{
MiGetBootImagePageProtection(v19, v9, (__int64)v8, &v28);
LODWORD(v23) = MiAllocateDriverPage();
if( v23 != (_LARGE_INTEGER *)-1i64 )
MiTradeBootImagePage(v11, v23);
}
++v11;
v19 += 4096;
}
while( v11 < v20 );
}
}
if( (v14 & 2) != 0
&& (unsigned int)DbgLoadImageSymbolsUnicode((_UNICODE_STRING *)(a2 + 88), v13, (UINT64)v8) == 1 )
{
*(_DWORD *)(a2 + 104) |= 0x100000u;
}
}
}
}Referenced by:
MiReloadBootLoadedDrivers