KiSearchForNewThreadOnNode

_KTHREAD *__stdcall KiSearchForNewThreadOnNode(_KPRCB *CurrentPrcb, _KNODE *a2){
  unsigned __int8 GroupIndex; 
  int Group; 
  unsigned __int64 Mask; 
  unsigned __int64 v7; 
  unsigned __int64 SharedReadyQueueMask; 
  unsigned __int64 v9; 
  _ETHREAD *result; 
  unsigned __int64 v11; 
  int v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  int v17; 
  unsigned __int64 v18; 
  int v19; 

  GroupIndex = CurrentPrcb->GroupIndex;
  Group = CurrentPrcb->Group;
  v19 = Group;
  Mask = a2->Affinity.Mask;
  v7 = Mask;
  SharedReadyQueueMask = a2->SharedReadyQueueMask;
  if( a2 == CurrentPrcb->ParentNode )
  {
    Mask ^= CurrentPrcb->GroupSetMember;
    SharedReadyQueueMask ^= CurrentPrcb->SharedReadyQueueMask;
    if( (KiCacheAwareScheduling & 2) != 0 )
      v7 &= CurrentPrcb->LLCMask;
  }
  v9 = ~a2->IdleCpuSet & Mask;
  while( 1 )
  {
    if( !v9 && !SharedReadyQueueMask )
      return 0i64;
    if( (SharedReadyQueueMask & v7) != 0 )
      break;
LABEL_14:
    if( (v9 & v7) != 0 )
    {
      v16 = __ROR8__(v9 & v7, GroupIndex);
      v17 = Group << 6;
      do
      {
        _BitScanForward64(&v18, v16);
        v16 ^= 1i64 << v18;
        result = (_ETHREAD *)KiSearchForNewThreadOnProcessor(
                               CurrentPrcb,
                               *(&KiProcessorBlock
                               + (unsigned int)KiProcessorNumberToIndexMappingTable[v17
                                                                                  + (((_BYTE)v18 + GroupIndex) & 0x3F)]),
                               0i64);
        if( result )
          return &result->Tcb;
      }
      while( v16 );
    }
    Group = v19;
    v9 &= ~v7;
    v7 = a2->Affinity.Mask;
  }
  v11 = __ROR8__(SharedReadyQueueMask & v7, GroupIndex);
  v12 = Group << 6;
  while( 1 )
  {
    _BitScanForward64(&v13, v11);
    v14 = (__int64)*(&KiProcessorBlock
                   + (unsigned int)KiProcessorNumberToIndexMappingTable[v12 + ((GroupIndex + (_BYTE)v13) & 0x3F)]);
    v15 = *(_QWORD *)(v14 + 33856);
    SharedReadyQueueMask &= ~v15;
    v11 &= __ROR8__(~v15, GroupIndex);
    result = (_ETHREAD *)KiSearchForNewThreadOnProcessor(CurrentPrcb, 0i64, *(_KSHARED_READY_QUEUE **)(v14 + 33864));
    if( result )
      return &result->Tcb;
    if( !v11 )
    {
      Group = v19;
      goto LABEL_14;
    }
  }
}

Referenced by:

KiSearchForNewThread