MiAgePteWorker
VOID __fastcall MiAgePteWorker(INT64 a1, UINT64 a2, UINT64 a3, INT64 a4, INT64 a5, CHAR a6){
UINT64 v6;
_MMPTE *PteBase;
WCHAR *Pml4eBase;
UINT8 PxeUserLimit;
_MMPFN *PfnDb;
_MMPTE *PteLimit;
_QWORD *v15;
UNICODE_STRING *v16;
char v17;
INT64 v18;
int v19;
unsigned __int64 v20;
char v21;
unsigned int v22;
UINT8 v23;
int v24;
int v25;
unsigned __int8 v26;
unsigned __int8 v27;
INT64 v28;
INT64 v29;
v6 = a2;
PteBase = MmGetPteBase();
Pml4eBase = (WCHAR *)MmGetPml4eBase();
PxeUserLimit = (unsigned __int8)MmGetPxeUserLimit();
PfnDb = MmGetPfnDb();
PteLimit = MmGetPteLimit();
if( a3 < (unsigned __int64)PteBase || a3 > (unsigned __int64)PteLimit )
{
v15 = (_QWORD *)((char *)PteBase + ((a3 >> 9) & 0x7FFFFFFFF8i64));
v16 = (UNICODE_STRING *)HIBYTE(*v15);
LOBYTE(v16) = (unsigned __int8)v16 & 0xF;
}
else
{
v15 = (_QWORD *)((char *)PteBase + ((a3 >> 9) & 0x7FFFFFFFF8i64));
v16 = (UNICODE_STRING *)*((unsigned __int8 *)PfnDb
+ 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v15) >> 12) & 0xFFFFFFFFFi64));
LOBYTE(v16) = ((unsigned __int8)v16 >> 1) & 7;
}
if( (a6 & 1) != 0 )
{
if( (unsigned __int8)((_BYTE)v16 - 1) > 5u )
{
if( (_BYTE)v16 == 7 )
{
LABEL_12:
v18 = 0i64;
v19 = 0;
if( (a6 & 2) != 0 )
{
v18 = *(_QWORD *)(a5 + 56);
}
else if( (a6 & 4) != 0 )
{
v19 = 1;
}
LODWORD(v29) = v19;
LODWORD(v28) = dword_140C4E568;
if( (unsigned int)MiClearPteAccessed(a1, a4, v6, v18, v28, v29) )
++*(_QWORD *)(a5 + 24);
if( v18 )
{
v20 = qword_140C4DCD0;
if( (*(_BYTE *)(v18 + 4) & 2) == 0
&& *(_DWORD *)v18 == 1
&& *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2288i64) )
{
v20 = -1i64;
}
if( (*(_DWORD *)(v18 + 12) >= *(_DWORD *)(v18 + 8) || *(_BYTE *)(v18 + 5) || *(_QWORD *)(v18 + 16) > v20)
&& v20 >= 0x400
&& !*(_BYTE *)(v18 + 5) )
{
MiFlushTbList(v18);
}
}
return;
}
}
else
{
MiSetVaAgeList(a1, a3, (UINT8 *)1, 0);
}
v17 = *(_BYTE *)(a4 + 35);
if( (v17 & 8) == 0 && (v17 & 7u) < 5 )
{
MiLockSetPfnPriority((_MMPFN *)a4, 5ui64);
v6 = a2;
}
goto LABEL_12;
}
v21 = *(_BYTE *)(a4 + 35);
if( (v21 & 8) != 0 )
v22 = 5;
else
v22 = v21 & 7;
if( (unsigned __int8)v16 < 6u )
{
if( v22 < 5 )
{
v23 = 6;
LABEL_37:
MiSetVaAgeList(a1, a3, (UINT8 *)1, v23);
++*(_QWORD *)(a5 + 16);
goto LABEL_38;
}
if( (*(_DWORD *)a5 & 1) != 0 )
{
v23 = (_BYTE)v16 + 1;
goto LABEL_37;
}
}
LABEL_38:
LOBYTE(v24) = MI_PFN_IS_PROTO((UNICODE_STRING *)a4, v16, PxeUserLimit, Pml4eBase);
if( v24 )
LOBYTE(v25) = *(_BYTE *)(a5 + 5);
else
v25 = *(unsigned __int8 *)(a5 + 4);
v26 = v25;
if( !(_BYTE)v25 )
v26 = 7;
if( (*(_BYTE *)(a1 + 184) & 7) == 3
&& ((*(_QWORD *)(a4 + 40) >> 60) & 7) == 4
&& (*(_QWORD *)(a4 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 1
&& *(_WORD *)(a4 + 32) == 1
|| (*(_DWORD *)a5 & 3) != 0
&& (a3 < (unsigned __int64)MmGetPteBase() || a3 > (unsigned __int64)MmGetPteLimit() ? (v27 = HIBYTE(*v15) & 0xF) : (v27 = (*((_BYTE *)MmGetPfnDb() + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v15) >> 12) & 0xFFFFFFFFFi64)) >> 1) & 7),
v27 >= v26 || v22 < *(_DWORD *)(a5 + 8)) )
{
++*(_QWORD *)(a5 + 32);
MiInsertTbFlushEntry(a5 + 64, a3, 1i64, 0i64);
if( *(_DWORD *)(a5 + 76) == *(_DWORD *)(a5 + 72) )
MiFreeWsleList(a1, a5 + 64, 0);
}
}Referenced by:
MiAgePte
MiAgeWorkingSetEPTCallback
MiSimpleAgePte
MiSimpleAgeWorkingSetEPTCallback