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