KiAddThreadToScbQueue
VOID __stdcall KiAddThreadToScbQueue(_KPRCB *Prcb, _KSCB *Scb, _ETHREAD *Thread, UINT64 Preempted){
_KSCB *v4;
int Priority;
_LIST_ENTRY *v7;
_LIST_ENTRY *v8;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
_KSCB *Parent;
v4 = Scb;
Priority = Thread->Tcb.Priority;
if( !Scb->Rank )
{
do
{
Parent = v4->Parent;
if( !Parent )
break;
v4 = v4->Parent;
}
while( !Parent->Rank );
}
v7 = (_LIST_ENTRY *)Thread->Tcb.gapD8;
v8 = &v4->ReadyListHead[Priority];
if( !(_DWORD)Preempted )
{
Blink = v8->Blink;
if( Blink->Flink == v8 )
{
v7->Flink = v8;
*(_QWORD *)&Thread->Tcb.gapD8[8] = Blink;
Blink->Flink = v7;
v8->Blink = v7;
goto LABEL_5;
}
LABEL_8:
__fastfail(3u);
}
Flink = v8->Flink;
if( v8->Flink->Blink != v8 )
goto LABEL_8;
v7->Flink = Flink;
*(_QWORD *)&Thread->Tcb.gapD8[8] = v8;
Flink->Blink = v7;
v8->Flink = v7;
LABEL_5:
Thread->Tcb._bf_0 |= 0x2000u;
Thread->Tcb.QueuedScb = v4;
v4->ReadySummary |= 1 << Priority;
KiInsertNonMaxOverQuotaScb(v4, Prcb, 1u);
}Referenced by:
KiAddThreadToReadyQueue
KiDeferGroupSchedulingPreemption
KiDeferredReadySingleThread
KiGroupSchedulingQuantumEnd
KiQueueReadyThread
KiSelectReadyThread