MiZeroPhysicalPage
VOID __stdcall MiZeroPhysicalPage(UINT64 PageFrameIndex, UINT64 Flags, _MI_PFN_CACHE_ATTRIBUTE FinalAttribute){
char v4;
_MMPFN *v6;
__int64 v7;
int v8;
UINT64 v9;
char v10;
int v11;
__int64 v12;
__int64 v13;
int v14;
_KTBFLUSH_TYPE v15;
v4 = Flags;
v6 = &MmGetPfnDb()[PageFrameIndex];
v7 = *((unsigned __int8 *)&v6->u3 + 2) >> 6;
v8 = *((unsigned __int8 *)&v6->u3 + 2) >> 6;
if( (Flags & 2) == 0 )
{
v8 = *((_DWORD *)&stru_140C4DB30 + 4 * v7 + (int)FinalAttribute + 106);
if( v8 != (_DWORD)v7 )
MiChangePageAttribute(v6, (_MI_PFN_CACHE_ATTRIBUTE)v8, 0i64);
}
v9 = 0i64;
v10 = -2;
if( !KeGetCurrentPrcb()->HyperPte )
v10 = v4;
if( (v10 & 1) != 0
&& (v9 = (UINT64)MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64)) != 0 )
{
MiMakeProtectionPfnCompatible((_BYTE *)4, v6);
LODWORD(v12) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v9, PageFrameIndex, v11 | 0xA0000000);
v13 = v12;
LOBYTE(v14) = MiPteInShadowRange(v9);
if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v13 & 1) != 0 )
v13 |= 0x8000000000000000ui64;
*(_QWORD *)v9 = v13;
KeZeroPages((VOID *)((__int64)((v9 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16), 0x1000ui64);
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (_MMPTE *)v9, 1ui64, v15);
}
else
{
if( KeGetCurrentPrcb()->HyperPte )
v9 = 1i64;
MiFillPhysicalPages((PVOID)PageFrameIndex);
}
if( v8 != (_DWORD)v7 && v8 != FinalAttribute )
{
if( v9 )
MiChangePageAttribute(v6, (_MI_PFN_CACHE_ATTRIBUTE)v7, 0i64);
}
}Referenced by:
MiComputeOptimalZeroPath
MiGetLargePage
MiGetPage
MiGetPageChain
MiInitializeCacheFlushing
MiIssueHardFault
MiMakePageAvoidRead
MiPerformFinalZeroing
MiPfPutPagesInTransition
MiWaitForInPageComplete
MiZeroAndConvertPage
MiZeroLargePage
MiZeroWithSystemPtes
MmCheckCachedPageStates