KiRequestProcessInSwap

VOID __stdcall KiRequestProcessInSwap(_ETHREAD *Thread, _EPROCESS *Process){
  struct _KPRCB *CurrentPrcb; 
  char v4; 
  _LIST_ENTRY *v6; 
  _LIST_ENTRY *Blink; 
  _SINGLE_LIST_ENTRY *p_SwapListEntry; 
  signed __int64 v9; 
  signed __int64 v10; 
  _DWORD *SchedulerAssist; 
  UINT64 SpinCount; 

  Thread->Tcb.WaitBlock[2].SpareLong = KUSER_SHARED_DATA.TickCount.LowPart;
  CurrentPrcb = KeGetCurrentPrcb();
  v4 = 0;
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( Thread->Tcb.ThreadLock );
    SchedulerAssist = CurrentPrcb->SchedulerAssist;
    if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
      ++SchedulerAssist[6];
  }
  Thread->Tcb.WaitBlockFill6[68] = 9;
  if( (*(&Thread->Tcb.MiscFlags + 1) & 0x1000) != 0 )
    _interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xCu);
  Thread->Tcb.ThreadLock = 0i64;
  v6 = (_LIST_ENTRY *)Thread->Tcb.gapD8;
  Blink = Process->Pcb.ReadyListHead.Blink;
  if( Blink->Flink != &Process->Pcb.ReadyListHead )
    __fastfail(3u);
  v6->Flink = &Process->Pcb.ReadyListHead;
  v6->Blink = Blink;
  Blink->Flink = v6;
  Process->Pcb.ReadyListHead.Blink = v6;
  if( (Process->Pcb.StackCount.Value & 7) == 1 )
  {
    _InterlockedXor(&Process->Pcb.StackCount.Value, 3u);
    v4 = 1;
  }
  _InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
  if( v4 )
  {
    MmNotifyProcessInSwapTrigger(&Process->Pcb);
    p_SwapListEntry = &Process->Pcb.SwapListEntry;
    _m_prefetchw((char *)&KiSwapEvent + 24);
    v9 = *(&KiSwapEvent + 3);
    do
    {
      p_SwapListEntry->Next = (_SINGLE_LIST_ENTRY *)v9;
      v10 = v9;
      v9 = _InterlockedCompareExchange64((_QWORD *)&KiSwapEvent + 3, (signed __int64)p_SwapListEntry, v9);
    }
    while( v9 != v10 );
    if( !v9 )
      KeSetEvent((PRKEVENT)&KiSwapEvent, 10, 0);
  }
}

Referenced by:

KiExitDispatcher
KiInSwapSingleProcess
KiReadyThread