PspAddSchedulingGroupToJobChain
NTSTATUS __stdcall PspAddSchedulingGroupToJobChain(_EJOB *BaseJob, _EJOB *PolicyJob){
__int64 *v3;
__int64 *PoolWithTag;
__int64 v6;
__int64 v7;
__int64 v8;
__int64 v9;
_KSCHEDULING_GROUP *v10;
__int64 v11;
__int64 **v12;
CHAR *RateControl;
__int64 *v15;
__int64 v16;
_QWORD *v17;
__int64 v18;
CHAR **v19;
__int64 v20;
_QWORD *v21;
__int64 P[2];
P[1] = (__int64)P;
v3 = P;
P[0] = (__int64)P;
if( PolicyJob )
{
PoolWithTag = (__int64 *)ExAllocatePoolWithTag(PagedPool, 0x18ui64, 0x624A7350ui64);
v3 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
PoolWithTag[2] = (__int64)PolicyJob;
v6 = P[0];
if( *(__int64 **)(P[0] + 8) != P )
LABEL_15:
__fastfail(3u);
*v3 = P[0];
v3[1] = (__int64)P;
*(_QWORD *)(v6 + 8) = v3;
P[0] = (__int64)v3;
}
if( !BaseJob )
goto LABEL_6;
while( 1 )
{
if( (BaseJob->JobFlags & 0x20) != 0 )
goto LABEL_6;
RateControl = PspAllocateRateControl(2i64);
BaseJob->CpuRateControl = (struct _JOB_CPU_RATE_CONTROL *)RateControl;
if( !RateControl )
break;
*((_DWORD *)RateControl + 33) |= 3u;
*((_DWORD *)RateControl + 32) = 655370000;
*((_DWORD *)BaseJob->CpuRateControl + 11) = *((_DWORD *)RateControl + 32);
*((_DWORD *)BaseJob->CpuRateControl + 10) |= 0x40u;
v15 = (__int64 *)ExAllocatePoolWithTag(PagedPool, 0x18ui64, 0x624A7350ui64);
v3 = v15;
if( !v15 )
{
PspFreeRateControl((CHAR **)BaseJob->CpuRateControl, 2i64);
BaseJob->CpuRateControl = 0i64;
break;
}
_InterlockedOr((volatile signed __int32 *)&BaseJob->1320, 0x20u);
v15[2] = (__int64)BaseJob;
v16 = P[0];
if( *(__int64 **)(P[0] + 8) != P )
goto LABEL_15;
*v3 = P[0];
v3[1] = (__int64)P;
*(_QWORD *)(v16 + 8) = v3;
P[0] = (__int64)v3;
BaseJob = BaseJob->ParentJob;
if( !BaseJob )
{
LABEL_6:
while( v3 != P )
{
v7 = v3[2];
v8 = *(_QWORD *)(v7 + 1072);
v9 = *(_QWORD *)(v7 + 1008);
if( v8 )
{
v10 = (_KSCHEDULING_GROUP *)(*(_QWORD *)(v8 + 1008) + 128i64);
}
else
{
v10 = *(_KSCHEDULING_GROUP **)(v7 + 1016);
if( PsCpuFairShareEnabled && v10 )
ObfReferenceObjectWithTag(*(PVOID *)(v7 + 1112), 0x624A7350u);
}
KeInsertSchedulingGroup((_KSCHEDULING_GROUP *)(v9 + 128), *(_KSCHEDULING_GROUP_POLICY *)(v9 + 128), v10);
if( *(_QWORD *)(v7 + 1016) )
PspEnumJobsAndProcessesInJobHierarchy(
(PVOID)v7,
PspSetCpuRateControlJobPreCallback,
(unsigned int(__fastcall *)(__int64, __int64))PspSetCpuRateControlJobPostCallback,
0i64,
0i64,
8);
PspEnumJobsAndProcessesInJobHierarchy(
(PVOID)v7,
PspSetCpuRateControlJobPreCallback,
(unsigned int(__fastcall *)(__int64, __int64))PspSetCpuRateControlJobPostCallback,
0i64,
*(_QWORD *)(v7 + 1008),
8);
v11 = *v3;
if( *(__int64 **)(*v3 + 8) != v3 )
goto LABEL_15;
v12 = (__int64 **)v3[1];
if( *v12 != v3 )
goto LABEL_15;
*v12 = (__int64 *)v11;
*(_QWORD *)(v11 + 8) = v12;
ExFreePoolWithTag(v3, 0x624A7350u);
v3 = (__int64 *)P[0];
}
return 0;
}
}
while( 1 )
{
v17 = (_QWORD *)P[0];
if( (__int64 *)P[0] == P )
return -1073741670;
v18 = *(_QWORD *)(P[0] + 16);
v19 = *(CHAR ***)(v18 + 1008);
if( v19 )
{
PspFreeRateControl(v19, 2i64);
*(_QWORD *)(v18 + 1008) = 0i64;
_InterlockedAnd((volatile signed __int32 *)(v18 + 1320), 0xFFFFFFDF);
}
v20 = *v17;
if( *(_QWORD **)(*v17 + 8i64) != v17 )
goto LABEL_15;
v21 = (_QWORD *)v17[1];
if( (_QWORD *)*v21 != v17 )
goto LABEL_15;
*v21 = v20;
*(_QWORD *)(v20 + 8) = v21;
ExFreePoolWithTag(v17, 0x624A7350u);
}
}Referenced by:
NtSetInformationJobObject
PspEstablishJobHierarchy