MiPrefetchJumpVad
VOID __stdcall MiPrefetchJumpVad(_MI_FAULT_VA_LIST *PrefetchHead, _MMVAD *Vad, VOID *VirtualAddress){
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v6;
unsigned __int64 v7;
int v8;
unsigned __int64 v9;
_MMPTE *PteBase;
unsigned __int64 v11;
unsigned __int64 v12;
__int64 v13;
_MMVAD *v14;
int v15;
v6.LongFlags = (unsigned int)Vad->Core.u;
v7 = ((Vad->Core.EndingVpn | ((unsigned __int64)Vad->Core.EndingVpnHigh << 32)) << 12) + 4096;
if( (v6.LongFlags & 4) == 0 )
{
if( (v6.LongFlags & 0x100000) != 0 )
{
if( (((Vad->Core.u.LongFlags & 0x70) - 16) & 0xFFFFFFDF) != 0 )
{
LOBYTE(v8) = MiIsVadLargePrivate((INT64)Vad);
if( !v8 )
{
PteBase = MmGetPteBase();
v11 = (unsigned __int64)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64);
v12 = (unsigned __int64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64);
if( v12 > (v11 & 0xFFFFFFFFFFFFF000ui64) + 4096 )
v12 = (((unsigned __int64)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64)) & 0xFFFFFFFFFFFFF000ui64) + 4096;
while( v11 < v12 )
{
LODWORD(v13) = MI_READ_PTE_LOCK_FREE(v11);
v11 += 8i64;
if( v13 )
{
if( (v13 & 1) != 0 )
goto LABEL_14;
if( (v13 & 0x400) != 0 )
break;
if( (v13 & 0x800) != 0 )
{
LABEL_14:
MiUpdatePrefetchPriority(PrefetchHead, VirtualAddress, (_MMPTE)Vad, v14);
}
else
{
IS_PTE_NOT_DEMAND_ZERO();
if( v15 )
break;
}
}
VirtualAddress = (char *)VirtualAddress + 4096;
}
v7 = (__int64)((v11 << 25) - ((_QWORD)PteBase << 25)) >> 16;
}
}
}
else if( (Vad->u2.LongFlags2 & 0x1000000) == 0 )
{
return;
}
}
MiLeapPrefetch(PrefetchHead, (VOID *)v7);
*((_BYTE *)PrefetchHead + 1) = 1;
}Referenced by:
MiZeroFault