KeRemoveSchedulingGroup

INT64 __fastcall KeRemoveSchedulingGroup(UINT16 *a1){
  __int64 v2; 
  UINT16 **v3; 
  INT64 v4; 
  __int64 v5; 
  unsigned int v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  UINT16 *v10; 
  __int64 v11; 
  UINT16 **v12; 
  _DWORD *v13; 
  __int64 v14; 
  int v16; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 SpinCount; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock(&KiSchedulingGroupLock, &LockHandle);
  v2 = *((_QWORD *)a1 + 7);
  v3 = (UINT16 **)*((_QWORD *)a1 + 8);
  if( *(UINT16 **)(v2 + 8) != a1 + 28 || *v3 != a1 + 28 )
    goto LABEL_26;
  *v3 = (UINT16 *)v2;
  v4 = 0i64;
  *(_QWORD *)(v2 + 8) = v3;
  v5 = 0i64;
  v6 = KeNumberProcessors_0;
  v7 = *((_QWORD *)a1 + 12);
  if( (_DWORD)KeNumberProcessors_0 )
  {
    while( 1 )
    {
      v8 = (__int64)*(&KiProcessorBlock + v5);
      v9 = 212i64 * (unsigned int)v5;
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v8 + 48), 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(_QWORD *)(v8 + 48) );
      }
      v10 = &a1[v9 + 100];
      v11 = *(_QWORD *)v10;
      v12 = (UINT16 **)*((_QWORD *)v10 + 1);
      if( *(UINT16 **)(*(_QWORD *)v10 + 8i64) != v10 || *v12 != v10 )
        break;
      *v12 = (UINT16 *)v11;
      *(_QWORD *)(v11 + 8) = v12;
      _InterlockedAnd64((volatile signed __int64 *)(v8 + 48), 0i64);
      v4 += *(_QWORD *)&a1[v9 + 92];
      v5 = (unsigned int)(v5 + 1);
      if( (unsigned int)v5 >= v6 )
        goto LABEL_9;
    }
LABEL_26:
    __fastfail(3u);
  }
LABEL_9:
  if( (*((_DWORD *)a1 + 1) & 1) == 0 )
  {
    v16 = *a1;
    if( v7 )
      *(_DWORD *)(v7 + 20) -= v16;
    else
      KiGroupSchedulingTotalWeight -= v16;
  }
  if( v7 )
  {
    if( *(_QWORD *)(v7 + 80) == v7 + 80 )
    {
      *(_DWORD *)(v7 + 16) = 0;
      *(_DWORD *)(v7 + 12) = 0;
      goto LABEL_15;
    }
    v13 = (_DWORD *)v7;
  }
  else
  {
    if( KiSchedulingGroupList == &KiSchedulingGroupList )
    {
      KiGroupSchedulingMinimumWeight = 0;
      KiGroupSchedulingMinimumRate = 0;
      goto LABEL_15;
    }
    v13 = 0i64;
  }
  if( KiUpdateMinimumWeight(*((_DWORD *)a1 + 1) & 1, 0, v13) || (*((_DWORD *)a1 + 1) & 1) == 0 )
    KiAssignSchedulingGroupWeights(*((_DWORD *)a1 + 1) & 1, 0, v14);
LABEL_15:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  return v4;
}

Referenced by:

MiSessionObjectDelete
PspEstablishDfssHierarchy
PspEstablishJobHierarchy
PspRemoveCpuRateControl