MiAgePteWorker
VOID __stdcall MiAgePteWorker(
_MMSUPPORT_INSTANCE *WsInfo,
_MMPTE *PointerPte,
VOID *Va,
_MMPFN *Pfn1,
INT64 a5,
INT64 a6){
_MMPTE *v6;
_MMPTE *PteBase;
wchar_t *Pml4eBase;
UINT8 PxeUserLimit;
_MMPFN *PfnDb;
_MMPTE *PteLimit;
_QWORD *v15;
unsigned __int64 v16;
_UNICODE_STRING *v17;
char v18;
__int64 v19;
int v20;
unsigned __int64 v21;
char v22;
unsigned int v23;
UINT8 v24;
int v25;
int v26;
unsigned __int8 v27;
unsigned __int64 v28;
unsigned __int8 v29;
_MI_TB_FLUSH_LIST *TbFlushList;
UINT64 AccessLogging;
v6 = PointerPte;
PteBase = MmGetPteBase();
Pml4eBase = (wchar_t *)MmGetPml4eBase();
PxeUserLimit = (unsigned __int8)MmGetPxeUserLimit();
PfnDb = MmGetPfnDb();
PteLimit = MmGetPteLimit();
if( Va < PteBase || Va > PteLimit )
{
v15 = (unsigned __int64 *)((char *)&PteBase->u.Long + (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64));
v17 = (_UNICODE_STRING *)HIBYTE(*v15);
LOBYTE(v17) = (unsigned __int8)v17 & 0xF;
}
else
{
v15 = (unsigned __int64 *)((char *)&PteBase->u.Long + (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64));
LODWORD(v16) = MI_READ_PTE_LOCK_FREE((INT64)v15);
v17 = (_UNICODE_STRING *)(unsigned __int8)PfnDb[(v16 >> 12) & 0xFFFFFFFFFi64].$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[0];
LOBYTE(v17) = ((unsigned __int8)v17 >> 1) & 7;
}
if( (a6 & 1) != 0 )
{
if( (unsigned __int8)((_BYTE)v17 - 1) > 5u )
{
if( (_BYTE)v17 == 7 )
{
LABEL_12:
v19 = 0i64;
v20 = 0;
if( (a6 & 2) != 0 )
{
v19 = *(_QWORD *)(a5 + 56);
}
else if( (a6 & 4) != 0 )
{
v20 = 1;
}
LODWORD(AccessLogging) = v20;
LODWORD(TbFlushList) = *(&stru_140C4DB30 + 654);
if( MiClearPteAccessed(WsInfo, Pfn1, v6, (_MMWSLE *)v19, TbFlushList, AccessLogging) )
++*(_QWORD *)(a5 + 24);
if( v19 )
{
v21 = *(&stru_140C4DB30 + 52);
if( (*(_BYTE *)(v19 + 4) & 2) == 0
&& *(_DWORD *)v19 == 1
&& KeGetCurrentThread()->ApcState.Process->VmContext )
{
v21 = -1i64;
}
if( (*(_DWORD *)(v19 + 12) >= *(_DWORD *)(v19 + 8) || *(_BYTE *)(v19 + 5) || *(_QWORD *)(v19 + 16) > v21)
&& v21 >= 0x400
&& !*(_BYTE *)(v19 + 5) )
{
MiFlushTbList((_MI_TB_FLUSH_LIST *)v19);
}
}
return;
}
}
else
{
MiSetVaAgeList(WsInfo, (UINT64)Va, 1ui64, 0);
}
v18 = *((_BYTE *)&Pfn1->u3 + 3);
if( (v18 & 8) == 0 && (v18 & 7u) < 5 )
{
MiLockSetPfnPriority(Pfn1, (VOID *)5);
v6 = PointerPte;
}
goto LABEL_12;
}
v22 = *((_BYTE *)&Pfn1->u3 + 3);
if( (v22 & 8) != 0 )
v23 = 5;
else
v23 = v22 & 7;
if( (unsigned __int8)v17 < 6u )
{
if( v23 < 5 )
{
v24 = 6;
LABEL_37:
MiSetVaAgeList(WsInfo, (UINT64)Va, 1ui64, v24);
++*(_QWORD *)(a5 + 16);
goto LABEL_38;
}
if( (*(_DWORD *)a5 & 1) != 0 )
{
v24 = (_BYTE)v17 + 1;
goto LABEL_37;
}
}
LABEL_38:
LOBYTE(v25) = MI_PFN_IS_PROTO((_UNICODE_STRING *)Pfn1, v17, PxeUserLimit, Pml4eBase);
if( v25 )
LOBYTE(v26) = *(_BYTE *)(a5 + 5);
else
v26 = *(unsigned __int8 *)(a5 + 4);
v27 = v26;
if( !(_BYTE)v26 )
v27 = 7;
if( (WsInfo->Flags._bf_0 & 7) == 3
&& (((unsigned __int64)Pfn1->u4._bf_0 >> 60) & 7) == 4
&& (Pfn1->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1
&& Pfn1->u3.ReferenceCount == 1
|| (*(_DWORD *)a5 & 3) != 0
&& (Va < MmGetPteBase() || Va > MmGetPteLimit() ? (v29 = HIBYTE(*v15) & 0xF) : (LODWORD(v28) = MI_READ_PTE_LOCK_FREE((INT64)v15),
v29 = (MmGetPfnDb()[(v28 >> 12) & 0xFFFFFFFFFi64].$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[0] >> 1) & 7),
v29 >= v27 || v23 < *(_DWORD *)(a5 + 8)) )
{
++*(_QWORD *)(a5 + 32);
MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)(a5 + 64), Va, 1ui64, 0i64);
if( *(_DWORD *)(a5 + 76) == *(_DWORD *)(a5 + 72) )
MiFreeWsleList(WsInfo, (_MMWSLE_FLUSH_LIST *)(a5 + 64), 0i64);
}
}Referenced by:
MiAgePte
MiAgeWorkingSetEPTCallback
MiSimpleAgePte
MiSimpleAgeWorkingSetEPTCallback