MiUpdatePrefetchPriority
VOID __stdcall MiUpdatePrefetchPriority(
_MI_FAULT_VA_LIST *PrefetchHead,
VOID *VirtualAddress,
_MMPTE PteContents,
_MMVAD *Vad){
unsigned int v6;
UINT64 *v7;
UINT64 v8;
__int64 v9;
__int64 v10;
_MMPFN *PfnDb;
_MMPFN *v12;
_MMPFN *v13;
_MMVAD *Address;
UINT64 SpinCount;
UINT64 v16;
v6 = PrefetchHead[20] & 7;
v7 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64));
v8 = *v7;
v16 = v8;
if( (v8 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v16);
v9 = (v8 >> 12) & 0xFFFFFFFFFi64;
v10 = v9;
if( (MmGetPfnDb()[v9].u4._bf_0 & 0x4000000000000i64) == 0 )
return;
PfnDb = MmGetPfnDb();
v12 = &PfnDb[v9];
if( (*((_BYTE *)&PfnDb[v10].u3 + 3) & 7) == v6 )
return;
if( PteContents.u.Long )
{
if( (*(_DWORD *)(PteContents.u.Long + 48) & 0x70) == 16 )
return;
}
else if( *(_QWORD *)&KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[7].LastAccessClearingRemainder )
{
Address = MiLocateAddress(VirtualAddress);
if( !Address || (Address->Core.u.LongFlags & 0x70) == 16 )
return;
}
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v12->u2._bf_0 < 0 );
}
}
else
{
if( !v8 )
return;
if( (v8 & 0x400) != 0 )
return;
if( (v8 & 0x800) == 0 )
return;
v12 = MiLockTransitionLeafPage((ULONG_PTR)v7, 0i64);
if( !v12 )
return;
}
if( MiGetPfnPriority(v12) != v6 )
MiUpdatePfnPriority(v13, v6, 0i64);
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}Referenced by:
MiPrefetchJumpVad
MiValidFault