KiGroupSchedulingMoveThread
_KTHREAD *__stdcall KiGroupSchedulingMoveThread(_KPRCB *TargetPrcb, _KPRCB *SourcePrcb, _RTL_RB_TREE *ScbQueue){
_RTL_BALANCED_NODE *Min;
unsigned __int64 j;
_ETHREAD *result;
int i;
unsigned int v9;
_QWORD *v10;
_QWORD *v11;
_ETHREAD *v12;
int v13;
_QWORD *v14;
unsigned int v15;
_RTL_RB_TREE *v16;
__int64 v17;
_QWORD **v18;
unsigned __int64 v19;
_QWORD *v20;
Min = ScbQueue->Min;
if( ((unsigned __int8)Min & 1) == 0 )
{
j = (unsigned __int64)ScbQueue->Min;
goto LABEL_3;
}
if( Min != (_RTL_BALANCED_NODE *)1 )
{
j = (unsigned __int64)Min ^ ((unsigned __int64)ScbQueue | 1);
while( 1 )
{
LABEL_3:
if( !j )
return 0i64;
for( i = *(unsigned __int16 *)(j + 26); i; i = v13 ^ (1 << v15) )
{
_BitScanReverse(&v9, i);
v10 = (_QWORD *)(16i64 * v9 + j + 48);
v11 = (_QWORD *)*v10;
do
{
v12 = (_ETHREAD *)(v11 - 27);
if( (unsigned int)KiPrcbInGroupAffinity(TargetPrcb, (_GROUP_AFFINITY *)(v11 + 45)) )
{
KiRemoveThreadFromScbQueue(SourcePrcb, (_KSCB *)(j - 88), v12, v15);
result = v12;
v12->Tcb._bf_0 = TargetPrcb->Number;
return &result->Tcb;
}
v11 = (_QWORD *)*v14;
}
while( v11 != v10 );
}
v16 = (_RTL_RB_TREE *)(j + 304);
v17 = *(_QWORD *)(j + 304);
if( (*(_BYTE *)(j + 312) & 1) != 0 )
{
if( !v17 )
goto LABEL_20;
v17 ^= (unsigned __int64)v16;
}
if( v17 )
{
result = (_ETHREAD *)KiGroupSchedulingMoveThread(TargetPrcb, SourcePrcb, v16);
if( result )
return &result->Tcb;
}
LABEL_20:
v18 = *(_QWORD ***)(j + 8);
v19 = j;
if( v18 )
{
v20 = *v18;
for( j = *(_QWORD *)(j + 8); v20; v20 = (_QWORD *)*v20 )
j = (unsigned __int64)v20;
}
else
{
while( 1 )
{
j = *(_QWORD *)(j + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !j || *(_QWORD *)j == v19 )
break;
v19 = j;
}
}
}
}
return 0i64;
}Referenced by:
KiGroupSchedulingMoveThread
KiSearchForNewThreadOnProcessor