MiUpdatePfnPriorityByPte
VOID __stdcall MiUpdatePfnPriorityByPte(_MMPTE *PointerPte, UINT64 DesiredPriority){
unsigned int v2;
unsigned __int64 PteBase;
__int64 v5;
WCHAR *v6;
unsigned __int64 v7;
int v8;
__int64 v9;
UINT8 v10;
char *v11;
unsigned __int8 CurrentIrql;
int v13;
char v14;
char v15;
_MMPTE *PteLimit;
unsigned __int64 v17;
INT64 v18;
UINT16 v19;
char v20;
unsigned int v21;
UINT64 SpinCount;
__int64 v23;
v2 = DesiredPriority;
while( 2 )
{
PteBase = (unsigned __int64)MmGetPteBase();
while( 1 )
{
v5 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
v23 = v5;
v7 = v5;
if( (v5 & 1) != 0 )
{
v8 = 6;
}
else
{
if( (v5 & 0x400) != 0 || (v5 & 0x800) == 0 || !MiInvalidPteConforms(v5) )
return;
if( qword_140C4DC80 )
{
if( (v7 & 0x10) != 0 )
v7 &= ~0x10ui64;
else
v7 &= ~qword_140C4DC80;
}
v8 = 2;
}
v9 = (v7 >> 12) & 0xFFFFFFFFFi64;
v10 = 6 * v9;
if( (*((_QWORD *)MmGetPfnDb() + 6 * v9 + 5) & 0x4000000000000i64) == 0 )
return;
v11 = (char *)MmGetPfnDb() + 48 * v9;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v11 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v11 + 3) < 0 );
}
if( (_MMPTE *)(*((_QWORD *)v11 + 1) | 0x8000000000000000ui64) != PointerPte )
{
LOBYTE(v13) = MI_PFN_IS_PROTO((UNICODE_STRING *)v11, (UNICODE_STRING *)v9, v10, v6);
if( !v13 || (unsigned __int64)PointerPte < PteBase || PointerPte > MmGetPteLimit() )
goto LABEL_44;
}
v14 = v11[34];
v15 = v14 & 7;
if( v8 != 6 )
break;
if( v15 == 6 )
goto LABEL_31;
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
PteBase = (unsigned __int64)MmGetPteBase();
if( (unsigned __int64)PointerPte >= PteBase )
{
PteLimit = MmGetPteLimit();
if( PointerPte <= PteLimit )
{
v17 = (__int64)(((_QWORD)PointerPte << 25) - (PteBase << 25)) >> 16;
if( (v17 < PteBase || v17 > (unsigned __int64)PteLimit) && (unsigned int)MiGetSystemRegionType(v17) == 9 )
return;
}
}
}
if( (unsigned __int8)(v15 - 2) > 2u || (*((_QWORD *)v11 + 3) & 0x4000000000000000i64) != 0 )
{
LABEL_32:
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
continue;
}
break;
}
LABEL_31:
v18 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
if( v23 != v18 )
goto LABEL_32;
v20 = v11[35];
if( (v20 & 8) != 0 )
v21 = 5;
else
v21 = v20 & 7;
if( v2 != v21 && v2 >= v21 )
{
if( (v14 & 7) == 2 )
{
if( v21
|| (*((_DWORD *)v11 + 4) & 0x400i64) != 0
|| !(unsigned int)MiIsPteInStore(
*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v11 + 5) >> 39) & 0x3FFi64)),
*((_QWORD *)v11 + 2)) )
{
MiRelinkStandbyPage((_MMPFN *)v11, v2, v19);
}
}
else
{
v11[35] = v20 ^ (v2 ^ v20) & 7;
}
}
LABEL_44:
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
}Referenced by:
MiPfPrepareReadList
MiPfPrepareSequentialReadList
MiSystemFault