MxMarkActiveDriverBits
VOID __fastcall MxMarkActiveDriverBits(
_MI_DYNAMIC_BITMAP *DynamicBitmap,
_MMPTE *PointerPxe,
_MMPTE *EndPxe,
_MI_PTE_RANGE *PteHierarchy,
UINT64 PagingLevel){
unsigned __int64 v5;
_MMPTE *v6;
_MMPTE *PteBase;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
UINT64 v13;
v5 = (unsigned __int64)PointerPxe;
v6 = EndPxe;
if( (unsigned __int64)PointerPxe < *(_QWORD *)&PteHierarchy[4 * (int)PagingLevel] )
v5 = *(_QWORD *)&PteHierarchy[4 * (int)PagingLevel];
if( (unsigned __int64)EndPxe > *(_QWORD *)&PteHierarchy[4 * (int)PagingLevel + 2] )
v6 = *(_MMPTE **)&PteHierarchy[4 * (int)PagingLevel + 2];
if( v5 <= (unsigned __int64)v6 )
{
PteBase = MmGetPteBase();
do
{
if( (MI_READ_PTE_LOCK_FREE(v5) & 1) != 0 )
{
v10 = (__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16;
if( (_DWORD)PagingLevel == 1 )
{
v11 = ((((v10 << 25) - ((_QWORD)PteBase << 25)) >> 16) - (unsigned __int64)DynamicBitmap->BaseVa) >> 21;
v12 = (unsigned __int64)DynamicBitmap->Bitmap.Buffer + (v11 >> 3);
if( (*(_DWORD *)((_BYTE *)&PteBase->u.Long + ((v12 >> 9) & 0x7FFFFFFFF8i64)) & 0x800i64) == 0 )
{
MiSplitBitmapPages(MiVaDriverImages, (char *)DynamicBitmap->Bitmap.Buffer + (v11 >> 3), (v11 & 7) + 1);
KeZeroSinglePage((VOID *)(v12 & 0xFFFFFFFFFFFFF000ui64));
}
if( DynamicBitmap->Bitmap.SizeOfBitMap <= v11 )
DynamicBitmap->Bitmap.SizeOfBitMap = v11 + 1;
_bittestandset64((signed __int64 *)DynamicBitmap->Bitmap.Buffer, v11);
}
else
{
LODWORD(v13) = PagingLevel - 1;
MxMarkActiveDriverBits(
DynamicBitmap,
(_MMPTE *)((__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16),
(_MMPTE *)(v10 + 4088),
PteHierarchy,
v13);
}
}
v5 += 8i64;
}
while( v5 <= (unsigned __int64)v6 );
}
}Referenced by:
MiInitializeDriverImages
MxMarkActiveDriverBits