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