MxMarkActiveDriverBits
unsigned __int64 __fastcall MxMarkActiveDriverBits(
unsigned __int64 *a1,
unsigned __int64 a2,
unsigned __int64 a3,
__int64 a4,
int a5){
unsigned __int64 v5;
unsigned __int64 v6;
unsigned __int64 result;
_MMPTE *PteBase;
__int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
v5 = a2;
v6 = a3;
if( a2 < *(_QWORD *)(a4 + 16i64 * a5) )
v5 = *(_QWORD *)(a4 + 16i64 * a5);
result = *(_QWORD *)(a4 + 16i64 * a5 + 8);
if( a3 > result )
v6 = *(_QWORD *)(a4 + 16i64 * a5 + 8);
if( v5 <= v6 )
{
PteBase = MmGetPteBase();
do
{
result = MI_READ_PTE_LOCK_FREE(v5);
if( (result & 1) != 0 )
{
v11 = (__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16;
if( a5 == 1 )
{
v12 = ((((v11 << 25) - ((_QWORD)PteBase << 25)) >> 16) - a1[4]) >> 21;
v13 = a1[1] + (v12 >> 3);
if( (*(_DWORD *)((char *)PteBase + ((v13 >> 9) & 0x7FFFFFFFF8i64)) & 0x800i64) == 0 )
{
MiSplitBitmapPages(12i64, (VOID *)(a1[1] + (v12 >> 3)), (v12 & 7) + 1);
KeZeroSinglePage((VOID *)(v13 & 0xFFFFFFFFFFFFF000ui64));
}
if( *a1 <= v12 )
*a1 = v12 + 1;
result = a1[1];
_bittestandset64((signed __int64 *)result, v12);
}
else
{
result = MxMarkActiveDriverBits(
a1,
(__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16,
v11 + 4088,
a4,
a5 - 1);
}
}
v5 += 8i64;
}
while( v5 <= v6 );
}
return result;
}Referenced by:
MiInitializeDriverImages
MxMarkActiveDriverBits