KeRemoveSchedulingGroup

UINT64 __stdcall KeRemoveSchedulingGroup(_KSCHEDULING_GROUP *SchedulingGroup){
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  UINT64 v4; 
  __int64 v5; 
  unsigned int v6; 
  _KSCHEDULING_GROUP *Parent; 
  __int64 v8; 
  __int64 v9; 
  _LIST_ENTRY *p_PerProcessorList; 
  _LIST_ENTRY *v11; 
  _LIST_ENTRY *v12; 
  _KSCHEDULING_GROUP *v13; 
  _KSCHEDULING_GROUP *v14; 
  char v15; 
  int Weight; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 SpinCount; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&KiSchedulingGroupLock, &LockHandle);
  Flink = SchedulingGroup->SchedulingGroupList.Flink;
  Blink = SchedulingGroup->SchedulingGroupList.Blink;
  if( ($60E5399CB9BE4CDCAACA2C9004551315 *)Flink->Blink != &SchedulingGroup->56
    || ($60E5399CB9BE4CDCAACA2C9004551315 *)Blink->Flink != &SchedulingGroup->56 )
  {
    goto LABEL_26;
  }
  Blink->Flink = Flink;
  v4 = 0i64;
  Flink->Blink = Blink;
  v5 = 0i64;
  v6 = KeNumberProcessors_0;
  Parent = SchedulingGroup->Parent;
  if( (_DWORD)KeNumberProcessors_0 )
  {
    while( 1 )
    {
      v8 = (__int64)*(&KiProcessorBlock + v5);
      v9 = (unsigned int)v5;
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v8 + 48), 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(_QWORD *)(v8 + 48) );
      }
      p_PerProcessorList = &SchedulingGroup->PerProcessor[v9].PerProcessorList;
      v11 = p_PerProcessorList->Flink;
      v12 = p_PerProcessorList->Blink;
      if( p_PerProcessorList->Flink->Blink != p_PerProcessorList || v12->Flink != p_PerProcessorList )
        break;
      v12->Flink = v11;
      v11->Blink = v12;
      _InterlockedAnd64((volatile signed __int64 *)(v8 + 48), 0i64);
      v4 += SchedulingGroup->PerProcessor[v9].ReadyTime;
      v5 = (unsigned int)(v5 + 1);
      if( (unsigned int)v5 >= v6 )
        goto LABEL_9;
    }
LABEL_26:
    __fastfail(3u);
  }
LABEL_9:
  if( (SchedulingGroup->Policy.AllFlags & 1) == 0 )
  {
    Weight = SchedulingGroup->Policy.Weight;
    if( Parent )
      Parent->ChildTotalWeight -= Weight;
    else
      KiGroupSchedulingTotalWeight -= Weight;
  }
  if( Parent )
  {
    if( Parent->ChildList.Flink == &Parent->ChildList )
    {
      Parent->ChildMinWeight = 0;
      Parent->ChildMinRate = 0;
      goto LABEL_15;
    }
    v13 = Parent;
  }
  else
  {
    if( (__int64 *)KiSchedulingGroupList == &KiSchedulingGroupList )
    {
      KiGroupSchedulingMinimumWeight = 0;
      KiGroupSchedulingMinimumRate = 0;
      goto LABEL_15;
    }
    v13 = 0i64;
  }
  KiUpdateMinimumWeight((_KSCHEDULING_GROUP_TYPE)(SchedulingGroup->Policy.AllFlags & 1), 0i64, v13);
  if( v15 || (SchedulingGroup->Policy.AllFlags & 1) == 0 )
    KiAssignSchedulingGroupWeights((_KSCHEDULING_GROUP_TYPE)(SchedulingGroup->Policy.AllFlags & 1), 0, v14);
LABEL_15:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  return v4;
}

Referenced by:

MiSessionObjectDelete
PspEstablishDfssHierarchy
PspEstablishJobHierarchy
PspRemoveCpuRateControl