KiProcessDeferredReadyList

VOID __fastcall KiProcessDeferredReadyList(_KPRCB *Prcb, _SINGLE_LIST_ENTRY *a2, UINT8 a3){
  INT64 v3; 
  unsigned __int64 v4; 
  _ETHREAD *NextThread; 
  _ETHREAD *CurrentThread; 
  INT64 v8; 
  struct _KPRCB *CurrentPrcb; 
  _ETHREAD *v10; 
  char v11; 
  _DWORD *SchedulerAssist; 
  INT64 v13; 
  INT64 v14; 
  UINT64 SpinCount; 

  v4 = a3;
  KiReadyDeferredReadyList(Prcb, a2);
  NextThread = Prcb->NextThread;
  if( (unsigned __int8)v4 < 2u )
  {
    CurrentThread = Prcb->CurrentThread;
    if( NextThread )
    {
      KiAbProcessContextSwitch(&CurrentThread->Tcb, 0i64);
      CurrentPrcb = KeGetCurrentPrcb();
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&Prcb->PrcbLock, 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( Prcb->PrcbLock );
        SchedulerAssist = CurrentPrcb->SchedulerAssist;
        if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
          ++SchedulerAssist[6];
      }
      v10 = Prcb->NextThread;
      Prcb->NextThread = 0i64;
      _disable();
      KiEndThreadCycleAccumulation((INT64)Prcb, (INT64)CurrentThread, 0i64, v8, v3, v13, v14);
      _enable();
      Prcb->CurrentThread = v10;
      if( v10->Tcb.WaitBlockFill6[68] == 1 )
        v10->Tcb.ReadyTime = v10->Tcb.ReadyTime - v10->Tcb.WaitBlock[2].SpareLong + KUSER_SHARED_DATA.TickCount.LowPart;
      v10->Tcb.WaitBlockFill6[68] = 2;
      CurrentThread->Tcb.WaitReason = 32;
      CurrentThread->Tcb.WaitIrql = v4;
      KiQueueReadyThread(Prcb, &CurrentThread->Tcb);
      KiSwapContext();
      if( !v11 )
        goto LABEL_4;
    }
    else if( (CurrentThread->Tcb._bf_0 & 0x40) == 0 )
    {
LABEL_4:
      __writecr8(v4);
      return;
    }
    __writecr8(1ui64);
    CurrentThread->Tcb._bf_0 &= ~0x40u;
    KiDeliverApc(0, 0i64, 0i64);
    goto LABEL_4;
  }
  if( NextThread && !Prcb->DpcRoutineActive )
    KiRequestSoftwareInterrupt(Prcb, 2);
}

Referenced by:

KeClearSystemPriority
KeRevertToUserGroupAffinityThread
KeSetActualBasePriorityThread
KeSetAffinityProcess
KeSetPriorityAndQuantumProcess
KeSetPriorityBoost
KeSetPriorityThread
KeSetSystemGroupAffinityThread
KeWaitForMultipleObjects
KeWaitForSingleObject
KiAbApplyWakeupBoost
KiExitThreadWait