KeRetryOutswapProcess

VOID __stdcall KeRetryOutswapProcess(_EPROCESS *Process){
  unsigned __int8 CurrentIrql; 
  int v3; 
  _SINGLE_LIST_ENTRY *p_SwapListEntry; 
  signed __int64 v5; 
  signed __int64 v6; 

  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  KiAcquireKobjectLockSafe(Process);
  v3 = Process->Pcb.StackCount.Value & 7;
  if( v3 == 1 )
    _InterlockedXor(&Process->Pcb.StackCount.Value, 7u);
  _InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
  __writecr8(CurrentIrql);
  if( v3 == 1 )
  {
    p_SwapListEntry = &Process->Pcb.SwapListEntry;
    _m_prefetchw(&KiProcessOutSwapListHead);
    v5 = KiProcessOutSwapListHead;
    do
    {
      p_SwapListEntry->Next = (_SINGLE_LIST_ENTRY *)v5;
      v6 = v5;
      v5 = _InterlockedCompareExchange64(&KiProcessOutSwapListHead, (signed __int64)p_SwapListEntry, v5);
    }
    while( v5 != v6 );
    if( !v5 )
      KeSetEvent((PRKEVENT)&KiSwapEvent, 10, 0);
  }
}

Referenced by:

MiProcessWorkingSets
MmReleaseCommitForMemResetPages