KiOutSwapProcesses

VOID __stdcall KiOutSwapProcesses(_SINGLE_LIST_ENTRY *SwapEntry){
  _SINGLE_LIST_ENTRY *v2; 
  UINT8 CurrentIrql; 
  _SINGLE_LIST_ENTRY *v4; 
  _LIST_ENTRY *Next; 
  _SINGLE_LIST_ENTRY *v6; 
  _SINGLE_LIST_ENTRY *v7; 
  char v8; 
  unsigned int v9; 
  _QWORD *p_Next; 
  signed __int64 v11; 
  signed __int64 v12; 
  UINT64 SpinCount; 
  do
  {
    v2 = SwapEntry - 45;
    SwapEntry = SwapEntry->Next;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset((volatile signed __int32 *)v2, 7u) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( (LODWORD(v2->Next) & 0x80u) != 0 );
    }
    v4 = v2 + 43;
    Next = (_LIST_ENTRY *)v2[43].Next;
    if( Next == (_LIST_ENTRY *)&v2[43] || ((__int64)v2[105].Next & 7) == 6 )
    {
      _InterlockedXor((volatile signed __int32 *)&v2[105], (__int64)v2[105].Next & 7 ^ 5);
      _InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
      __writecr8(CurrentIrql);
      MmOutSwapProcess((_KPROCESS *)v2);
      v8 = 0;
      KeGetCurrentIrql();
      __writecr8(2ui64);
      KiAcquireKobjectLockSafe(v2);
      if( v4->Next == v4 )
      {
        v9 = 4;
      }
      else
      {
        p_Next = &v2[45].Next;
        _m_prefetchw(&KiProcessInSwapListHead);
        v11 = KiProcessInSwapListHead;
        do
        {
          *p_Next = v11;
          v12 = v11;
          v11 = _InterlockedCompareExchange64(&KiProcessInSwapListHead, (signed __int64)p_Next, v11);
        }
        while( v11 != v12 );
        if( !v11 )
          v8 = 1;
        v9 = 7;
      }
      _InterlockedXor((volatile signed __int32 *)&v2[105], v9);
      _InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
      if( v8 )
      {
        KiAcquireKobjectLockSafe(&KiSwapEvent);
        KiSwapEvent.Header.SignalState = 1;
        _InterlockedAnd((volatile signed __int32 *)&KiSwapEvent, 0xFFFFFF7F);
      }
      __writecr8(CurrentIrql);
    }
    else
    {
      v6 = v4->Next;
      v7 = v2[44].Next;
      if( v4->Next[1].Next != v4 || v7->Next != v4 )
        __fastfail(3u);
      v7->Next = v6;
      v6[1].Next = v7;
      v2[44].Next = v2 + 43;
      v4->Next = v4;
      _InterlockedXor((volatile signed __int32 *)&v2[105], 3u);
      _InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
      KiReadyOutSwappedThreads(Next, CurrentIrql);
    }
  }
  while( SwapEntry );
}

Referenced by:

KeSwapProcessOrStack