MiScrubAwePage
NTSTATUS __fastcall MiScrubAwePage(VOID *OpaqueParameter, __int64 a2, _DWORD *a3){
_MMPFN *v4;
UINT64 PteLong;
_EPROCESS *Process;
_MMPTE *PteBase;
_MMSUPPORT_INSTANCE *p_Instance;
__int64 v10;
char v11;
UINT64 v12;
__int64 v13;
__int64 v14;
unsigned __int64 Long;
int v16;
NTSTATUS v17;
__int64 v18;
int v19;
__int64 v20;
UINT64 v21;
char WsIrql;
v4 = &MmGetPfnDb()[a2];
PteLong = v4->PteLong;
if( !PteLong )
return MiScrubPage(OpaqueParameter, v4, 0i64, (VOID *)1);
Process = KeGetCurrentThread()->ApcState.Process;
if( (*a3 & 1) == 0 )
return 0;
if( (v4->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
return MiScrubPage(OpaqueParameter, v4, 0i64, (VOID *)1);
PteBase = MmGetPteBase();
p_Instance = &Process->Vm.Instance;
v10 = (__int64)((PteLong << 25) - ((_QWORD)PteBase << 25)) >> 16;
MiLockWorkingSetShared();
WsIrql = v11;
if( v4->u3.ReferenceCount == 2 )
{
v21 = (UINT64)PteBase + ((PteLong >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal((INT64)p_Instance, v21, 0i64);
LODWORD(v13) = MI_READ_PTE_LOCK_FREE(PteLong);
v14 = v13;
LODWORD(v13) = v13 & 1;
v20 = (unsigned int)v13;
if( (_DWORD)v13 )
{
Long = ZeroPte.u.Long;
LOBYTE(v16) = MiPteInShadowRange(PteLong);
if( v16 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)PteLong = Long;
KeFlushSingleTb(v10, FlushUser, 0i64);
}
v17 = MiScrubPage(OpaqueParameter, v4, 0i64, (VOID *)1);
if( v20 )
{
v18 = v14 | 0x20;
LOBYTE(v19) = MiPteInShadowRange(PteLong);
if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v18 & 1) != 0 )
v18 |= 0x8000000000000000ui64;
*(_QWORD *)PteLong = v18;
}
MiUnlockPageTableInternal((INT64)p_Instance, v21);
v11 = WsIrql;
}
else
{
v17 = 0;
}
LOBYTE(v12) = v11;
MiUnlockWorkingSetShared(p_Instance, v12);
return v17;
}Referenced by:
MiScrubProcessPhysicalPages