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