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