KeInsertSchedulingGroup
VOID __stdcall KeInsertSchedulingGroup(
_KSCHEDULING_GROUP *SchedulingGroup,
_KSCHEDULING_GROUP_POLICY Policy,
_KSCHEDULING_GROUP *Parent){
LARGE_INTEGER PerformanceCounter;
bool v7;
$60E5399CB9BE4CDCAACA2C9004551315 *v8;
unsigned int v9;
unsigned __int64 *p_MinQuotaCycleTarget;
_QWORD *v11;
__int64 v12;
__int64 v13;
char v14;
_LIST_ENTRY *v15;
unsigned int v16;
unsigned int v17;
__int64 v18;
char *v19;
_QWORD *v20;
_QWORD *v21;
__int64 v22;
unsigned int ChildMinRate;
int Weight;
int v25;
_KSCHEDULING_GROUP *v26;
_KSCB *v27;
_LIST_ENTRY *Blink;
unsigned int ChildMinWeight;
int v30;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 SpinCount;
_KSCHEDULING_GROUP_POLICY v33;
char *v34;
v33 = 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.QuadPart;
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((INT64)(p_MinQuotaCycleTarget - 1), 0i64);
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 )
{
v27 = &Parent->PerProcessor[v9];
p_MinQuotaCycleTarget[50] = (unsigned __int64)v27;
p_MinQuotaCycleTarget[51] = (unsigned __int64)v27->Root;
v14 = v27->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(&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
{
v15 = (_LIST_ENTRY *)qword_140C31A18;
if( *(_QWORD ***)qword_140C31A18 != &KiSchedulingGroupList )
goto LABEL_53;
v8->SchedulingGroupList.Flink = (_LIST_ENTRY *)&KiSchedulingGroupList;
SchedulingGroup->SchedulingGroupList.Blink = v15;
v15->Flink = &v8->SchedulingGroupList;
qword_140C31A18 = (__int64)&SchedulingGroup->56;
}
v16 = KeNumberProcessors_0;
v17 = 0;
v34 = 0i64;
if( (_DWORD)KeNumberProcessors_0 )
{
while( 1 )
{
v18 = (__int64)*(&KiProcessorBlock + v17);
v19 = (char *)SchedulingGroup + 424 * v17;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v18 + 48), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v18 + 48) );
}
v20 = *(_QWORD **)(v18 + 33296);
v21 = v19 + 200;
if( *v20 != v18 + 33288 )
break;
v7 = (v33.AllFlags & 4) == 0;
*v21 = v18 + 33288;
*((_QWORD *)v19 + 26) = v20;
*v20 = v21;
*(_QWORD *)(v18 + 33296) = v21;
if( !v7 )
{
v19[240] |= 0xCu;
*((_DWORD *)v19 + 61) = 1;
}
_InterlockedAnd64((volatile signed __int64 *)(v18 + 48), 0i64);
if( *(_QWORD *)(v18 + 33856) )
{
if( *(_BYTE *)(v18 + 209) == *(_BYTE *)(*(_QWORD *)(v18 + 33864) + 593i64) )
{
v19[240] |= 0x20u;
v22 = (__int64)(v19 + 256);
v34 = v19 + 256;
}
else
{
v22 = (__int64)v34;
}
*((_QWORD *)v19 + 31) = v22;
}
if( ++v17 >= v16 )
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;
}
v26 = 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);
goto LABEL_30;
}
}
v26 = 0i64;
KiGroupSchedulingMinimumRate = Policy.Weight;
}
KiAssignSchedulingGroupWeights(1, 0, (__int64)v26);
goto LABEL_29;
}
if( Parent )
{
ChildMinWeight = Parent->ChildMinWeight;
if( !ChildMinWeight || (v30 = Policy.Weight, Policy.Weight < ChildMinWeight) )
{
v30 = Policy.Weight;
Parent->ChildMinWeight = Policy.Weight;
}
Parent->ChildTotalWeight += v30;
}
else
{
if( !KiGroupSchedulingMinimumWeight
|| (v25 = Policy.Weight, Policy.Weight < (unsigned int)KiGroupSchedulingMinimumWeight) )
{
v25 = Policy.Weight;
KiGroupSchedulingMinimumWeight = Policy.Weight;
}
KiGroupSchedulingTotalWeight += v25;
}
KiAssignSchedulingGroupWeights(0, 0, (__int64)Parent);
LABEL_30:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}Referenced by:
MiSessionObjectCreate
PspAddSchedulingGroupToJobChain
PspEstablishDfssHierarchy
PspEstablishJobHierarchy