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