KiOutSwapProcesses

VOID __stdcall KiOutSwapProcesses(_SINGLE_LIST_ENTRY *SwapEntry){
  _EPROCESS *v2; 
  UINT8 CurrentIrql; 
  _LIST_ENTRY *p_ReadyListHead; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v6; 
  _LIST_ENTRY *Blink; 
  char v8; 
  unsigned int v9; 
  _QWORD *p_Next; 
  signed __int64 v11; 
  signed __int64 v12; 
  UINT64 SpinCount; 

  do
  {
    v2 = (_EPROCESS *)&SwapEntry[-45];
    SwapEntry = SwapEntry->Next;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset((volatile signed __int32 *)v2, 7u) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( (*(_DWORD *)v2->Pcb.gap0 & 0x80u) != 0 );
    }
    p_ReadyListHead = &v2->Pcb.ReadyListHead;
    Flink = v2->Pcb.ReadyListHead.Flink;
    if( Flink == &v2->Pcb.ReadyListHead || (v2->Pcb.StackCount.Value & 7) == 6 )
    {
      _InterlockedXor(&v2->Pcb.StackCount.Value, v2->Pcb.StackCount.Value & 7 ^ 5);
      _InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
      __writecr8(CurrentIrql);
      MmOutSwapProcess(&v2->Pcb);
      v8 = 0;
      KeGetCurrentIrql();
      __writecr8(2ui64);
      KiAcquireKobjectLockSafe(v2);
      if( p_ReadyListHead->Flink == p_ReadyListHead )
      {
        v9 = 4;
      }
      else
      {
        p_Next = &v2->Pcb.SwapListEntry.Next;
        _m_prefetchw((char *)&KiSwapEvent + 24);
        v11 = *(&KiSwapEvent + 3);
        do
        {
          *p_Next = v11;
          v12 = v11;
          v11 = _InterlockedCompareExchange64((_QWORD *)&KiSwapEvent + 3, (signed __int64)p_Next, v11);
        }
        while( v11 != v12 );
        if( !v11 )
          v8 = 1;
        v9 = 7;
      }
      _InterlockedXor(&v2->Pcb.StackCount.Value, v9);
      _InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
      if( v8 )
      {
        KiAcquireKobjectLockSafe(&KiSwapEvent);
        *(&KiSwapEvent + 1) = 1;
        _InterlockedAnd((volatile signed __int32 *)&KiSwapEvent, 0xFFFFFF7F);
      }
      __writecr8(CurrentIrql);
    }
    else
    {
      v6 = p_ReadyListHead->Flink;
      Blink = v2->Pcb.ReadyListHead.Blink;
      if( p_ReadyListHead->Flink->Blink != p_ReadyListHead || Blink->Flink != p_ReadyListHead )
        __fastfail(3u);
      Blink->Flink = v6;
      v6->Blink = Blink;
      v2->Pcb.ReadyListHead.Blink = &v2->Pcb.ReadyListHead;
      p_ReadyListHead->Flink = p_ReadyListHead;
      _InterlockedXor(&v2->Pcb.StackCount.Value, 3u);
      _InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
      KiReadyOutSwappedThreads(Flink, CurrentIrql);
    }
  }
  while( SwapEntry );
}

Referenced by:

KeSwapProcessOrStack