MiFillGapPtes
char __fastcall MiFillGapPtes(unsigned __int64 a1, unsigned __int64 a2, __int64 a3, __int64 a4, int a5){
unsigned __int64 v5;
unsigned __int64 v6;
unsigned __int64 CurrentThread;
int v10;
UINT64 v11;
UINT64 ValidPte;
__int64 v13;
bool v14;
v5 = a1;
v6 = a2;
if( a1 < *(_QWORD *)(a3 + 16i64 * a5) )
v5 = *(_QWORD *)(a3 + 16i64 * a5);
CurrentThread = *(_QWORD *)(a3 + 16i64 * a5 + 8);
if( a2 > CurrentThread )
v6 = *(_QWORD *)(a3 + 16i64 * a5 + 8);
if( v5 <= v6 )
{
v10 = 0;
do
{
LOBYTE(CurrentThread) = MI_READ_PTE_LOCK_FREE(v5);
if( (CurrentThread & 1) != 0 )
{
if( a5 && (CurrentThread & 0x80u) == 0i64 )
{
v13 = (__int64)((v5 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
LOBYTE(CurrentThread) = MiFillGapPtes(v13, v13 + 4088, a3, a4, a5 - 1);
}
goto LABEL_14;
}
v11 = v5;
if( a5 )
v11 = 0i64;
ValidPte = MiMakeValidPte(v11, *(_QWORD *)(a4 + 8i64 * a5), a5 != 0 ? -1476395004 : 536870913);
LODWORD(CurrentThread) = MiPteInShadowRange(v5);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v10 = 1;
if( !HIBYTE(word_140C4DD48) )
{
v14 = (ValidPte & 1) == 0;
goto LABEL_24;
}
}
else
{
CurrentThread = (unsigned __int64)KeGetCurrentThread();
if( (*(_DWORD *)(*(_QWORD *)(CurrentThread + 184) + 2172i64) & 0x1000) != 0 )
{
v14 = (ValidPte & 1) == 0;
LABEL_24:
if( !v14 )
{
LOBYTE(CurrentThread) = 0;
ValidPte |= 0x8000000000000000ui64;
}
}
}
}
*(_QWORD *)v5 = ValidPte;
if( v10 )
LOBYTE(CurrentThread) = MiWritePteShadow();
v10 = 0;
LABEL_14:
v5 += 8i64;
}
while( v5 <= v6 );
}
return CurrentThread;
}Referenced by:
MiFillGapAddresses
MiFillGapPtes