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