MiUpdateOldPte
NTSTATUS __fastcall MiUpdateOldPte(UINT64 PurgeTransition, INT64 a2, INT64 a3){
_MMSUPPORT_INSTANCE *v5;
INT64 v6;
unsigned __int64 v7;
_MMPFN *v8;
INT64 v9;
unsigned __int64 v10;
_UNICODE_STRING *v11;
UINT8 v12;
wchar_t *v13;
__int64 v14;
int v15;
UINT64 *v16;
INT64 v18;
if( (int)a3 >= 1 )
return 0;
v5 = *(_MMSUPPORT_INSTANCE **)(PurgeTransition + 24);
LODWORD(v6) = MI_READ_PTE_LOCK_FREE(a2);
v18 = v6;
LODWORD(v7) = MI_READ_PTE_LOCK_FREE((INT64)&v18);
v8 = &MmGetPfnDb()[(v7 >> 12) & 0xFFFFFFFFFi64];
if( !(unsigned int)MiWalkVaCheckCommon(v5, (_MMPTE *)a2, v8, 1, (__int64)&v18) )
return 0;
v10 = ((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( MiGetVaAge(v9, v10) != 6 )
return 0;
v14 = *(_QWORD *)(PurgeTransition + 168);
if( (v8->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
{
if( (*(_DWORD *)v14 & 1) == 0 || (LOBYTE(v15) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v8, v11, v12, v13), !v15) )
{
if( (((unsigned __int64)v18 >> 5) & 1) != 0
&& (v16 = *(UINT64 **)(v14 + 208)) != 0i64
&& v10 <= 0x7FFFFFFEFFFFi64 )
{
if( MiInsertVmAccessedEntry(v16, v10) )
return MiUpdateOldWorkingSetPagesTail(PurgeTransition);
}
else if( (((unsigned __int64)v18 >> 5) & 1) == 0 )
{
MiUpdateOldPteWorker(v5, a2, v8);
}
}
}
if( ++*(_QWORD *)(v14 + 16) >= *(_QWORD *)(v14 + 8) )
return 3;
else
return 0;
}Referenced by:
No references.