MiBuildForkPageTable
VOID __stdcall MiBuildForkPageTable(
UINT64 PageFrameIndex,
MMPTE *PointerPde,
MMPTE *PointerNewPde,
UINT64 ContainingFrame,
UINT64 MakeValid){
_MMPFN *PfnDb;
INT64 v9;
INT64 v10;
__int64 v11;
unsigned __int64 v12;
char v13;
char v14;
unsigned __int64 v15;
UINT64 v16;
UINT64 TransitionPte;
int v18;
PfnDb = MmGetPfnDb();
v9 = (INT64)PfnDb + 48 * (_QWORD)PointerPde;
v10 = (INT64)PfnDb + 48 * MakeValid;
*(_QWORD *)(v9 + 16) = MiSwizzleInvalidPte(128i64);
*(_QWORD *)(v9 + 40) ^= (v11 ^ *(_QWORD *)(v9 + 40)) & 0xFFFFFFFFFi64;
v12 = (unsigned __int8)MiLockPageInline(v10);
*(_QWORD *)(v10 + 24) ^= ((*(_QWORD *)(v10 + 24) + 1i64) ^ *(_QWORD *)(v10 + 24)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
LODWORD(MakeValid) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v9 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&MakeValid);
while( *(__int64 *)(v9 + 24) < 0 );
}
v13 = *(_BYTE *)(v9 + 34) | 0x10;
*(_BYTE *)(v9 + 34) = v13;
v14 = v13;
if( (v13 & 0xC0) != 64 )
{
MiChangePageAttribute(v9, 1i64, 1);
v14 = *(_BYTE *)(v9 + 34);
}
v15 = *(_QWORD *)(v9 + 24) & 0xC000000000000001ui64;
*(_WORD *)(v9 + 32) = 1;
*(_QWORD *)(v9 + 8) = PointerNewPde;
*(_QWORD *)(v9 + 24) = v15 | 1;
*(_BYTE *)(v9 + 34) = v14 & 0xF8 | 6;
MiAddLockedPageCharge(v9, 1);
_InterlockedAnd64((volatile signed __int64 *)(v9 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
if( v18 == 1 )
TransitionPte = MiMakeTransitionPte((UINT64)PointerPde, 4ui64, v16);
else
TransitionPte = MiMakeValidPte((UINT64)PointerNewPde, (INT64)PointerPde, 2147483652i64) | 4;
*(_QWORD *)ContainingFrame = TransitionPte;
}Referenced by:
MiUpdateForkMaps