MiReleaseCommitForResetPages
VOID __stdcall MiReleaseCommitForResetPages(_EPROCESS *Process){
_MMSUPPORT_SHARED *SharedVm;
_ETHREAD *CurrentThread;
_MMSUPPORT_SHARED *v4;
void *CommitReleaseContext;
_RTL_BALANCED_NODE *Root;
_MMVAD_SHORT *i;
int v8;
_MMVAD_SHORT **ExtraCreateInfo;
_MMVAD_SHORT *v10;
_MMVAD_SHORT *NextVad;
UINT64 v12;
_MMSUPPORT_SHARED *v13;
UINT8 v14;
_KEVENT *v15;
unsigned __int64 v16;
UINT64 v17;
KeForceAttachProcess(Process);
SharedVm = MiGetSharedVm(&Process->Vm.Instance);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = SharedVm;
CommitReleaseContext = SharedVm->CommitReleaseContext;
if( (*((_DWORD *)CommitReleaseContext + 12) & 1) != 0 )
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&Process->AddressCreationLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 1u;
Root = Process->VadRoot.Root;
i = 0i64;
while( Root )
{
i = (_MMVAD_SHORT *)Root;
Root = Root->Children[0];
}
while( i )
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&i->PushLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 0x80u;
MiIsVadEligibleForCommitRelease(i);
if( v8 )
MiWalkResetCommitPages((INT64)i);
MiUnlockVad(CurrentThread, i);
ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
v10 = i;
if( ExtraCreateInfo )
{
NextVad = *ExtraCreateInfo;
for( i = (_MMVAD_SHORT *)i->ExtraCreateInfo; NextVad; NextVad = NextVad->NextVad )
i = NextVad;
}
else
{
while( 1 )
{
i = (_MMVAD_SHORT *)(i->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
if( !i || i->NextVad == v10 )
break;
v10 = i;
}
}
}
UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
}
v12 = _InterlockedExchange64((volatile __int64 *)&Process->Vm.Shared.ResetPagesRepurposedCount, 0i64);
if( v12 )
MiReturnCommit(*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * Process->Vm.Instance.PartitionId), v12);
v13 = MiGetSharedVm(&Process->Vm.Instance);
v14 = ExAcquireSpinLockExclusive((INT64 *)&v13->WorkingSetLock);
v13->GoodCitizenWaiting = 0;
v15 = (_KEVENT *)*((_QWORD *)CommitReleaseContext + 5);
*((_QWORD *)CommitReleaseContext + 5) = 0i64;
v16 = *((_QWORD *)CommitReleaseContext + 4);
if( v16 <= v12 )
v17 = 0i64;
else
v17 = v16 - v12;
*((_QWORD *)CommitReleaseContext + 4) = v17;
v4->ReleasedCommitDebt += v12;
MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v14);
MiLogResetPagesCommitRelease(Process, v12);
KeForceDetachProcess(0i64, 0);
KeSetEvent(v15, 0, 0);
}Referenced by:
MmOutSwapProcess