MiPrefetchJumpVad
INT64 __fastcall MiPrefetchJumpVad(INT64 a1, INT64 a2, UINT64 a3){
int v6;
unsigned __int64 v7;
unsigned __int64 v8;
_MMPTE *PteBase;
unsigned __int64 v10;
unsigned __int64 v11;
INT64 v12;
INT64 result;
v6 = *(_DWORD *)(a2 + 48);
v7 = ((*(unsigned int *)(a2 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a2 + 33) << 32)) << 12) + 4096;
if( (v6 & 4) == 0 )
{
if( (v6 & 0x100000) != 0 )
{
if( (((*(_DWORD *)(a2 + 48) & 0x70) - 16) & 0xFFFFFFDF) != 0 && !MiIsVadLargePrivate(a2) )
{
PteBase = MmGetPteBase();
v10 = (unsigned __int64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
v11 = (unsigned __int64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64);
if( v11 > (v10 & 0xFFFFFFFFFFFFF000ui64) + 4096 )
v11 = (((unsigned __int64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64)) & 0xFFFFFFFFFFFFF000ui64) + 4096;
while( v10 < v11 )
{
v12 = MI_READ_PTE_LOCK_FREE(v10);
v10 += 8i64;
if( v12 )
{
if( (v12 & 1) != 0 )
goto LABEL_14;
if( (v12 & 0x400) != 0 )
break;
if( (v12 & 0x800) != 0 )
{
LABEL_14:
MiUpdatePrefetchPriority(a1, a3, a2);
}
else if( IS_PTE_NOT_DEMAND_ZERO(v12) )
{
break;
}
}
a3 += 4096i64;
}
v7 = (__int64)((v10 << 25) - ((_QWORD)PteBase << 25)) >> 16;
}
}
else
{
result = *(unsigned int *)(a2 + 64);
if( (result & 0x1000000) == 0 )
return result;
}
}
result = MiLeapPrefetch((_QWORD *)a1, v7);
*(_BYTE *)(a1 + 1) = 1;
return result;
}Referenced by:
MiZeroFault