KiCheckForEffectivePriorityChange
VOID __stdcall KiCheckForEffectivePriorityChange(_KPRCB *Prcb, _KSCB *Scb, _KPRCB *a3){
_ETHREAD *NextThread;
_KSCB *SchedulingGroup;
UINT8 IsThreadRankNonZero;
char Priority;
INT64 v8;
NextThread = Prcb->NextThread;
if( !NextThread )
NextThread = Prcb->CurrentThread;
SchedulingGroup = (_KSCB *)NextThread->Tcb.SchedulingGroup;
if( SchedulingGroup )
{
for( SchedulingGroup = (_KSCB *)((char *)SchedulingGroup + Prcb->ScbOffset);
SchedulingGroup;
SchedulingGroup = SchedulingGroup->Parent )
{
if( SchedulingGroup == Scb )
goto LABEL_9;
}
}
if( SchedulingGroup == Scb )
{
LABEL_9:
if( (NextThread->Tcb.gap0[2] & 4) == 0
|| (IsThreadRankNonZero = KiIsThreadRankNonZero(&NextThread->Tcb, Prcb, (_KPRCB *)SchedulingGroup),
Priority = 1,
!IsThreadRankNonZero) )
{
Priority = NextThread->Tcb.Priority;
}
*Prcb->PriorityState = Priority;
if( Prcb->SchedulerAssist )
{
v8 = (unsigned int)KiVpThreadSystemWorkPriority;
if( NextThread != Prcb->IdleThread )
v8 = (unsigned int)Priority;
KiSetSchedulerAssistPriority((INT32 *)Prcb->SchedulerAssist, v8, 0);
}
}
}Referenced by:
KeSetSchedulingGroupRankBias
KiComputeGroupSchedulingRank
KiUpdateCpuTargetByRate
KiUpdateCpuTargetByWeight