MiTrimPte
INT64 __fastcall MiTrimPte(INT64 a1, UINT64 a2, INT64 a3){
int v3;
_MMSUPPORT_INSTANCE *v6;
unsigned __int64 v7;
unsigned __int64 v8;
BOOL v9;
__int64 v10;
unsigned __int64 v11;
__int64 v12;
int v13;
unsigned __int64 v14;
_QWORD *v15;
__int64 v16;
_MMPTE *PteBase;
unsigned int v18;
__int64 v19;
unsigned int v20;
INT64 v21;
int v24;
v24 = 0;
v3 = a3;
v6 = *(_MMSUPPORT_INSTANCE **)(a1 + 24);
v7 = *(_QWORD *)a2;
v8 = (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v9 = a3 == 0;
v10 = *(_QWORD *)(a1 + 168);
v11 = *(_QWORD *)(v10 + 16);
v12 = *(_QWORD *)(v10 + 8);
if( v11 == v12 )
return 3i64;
v13 = *(_DWORD *)v10;
if( (*(_DWORD *)v10 & 0x400) != 0
&& ((v13 & 0x800) != 0 && v11 >= 0x100 || v6->WorkingSetSize <= *(_QWORD *)(v10 + 48) - v12) )
{
return 3i64;
}
if( (v13 & 0x1000) == 0 )
v6->VmWorkingSetList->NextPteToTrim = (_MMPTE *)MiComputeNextWalkPte(a2, v9);
v14 = *(_QWORD *)a2;
MiPteInShadowRange(a2);
v15 = (_QWORD *)((char *)MmGetPfnDb() + 48 * ((v14 >> 12) & 0xFFFFFFFFFi64));
if( v3 && ((v15[3] & 0x3FFFFFFFFFFFFFFFi64) != 1 || (unsigned int)MiIsPageTableLocked((INT64)v6, a2)) )
return 0i64;
if( (v15[5] & 0x1000000000i64) == 0 )
{
v16 = v15[1];
if( v16 > 0 && (unsigned int)MiDemoteCombinedPte(v6, (_MMPTE *)a2, (_MMPTE *)(v16 | 0x8000000000000000ui64)) == 1 )
LOBYTE(v7) = MI_READ_PTE_LOCK_FREE(a2);
}
PteBase = MmGetPteBase();
if( v8 < (unsigned __int64)PteBase || v8 > (unsigned __int64)MmGetPteLimit() )
v18 = HIBYTE(*(_QWORD *)((char *)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64))) & 0xF;
else
v18 = (*((_DWORD *)MmGetPfnDb()
+ 12
* (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64)) >> 12) & 0xFFFFFFFFFi64)) >> 1) & 7;
v19 = *(_QWORD *)(a1 + 24);
v20 = *(_DWORD *)v10 & 0xF;
if( !(unsigned int)MiTrimThisWsle(v19, v8, (__int64)v15, (int *)v10, (v7 & 0x20) != 0, &v24) )
goto LABEL_26;
MiInsertTbFlushEntry(v10 + 56, v8, 1i64, 0i64);
if( (*(_DWORD *)v10 & 0x10) != 0 )
MI_WSLE_LOG_ACCESS(v19, a2);
if( ++*(_QWORD *)(v10 + 16) == *(_QWORD *)(v10 + 8) || *(_DWORD *)(v10 + 68) == *(_DWORD *)(v10 + 64) )
{
v21 = a1;
MiTrimWorkingSetBuildup(a1, v10);
if( *(_QWORD *)(v10 + 16) == *(_QWORD *)(v10 + 8) )
return 3i64;
}
else
{
LABEL_26:
v21 = a1;
}
if( v24 && (unsigned int)MiInsertVmAccessedEntry(*(UINT64 **)(v10 + 240), v8) )
{
MiTrimWorkingSetTail(v21);
return 0i64;
}
if( v18 < v20 )
return 0i64;
if( ++*(_QWORD *)(v10 + 32) < *(_QWORD *)(v10 + 40) )
return 0i64;
return 3i64;
}Referenced by:
No references.