MiAgeWorkingSetTail
INT64 __fastcall MiAgeWorkingSetTail(INT64 a1){
__int64 v1;
int i;
int *v4;
UINT64 v5;
_DWORD *v6;
char v8;
unsigned __int64 v9;
unsigned int v10;
__int64 v11;
unsigned int v12;
v1 = *(_QWORD *)(a1 + 168);
for( i = 0; ; i = 1 )
{
v4 = *(int **)(v1 + 56);
if( !v4 )
goto LABEL_4;
v5 = (unsigned int)v4[3];
if( !(_DWORD)v5 )
goto LABEL_4;
v8 = *((_BYTE *)v4 + 4);
v9 = qword_140C4DCD0;
if( (v8 & 2) == 0 )
{
v10 = *v4;
if( *v4 != 1 )
goto LABEL_24;
v11 = *((_QWORD *)KeGetCurrentThread() + 23);
if( *(_QWORD *)(v11 + 2288) || *(_QWORD *)(v11 + 992) )
v9 = -1i64;
}
v10 = *v4;
if( *v4 != 1 )
{
LABEL_24:
v12 = 1;
if( (v8 & 8) != 0 )
v12 = 2;
goto LABEL_16;
}
v12 = 0;
LABEL_16:
if( *((_BYTE *)v4 + 5) || *((_QWORD *)v4 + 2) > v9 )
{
if( (v8 & 1) != 0 )
KeFlushCurrentTbOnly(v10);
else
KeFlushTb(v10, v12);
*((_BYTE *)v4 + 5) = 0;
}
else if( (v8 & 1) != 0 )
{
KeFlushMultipleRangeCurrentTb(v5, (UINT64 *)v4 + 3, v10);
}
else
{
KeFlushMultipleRangeTb(v5, (UINT64 *)v4 + 3, v10, v12);
}
*((_BYTE *)v4 + 4) &= ~8u;
v4[3] = 0;
*((_QWORD *)v4 + 2) = 0i64;
LABEL_4:
if( *(_DWORD *)(v1 + 76) )
MiFreeWsleList(*(_QWORD *)(a1 + 24), v1 + 64, 0);
v6 = *(_DWORD **)(v1 + 248);
if( !v6 || !*v6 || !(unsigned int)MiQueryEPTAccessedState(a1, v6) )
break;
MiProcessVmAccessedInfo(
a1,
*(_DWORD **)(v1 + 248),
(__int64(__fastcall *)(__int64, _QWORD *, char *, unsigned __int64, __int64))MiAgeWorkingSetEPTCallback,
v1);
}
if( (*(_BYTE *)(a1 + 2) & 2) != 0 || i )
*(_BYTE *)(v1 + 6) = 1;
return 0i64;
}Referenced by:
MiAgePte