MiFinishLastForkPageTable
VOID __stdcall MiFinishLastForkPageTable(UINT64 PageFrameIndex, UINT64 a2){
_BOOL4 v3;
_MMPFN *v4;
unsigned __int64 PteBase;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
_QWORD *v9;
__int64 v10;
__int64 v11;
int v12;
v3 = 1;
v4 = &MmGetPfnDb()[a2];
PteBase = (unsigned __int64)MmGetPteBase();
v6 = v4->PteLong | 0x8000000000000000ui64;
v7 = (__int64)(((__int64)((v6 << 25) - (PteBase << 25)) >> 16 << 25) - (PteBase << 25)) >> 16;
if( v7 >= PteBase )
v3 = (unsigned __int64)MmGetPteLimit() < v7;
v8 = MiLockPageInline(v4);
MiRemoveLockedPageChargeAndDecRef(v4);
if( v3 )
{
if( (v4->u2._bf_0 & 0x3FFFFFFFFFFFFFFFui64) <= 1 )
{
MiDecrementShareCount(v4);
}
else
{
v9 = (char *)MiMapPageInHyperSpaceWorker(v4->u4._bf_0 & 0xFFFFFFFFFi64, 0i64, 0x80000000ui64)
+ 8 * ((v6 >> 3) & 0x1FF);
if( (MI_READ_PTE_LOCK_FREE((INT64)v9) & 1) == 0 )
{
LODWORD(v10) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v6, a2, 2147483652i64);
v11 = v10;
LOBYTE(v12) = MiPteInShadowRange((UINT64)v9);
if( v12 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v11 & 1) != 0 )
v11 |= 0x8000000000000000ui64;
*v9 = v11;
}
MiUnmapPageInHyperSpaceWorker(v9, 0x11u, 0x80000000ui64);
}
}
_InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v8);
}Referenced by:
MiDoneWithThisPageGetAnother
MiFreeForkMaps