KeInsertSchedulingGroup

VOID __stdcall KeInsertSchedulingGroup(
        _KSCHEDULING_GROUP *SchedulingGroup,
        _KSCHEDULING_GROUP_POLICY Policy,
        _KSCHEDULING_GROUP *Parent){
  unsigned __int64 PerformanceCounter; 
  bool v7; 
  $60E5399CB9BE4CDCAACA2C9004551315 *v8; 
  unsigned int v9; 
  unsigned __int64 *p_MinQuotaCycleTarget; 
  _QWORD *v11; 
  __int64 v12; 
  __int64 v13; 
  char v14; 
  _KPRCB *v15; 
  _LIST_ENTRY *v16; 
  unsigned int v17; 
  unsigned int v18; 
  __int64 v19; 
  char *v20; 
  _QWORD *v21; 
  _QWORD *v22; 
  __int64 v23; 
  unsigned int ChildMinRate; 
  int Weight; 
  int v26; 
  _KSCHEDULING_GROUP *v27; 
  _KSCB *v28; 
  _LIST_ENTRY *Blink; 
  unsigned int ChildMinWeight; 
  int v31; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 SpinCount; 
  _KSCHEDULING_GROUP_POLICY v34; 
  char *v35; 

  v34 = Policy;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( !KiGroupSchedulingEnabled )
    KiEnableGroupScheduling();
  SchedulingGroup->Policy = Policy;
  SchedulingGroup->NotificationCycles = 0i64;
  *(_QWORD *)&SchedulingGroup->ChildMinRate = 0i64;
  SchedulingGroup->ChildTotalWeight = 0;
  PerformanceCounter = KeQueryPerformanceCounter(0i64);
  v7 = (_DWORD)KeMaximumProcessors == 0;
  v8 = &SchedulingGroup->56;
  SchedulingGroup->QueryHistoryTimeStamp = PerformanceCounter;
  v9 = 0;
  SchedulingGroup->SchedulingGroupList.Blink = &SchedulingGroup->SchedulingGroupList;
  SchedulingGroup->ChildList.Blink = &SchedulingGroup->ChildList;
  SchedulingGroup->ChildList.Flink = &SchedulingGroup->ChildList;
  SchedulingGroup->SchedulingGroupList.Flink = &SchedulingGroup->SchedulingGroupList;
  SchedulingGroup->Parent = 0i64;
  SchedulingGroup->MaxQuotaLimitCycles = 0i64;
  SchedulingGroup->MaxQuotaCyclesRemaining = 0i64;
  if( !v7 )
  {
    p_MinQuotaCycleTarget = &SchedulingGroup->PerProcessor[0].MinQuotaCycleTarget;
    do
    {
      memset(p_MinQuotaCycleTarget - 1, 0i64, 0x88u);
      v11 = p_MinQuotaCycleTarget + 16;
      v12 = 16i64;
      do
      {
        v11[1] = v11;
        *v11 = v11;
        v11 += 2;
        --v12;
      }
      while( v12 );
      v13 = KiCycleDivisorShortTerm;
      *p_MinQuotaCycleTarget = KiCycleDivisorShortTerm;
      p_MinQuotaCycleTarget[1] = v13;
      p_MinQuotaCycleTarget[48] = 0i64;
      p_MinQuotaCycleTarget[49] = 0i64;
      if( Parent )
      {
        v28 = &Parent->PerProcessor[v9];
        p_MinQuotaCycleTarget[50] = (unsigned __int64)v28;
        p_MinQuotaCycleTarget[51] = (unsigned __int64)v28->Root;
        v14 = v28->Depth + 1;
      }
      else
      {
        p_MinQuotaCycleTarget[50] = 0i64;
        v14 = 0;
        p_MinQuotaCycleTarget[51] = (unsigned __int64)(p_MinQuotaCycleTarget - 1);
      }
      *((_BYTE *)p_MinQuotaCycleTarget + 105) = v14;
      ++v9;
      p_MinQuotaCycleTarget += 53;
    }
    while( v9 < (unsigned int)KeMaximumProcessors );
  }
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&KiSchedulingGroupLock, &LockHandle);
  if( Parent )
  {
    SchedulingGroup->Parent = Parent;
    Blink = Parent->ChildList.Blink;
    if( Blink->Flink != &Parent->ChildList )
      goto LABEL_53;
    v8->SchedulingGroupList.Flink = &Parent->ChildList;
    SchedulingGroup->SchedulingGroupList.Blink = Blink;
    Blink->Flink = &v8->SchedulingGroupList;
    Parent->ChildList.Blink = &v8->SchedulingGroupList;
  }
  else
  {
    v16 = (_LIST_ENTRY *)qword_140C31A18;
    if( *(__int64 **)qword_140C31A18 != &KiSchedulingGroupList )
      goto LABEL_53;
    v8->SchedulingGroupList.Flink = (_LIST_ENTRY *)&KiSchedulingGroupList;
    SchedulingGroup->SchedulingGroupList.Blink = v16;
    v16->Flink = &v8->SchedulingGroupList;
    qword_140C31A18 = (__int64)&SchedulingGroup->56;
  }
  v17 = KeNumberProcessors_0;
  v18 = 0;
  v35 = 0i64;
  if( (_DWORD)KeNumberProcessors_0 )
  {
    while( 1 )
    {
      v19 = (__int64)*(&KiProcessorBlock + v18);
      v20 = (char *)SchedulingGroup + 424 * v18;
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v19 + 48), 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(_QWORD *)(v19 + 48) );
      }
      v21 = *(_QWORD **)(v19 + 33296);
      v22 = v20 + 200;
      if( *v21 != v19 + 33288 )
        break;
      v7 = (v34.AllFlags & 4) == 0;
      *v22 = v19 + 33288;
      *((_QWORD *)v20 + 26) = v21;
      *v21 = v22;
      *(_QWORD *)(v19 + 33296) = v22;
      if( !v7 )
      {
        v20[240] |= 0xCu;
        *((_DWORD *)v20 + 61) = 1;
      }
      _InterlockedAnd64((volatile signed __int64 *)(v19 + 48), 0i64);
      if( *(_QWORD *)(v19 + 33856) )
      {
        if( *(_BYTE *)(v19 + 209) == *(_BYTE *)(*(_QWORD *)(v19 + 33864) + 593i64) )
        {
          v20[240] |= 0x20u;
          v23 = (__int64)(v20 + 256);
          v35 = v20 + 256;
        }
        else
        {
          v23 = (__int64)v35;
        }
        *((_QWORD *)v20 + 31) = v23;
      }
      if( ++v18 >= v17 )
        goto LABEL_24;
    }
