KiReadyOutSwappedThreads

VOID __stdcall KiReadyOutSwappedThreads(_LIST_ENTRY *ListHead, UINT8 OldIrql){
  struct _KPRCB *CurrentPrcb; 
  unsigned __int64 v4; 
  _LIST_ENTRY *v5; 
  struct _KPRCB *v6; 
  INT64 p_Blink; 
  _ETHREAD *CurrentThread; 
  _DWORD *SchedulerAssist; 
  INT64 v10; 
  struct _KPRCB *v11; 
  _ETHREAD *NextThread; 
  char v13; 
  _DWORD *v14; 
  INT64 v15; 
  INT64 v16; 
  INT64 v17; 
  UINT64 v18; 
  UINT64 SpinCount; 

  CurrentPrcb = KeGetCurrentPrcb();
  v4 = OldIrql;
  v5 = ListHead;
  do
  {
    v6 = KeGetCurrentPrcb();
    p_Blink = (INT64)&v5[-14].Blink;
    v5 = v5->Flink;
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(p_Blink + 64), 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *(_QWORD *)(p_Blink + 64) );
      SchedulerAssist = v6->SchedulerAssist;
      if( SchedulerAssist && v6->NestingLevel <= 1u )
        ++SchedulerAssist[6];
    }
    KiEnterDeferredReadyState(p_Blink);
    *(_QWORD *)(p_Blink + 64) = 0i64;
    KiReadyThread(CurrentPrcb, (_KTHREAD *)p_Blink);
  }
  while( v5 != ListHead );
  if( (unsigned __int8)v4 < 2u )
  {
    CurrentThread = CurrentPrcb->CurrentThread;
    if( CurrentPrcb->NextThread )
    {
      KiAbProcessContextSwitch(&CurrentPrcb->CurrentThread->Tcb, 0i64);
      v11 = KeGetCurrentPrcb();
      LODWORD(v18) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
      {
        do
          KeYieldProcessorEx(&v18);
        while( CurrentPrcb->PrcbLock );
        v14 = v11->SchedulerAssist;
        if( v14 && v11->NestingLevel <= 1u )
          ++v14[6];
      }
      NextThread = CurrentPrcb->NextThread;
      CurrentPrcb->NextThread = 0i64;
      _disable();
      KiEndThreadCycleAccumulation((INT64)CurrentPrcb, (INT64)CurrentThread, 0i64, v10, v15, v16, v17);
      _enable();
      CurrentPrcb->CurrentThread = NextThread;
      if( NextThread->Tcb.WaitBlockFill6[68] == 1 )
        NextThread->Tcb.ReadyTime = NextThread->Tcb.ReadyTime
                                  - NextThread->Tcb.WaitBlock[2].SpareLong
                                  + KUSER_SHARED_DATA.TickCount.LowPart;
      NextThread->Tcb.WaitBlockFill6[68] = 2;
      CurrentThread->Tcb.WaitReason = 32;
      CurrentThread->Tcb.WaitIrql = v4;
      KiQueueReadyThread(CurrentPrcb, &CurrentThread->Tcb);
      KiSwapContext();
      if( !v13 )
        goto LABEL_8;
    }
    else if( (CurrentThread->Tcb._bf_0 & 0x40) == 0 )
    {
LABEL_8:
      __writecr8(v4);
      return;
    }
    __writecr8(1ui64);
    CurrentThread->Tcb._bf_0 &= ~0x40u;
    KiDeliverApc(0, 0i64, 0i64);
    goto LABEL_8;
  }
  if( CurrentPrcb->NextThread && !CurrentPrcb->DpcRoutineActive )
    KiRequestSoftwareInterrupt(CurrentPrcb, 2);
}

Referenced by:

KiInSwapProcesses
KiOutSwapProcesses