KiInSwapSingleProcess

VOID __fastcall KiInSwapSingleProcess(_ETHREAD *Thread, _EPROCESS *Process, UINT8 OldIrql){
  unsigned __int64 v4; 
  struct _KPRCB *CurrentPrcb; 
  UINT64 SpinCount; 

  LODWORD(SpinCount) = 0;
  v4 = OldIrql;
  while( _interlockedbittestandset((volatile signed __int32 *)Process, 7u) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( (*(_DWORD *)Process->Pcb.gap0 & 0x80u) != 0 );
  }
  if( (Process->Pcb.StackCount.Value & 7) != 0 )
  {
    KiRequestProcessInSwap(&Thread->Tcb, &Process->Pcb);
    CurrentPrcb = KeGetCurrentPrcb();
    if( Thread == CurrentPrcb->CurrentThread )
    {
      Thread->Tcb.WaitReason = 23;
      Thread->Tcb.WaitIrql = v4;
      KiSwapThread(Thread, CurrentPrcb);
      return;
    }
  }
  else
  {
    _InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
  }
  __writecr8(v4);
}

Referenced by:

KeReadyThread
KiAttachProcess
KiStackAttachProcess