MiReleaseOutSwappedProcessCommit

VOID __stdcall MiReleaseOutSwappedProcessCommit(_EPROCESS *Process){
  _MMSUPPORT_SHARED *SharedVm; 
  __int64 PartitionId; 
  __int64 v4; 
  _ETHREAD *CurrentThread; 
  UINT64 *Pool; 
  _MMSUPPORT_SHARED *v7; 
  UINT8 v8; 
  UINT64 v9; 
  UINT64 v10; 
  _MI_PARTITION *v11; 
  int v12; 
  UINT64 v13; 
  _RTL_BALANCED_NODE *Root; 
  _MMVAD_SHORT *i; 
  int v16; 
  __int64 v17; 
  __int64 v18; 
  _MMVAD_SHORT **ExtraCreateInfo; 
  _MMVAD_SHORT *v20; 
  _MMVAD_SHORT *NextVad; 
  UINT64 v22; 
  _MMSUPPORT_SHARED *v23; 
  UINT8 v24; 
  _MMSUPPORT_FLAGS Flags; 
  __int8 v26; 
  UINT64 AcceptStorePages; 
  _MI_PARTITION *Partition; 
  UINT64 CommitSizeUsed; 
  _MMSUPPORT_SHARED *v30; 

  CommitSizeUsed = 0i64;
  KeForceAttachProcess(Process);
  SharedVm = MiGetSharedVm(&Process->Vm.Instance);
  PartitionId = Process->Vm.Instance.PartitionId;
  v4 = (__int64)SharedVm;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v30 = SharedVm;
  Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * PartitionId);
  Pool = (UINT64 *)MiAllocatePool(64i64, 0x38ui64, 0x7243694Dui64);
  if( Pool )
  {
    v7 = MiGetSharedVm(&Process->Vm.Instance);
    v8 = ExAcquireSpinLockExclusive((INT64 *)&v7->WorkingSetLock);
    v7->GoodCitizenWaiting = 0;
    Process->Vm.Instance.Flags._bf_0 |= 0x60u;
    MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v8);
    v9 = 1i64;
    if( dword_140CFA1D0 == 1 )
    {
      v10 = 0i64;
    }
    else
    {
      v11 = Partition;
      v12 = 0;
      v13 = 0i64;
      if( Partition->Store.Registered && (unsigned int)SmStoreExistsForProcess(Process) )
        v12 = 1;
      --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( v16 )
        {
          LODWORD(AcceptStorePages) = v12;
          LODWORD(v17) = MiCheckCommitReleaseFromVad(v11, Process, &Process->Vm.Instance, i, AcceptStorePages, Pool + 4);
          v18 = v17;
          MiUnlockVad(CurrentThread, i);
          v13 += v18;
          v11 = Partition;
        }
        else
        {
          MiUnlockVad(CurrentThread, i);
        }
        ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
        v20 = 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 == v20 )
              break;
            v20 = i;
          }
        }
      }
      UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
      v9 = v13;
      _InterlockedExchange64((volatile __int64 *)&Process->Vm.Shared.ResetPagesRepurposedCount, 0i64);
      v10 = Pool[4];
      if( v12 )
      {
        SmQueryStoreCommitUsage(Process, &CommitSizeUsed);
        v22 = ((CommitSizeUsed & 0xFFF) != 0) + (CommitSizeUsed >> 12);
        CommitSizeUsed = v22;
        if( v13 <= v22 )
          v9 = 0i64;
        else
          v9 = v13 - v22;
      }
      if( v9 )
        MiReturnCommit(v11, v9);
      v4 = (__int64)v30;
    }
    v23 = MiGetSharedVm(&Process->Vm.Instance);
    v24 = ExAcquireSpinLockExclusive((INT64 *)&v23->WorkingSetLock);
    v23->GoodCitizenWaiting = 0;
    Flags = Process->Vm.Instance.Flags;
    if( v9 )
    {
      *(_QWORD *)(v4 + 32) = Pool;
      v26 = Flags.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 & 0x9F | 0x40;
      *(_QWORD *)(v4 + 8) = v9;
      Pool = 0i64;
    }
    else
    {
      v26 = Flags.$2436257948A9E417F8C1432C685A007E::$56A022E0416FA8F0D143F219D5D8FA21::_bf_0 & 0x9F;
    }
    Process->Vm.Instance.Flags._bf_0 = v26;
    MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v24);
    MiLogOutswappedProcessCommitRelease(Process, v9, v10);
  }
  KeForceDetachProcess(0i64, 0);
  if( Pool )
    ExFreePoolWithTag(Pool, 0);
}

Referenced by:

MmOutSwapProcess