MiInitializeTransitionPfn
VOID __stdcall MiInitializeTransitionPfn(UINT64 PageFrameIndex, _MMPTE *PointerPte){
__int64 v2;
__int64 v3;
_MMPFN *v6;
__int64 v7;
__int64 v8;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v9;
__int64 bf_0;
char v11;
char v12;
INT64 v13;
unsigned __int64 v14;
__int64 v15;
_MI_PFN_CACHE_ATTRIBUTE v16;
INT64 v17;
char v18;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v19;
int v20;
_MMPFN *v21;
INT64 Long;
v3 = v2;
v6 = &MmGetPfnDb()[PageFrameIndex];
LODWORD(v7) = MiGetContainingPageTable((UINT64)PointerPte);
v6->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
v8 = v7;
LODWORD(v9.Long) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
Long = v9.Long;
if( (v9.Long & 0x400) == 0 && (v9.Long & 0x800) != 0 )
{
v9.Long = (unsigned __int64)MmGetPfnDb()[v3].OriginalPte.u;
Long = v9.Long;
}
bf_0 = v6->u4._bf_0;
v6->OriginalPte.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v9.Long;
v6->PteLong = (unsigned __int64)PointerPte;
v6->u2._bf_0 &= ~0x4000000000000000ui64;
v11 = *((_BYTE *)&v6->u3 + 2);
v6->u4._bf_0 = v8 & 0xFFFFFFFFFi64 | bf_0 & 0xFFFFFFF000000000ui64 | 0x8000000000000000ui64;
if( (v11 & 0x10) != 0 )
v12 = v11 & 0xF8 | 3;
else
v12 = v11 & 0xF8 | 2;
*((_BYTE *)&v6->u3 + 2) = v12;
LODWORD(v13) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
Long = v13;
LODWORD(v14) = MI_READ_PTE_LOCK_FREE((INT64)&Long);
v15 = (v14 >> 5) & 0x1F;
v16 = MiProtectionToCacheAttribute(v15);
MiFinalizePageAttribute(v6, v16, 1ui64);
v6->u2._bf_0 &= 0xC000000000000000ui64;
if( v3 == -1 )
{
LODWORD(v17) = MiMakeTransitionPte(PageFrameIndex, v15);
Long = v17;
v18 = v17;
v19.Long = v17;
LOBYTE(v20) = MiPteInShadowRange((UINT64)PointerPte);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v18 & 1) != 0 )
v19.Long |= 0x8000000000000000ui64;
PointerPte->u.Long = v19.Long;
}
v21 = &MmGetPfnDb()[v8];
MiLockNestedPageAtDpcInline(v21);
v21->u2._bf_0 ^= (v21->u2._bf_0 ^ (v21->u2._bf_0 + 1)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v21->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}Referenced by:
MiCopyDataPageToImagePage
MiCopyFileOnlyGlobalSubsectionPage
MiCopyImageExtentContents
MiInitializeImageProtos
MiSectionCreated