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;
__int64 v15;
_KPRCB **v16;
INT64 v17;
_KSCB *v18;
__int64 v19;
_KPRCB *v20;
_LIST_ENTRY *v21;
_LIST_ENTRY **p_Flink;
int v23;
unsigned int v24;
_LIST_ENTRY *ReadyListHead;
char v26;
UINT8 ShareRankNonZero;
_KPRCB *v28;
INT64 v29;
v29 = (INT64)ReadyList;
v28 = 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 = (__int64)v28;
v16 = (_KPRCB **)*v13;
do
{
v17 = (INT64)(v16 - 27);
if( v9 )
{
v18 = TargetScb;
}
else
{
*(_DWORD *)(v17 + 116) &= ~0x2000u;
v18 = v4;
}
*(_QWORD *)(v17 + 944) = v18;
v16 = (_KPRCB **)*v16;
if( v10 )
{
KiInsertDeferredReadyList(v14, v17);
}
else
{
if( !v6 )
continue;
KiGetThreadEffectiveRankNonZero((_ETHREAD *)v17, Scb, Prcb, 0, &ShareRankNonZero);
KiAddThreadToPrcbQueue(v15, v19, *(char *)(v19 + 195), 0, ShareRankNonZero);
v4 = 0i64;
}
v6 = v26;
}
while( v16 != v13 );
ReadySummary = v23;
if( v9 )
{
v20 = *v13;
Prcb = v13[1];
if( *((_KPRCB ***)*v13 + 1) != v13
|| *(_KPRCB ***)Prcb != v13
|| (*(_QWORD *)Prcb = v20,
*((_QWORD *)v20 + 1) = Prcb,
v21 = &ReadyListHead[v24],
p_Flink = &v21->Blink->Flink,
v21->Flink->Blink != v21)
|| *p_Flink != v21
|| *(_KPRCB **)(*(_QWORD *)v20 + 8i64) != v20
|| *(_KPRCB **)Prcb != v20 )
{
__fastfail(3u);
}
*p_Flink = (_LIST_ENTRY *)v20;
v21->Blink = (_LIST_ENTRY *)*((_QWORD *)v20 + 1);
**((_QWORD **)v20 + 1) = v21;
*((_QWORD *)v20 + 1) = p_Flink;
}
v13[1] = (_KPRCB *)v13;
*v13 = (_KPRCB *)v13;
if( v23 )
{
v6 = v26;
continue;
}
break;
}
LABEL_15:
Scb->ReadySummary = (unsigned __int16)v4;
}Referenced by:
KeSetSchedulingGroupRankBias
KiResetScb