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