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