KiRecomputeGroupSchedulingRank

VOID __stdcall KiRecomputeGroupSchedulingRank(_KSCHEDULING_GROUP *SchedulingGroup, _KSCB *Scb, _KPRCB *Prcb){
  unsigned __int64 v6; 
  volatile signed __int32 *ShareRank; 
  unsigned __int64 v8; 
  unsigned __int64 RankCycleTarget; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  volatile signed __int32 *v12; 

  KiChargeSchedulingGroupCycleTime(SchedulingGroup, Scb);
  v6 = KiCycleDivisorShortTerm * SchedulingGroup->RelativeWeight;
  ++Scb->Rank;
  ShareRank = (volatile signed __int32 *)Scb->ShareRank;
  v8 = v6 >> 7;
  Scb->RankCycleTarget += v8;
  RankCycleTarget = Scb->RankCycleTarget;
  if( ShareRank )
  {
    _InterlockedIncrement(ShareRank);
    RankCycleTarget = Scb->RankCycleTarget;
  }
  if( Scb->GenerationCycles > RankCycleTarget )
  {
    v11 = v8 + Scb->GenerationCycles - RankCycleTarget - 1;
    v10 = v11 / v8;
    Scb->Rank += v11 / v8;
    Scb->RankCycleTarget = RankCycleTarget + v8 * (unsigned int)(v11 / v8);
    v12 = (volatile signed __int32 *)Scb->ShareRank;
    if( v12 )
      _InterlockedExchangeAdd(v12, v10);
  }
  if( (*((_BYTE *)Scb + 112) & 1) != 0 )
    KiResortScbQueue(Prcb, Scb, 1u);
}

Referenced by:

KiGroupSchedulingQuantumEnd
KiQueueReadyThread
KiSwapThread