MiSplitReducedCommitClonePage
__int64 __fastcall MiSplitReducedCommitClonePage(unsigned __int64 *a1){
int v3;
_ETHREAD *CurrentThread;
INT64 *v5;
unsigned __int64 v6;
INT64 *v7;
int v8;
INT64 **v9;
unsigned __int64 v10;
INT64 *v11;
INT64 **v12;
MMPTE *v13;
INT64 v14;
unsigned __int64 v15;
UNICODE_STRING *v16;
UINT8 v17;
PWCHAR v18;
int v19;
__int64 v20;
_QWORD *CloneAddress;
__int64 v22;
unsigned __int64 v23;
INT64 v24;
INT64 v25;
v24 = 0i64;
if( !MiProcessCommitIntact() )
return 3221225477i64;
MiUnlockProbePacketWorkingSet((INT64)a1);
v3 = 1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = (INT64 *)((char *)MmGetPteBase() + ((*a1 >> 9) & 0x7FFFFFFFF8i64));
v6 = a1[10];
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx(v6 + 1232, 0i64);
v8 = MiChargeFullProcessCommitment(a1[10], 1ui64);
if( v8 >= 0 )
{
MiLockProbePacketWorkingSet((INT64)a1, v7, v9);
v13 = MiLockLowestValidPageTable(a1[12], v5, (INT64 **)&v24);
v14 = v24;
a1[4] = (unsigned __int64)v13;
if( (INT64 *)v14 == v5 )
{
v25 = MI_READ_PTE_LOCK_FREE(v14);
if( (v25 & 1) != 0 )
{
v15 = MI_READ_PTE_LOCK_FREE((INT64)&v25);
LOBYTE(v19) = MI_PFN_IS_PROTO(
(UNICODE_STRING *)MmGetPfnDb() + 3 * ((v15 >> 12) & 0xFFFFFFFFFi64),
v16,
v17,
v18);
if( v19 )
{
if( (*(_QWORD *)(v20 + 40) & 0x1000000000i64) != 0 || *(__int64 *)(v20 + 8) <= 0 )
{
CloneAddress = MiLocateCloneAddress(a1[10], *(_QWORD *)(v20 + 8) | 0x8000000000000000ui64);
if( CloneAddress )
{
if( *(_QWORD *)(*(_QWORD *)(v22 + 1680) + 360i64) > CloneAddress[12] )
{
v8 = MiCopyOnWrite(*a1, (UINT64 *)v5, -1i64, 0i64);
if( v8 >= 0 )
v3 = 0;
}
}
}
}
}
}
MiUnlockProbePacketWorkingSet((INT64)a1);
if( v3 )
MiReturnFullProcessCommitment(a1[10], 1ui64);
v23 = a1[10];
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v23 + 1232), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v23 + 1232));
KeAbPostRelease((PVOID)(v23 + 1232));
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( v8 < 0 )
MiCopyOnWriteCheckConditions(a1[12], (unsigned int)v8);
v8 = 0;
}
else
{
v10 = a1[10];
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + 1232), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v10 + 1232));
KeAbPostRelease((PVOID)(v10 + 1232));
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
MiLockProbePacketWorkingSet((INT64)a1, v11, v12);
return(unsigned int)v8;
}Referenced by:
MiProbeLeafPteAccess