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