MiMapBBTMemory
VOID __fastcall MiMapBBTMemory(_LOADER_PARAMETER_BLOCK *LoaderBlock){
unsigned __int64 v1;
_QWORD *v3;
unsigned __int64 v4;
UINT64 v5;
_MMPTE *PteBase;
UINT64 *v7;
INT64 v8;
UINT64 ValidPte;
char *v10;
char *v11;
unsigned __int64 v12;
__int64 v13;
UINT64 v14;
INT64 v15;
char *v16;
_QWORD *v17;
v1 = 0i64;
if( BBTPagesToReserve )
{
v3 = *(_QWORD **)(*((_QWORD *)LoaderBlock + 30) + 2824i64);
if( v3 )
{
v1 = (BBTPagesToReserve + 511) & 0xFFFFFFFFFFFFFE00ui64;
LABEL_20:
v14 = v1 << 12;
KeZeroPages(v3, v14);
*v3 = v14;
goto LABEL_21;
}
v4 = (BBTPagesToReserve + 511) & 0xFFFFFFFFFFFFFE00ui64;
v5 = MiObtainSystemVa(v4 >> 9, 9i64);
v17 = (_QWORD *)v5;
v3 = (_QWORD *)v5;
if( v5 )
{
PteBase = MmGetPteBase();
v7 = (UINT64 *)((char *)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64));
LODWORD(v15) = 0;
v8 = (INT64)&v7[v4 - 1];
if( (unsigned int)MiMakeZeroedPageTablesEx((INT64)v7, v8, 0i64, 9i64, v15) )
{
ValidPte = MiMakeValidPte((UINT64)v7, 0i64, 2684354564i64);
v10 = (char *)LoaderBlock + 32;
v11 = (char *)*((_QWORD *)LoaderBlock + 4);
v16 = v10;
if( v11 != v10 )
{
while( 1 )
{
if( *((_DWORD *)v11 + 4) == 23 )
{
v12 = *((_QWORD *)v11 + 4);
v13 = *((_QWORD *)v11 + 3);
if( v12 + v1 > BBTPagesToReserve )
v12 = BBTPagesToReserve - v1;
v1 += v12;
do
{
ValidPte ^= (ValidPte ^ (v13 << 12)) & 0xFFFFFFFFF000i64;
*v7++ = ValidPte;
++v13;
--v12;
}
while( v12 );
if( v1 == BBTPagesToReserve )
{
LABEL_17:
v3 = v17;
break;
}
v10 = v16;
}
v11 = *(char **)v11;
if( v11 == v10 )
goto LABEL_17;
}
}
if( v1 < BBTPagesToReserve )
BBTPagesToReserve = v1;
goto LABEL_20;
}
MiReturnSystemVa((UINT64)v3, ((v8 << 25) - ((_QWORD)PteBase << 25) + 0x10000000) >> 16, 9i64);
v3 = 0i64;
}
BBTPagesToReserve = 0i64;
LABEL_21:
BBTBuffer = (__int64)v3;
}
}Referenced by:
MiInitSystem