MiRemoveVadCharges
VOID __stdcall MiRemoveVadCharges(_MMVAD *Vad, ULONG_PTR CurrentProcess){
__int64 v3;
_MI_PARTITION *ProcessPartition;
int v5;
NTSTATUS v6;
__int64 LongFlags1;
unsigned __int64 v8;
__int64 v9;
unsigned int v10;
_MMSUPPORT_SHARED *SharedVm;
UINT64 v12;
unsigned __int64 ReleasedCommitDebt;
UINT64 v14;
__int128 CommitReturnInfo;
_MI_DELETE_VA_INFO DeleteInfo;
_MMVAD_SHORT *NextVad;
__int128 v18;
__int64 v19;
v3 = *(_QWORD *)&CurrentProcess;
*(_QWORD *)&DeleteInfo.ResidentPages = 0i64;
v19 = 0i64;
v18 = 0i64;
CommitReturnInfo = 0i64;
ProcessPartition = MiGetProcessPartition(*(VOID **)&CurrentProcess, *(_EPROCESS **)&CurrentProcess);
v5 = 0;
if( MiIsVadLarge((INT64)Vad) && (Vad->Core.u.LongFlags & 0x70) != 80 )
{
v5 = 1;
v6 = MiVadCommitCrossPartition((INT64)Vad);
}
LongFlags1 = Vad->Core.u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
v8 = LongFlags1 | ((unsigned __int64)Vad->Core.CommitChargeHigh << 31);
if( v8 < 0x7FFFFFFFDi64 && !v6 )
{
*(_QWORD *)&DeleteInfo.ReducedCommitClonePages = Vad->Core.ExtraCreateInfo;
NextVad = Vad->Core.NextVad;
MiFillCommitReturnInfo(v8, &DeleteInfo, (_MI_COMMIT_RETURN_INFO *)&CommitReturnInfo);
v9 = CommitReturnInfo;
if( (_QWORD)CommitReturnInfo )
{
MiReturnFullProcessCharges(v3, CommitReturnInfo);
if( v5 )
_InterlockedExchangeAdd64((volatile signed __int64 *)(v3 + 2032), -v9);
}
if( !*((_QWORD *)&CommitReturnInfo + 1) )
goto LABEL_6;
SharedVm = MiGetSharedVm((_MMSUPPORT_INSTANCE *)(v3 + 1664));
ReleasedCommitDebt = SharedVm->ReleasedCommitDebt;
if( ReleasedCommitDebt )
{
if( v12 <= ReleasedCommitDebt )
{
SharedVm->ReleasedCommitDebt = ReleasedCommitDebt - v12;
LABEL_6:
Vad->Core.u1.LongFlags1 &= 0x80000000;
Vad->Core.CommitChargeHigh = 0;
goto LABEL_7;
}
v12 -= ReleasedCommitDebt;
SharedVm->ReleasedCommitDebt = 0i64;
}
if( v12 )
MiReturnCommit(ProcessPartition, v12);
goto LABEL_6;
}
LABEL_7:
v10 = Vad->Core.u.LongFlags & 0x70;
if( v10 == 64 || v10 == 16 )
{
LODWORD(v14) = MiResidentPagesForSpan(
(VOID *)((Vad->Core.StartingVpn | ((unsigned __int64)Vad->Core.StartingVpnHigh << 32)) << 12),
(VOID *)(((Vad->Core.EndingVpn | ((unsigned __int64)Vad->Core.EndingVpnHigh << 32)) << 12) | 0xFFF));
if( v14 )
MiReturnResident((INT64)ProcessPartition, v14);
}
MiReleaseVadEventBlocks(&Vad->Core);
}Referenced by:
MiFinishVadDeletion