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