MiInitializeTransitionPfn
VOID __stdcall MiInitializeTransitionPfn(UINT64 PageFrameIndex, MMPTE *PointerPte){
__int64 v2;
__int64 v3;
char *v6;
UINT64 ContainingPageTable;
UINT64 v8;
INT64 v9;
__int64 v10;
char v11;
char v12;
unsigned __int64 v13;
_MI_PFN_CACHE_ATTRIBUTE v14;
UINT64 v15;
char *v16;
INT64 TransitionPte;
v3 = v2;
v6 = (char *)MmGetPfnDb() + 48 * PageFrameIndex;
ContainingPageTable = MiGetContainingPageTable((UINT64)PointerPte);
*(_QWORD *)v6 = 0i64;
v8 = ContainingPageTable;
v9 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
TransitionPte = v9;
if( (v9 & 0x400) == 0 && (v9 & 0x800) != 0 )
{
v9 = *((_QWORD *)MmGetPfnDb() + 6 * v3 + 2);
TransitionPte = v9;
}
v10 = *((_QWORD *)v6 + 5);
*((_QWORD *)v6 + 2) = v9;
*((_QWORD *)v6 + 1) = PointerPte;
*((_QWORD *)v6 + 3) &= ~0x4000000000000000ui64;
v11 = v6[34];
*((_QWORD *)v6 + 5) = v8 & 0xFFFFFFFFFi64 | v10 & 0xFFFFFFF000000000ui64 | 0x8000000000000000ui64;
if( (v11 & 0x10) != 0 )
v12 = v11 & 0xF8 | 3;
else
v12 = v11 & 0xF8 | 2;
v6[34] = v12;
TransitionPte = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
v13 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&TransitionPte) >> 5) & 0x1F;
v14 = (unsigned int)MiProtectionToCacheAttribute(v13);
MiFinalizePageAttribute((_MMPFN *)v6, v14, 1ui64);
*((_QWORD *)v6 + 3) &= 0xC000000000000000ui64;
if( v3 == -1 )
{
TransitionPte = MiMakeTransitionPte(PageFrameIndex, (unsigned int)v13, v15);
*(_QWORD *)PointerPte = TransitionPte;
}
v16 = (char *)MmGetPfnDb() + 48 * v8;
MiLockNestedPageAtDpcInline((INT64)v16);
*((_QWORD *)v16 + 3) ^= (*((_QWORD *)v16 + 3) ^ (*((_QWORD *)v16 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
}Referenced by:
MiCopyDataPageToImagePage
MiCopyFileOnlyGlobalSubsectionPage
MiCopyImageExtentContents
MiInitializeImageProtos
MiSectionCreated