MiBuildForkPageTable
VOID __stdcall MiBuildForkPageTable(
UINT64 PageFrameIndex,
_MMPTE *PointerPde,
_MMPTE *PointerNewPde,
UINT64 ContainingFrame,
UINT64 MakeValid){
_MMPFN *PfnDb;
_MMPFN *v9;
_MMPFN *v10;
__int64 v11;
unsigned __int64 v12;
char v13;
char v14;
unsigned __int64 v15;
__int64 v16;
__int64 v17;
int v18;
__int64 v19;
int v20;
int v21;
PfnDb = MmGetPfnDb();
v9 = &PfnDb[(_QWORD)PointerPde];
v10 = &PfnDb[MakeValid];
v9->OriginalPte.u.Long = MiSwizzleInvalidPte(128i64);
v9->u4._bf_0 ^= (v11 ^ v9->u4._bf_0) & 0xFFFFFFFFFi64;
v12 = MiLockPageInline(v10);
v10->u2._bf_0 ^= ((v10->u2._bf_0 + 1) ^ v10->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LODWORD(MakeValid) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v9->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&MakeValid);
while( v9->u2._bf_0 < 0 );
}
v13 = *((_BYTE *)&v9->u3 + 2) | 0x10;
*((_BYTE *)&v9->u3 + 2) = v13;
v14 = v13;
if( (v13 & 0xC0) != 64 )
{
MiChangePageAttribute(v9, MiCached, 1ui64);
v14 = *((_BYTE *)&v9->u3 + 2);
}
v15 = v9->u2._bf_0 & 0xC000000000000001ui64;
v9->u3.ReferenceCount = 1;
v9->PteLong = (unsigned __int64)PointerNewPde;
v9->u2._bf_0 = v15 | 1;
*((_BYTE *)&v9->u3 + 2) = v14 & 0xF8 | 6;
MiAddLockedPageCharge(v9, 1ui64);
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
if( v21 == 1 )
{
LODWORD(v19) = MiMakeTransitionPte((INT64)PointerPde, 4);
v17 = v19;
LOBYTE(v20) = MiPteInShadowRange(ContainingFrame);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
goto LABEL_14;
}
else
{
LODWORD(v16) = MiMakeValidPte((_XSTATE_CONFIGURATION *)PointerNewPde, (INT64)PointerPde, 2147483652i64);
v17 = v16 | 4;
LOBYTE(v18) = MiPteInShadowRange(ContainingFrame);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
LABEL_14:
v17 |= 0x8000000000000000ui64;
}
*(_QWORD *)ContainingFrame = v17;
}Referenced by:
MiUpdateForkMaps