MxCreatePfn
VOID __fastcall MxCreatePfn(UINT64 PageFrameIndex, _MMPTE *PointerPxe, UINT64 ContainingPage, UINT64 LeafPage){
char *v4;
UINT64 v5;
char v6;
INT64 v7;
int v8;
int v9;
INT64 v10;
__int64 v11;
__int16 v12;
__int64 v13;
int v14;
int v15;
v4 = (char *)MmGetPfnDb() + 48 * PageFrameIndex;
if( v15 == 1 )
{
*(_OWORD *)v4 = 0i64;
*((_OWORD *)v4 + 1) = 0i64;
*((_OWORD *)v4 + 2) = 0i64;
}
v5 = LeafPage ^ *((_QWORD *)v4 + 5);
*((_QWORD *)v4 + 1) = PointerPxe;
*((_WORD *)v4 + 16) = 1;
*((_QWORD *)v4 + 5) ^= v5 & 0xFFFFFFFFFi64;
LOBYTE(v5) = v4[34] & 0xFE;
*((_QWORD *)v4 + 3) ^= (*((_QWORD *)v4 + 3) ^ (*((_QWORD *)v4 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
v4[34] = v5 | 6;
if( (ContainingPage & 0x10) != 0 || (ContainingPage & 8) == 0 )
v6 = (ContainingPage & 0x10) == 0;
else
v6 = 2;
v4[34] = v4[34] & 0x3F | (v6 << 6);
v7 = MiSwizzleInvalidPte(128i64);
if( v8 == v9 )
{
v7 |= 0x300ui64;
}
else if( !v8 )
{
v7 |= 0x100ui64;
}
*(_QWORD *)(v10 + 16) = v7;
*(_BYTE *)(v10 + 34) |= 0x10u;
*(_QWORD *)(v10 + 40) |= 0x4000000000000ui64;
if( v14 == 1 )
{
if( v11 == (v11 & 0xFFFFFFFFFFFFFE00ui64) )
*(_BYTE *)(v10 + 39) = v9 | *(_BYTE *)(v10 + 39) & 0xFE;
MiSetResidentPageMemberInPfn(v10, 1ui64);
*(_WORD *)(v13 + 32) = v12;
}
}Referenced by:
MxCreatePfns