MiReAcquireOutSwappedProcessCommit

NTSTATUS __stdcall MiReAcquireOutSwappedProcessCommit(_EPROCESS *Process){
  _MMSUPPORT_SHARED *SharedVm; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v4; 
  _MMSUPPORT_SHARED *v5; 
  NTSTATUS v6; 
  unsigned int v7; 
  _MMSUPPORT_SHARED *v8; 
  UINT8 v9; 
  _QWORD *CommitReleaseContext; 
  _MMSUPPORT_SHARED *v11; 
  UINT8 v12; 
  _WORK_QUEUE_ITEM *v13; 
  _KEVENT *Blink; 

  KeForceAttachProcess(Process);
  SharedVm = MiGetSharedVm(&Process->Vm.Instance);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0;
  v5 = SharedVm;
  if( dword_140CFA1D0 != 1 )
  {
    if( (Process->Flags & 8) != 0 )
    {
      v7 = 1;
      v6 = 0;
    }
    else
    {
      v7 = 0;
      v6 = MiChargeCommit(
             *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * Process->Vm.Instance.PartitionId),
             SharedVm->ReleasedCommitDebt,
             1ui64);
      if( v6 )
        goto LABEL_15;
    }
    MiLogOutswappedProcessCommitReacquire(Process, v5->ReleasedCommitDebt, 1ui64, v7);
    _InterlockedOr((volatile signed __int32 *)&Process->2172, 0x100u);
    v8 = MiGetSharedVm(&Process->Vm.Instance);
    v9 = ExAcquireSpinLockExclusive((INT64 *)&v8->WorkingSetLock);
    v8->GoodCitizenWaiting = 0;
    Process->Vm.Instance.Flags._bf_0 |= 0x60u;
    MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v9);
    MiBeginProcessClean(CurrentThread, Process);
    KeFreezeProcess(&Process->Pcb, 0);
    ObfReferenceObjectWithTag(Process, 0x746C6644ui64);
    CommitReleaseContext = v5->CommitReleaseContext;
    CommitReleaseContext[2] = MiReAcquireCommitFailWorker;
    CommitReleaseContext[3] = Process;
    *CommitReleaseContext = 0i64;
    goto LABEL_6;
  }
  v6 = 1;
LABEL_15:
  MiLogOutswappedProcessCommitReacquire(Process, v5->ReleasedCommitDebt, 0i64, 0i64);
LABEL_6:
  v11 = MiGetSharedVm(&Process->Vm.Instance);
  v12 = ExAcquireSpinLockExclusive((INT64 *)&v11->WorkingSetLock);
  v11->GoodCitizenWaiting = 0;
  if( (Process->Vm.Instance.Flags._bf_0 & 0x60) == 64 )
    Process->Vm.Instance.Flags._bf_0 = Process->Vm.Instance.Flags._bf_0 & 0x9F | 0x20;
  v13 = (_WORK_QUEUE_ITEM *)v5->CommitReleaseContext;
  if( v6 )
  {
    v5->ReleasedCommitDebt = 0i64;
    v5->CommitReleaseContext = 0i64;
  }
  MiUnlockWorkingSetExclusive(&Process->Vm.Instance, v12);
  KeForceDetachProcess(0i64, 0);
  Blink = (_KEVENT *)v13[1].List.Blink;
  if( Blink )
    KeSetEvent(Blink, 0, 0);
  if( v6 )
  {
    ExFreePoolWithTag(v13, 0);
  }
  else
  {
    ExQueueWorkItem(v13, CriticalWorkQueue);
    return -1073741523;
  }
  return v4;
}

Referenced by:

KiInSwapProcesses