MiScrubPage
NTSTATUS __stdcall MiScrubPage(VOID *OpaqueParameter, VOID *WorkPage, _MMPFN *Pfn1, VOID *ZeroVa){
char v4;
_MMPFN *v8;
_XSTATE_CONFIGURATION *v9;
_MMPFN *v10;
int v11;
unsigned __int64 v12;
unsigned __int64 v13;
int v14;
void *v15;
NTSTATUS v16;
unsigned __int64 Long;
int v18;
v4 = (char)ZeroVa;
if( Pfn1 )
{
v8 = Pfn1;
v9 = 0i64;
}
else
{
MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)OpaqueParameter + 36, 3i64);
v8 = v10;
v9 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + (((unsigned __int64)v10 >> 9) & 0x7FFFFFFFF8i64));
MiMakeProtectionPfnCompatible((_BYTE *)4, (_MMPFN *)WorkPage);
LODWORD(v12) = MiMakeValidPte(v9, ((_BYTE *)WorkPage - (_BYTE *)MmGetPfnDb()) / 48, v11 | 0xA0000000);
v13 = v12;
LOBYTE(v14) = MiPteInShadowRange((UINT64)v9);
if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v13 & 1) != 0 )
v13 |= 0x8000000000000000ui64;
v9->EnabledFeatures = v13;
}
if( (v4 & 1) != 0 )
{
v15 = (void *)*((_QWORD *)OpaqueParameter + 25);
KeCopyPage(v15);
}
else
{
v15 = 0i64;
}
v16 = RtlScrubMemory(v8);
if( v15 )
KeCopyPage(v8);
if( !Pfn1 )
{
Long = ZeroPte.u.Long;
LOBYTE(v18) = MiPteInShadowRange((UINT64)v9);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
v9->EnabledFeatures = Long;
}
++*((_QWORD *)OpaqueParameter + 26);
return v16;
}Referenced by:
MiScrubAwePage
MiScrubLargeMappedPage
MiScrubNode
MiScrubNodeLargePageList