MiCheckCommitReleaseFromVad
INT64 __fastcall MiCheckCommitReleaseFromVad(
_MI_PARTITION *Partition,
_EPROCESS *Process,
_MMSUPPORT_INSTANCE *Vm,
_MMVAD_SHORT *Vad,
UINT64 AcceptStorePages,
UINT64 *ResetPagesNotReleasedCount){
unsigned __int64 v6;
_MMSUPPORT_INSTANCE *v7;
_MMPTE *PteBase;
INT64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
char v14;
unsigned __int64 v15;
unsigned __int64 v16;
UINT64 v17;
char *v18;
unsigned __int64 v19;
unsigned __int64 v20;
UINT64 v21;
char *v22;
UINT64 v23;
INT64 v24;
__int64 v25;
_MMPFN *v26;
bool v27;
UINT64 v28;
int a6;
INT64 v31;
UINT64 PagesProcessedOut;
UINT64 v33;
unsigned __int64 v34;
char i;
v6 = (unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32;
v7 = Vm;
a6 = 0;
PagesProcessedOut = 0i64;
PteBase = MmGetPteBase();
v11 = 0i64;
v12 = (unsigned __int64)PteBase + 8 * ((*((unsigned int *)Vad + 6) | v6) & 0xFFFFFFFFFi64);
v13 = (unsigned __int64)PteBase
+ 8 * ((*((unsigned int *)Vad + 7) | ((unsigned __int64)*((unsigned __int8 *)Vad + 33) << 32)) & 0xFFFFFFFFFi64);
v34 = v13;
v14 = MiLockWorkingSetShared((INT64)Vm);
for( i = v14; v12 <= v13; v14 = i )
{
MiGetNextPageTable(v12, v13, 0i64, v14, 0, &a6);
v16 = v15;
if( v15 != v12 )
{
v17 = v15 ? (__int64)(v15 - v12) >> 3 : ((__int64)(v13 - v12) >> 3) + 1;
v11 += MiComputeCommitChargeForZeroPteRange(Vad, (_MMPTE *)v12, v17);
if( !v16 )
break;
}
v12 = v16;
v18 = (char *)MmGetPteBase() + ((v16 >> 9) & 0x7FFFFFFFF8i64);
v19 = v13;
v33 = (UINT64)v18;
if( (v16 & 0xFFFFFFFFFFFFF000ui64) + 4088 <= v13 )
v19 = (v16 & 0xFFFFFFFFFFFFF000ui64) + 4088;
if( v16 <= v19 )
{
while( 1 )
{
v20 = MI_READ_PTE_LOCK_FREE(v12);
v31 = v20;
if( !v20 )
break;
if( (v20 & 1) != 0 )
{
if( (v20 & 0x200) == 0
|| (*((_DWORD *)Vad + 12) & 0x70) == 64 && (unsigned int)MiRotatedToFrameBuffer((MMPTE *)v12) )
{
goto LABEL_48;
}
v22 = (char *)MmGetPfnDb()
+ 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v31) >> 12) & 0xFFFFFFFFFi64);
if( (*((_QWORD *)v22 + 5) & 0x1000000000i64) == 0 && *((__int64 *)v22 + 1) > 0 )
goto LABEL_48;
if( *((_QWORD *)Process + 158)
&& MiLocateCloneAddress((__int64)Process, *((_QWORD *)v22 + 1) | 0x8000000000000000ui64) )
{
goto LABEL_48;
}
LABEL_47:
++v11;
goto LABEL_48;
}
if( (v20 & 0x400) != 0 )
{
if( MiIsPrototypePteVadLookup(v20) )
{
v24 = v11 + 1;
if( ((v23 >> 5) & 5) != 5 )
v24 = v11;
v11 = v24;
goto LABEL_48;
}
if( MI_PROTO_FORMAT_COMBINED(v23) )
goto LABEL_48;
if( *((_QWORD *)Process + 158) )
{
if( qword_140C4DC80 && (v25 & 0x10) == 0 )
v25 &= ~qword_140C4DC80;
if( MiLocateCloneAddress((__int64)Process, v25 >> 16) )
goto LABEL_48;
}
MiComputeImageVadCommitCharge(
(_MMVAD *)Vad,
(unsigned __int64)((__int64)((v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) >> 12,
1ui64,
&PagesProcessedOut);
goto LABEL_33;
}
if( (v20 & 0x800) != 0 )
{
v26 = MiLockTransitionLeafPage((_MMPTE *)v12, 0i64);
if( v26 )
{
if( (*((_BYTE *)v26 + 34) & 0x10) == 0 && (*((_DWORD *)v26 + 4) & 4) == 0 && !*((_WORD *)v26 + 16) )
++*ResetPagesNotReleasedCount;
_InterlockedAnd64((volatile signed __int64 *)v26 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
else
{
v12 -= 8i64;
}
goto LABEL_48;
}
if( (v20 & 4) != 0 )
{
if( !(_DWORD)AcceptStorePages )
goto LABEL_48;
v27 = (unsigned int)MiIsPteInStore((__int64)Partition, v20) == 0;
}
else
{
v27 = ((v20 >> 5) & 0x1F) == 16;
}
if( !v27 )
goto LABEL_47;
LABEL_48:
v12 += 8i64;
if( v12 > v19 )
{
v18 = (char *)v33;
v13 = v34;
goto LABEL_50;
}
}
v21 = MiComputeCommitChargeForZeroPteRange(Vad, (_MMPTE *)v12, 1ui64);
LABEL_33:
v11 += v21;
goto LABEL_48;
}
LABEL_50:
v28 = (UINT64)v18;
v7 = Vm;
MiUnlockPageTableInternal((INT64)Vm, v28);
}
MiUnlockWorkingSetShared((INT64)v7, v14);
return v11;
}Referenced by:
MiReleaseOutSwappedProcessCommit