MiDuplicateCloneLeaf
UINT64 __stdcall MiDuplicateCloneLeaf(
MMPTE *PointerPte,
MMPTE *PointerNewPte,
UINT64 NewPage,
UINT8 WsIrql,
UINT8 PageIrql){
unsigned __int64 v8;
ULONG_PTR v9;
char *v10;
int v11;
unsigned __int64 v12;
INT64 *SharedVm;
__int64 v15;
__int64 v16;
UINT64 v17;
int v18;
UINT64 v19;
INT64 TransitionPte;
UINT64 v21;
unsigned __int64 v22;
unsigned __int8 v23;
int v24;
_ETHREAD *CurrentThread;
unsigned int v26;
INT64 v27;
char PfnPriority;
INT64 v29;
v8 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
v29 = v8;
if( (v8 & 1) != 0 )
{
v9 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v29) >> 12) & 0xFFFFFFFFFi64;
v10 = (char *)MmGetPfnDb() + 48 * v9;
v11 = 1;
v8 = *((_QWORD *)v10 + 2);
}
else
{
v12 = v8;
if( qword_140C4DC80 )
{
if( (v8 & 0x10) != 0 )
v12 = v8 & 0xFFFFFFFFFFFFFFEFui64;
else
v12 = v8 & ~qword_140C4DC80;
}
v9 = (v12 >> 12) & 0xFFFFFFFFFi64;
v10 = (char *)MmGetPfnDb() + 48 * v9;
if( (v10[34] & 0x20) != 0 )
{
v27 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
MiUnlockWorkingSetExclusive(v27, WsIrql);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
++*((_BYTE *)CurrentThread + 1310);
--*((_BYTE *)CurrentThread + 1310);
SharedVm = MiGetSharedVm(v27);
ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
return 0i64;
}
v11 = 0;
}
v15 = (v8 >> 5) & 0x1F;
v24 = MI_IS_SOFTWARE_PTE_SHADOW_STACK((_QWORD *)v10 + 2);
v17 = v16 + 48 * NewPage;
if( v11 != 1 )
MiLockNestedPageAtDpcInline(v16 + 48 * NewPage);
v18 = 129;
if( v11 != 1 )
v18 = 132;
MiCopyPage(NewPage, v9, 0i64, v18);
if( !v11 )
_InterlockedAnd64((volatile signed __int64 *)(v17 + 24), 0x7FFFFFFFFFFFFFFFui64);
PfnPriority = MiGetPfnPriority((INT64)v10);
v26 = (unsigned __int8)v10[34] >> 6;
if( v11 == 1 )
{
TransitionPte = MiMakeTransitionPte(NewPage, (unsigned int)v15, v19);
}
else
{
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(PageIrql);
TransitionPte = MiUpdateTransitionPteFrame(v29, NewPage);
}
v29 = TransitionPte;
*(_QWORD *)PointerNewPte = TransitionPte;
v21 = MiVaToPfn(PointerNewPte);
MiInitializePfnForOtherProcess(NewPage, PointerPte, v21, 0x10ui64);
*(_QWORD *)(v17 + 16) = *(_QWORD *)(v17 + 16) & 0xFFFFFFFFFFFFFC1Fui64 | (32i64 * (unsigned int)v15);
v22 = (unsigned __int8)MiLockPageInline(v17);
if( v24 )
*(_QWORD *)(v17 + 16) |= 0x4000000ui64;
v23 = *(_BYTE *)(v17 + 34);
if( v23 >> 6 != v26 )
{
MiChangePageAttribute(v17, v26, 3);
v23 = *(_BYTE *)(v17 + 34);
}
*(_BYTE *)(v17 + 35) ^= (PfnPriority ^ *(_BYTE *)(v17 + 35)) & 7;
*(_BYTE *)(v17 + 34) = v23 & 0xF8 | 6;
MiDecrementShareCount(v17);
_InterlockedAnd64((volatile signed __int64 *)(v17 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v22);
return 1i64;
}Referenced by:
MiBuildForkPte
MiHandleForkTransitionPte