KiFindReadyThread
_KTHREAD *__stdcall KiFindReadyThread(
_KPRCB *TargetPrcb,
_KPRCB *Prcb,
_KSHARED_READY_QUEUE *ReadyQueue,
UINT64 PrioritySet){
unsigned __int64 GroupSetMember;
_LIST_ENTRY *DispatcherReadyListHead;
unsigned int v6;
_KPRCB *v7;
int v8;
unsigned int v9;
_LIST_ENTRY **p_Flink;
_LIST_ENTRY *v11;
unsigned int v12;
_LIST_ENTRY **p_Blink;
unsigned __int64 Blink;
_ETHREAD *result;
_LIST_ENTRY *v16;
__int64 v17;
_KSCB *v18;
unsigned __int64 v19;
_KPRCB *Prcba;
unsigned int QueueIndex;
Prcba = Prcb;
GroupSetMember = TargetPrcb->GroupSetMember;
DispatcherReadyListHead = Prcb->DispatcherReadyListHead;
v6 = PrioritySet;
if( !Prcb )
DispatcherReadyListHead = ReadyQueue->ReadyListHead;
v7 = TargetPrcb;
v8 = 64;
LABEL_4:
_BitScanReverse(&v9, v6);
v6 ^= 1 << v9;
p_Flink = &DispatcherReadyListHead[v9].Flink;
QueueIndex = v9;
v11 = *p_Flink;
while( 1 )
{
v12 = BYTE5(v11[-6].Flink);
p_Blink = &v11[-14].Blink;
Blink = (unsigned __int64)v11[22].Blink;
if( v12 >= 5 )
{
v12 = KiConvertDynamicHeteroPolicy((_ETHREAD *)&v11[-14].Blink, (_KHETERO_CPU_POLICY)Prcb, v7);
v7 = TargetPrcb;
}
if( v12 )
{
Prcb = (_KPRCB *)v7->ParentNode;
v19 = Blink & *(&Prcb->GroupSetMember + 3 * (int)v12);
if( v19 )
Blink = v19;
}
if( (GroupSetMember & Blink) != 0 )
{
v16 = p_Blink[13];
if( !v16 )
break;
v18 = (_KSCB *)((char *)v16 + v7->ScbOffset);
if( !v18 || !KiCheckForMaxOverQuotaScb(v18) )
break;
}
v11 = v11->Flink;
--v8;
if( v11 == (_LIST_ENTRY *)p_Flink || !v8 )
{
if( !v6 || !v8 )
return 0i64;
goto LABEL_4;
}
}
if( Prcba )
KiRemoveThreadFromReadyQueue(Prcba, v11, QueueIndex);
else
KiRemoveThreadFromSharedReadyQueue(ReadyQueue, (_KTHREAD *)&v11[-14].Blink, QueueIndex);
result = (_ETHREAD *)&v11[-14].Blink;
*((_DWORD *)p_Blink + 134) = *(_DWORD *)(v17 + 36);
return &result->Tcb;
}Referenced by:
KiSearchForNewThreadOnProcessor