KiSelectThreadFromScbQueue
_ETHREAD *__fastcall KiSelectThreadFromScbQueue(__int64 a1, _KPRCB *a2, int a3, _KSCB *a4, _BYTE *a5){
__int64 v5;
_QWORD *i;
unsigned int v10;
_KSCB *v11;
__int64 p_ChildScbQueue;
unsigned __int64 Root;
_ETHREAD *result;
_QWORD **v15;
_QWORD *v16;
_QWORD *v17;
v5 = *(_QWORD *)(a1 + 8);
if( (v5 & 1) != 0 )
{
if( v5 == 1 )
return 0i64;
i = (_QWORD *)(v5 ^ (a1 | 1));
}
else
{
i = *(_QWORD **)(a1 + 8);
}
if( i )
{
v10 = 1 << a3;
while( 1 )
{
v11 = (_KSCB *)(i - 11);
if( *((unsigned __int16 *)i + 13) >= v10 )
return KiSelectThreadFromSchedulingGroup(a2, v11, (unsigned int)a3);
if( v11 == a4 )
{
*a5 = 1;
return 0i64;
}
p_ChildScbQueue = (__int64)&v11->ChildScbQueue;
Root = (unsigned __int64)v11->ChildScbQueue.Root;
if( (v11->ChildScbQueue._bf_0 & 1) == 0 )
goto LABEL_12;
if( Root )
break;
LABEL_14:
if( !*a5 )
{
v15 = (_QWORD **)i[1];
v16 = i;
if( v15 )
{
v17 = *v15;
for( i = (_QWORD *)i[1]; v17; v17 = (_QWORD *)*v17 )
i = v17;
}
else
{
while( 1 )
{
i = (_QWORD *)(i[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !i || (_QWORD *)*i == v16 )
break;
v16 = i;
}
}
if( i )
continue;
}
return 0i64;
}
Root ^= p_ChildScbQueue;
LABEL_12:
if( Root )
{
result = KiSelectThreadFromScbQueue(p_ChildScbQueue, a2, a3, a4, a5);
if( result )
return result;
}
goto LABEL_14;
}
return 0i64;
}Referenced by:
KiChooseLowestRankedThread
KiSelectThreadFromScbQueue