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