MiFillHyperPtes
VOID __fastcall MiFillHyperPtes(UINT64 a1, UINT64 a2, UINT8 a3, INT64 a4){
__int64 v4;
__int64 v7;
_MMPTE *PteBase;
char *v9;
char *v10;
UINT64 v11;
UINT64 v12;
__int64 v13;
_MMPTE *v14;
UINT64 v15;
INT64 v16;
char *v17;
__int64 v18;
char v19;
char v20;
v4 = 4i64;
v18 = 4i64;
v7 = 4i64;
PteBase = MmGetPteBase();
v9 = &v19;
do
{
*((_QWORD *)v9 - 1) = a1;
*(_QWORD *)v9 = a2;
a1 = (UINT64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
a2 = (UINT64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
v9 += 16;
--v7;
}
while( v7 );
v10 = &v20;
v17 = &v20;
do
{
v11 = *((_QWORD *)v10 - 1);
v12 = *(_QWORD *)v10;
if( *(_DWORD *)a4 )
{
v13 = *((_QWORD *)KeGetCurrentThread() + 23);
if( v11 <= v12 )
{
v14 = MmGetPteBase();
do
{
v15 = (UINT64)v14 + ((v11 >> 9) & 0x7FFFFFFFF8i64);
MiMakeSystemAddressValid(v11, 0i64, 0i64, a3, 0);
do
{
if( !MI_READ_PTE_LOCK_FREE(v11) )
MiMakeHyperPteDemandZero((UINT64 *)v11, v16, a4);
v11 += 8i64;
}
while( v11 <= v12 && (v11 & 0xFFF) != 0 );
MiUnlockPageTableInternal(v13 + 1664, v15);
}
while( v11 <= v12 );
v10 = v17;
v4 = v18;
}
}
else
{
*(_QWORD *)(a4 + 8) += ((__int64)(v12 - v11) >> 3) + 1;
}
v10 -= 16;
--v4;
v17 = v10;
v18 = v4;
}
while( v4 );
}Referenced by:
MiMakeHyperRangeAccessible