LABEL_53:
    __fastfail(3u);
  }
LABEL_24:
  if( (SchedulingGroup->Policy.AllFlags & 1) != 0 )
  {
    if( Parent )
    {
      ChildMinRate = Parent->ChildMinRate;
      if( ChildMinRate )
      {
        Weight = Policy.Weight;
        if( Policy.Weight >= ChildMinRate )
          goto LABEL_28;
      }
      v27 = Parent;
      Parent->ChildMinRate = Policy.Weight;
    }
    else
    {
      ChildMinRate = KiGroupSchedulingMinimumRate;
      if( KiGroupSchedulingMinimumRate )
      {
        Weight = Policy.Weight;
        if( Policy.Weight >= (unsigned int)KiGroupSchedulingMinimumRate )
        {
LABEL_28:
          SchedulingGroup->RelativeWeight = (Weight << 7) / ChildMinRate;
LABEL_29:
          KiUpdateCpuTargetByRate(SchedulingGroup, 0, v15);
          goto LABEL_30;
        }
      }
      v27 = 0i64;
      KiGroupSchedulingMinimumRate = Policy.Weight;
    }
    KiAssignSchedulingGroupWeights(RateBased, 0, v27);
    goto LABEL_29;
  }
  if( Parent )
  {
    ChildMinWeight = Parent->ChildMinWeight;
    if( !ChildMinWeight || (v31 = Policy.Weight, Policy.Weight < ChildMinWeight) )
    {
      v31 = Policy.Weight;
      Parent->ChildMinWeight = Policy.Weight;
    }
    Parent->ChildTotalWeight += v31;
  }
  else
  {
    if( !KiGroupSchedulingMinimumWeight
      || (v26 = Policy.Weight, Policy.Weight < (unsigned int)KiGroupSchedulingMinimumWeight) )
    {
      v26 = Policy.Weight;
      KiGroupSchedulingMinimumWeight = Policy.Weight;
    }
    KiGroupSchedulingTotalWeight += v26;
  }
  KiAssignSchedulingGroupWeights(WeightBased, 0, Parent);
LABEL_30:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

MiSessionObjectCreate
PspEstablishDfssHierarchy
PspEstablishJobHierarchy