MxCreatePfn
VOID __stdcall MxCreatePfn(UINT64 PageFrameIndex, _MMPTE *PointerPxe, UINT64 ContainingPage, UINT64 LeafPage){
_MMPFN *v4;
UINT64 v5;
char v6;
__int64 v7;
int v8;
int v9;
INT64 v10;
__int64 v11;
__int16 v12;
__int64 v13;
int v14;
int v15;
v4 = &MmGetPfnDb()[PageFrameIndex];
if( v15 == 1 )
{
v4->ListEntry = 0i64;
*((_OWORD *)&v4->3 + 1) = 0i64;
*(_OWORD *)&v4->u3.ReferenceCount = 0i64;
}
v5 = LeafPage ^ v4->u4._bf_0;
v4->PteLong = (unsigned __int64)PointerPxe;
v4->u3.ReferenceCount = 1;
v4->u4._bf_0 ^= v5 & 0xFFFFFFFFFi64;
LOBYTE(v5) = *(_BYTE *)(&v4->u3 + 1) & 0xFE;
v4->u2._bf_0 ^= (v4->u2._bf_0 ^ (v4->u2._bf_0 + 1)) & 0x3FFFFFFFFFFFFFFFi64;
*((_BYTE *)&v4->u3 + 2) = v5 | 6;
if( (ContainingPage & 0x10) != 0 || (ContainingPage & 8) == 0 )
v6 = (ContainingPage & 0x10) == 0;
else
v6 = 2;
*((_BYTE *)&v4->u3 + 2) = *(_BYTE *)(&v4->u3 + 1) & 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