KiInSwapProcesses

VOID __stdcall KiInSwapProcesses(SINGLE_LIST_ENTRY *SwapEntry){
  _LIST_ENTRY *v1; 
  __int64 v2; 
  __int64 v3; 
  SINGLE_LIST_ENTRY *v5; 
  unsigned __int64 PxeSelfRef; 
  int Next_high; 
  UINT8 CurrentIrql; 
  SINGLE_LIST_ENTRY *v9; 
  _LIST_ENTRY *Next; 
  UINT64 v11; 
  UINT64 v12; 
  __int64 v13; 
  void *v14; 
  char *v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  CHAR v18; 
  INT64 v19; 
  CHAR v20; 
  _SINGLE_LIST_ENTRY *v21; 
  UINT64 v22; 
  INT64 v23; 
  INT64 v24; 
  UINT64 v25; 
  INT64 v26; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 *v28; 
  INT64 *v29; 
  _BYTE savedregs[64]; 
  SINGLE_LIST_ENTRY *v31; 
  UINT8 OldIrql; 
  UINT64 OutswappedPageResident; 
  PVOID VirtualAddress; 
  do
  {
    v5 = SwapEntry - 45;
    PxeSelfRef = (unsigned __int64)MmGetPxeSelfRef();
    SwapEntry = SwapEntry->Next;
    v31 = SwapEntry;
    _InterlockedXor((volatile signed __int32 *)&v5[105], 6u);
    OutswappedPageResident = 0i64;
    Next_high = HIDWORD(v5[140].Next);
    OldIrql = 0;
    memset(&LockHandle, 0, sizeof(LockHandle));
    if( (Next_high & 0x80u) != 0 )
    {
      LODWORD(v24) = WORD2(v5[104].Next);
      OutswappedPageResident = MiMakeOutswappedPageResident((__int64)v5, (__int64)v1, v2, v3, v24);
      v11 = OutswappedPageResident;
      v12 = OutswappedPageResident;
      MiPteInShadowRange((UINT64)&OutswappedPageResident);
      v13 = (v11 >> 12) & 0xFFFFFFFFFi64;
      LODWORD(v14) = MiMapPageInHyperSpaceWorker(v13, &OldIrql, 0x80000000ui64);
      VirtualAddress = v14;
      *((_QWORD *)v14 + ((PxeSelfRef >> 3) & 0x1FF)) = v12;
      MiUnmapPageInHyperSpaceWorker(VirtualAddress, OldIrql, 0x80000000ui64);
      v15 = (char *)MmGetPfnDb() + 48 * v13;
      v16 = (unsigned __int8)MiLockPageInline((INT64)v15);
      v17 = v13 | *((_QWORD *)v15 + 5) & 0xFFFFFFF000000000ui64;
      *((_QWORD *)v15 + 3) ^= ((*((_QWORD *)v15 + 3) + 1i64) ^ *((_QWORD *)v15 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
      *((_QWORD *)v15 + 5) = v17;
      MiSetPageTablePfnBuddy((INT64)v15, (INT64)v5, 1i64);
      *((_QWORD *)v15 + 1) = MmGetPxeSelfRef();
      if( (*v15 & 1) == 0 )
        MiMarkPfnTradable((INT64)v15, 1i64);
      _InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v16);
      v5[225].Next = (_SINGLE_LIST_ENTRY *)1;
      v5[226].Next = (_SINGLE_LIST_ENTRY *)1;
      LODWORD(v21) = KeMakeKernelDirectoryTableBase(
                       (UINT64 *)(v13 << 12),
                       v18,
                       v19,
                       v20,
                       v25,
                       v26,
                       (PRIVILEGE_SET **)LockHandle.LockQueue.Next,
                       (INT64 *)LockHandle.LockQueue.Lock,
                       LockHandle.OldIrql,
                       v28,
                       v29,
                       savedregs[0]);
      v5[5].Next = v21;
      KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
      if( (HIDWORD(v5[140].Next) & 0x800000) != 0 )
      {
        _InterlockedAnd((volatile signed __int32 *)&v5[140].Next + 1, 0xFF7FFFFF);
        MiUpdateSystemPdes((INT64)v5, v22, v23);
      }
      MiReturnWsToExpansionList((_MMSUPPORT_INSTANCE *)&v5[208], 0i64);
      _InterlockedAnd((volatile signed __int32 *)&v5[140].Next + 1, 0xFFFFFF7F);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      SwapEntry = v31;
    }
    _InterlockedAnd((volatile signed __int32 *)&v5[140].Next + 1, 0xFFFFFFBF);
    if( (BYTE3(v5[231].Next) & 0x60) == 64 )
      MiReAcquireOutSwappedProcessCommit((_EPROCESS *)v5);
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    KiAcquireKobjectLockSafe(v5);
    v9 = v5 + 43;
    Next = (_LIST_ENTRY *)v5[43].Next;
    if( Next == (_LIST_ENTRY *)&v5[43] )
    {
      Next = 0i64;
    }
    else
    {
      v1 = (_LIST_ENTRY *)v5[44].Next;
      if( (SINGLE_LIST_ENTRY *)Next->Blink != v9 || (SINGLE_LIST_ENTRY *)v1->Flink != v9 )
        __fastfail(3u);
      v1->Flink = Next;
      Next->Blink = v1;
      v5[44].Next = v5 + 43;
      v9->Next = v9;
    }
    _InterlockedXor((volatile signed __int32 *)&v5[105], 4u);
    _InterlockedAnd((volatile signed __int32 *)v5, 0xFFFFFF7F);
    if( Next )
      KiReadyOutSwappedThreads(Next, CurrentIrql);
    else
      __writecr8(CurrentIrql);
  }
  while( SwapEntry );
}

Referenced by:

KeSwapProcessOrStack