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