MiReAcquireOutSwappedProcessCommit

NTSTATUS __stdcall MiReAcquireOutSwappedProcessCommit(_EPROCESS *Process){
  INT64 *SharedVm; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v4; 
  INT64 *v5; 
  int v6; 
  unsigned int v7; 
  INT64 *v8; 
  KIRQL v9; 
  _QWORD *v10; 
  INT64 *v11; 
  KIRQL v12; 
  WORK_QUEUE_ITEM *v13; 
  struct _KEVENT *Blink; 
  KeForceAttachProcess(Process);
  SharedVm = MiGetSharedVm((INT64)Process + 1664);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0;
  v5 = SharedVm;
  if( dword_140CFA1D0 != 1 )
  {
    if( (*((_DWORD *)Process + 281) & 8) != 0 )
    {
      v7 = 1;
      v6 = 0;
    }
    else
    {
      v7 = 0;
      v6 = MiChargeCommit(
             *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *((unsigned __int16 *)Process + 919)),
             SharedVm[1],
             1ui64);
      if( v6 )
        goto LABEL_15;
    }
    MiLogOutswappedProcessCommitReacquire(Process, v5[1], 1ui64, v7);
    _InterlockedOr((volatile signed __int32 *)Process + 543, 0x100u);
    v8 = MiGetSharedVm((INT64)Process + 1664);
    v9 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v8);
    *((_DWORD *)v8 + 1) = 0;
    *((_BYTE *)Process + 1851) |= 0x60u;
    MiUnlockWorkingSetExclusive((INT64)Process + 1664, v9);
    MiBeginProcessClean((__int64)CurrentThread, (__int64)Process);
    KeFreezeProcess((__int64)Process, 0);
    ObfReferenceObjectWithTag(Process, 0x746C6644u);
    v10 = (_QWORD *)v5[4];
    v10[2] = MiReAcquireCommitFailWorker;
    v10[3] = Process;
    *v10 = 0i64;
    goto LABEL_6;
  }
  v6 = 1;
LABEL_15:
  MiLogOutswappedProcessCommitReacquire(Process, v5[1], 0i64, 0i64);
LABEL_6:
  v11 = MiGetSharedVm((INT64)Process + 1664);
  v12 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v11);
  *((_DWORD *)v11 + 1) = 0;
  if( (*((_BYTE *)Process + 1851) & 0x60) == 64 )
    *((_BYTE *)Process + 1851) = *((_BYTE *)Process + 1851) & 0x9F | 0x20;
  v13 = (WORK_QUEUE_ITEM *)v5[4];
  if( v6 )
  {
    v5[1] = 0i64;
    v5[4] = 0i64;
  }
  MiUnlockWorkingSetExclusive((INT64)Process + 1664, v12);
  KeForceDetachProcess(0i64, 0);
  Blink = (struct _KEVENT *)v13[1].List.Blink;
  if( Blink )
    KeSetEvent(Blink, 0);
  if( v6 )
  {
    ExFreePoolWithTag(v13, 0);
  }
  else
  {
    ExQueueWorkItem(v13, CriticalWorkQueue);
    return -1073741523;
  }
  return v4;
}

Referenced by:

KiInSwapProcesses