MiScrubAwePage
INT64 __fastcall MiScrubAwePage(UINT64 *a1, INT64 a2, _DWORD *a3){
char *v4;
unsigned __int64 v5;
__int64 v7;
_MMPTE *PteBase;
INT64 v9;
__int64 v10;
UINT8 v11;
INT64 v12;
unsigned int v13;
UINT64 v14;
UINT8 v15;
v4 = (char *)MmGetPfnDb() + 48 * a2;
v5 = *((_QWORD *)v4 + 1);
if( !v5 )
return MiScrubPage(a1, (INT64)v4, 0i64, 1);
v7 = *((_QWORD *)KeGetCurrentThread() + 23);
if( (*a3 & 1) == 0 )
return 0i64;
if( (*((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 1 )
return MiScrubPage(a1, (INT64)v4, 0i64, 1);
PteBase = MmGetPteBase();
v9 = v7 + 1664;
v10 = (__int64)((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16;
v11 = MiLockWorkingSetShared(v9);
v15 = v11;
if( *((_WORD *)v4 + 16) == 2 )
{
v14 = (UINT64)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal(v9, v14, 0i64);
v12 = MI_READ_PTE_LOCK_FREE(v5);
if( (v12 & 1) != 0 )
{
*(_QWORD *)v5 = ZeroPte;
KeFlushSingleTb(v10, 1i64, 0i64);
}
v13 = MiScrubPage(a1, (INT64)v4, 0i64, 1);
if( (v12 & 1) != 0 )
*(_QWORD *)v5 = v12 | 0x20;
MiUnlockPageTableInternal(v9, v14);
v11 = v15;
}
else
{
v13 = 0;
}
MiUnlockWorkingSetShared(v9, v11);
return v13;
}Referenced by:
MiScrubProcessPhysicalPages