KeSetSchedulingGroupWeights
INT64 __fastcall KeSetSchedulingGroupWeights(UINT64 a1, INT64 a2, INT64 a3){
__int64 v3;
INT64 v6;
INT64 v7;
int v8;
_QWORD *v9;
__int64 v10;
INT64 result;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v3 = (unsigned int)a1;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&KiSchedulingGroupLock, &LockHandle);
if( (_DWORD)v3 )
{
v6 = a2;
v7 = a3 - a2;
do
{
v8 = *(_DWORD *)(*(_QWORD *)v6 + 4i64);
if( (v8 & 1) != 0 )
{
*(_DWORD *)(*(_QWORD *)v6 + 4i64) = v8 & 0xFFFFFFFE;
if( KiUpdateMinimumWeight(1, 0, *(_DWORD **)(*(_QWORD *)v6 + 96i64)) )
KiAssignSchedulingGroupWeights(1, 0, *(_QWORD *)(*(_QWORD *)v6 + 96i64));
}
v9 = *(_QWORD **)v6;
v10 = *(_QWORD *)(v7 + v6);
v6 += 8i64;
*v9 = v10;
--v3;
}
while( v3 );
}
KiUpdateMinimumWeight(0, 1, *(_DWORD **)(*(_QWORD *)a2 + 96i64));
KiAssignSchedulingGroupWeights(0, 1, *(_QWORD *)(*(_QWORD *)a2 + 96i64));
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
NtSetInformationJobObject
PsSetCpuQuotaInformation