MiCopyPage
void __fastcall MiCopyPage(ULONG_PTR a1, ULONG_PTR a2, __int128 *a3, int a4){
_MMPFN *PfnDb;
char v8;
UNICODE_STRING *v9;
UINT64 v10;
int v11;
unsigned int PagePrivilege;
INT64 v13;
WCHAR *v14;
int v15;
unsigned __int8 v16;
int v17;
int v18;
_MMPTE *PteBase;
unsigned __int8 v20;
int v21;
NTSTATUS v22;
INT64 v23;
unsigned __int8 CurrentIrql;
UINT64 HyperSpace;
UINT64 *PteFromCopyList;
unsigned __int64 v27;
_MMPTE *Pml4eBase;
_MMPTE *PxeUserLimit;
unsigned __int64 v30;
unsigned __int64 *v31;
unsigned __int8 v32;
__int64 v33;
int v34;
UINT64 v35;
LARGE_INTEGER ThawTimeout[2];
__int128 v37;
__int128 v38;
__int64 v39;
int v42;
v39 = 0i64;
PfnDb = MmGetPfnDb();
v8 = 0;
v38 = 0i64;
v37 = 0i64;
*(_OWORD *)&ThawTimeout[0].LowPart = 0i64;
v9 = (UNICODE_STRING *)((char *)PfnDb + 48 * a2);
v35 = (UINT64)v9;
v10 = (UINT64)PfnDb + 48 * a1;
v11 = -1073741823;
v42 = a4 & 4;
v34 = v42 != 0 ? 4 : 0;
PagePrivilege = MiGetPagePrivilege((ULONG_PTR)v9, v42, (unsigned __int64 *)&v37);
v15 = 2;
v16 = PagePrivilege;
if( PagePrivilege )
{
if( (a4 & 0x12) != 0 )
{
v8 = 2;
v17 = a4 & 2;
}
else if( (MiFlags & 0x10000) == 0
|| (a4 & 8) != 0
|| (PagePrivilege & 1) == 0
|| (LOBYTE(v18) = MI_PFN_IS_PROTO(v9, (UNICODE_STRING *)PagePrivilege, 2u, v14), v18) )
{
if( (MiFlags & 0x40000) == 0 || (a4 & 8) != 0 || (v8 = v15, (v16 & (unsigned __int8)v15) == 0) )
v8 = 4;
v17 = v15 & a4;
}
else
{
v8 = v15;
v17 = v15 & a4;
}
}
else
{
v17 = a4 & 2;
if( (a4 & 2) == 0 )
v8 = 4;
}
PteBase = MmGetPteBase();
if( ((unsigned __int8)v8 & (unsigned __int8)v15) != 0 )
{
v20 = 17;
if( (MiFlags & 0x40000) != 0 )
{
MiFlushEntireTbDueToAttributeChange(v13, PteBase);
PteBase = MmGetPteBase();
}
if( (MiFlags & 0x8000) == 0 )
goto LABEL_31;
if( v17 )
{
*(_OWORD *)&ThawTimeout[0].LowPart = v37;
}
else
{
ThawTimeout[0].QuadPart = (__int64)((*(_QWORD *)(v10 + 8) << 25) - ((_QWORD)PteBase << 25)) >> 16;
if( ThawTimeout[0].QuadPart < 0xFFFF800000000000ui64 )
{
v8 |= 8u;
ThawTimeout[1] = *(LARGE_INTEGER *)(*((_QWORD *)KeGetCurrentThread() + 23) + 992i64);
if( !v42 )
v20 = MiLockPageInline(v10);
MiMarkPfnVerified(v10, 4);
MiAbortCombineScan(v10);
v21 = v42;
if( v42 )
goto LABEL_28;
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v20);
v20 = 17;
}
}
v21 = v42;
LABEL_28:
if( (a4 & 0x20) != 0 && !v21 )
v20 = MiLockPageInline(v10);
LABEL_31:
v22 = KeCopyPrivilegedPage((LARGE_INTEGER *)a1, ThawTimeout, a2);
v11 = v22;
if( v22 < 0 )
KeBugCheckEx(0x1Au, 0x5150Aui64, a2, a1, v22);
if( v20 != 17 )
{
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v20);
}
if( (MiFlags & 0x40000) != 0
&& !v17
&& (*(_QWORD *)(v10 + 8) | 0x8000000000000000ui64) < (unsigned __int64)MmGetPteBase() + 0x4000000000i64 )
{
v11 = KeSetPagePrivilege(a1, (__int128 *)ThawTimeout, 4);
if( v11 < 0 )
KeBugCheckEx(0x1Au, 0x5150Dui64, a2, a1, 0i64);
}
}
if( ((*(_QWORD *)(v35 + 40) >> 60) & 7) == 3 )
{
if( v17 )
MiClearPfnImageVerified(v35, v34);
if( (v8 & 4) == 0 && ((*(_QWORD *)(v10 + 40) >> 60) & 7) != 3 )
MiMarkPfnVerified(v10, v34);
}
if( v11 < 0 )
{
v23 = *(unsigned __int8 *)(v35 + 34) >> 6;
if( *(unsigned __int8 *)(v10 + 34) >> 6 != (_DWORD)v23 )
MiChangePageAttribute(v10, v23, 0);
if( !a3 )
{
a3 = &v38;
if( (a4 & 1) == 0 || (MiCreatePteCopyList(2ui64, 2ui64, (__int64)&v38), !DWORD1(v38)) )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
BYTE8(v38) = CurrentIrql;
HyperSpace = MiAllocateHyperSpace(2ui64);
*(_QWORD *)&v38 = 0x200000000i64;
v39 = (__int64)MmGetPteBase() + ((HyperSpace >> 9) & 0x7FFFFFFFF8i64);
BYTE9(v38) = 1;
}
}
PteFromCopyList = MiGetPteFromCopyList((UINT64 *)a3, a1, a2);
KeCopyPage((PVOID)((__int64)(((_QWORD)PteFromCopyList << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
v27 = ZeroPte;
Pml4eBase = MmGetPml4eBase();
PxeUserLimit = MmGetPxeUserLimit();
if( PteFromCopyList >= (UINT64 *)Pml4eBase
&& PteFromCopyList <= (UINT64 *)PxeUserLimit
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (ZeroPte & 1) != 0 )
{
v27 = ZeroPte | 0x8000000000000000ui64;
}
*PteFromCopyList = v27;
v30 = ZeroPte;
v31 = PteFromCopyList + 1;
if( v31 >= (unsigned __int64 *)Pml4eBase
&& v31 <= (unsigned __int64 *)PxeUserLimit
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (ZeroPte & 1) != 0 )
{
v30 = ZeroPte | 0x8000000000000000ui64;
}
*v31 = v30;
if( a3 == &v38 )
{
v32 = *((_BYTE *)a3 + 8);
if( v32 == 17 )
{
MiReleasePtes((INT64)&qword_140C4EC80, *((_QWORD *)a3 + 2), 2ui64);
}
else
{
v33 = *((_QWORD *)KeGetCurrentPrcb() + 4095);
if( v33 )
{
*(_QWORD *)(v33 + 12344) = 0i64;
v32 = *((_BYTE *)a3 + 8);
}
__writecr8(v32);
}
}
}
}Referenced by:
MiCopyFileOnlyGlobalSubsectionPage
MiCopyHeaderIfResident
MiCopyOnWrite
MiDuplicateCloneLeaf
MiFillPerSessionProtos
MiIdealClusterPage
MiMigratePfn
MiPrivateFixup
MiReplaceTransitionPage
MiSplitDirectMapPage
MiSwapNumaStandbyPage
MiSwapStackPageNoDpc
MiTradeActivePage