MiCopySinglePage

VOID __fastcall MiCopySinglePage(
        VOID *VirtualAddress,
        UINT64 PageFrameIndex,
        UINT64 ByteOffset,
        UINT64 BytesInChunk,
        _MMPTE *PointerPte,
        UINT64 Flags){
  size_t v6; 
  UINT64 v8; 
  union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4; 
  __int64 bf_0; 
  _MMPFN *PfnDb; 
  INT64 v12; 
  UINT8 v13; 
  int v14; 
  int v15; 
  int v16; 
  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;} v17; 
  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;} v18; 
  int v19; 
  __int64 v20; 
  VOID *v21; 
  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;} v22; 
  int v23; 

  v6 = BytesInChunk;
  if( PageFrameIndex <= 0xFFFFFFFFFi64 )
  {
    v8 = 6 * PageFrameIndex;
    p_u4 = &MmGetPfnDb()->u4;
    bf_0 = p_u4[6 * PageFrameIndex]._bf_0;
    if( (bf_0 & 0x4000000000000i64) != 0 )
    {
      PfnDb = MmGetPfnDb();
      v12 = (INT64)&PfnDb[PageFrameIndex];
      if( (Flags & 1) != 0 )
      {
        v13 = MiLockPageInline(&PfnDb[PageFrameIndex]);
        bf_0 = p_u4[v8]._bf_0;
      }
      else
      {
        v13 = 17;
      }
      if( (bf_0 & 0x4000000000000i64) != 0 )
      {
        if( *(char *)(v12 + 35) < 0 || (LOBYTE(v14) = MiIsPageSecured(v12), v14) )
        {
          if( v13 != 17 )
          {
            _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v13);
          }
        }
        else
        {
          v15 = *(unsigned __int8 *)(v12 + 34) >> 6;
          if( v15 == 3 )
            MiChangePageAttribute((_MMPFN *)v12, MiCached, 1ui64);
          MiMakeProtectionPfnCompatible((_BYTE *)1, (_MMPFN *)v12);
          if( PointerPte )
          {
            LODWORD(v17.Long) = MiMakeValidPte((_XSTATE_CONFIGURATION *)PointerPte, PageFrameIndex, v16 | 0x20000000u);
            v18.Long = v17.Long;
            LOBYTE(v19) = MiPteInShadowRange((UINT64)PointerPte);
            if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v18.Long & 1) != 0 )
              v18.Long |= 0x8000000000000000ui64;
            PointerPte->u.Long = v18.Long;
            v20 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
          }
          else
          {
            v20 = (__int64)MiMapPageInHyperSpaceWorker(PageFrameIndex, 0i64, 0xA0000000ui64);
          }
          v21 = (VOID *)(ByteOffset + v20);
          memmove(VirtualAddress, v21, v6);
          if( PointerPte )
          {
            v22.Long = ZeroPte.u.Long;
            LOBYTE(v23) = MiPteInShadowRange((UINT64)PointerPte);
            if( v23 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
              v22.Long = ZeroPte.u.Long | 0x8000000000000000ui64;
            PointerPte->u.Long = v22.Long;
          }
          else
          {
            MiUnmapPageInHyperSpaceWorker(v21, 0x11u, 0x80000000ui64);
          }
          if( v15 == 3 )
            MiChangePageAttribute((_MMPFN *)v12, MiNotMapped, 3ui64);
          if( v13 != 17 )
          {
            _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v13);
          }
        }
      }
      else if( v13 != 17 )
      {
        _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v13);
      }
    }
  }
}

Referenced by:

MmCopyMemory