KiGroupSchedulingMoveThread
VOID __stdcall KiGroupSchedulingMoveThread(_KPRCB *TargetPrcb, _KPRCB *SourcePrcb, _RTL_RB_TREE *ScbQueue){
_RTL_BALANCED_NODE *Min;
unsigned __int64 j;
int i;
unsigned int v8;
_QWORD *v9;
_QWORD *v10;
_QWORD *v11;
int v12;
_QWORD *v13;
char v14;
_RTL_RB_TREE *v15;
__int64 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;
for( i = *(unsigned __int16 *)(j + 26); i; i = v12 ^ (1 << v14) )
{
_BitScanReverse(&v8, i);
v9 = (_QWORD *)(16i64 * v8 + j + 48);
v10 = (_QWORD *)*v9;
do
{
v11 = v10 - 27;
if( KiPrcbInGroupAffinity((__int64)TargetPrcb, (__int64)(v10 + 45)) )
{
KiRemoveThreadFromScbQueue(SourcePrcb, j - 88, v11);
*((_DWORD *)v11 + 134) = *((_DWORD *)TargetPrcb + 9);
return;
}
v10 = (_QWORD *)*v13;
}
while( v10 != v9 );
}
v15 = (_RTL_RB_TREE *)(j + 304);
v16 = *(_QWORD *)(j + 304);
if( (*(_BYTE *)(j + 312) & 1) != 0 )
{
if( !v16 )
goto LABEL_19;
v16 ^= (unsigned __int64)v15;
}
if( v16 )
{
KiGroupSchedulingMoveThread(TargetPrcb, SourcePrcb, v15);
if( v17 )
return;
}
LABEL_19:
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;
}
}
}
}
}Referenced by:
KiGroupSchedulingMoveThread
KiSearchForNewThreadOnProcessor