KiSearchForNewThread

VOID __stdcall KiSearchForNewThread(_KPRCB *CurrentPrcb, UINT8 IdleScan){
  __int64 v3; 
  _KTHREAD *v5; 
  __int64 i; 
  __int64 v7; 
  __int64 v8; 
  char v9; 
  char v10; 
  __int64 v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  unsigned int NextNode; 
  unsigned __int64 v15; 
  __int64 v16; 
  _ETHREAD *v17; 
  char v18; 
  char v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  char v27; 
  char v28; 
  INT64 v29; 
  INT64 v30; 
  __int64 v31[9]; 
  UINT64 SpinCount; 
  UINT64 LookupIndex; 
  LODWORD(LookupIndex) = 0;
  v3 = *((_QWORD *)CurrentPrcb + 2);
  if( v3 )
  {
LABEL_30:
    *((_QWORD *)CurrentPrcb + 2) = 0i64;
    *((_QWORD *)CurrentPrcb + 1) = v3;
    if( *(_BYTE *)(v3 + 388) == 1 )
      *(_DWORD *)(v3 + 132) = *(_DWORD *)(v3 + 132) - *(_DWORD *)(v3 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
    *(_BYTE *)(v3 + 388) = 2;
    return;
  }
  while( 1 )
  {
    v5 = (_ETHREAD *)KiSelectReadyThread(1i64, CurrentPrcb);
    if( !v5 )
    {
      if( KiPerfIsoEnabled )
      {
        v21 = **((_QWORD **)CurrentPrcb + 24) - ((**((_QWORD **)CurrentPrcb + 24) >> 1) & 0x5555555555555555i64);
        if( (unsigned int)((0x101010101010101i64
                           * (((v21 & 0x3333333333333333i64)
                             + ((v21 >> 2) & 0x3333333333333333i64)
                             + (((v21 & 0x3333333333333333i64) + ((v21 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 < KiPerfIsoEnabled )
          break;
        v22 = *((_QWORD *)CurrentPrcb + 25);
        v23 = *((_QWORD *)CurrentPrcb + 4235);
        if( v22 != v23 )
        {
          v24 = v23 & ~v22;
          if( (*(_QWORD *)(*((_QWORD *)CurrentPrcb + 24) + 24i64) & v24) == 0 )
          {
            _BitScanForward64(&v25, v24);
            if( (*((_DWORD *)*(&KiProcessorBlock
                              + (unsigned int)KiProcessorNumberToIndexMappingTable[64
                                                                                 * *((unsigned __int8 *)CurrentPrcb + 208)
                                                                                 + (unsigned int)v25])
                  + 59) & 0x400) == 0 )
              break;
          }
        }
      }
      v5 = 0i64;
      for( i = (__int64)CurrentPrcb + 31856; ; i = v20 + 392 )
      {
        v7 = *(_QWORD *)(i + 8);
        if( (v7 & 1) != 0 )
        {
          if( v7 == 1 )
            goto LABEL_9;
          v8 = v7 ^ (i | 1);
        }
        else
        {
          v8 = *(_QWORD *)(i + 8);
        }
        if( !v8 )
          break;
        v20 = v8 - 88;
        v5 = (_ETHREAD *)KiSelectThreadFromSchedulingGroup(CurrentPrcb, (_KSCB *)(v8 - 88), 0i64);
        if( v5 )
          break;
      }
      if( !v5 )
        break;
    }
LABEL_21:
    if( KiCheckThreadAffinity((INT64)v5) )
    {
      if( (*((_BYTE *)v5 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v17, CurrentPrcb), v18 = 1, !v19) )
        v18 = *((_BYTE *)v5 + 195);
      **((_BYTE **)CurrentPrcb + 7) = v18;
      if( *((_QWORD *)CurrentPrcb + 4247) )
      {
        v30 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( v5 != *((_ETHREAD **)CurrentPrcb + 3) )
          v30 = (unsigned int)v18;
        KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v30, 0);
      }
      *((_QWORD *)CurrentPrcb + 1) = v5;
      if( *((_BYTE *)v5 + 388) == 1 )
        *((_DWORD *)v5 + 33) = *((_DWORD *)v5 + 33) - *((_DWORD *)v5 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
      *((_BYTE *)v5 + 388) = 2;
      if( IdleScan )
        KiSetProcessorIdle(CurrentPrcb, 0i64, 0i64);
      return;
    }
    KiEnterDeferredReadyState((INT64)v17);
    _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
    *((_QWORD *)v5 + 27) = 0i64;
    v31[0] = (__int64)v5 + 216;
    KiReadyDeferredReadyList(CurrentPrcb, v31);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((_QWORD *)CurrentPrcb + 6) );
    }
    if( IdleScan && *((_QWORD *)CurrentPrcb + 2) == *((_QWORD *)CurrentPrcb + 3) )
      *((_QWORD *)CurrentPrcb + 2) = 0i64;
    v3 = *((_QWORD *)CurrentPrcb + 2);
    if( v3 )
      goto LABEL_30;
  }
LABEL_9:
  v5 = (_ETHREAD *)KiSelectReadyThread(0i64, CurrentPrcb);
  if( v5 )
    goto LABEL_21;
  v9 = *((_BYTE *)CurrentPrcb + 35);
  if( !IdleScan )
  {
    KiSetProcessorIdle(CurrentPrcb, 1ui64, 0i64);
    v26 = *((_QWORD *)CurrentPrcb + 3);
    if( (*(_BYTE *)(v26 + 2) & 4) == 0
      || (KiIsThreadRankNonZero(*((_ETHREAD **)CurrentPrcb + 3), CurrentPrcb), v27 = 1, !v28) )
    {
      v27 = *(_BYTE *)(v26 + 195);
    }
    **((_BYTE **)CurrentPrcb + 7) = v27;
    if( *((_QWORD *)CurrentPrcb + 4247) )
    {
      v29 = (unsigned int)KiVpThreadSystemWorkPriority;
      if( v26 != *((_QWORD *)CurrentPrcb + 3) )
        v29 = (unsigned int)v27;
      KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v29, 0);
    }
  }
  v10 = *((_BYTE *)CurrentPrcb + 35) & 2;
  _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
  if( !v10 || v9 == 7 )
  {
    v11 = *((_QWORD *)CurrentPrcb + 24);
    v12 = *(unsigned __int16 *)(v11 + 146);
    LODWORD(v13) = *(_DWORD *)(v11 + 128);
LABEL_13:
    if( !KiSearchForNewThreadOnNode((unsigned __int64)CurrentPrcb, (_QWORD *)v11) )
    {
      v13 = (unsigned int)v13 & (unsigned __int64)~(1i64 << *(_WORD *)(v11 + 146));
      if( (_DWORD)v13 )
      {
        while( 1 )
        {
          NextNode = MmGetNextNode(v12, &LookupIndex);
          v15 = NextNode;
          if( NextNode == -1 )
            break;
          v16 = (unsigned int)v13;
          if( _bittest64(&v16, v15) )
          {
            v11 = *((_QWORD *)&KeNodeBlock + v15);
            goto LABEL_13;
          }
        }
      }
    }
  }
}

Referenced by:

KiIdleSchedule