KiMoveScbThreadsToNewReadylist
VOID __stdcall KiMoveScbThreadsToNewReadylist(
_KSCB *Scb,
_KSCB *TargetScb,
_KPRCB *Prcb,
_SINGLE_LIST_ENTRY *ReadyList){
_KSCB *v4;
char v6;
unsigned int ReadySummary;
char v9;
char v10;
unsigned int v11;
int v12;
_KPRCB **v13;
INT64 v14;
_KPRCB *v15;
_KPRCB **v16;
_ETHREAD *v17;
_KSCB *v18;
_ETHREAD *v19;
_KPRCB *v20;
_LIST_ENTRY *v21;
_ETHREAD *Blink;
int v23;
unsigned int v24;
_LIST_ENTRY *ReadyListHead;
char v26;
UINT8 ShareRankNonZero;
_KPRCB *Prcba;
INT64 v29;
v29 = (INT64)ReadyList;
Prcba = Prcb;
v4 = 0i64;
v26 = 0;
v6 = 0;
ShareRankNonZero = 0;
ReadyListHead = 0i64;
ReadySummary = Scb->ReadySummary;
v9 = 0;
v10 = 0;
if( TargetScb )
{
TargetScb->ReadySummary |= ReadySummary;
ReadyListHead = TargetScb->ReadyListHead;
v9 = 1;
}
else if( Prcb )
{
v6 = 1;
v26 = 1;
}
else if( ReadyList )
{
v10 = 1;
}
if( !ReadySummary )
goto LABEL_15;
while( 2 )
{
_BitScanReverse(&v11, ReadySummary);
v12 = ReadySummary ^ (1 << v11);
v13 = (_KPRCB **)&Scb->ReadyListHead[v11];
v24 = v11;
v14 = v29;
v23 = v12;
v15 = Prcba;
v16 = (_KPRCB **)*v13;
do
{
v17 = (_ETHREAD *)(v16 - 27);
if( v9 )
{
v18 = TargetScb;
}
else
{
v17->Tcb._bf_0 &= ~0x2000u;
v18 = v4;
}
v17->Tcb.QueuedScb = v18;
v16 = (_KPRCB **)*v16;
if( v10 )
{
KiInsertDeferredReadyList(v14, (INT64)v17);
}
else
{
if( !v6 )
continue;
KiGetThreadEffectiveRankNonZero(v17, Scb, Prcb, 0, &ShareRankNonZero);
KiAddThreadToPrcbQueue(v15, &v19->Tcb, (unsigned int)v19->Tcb.Priority, 0i64, ShareRankNonZero);
v4 = 0i64;
}
v6 = v26;
}
while( v16 != v13 );
ReadySummary = v23;
if( v9 )
{
v20 = *v13;
Prcb = v13[1];
if( (_KPRCB **)(*v13)->CurrentThread != v13
|| *(_KPRCB ***)&Prcb->_MxCsr != v13
|| (*(_QWORD *)&Prcb->_MxCsr = v20,
v20->CurrentThread = (_ETHREAD *)Prcb,
v21 = &ReadyListHead[v24],
Blink = (_ETHREAD *)v21->Blink,
v21->Flink->Blink != v21)
|| *(_LIST_ENTRY **)Blink->Tcb.gap0 != v21
|| *(_KPRCB **)(*(_QWORD *)&v20->_MxCsr + 8i64) != v20
|| *(_KPRCB **)&Prcb->_MxCsr != v20 )
{
__fastfail(3u);
}
*(_QWORD *)Blink->Tcb.gap0 = v20;
v21->Blink = (_LIST_ENTRY *)v20->CurrentThread;
*(_QWORD *)v20->CurrentThread = v21;
v20->CurrentThread = Blink;
}
v13[1] = (_KPRCB *)v13;
*v13 = (_KPRCB *)v13;
if( v23 )
{
v6 = v26;
continue;
}
break;
}
LABEL_15:
Scb->ReadySummary = (unsigned __int16)v4;
}Referenced by:
KeSetSchedulingGroupRankBias
KiResetScb