MiInitializeDriverImages
NTSTATUS __stdcall MiInitializeDriverImages(_LOADER_PARAMETER_BLOCK *LoaderBlock){
unsigned __int64 v1;
_RTL_BITMAP *v3;
_MMPTE *PteBase;
_MMPTE *v5;
char *v6;
__int64 v7;
char *v8;
_DWORD *v9;
UINT64 i;
_RTL_BITMAP *v11;
VOID *v12;
int v13;
_SUBSECTION *v14;
UINT64 v15;
INT64 v16;
int v17;
int v18;
NTSTATUS result;
unsigned __int16 *v20;
unsigned __int16 *v21;
__int64 v22;
unsigned __int64 v23;
unsigned __int16 *j;
unsigned __int64 v25;
_QWORD *Pool;
__int16 v27;
_QWORD *v28;
UINT64 PagingLevel;
_MI_PTE_RANGE PteHierarchy;
char v31;
v1 = *(&stru_140C4DB30 + 947);
v3 = (_RTL_BITMAP *)MiSystemVaToDynamicBitmap(12i64);
if( !MiBuildDynamicRegion(v3, (VOID *)v1, 0x8000000000ui64) )
return 0;
PteBase = MmGetPteBase();
v5 = (_MMPTE *)(v1 + 0x7FFFFFFFFFi64);
v6 = &v31;
v7 = 4i64;
do
{
v1 = (unsigned __int64)PteBase + ((v1 >> 9) & 0x7FFFFFFFF8i64);
v5 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)v5 >> 9) & 0x7FFFFFFFF8i64));
*((_QWORD *)v6 - 1) = v1;
*(_QWORD *)v6 = v5;
v6 += 16;
--v7;
}
while( v7 );
LODWORD(PagingLevel) = 3;
MxMarkActiveDriverBits(
(_MI_DYNAMIC_BITMAP *)((char *)&stru_140C4DB30 + 752),
(_MMPTE *)v1,
v5,
&PteHierarchy,
PagingLevel);
v8 = (char *)*(&stru_140C4DB30 + 95);
v9 = (_DWORD *)((char *)PteBase + ((*(&stru_140C4DB30 + 95) >> 9) & 0x7FFFFFFFF8i64));
for( i = 0i64; i < *(&stru_140C4DB30 + 94); i += 0x8000i64 )
{
if( (*v9 & 0x800i64) == 0 )
{
if( !MiSplitBitmapPages(MiVaNonPagedPool, v8, 8ui64) )
return 0;
RtlClearBitsEx((_RTL_BITMAP_EX *)&stru_140C4DB30 + 47, i, 0x8000ui64);
}
v8 += 4096;
v9 += 2;
}
*(&stru_140C4DB30 + 94) = i;
v11 = (_RTL_BITMAP *)MiSystemVaToDynamicBitmap(11i64);
if( !MiBuildDynamicRegion(v11, v12, 0x2000000000ui64) )
return 0;
HighestPfn = -1i64;
qword_140C4CA68 = 0i64;
qword_140C4CA40 = (__int64)&qword_140C4CA38;
qword_140C4CA38 = (__int64)&qword_140C4CA38;
if( MmLargePageDriverBufferLength != -1 )
{
v20 = (unsigned __int16 *)&MmLargePageDriverBuffer;
v21 = (unsigned __int16 *)((char *)&MmLargePageDriverBuffer
+ 2 * (((unsigned __int64)(unsigned int)MmLargePageDriverBufferLength - 2) >> 1));
if( &MmLargePageDriverBuffer < (_UNKNOWN *)v21 )
{
v22 = 0x100002601i64;
do
{
v23 = *v20;
if( (unsigned __int16)v23 <= 0x20u && _bittest64(&v22, v23) || (_WORD)v23 == 12288 )
{
j = v20;
}
else
{
if( (_DWORD)v23 == 42 )
{
byte_140C4CA29 = 1;
break;
}
for( j = v20; j < v21; ++j )
{
v25 = *j;
if( (unsigned __int16)v25 <= 0x20u && _bittest64(&v22, v25) )
break;
if( (_WORD)v25 == 12288 )
break;
}
Pool = MiAllocatePool(64i64, 0x20ui64, 0x704C6D4Dui64);
if( !Pool )
break;
v27 = 2 * (j - v20);
Pool[3] = v20;
*((_WORD *)Pool + 8) = v27;
*((_WORD *)Pool + 9) = v27;
v28 = (_QWORD *)qword_140C4CA40;
if( *(__int64 **)qword_140C4CA40 != &qword_140C4CA38 )
__fastfail(3u);
*Pool = &qword_140C4CA38;
Pool[1] = v28;
v22 = 0x100002601i64;
*v28 = Pool;
qword_140C4CA40 = (__int64)Pool;
}
v20 = j + 1;
}
while( j + 1 < v21 );
}
}
BugCheckParameter3 = 0i64;
MiInitializeBootLoadedDriverPfns(LoaderBlock);
if( !v13 )
return 0;
if( !MiInitializeDriverPtes((INT64)LoaderBlock) )
return 0;
MiFreeKernelPadSections(
*(_KLDR_DATA_TABLE_ENTRY **)(qword_140C4CA58 + 48),
*(_QWORD *)(qword_140C4CA58 + 48) + *(unsigned int *)(qword_140C4CA58 + 64));
MiReloadBootLoadedDrivers(LoaderBlock, v14, v15, v16);
if( !v17 )
return 0;
LOBYTE(v18) = MiCreateInitialSystemWsles();
if( !v18 )
return 0;
VfInitBootDriversLoaded(LoaderBlock);
result = 1;
qword_140C4CA50 = (__int64)&qword_140C4CA48;
qword_140C4CA48 = &qword_140C4CA48;
return result;
}Referenced by:
MiInitSystem