KiComputeGroupSchedulingRank
VOID __stdcall KiComputeGroupSchedulingRank(_KSCHEDULING_GROUP *SchedulingGroup, _KPRCB *Prcb, _KSCB *Scb){
char v3;
char v7;
UINT8 v8;
char v9;
unsigned __int64 GenerationCycles;
unsigned __int64 MinQuotaCycleTarget;
char v12;
__int64 RelativeWeight;
unsigned int v14;
volatile signed __int32 *ShareRank;
_KPRCB *v16;
v3 = *((_BYTE *)Scb + 112);
v7 = v3;
if( (v3 & 0x12) != 0 )
goto LABEL_4;
v8 = KiChargeSchedulingGroupCycleTime(SchedulingGroup, Scb);
v3 = *((_BYTE *)Scb + 112);
if( !v8 )
{
v7 = *((_BYTE *)Scb + 112);
LABEL_4:
v9 = 0;
goto LABEL_5;
}
v3 |= 2u;
v9 = 1;
*((_BYTE *)Scb + 112) = v3;
v7 = v3;
LABEL_5:
GenerationCycles = Scb->GenerationCycles;
MinQuotaCycleTarget = Scb->MinQuotaCycleTarget;
if( (v3 & 0x10) != 0 && GenerationCycles >= MinQuotaCycleTarget
|| (v12 = v7, (v3 & 0x10) == 0)
&& (v9 || MinQuotaCycleTarget != Scb->MaxQuotaCycleTarget && GenerationCycles >= MinQuotaCycleTarget) )
{
RelativeWeight = SchedulingGroup->RelativeWeight;
v14 = Scb->LongTermCycles / ((unsigned __int64)(KiCycleDivisorLongTerm * RelativeWeight) >> 7) + 1;
ShareRank = (volatile signed __int32 *)Scb->ShareRank;
Scb->Rank = v14;
if( ShareRank )
{
_InterlockedExchangeAdd(ShareRank, v14);
MinQuotaCycleTarget = Scb->MinQuotaCycleTarget;
v3 = *((_BYTE *)Scb + 112);
}
v16 = (_KPRCB *)(MinQuotaCycleTarget + ((unsigned __int64)(KiCycleDivisorShortTerm * RelativeWeight) >> 7));
*((_BYTE *)Scb + 112) = v3 | 4;
Scb->RankCycleTarget = (unsigned __int64)v16;
KiCheckForEffectivePriorityChange(Prcb, Scb, v16);
v12 = *((_BYTE *)Scb + 112);
}
if( (v12 & 1) != 0 )
{
if( (v12 & 2) != 0 )
KiRemoveSchedulingGroupQueue(Prcb, Scb, 1u);
else
KiResortScbQueue(Prcb, Scb, 1u);
}
if( (*((_BYTE *)Scb + 112) & 4) != 0 && !Prcb->GroupSchedulingOverQuota )
{
_InterlockedOr64(
(volatile signed __int64 *)&KiGroupSchedulingOverQuotaMask.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[Prcb->Number] >> 6],
1i64 << (KiProcessorIndexToNumberMappingTable[Prcb->Number] & 0x3F));
Prcb->GroupSchedulingOverQuota = 1;
}
}Referenced by:
KiGroupSchedulingQuantumEnd
KiQueueReadyThread
KiSwapThread