PspEstablishJobHierarchy
NTSTATUS __fastcall PspEstablishJobHierarchy(_EJOB *Job, _EPROCESS *Process, PVOID Object, INT64 a4){
int v5;
int v8;
_QWORD *v9;
VOID **PoolWithTag;
unsigned __int64 v12;
_KSCHEDULING_GROUP *v13;
__int64 v14;
VOID *v15;
PVOID *v16;
_QWORD *v17;
char v18;
int i;
INT64 *v20;
VOID *v21;
_EJOB *v22;
__int64 v23;
_QWORD *v24;
_EJOB *v25;
INT64 JobPostCallback[2];
_EPROCESS *v27;
VOID *v28;
VOID *v29;
UINT64 v30;
v5 = a4;
*(_OWORD *)JobPostCallback = 0i64;
v27 = 0i64;
if( (_DWORD)a4 != 1 )
{
if( (_DWORD)a4 != 2 )
{
if( (_DWORD)a4 == 3 )
{
PspUnlinkJobProcess((_EJOB *)Object, Process);
MmLinkJobProcess(Job, Process);
ObfReferenceObjectWithTag(Job, 0x73507350ui64);
ObfDereferenceObjectWithTag(Object, 0x73507350ui64);
v24 = (_QWORD *)*((_QWORD *)Job + 169);
if( !*((_DWORD *)Job + 337) )
{
if( !v24 )
goto LABEL_67;
v24 = (_QWORD *)v24[169];
}
IoSetDiskIoAttributionOnProcess(v24, Process);
goto LABEL_67;
}
if( (_DWORD)a4 == 4 || (_DWORD)a4 == 5 )
goto LABEL_13;
if( (_DWORD)a4 != 6 )
{
if( (_DWORD)a4 != 7 )
{
v8 = -1073741811;
goto LABEL_6;
}
LABEL_13:
PoolWithTag = 0i64;
v12 = *((_QWORD *)Object + 138) + 1i64;
if( v12 > 2 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 8 * v12 - 16, 1649046352i64);
if( !PoolWithTag )
return -1073741670;
}
if( (unsigned int)(v5 - 4) <= 1 )
{
v8 = PspBindProcessSessionToJob(Job, Process);
if( v8 < 0 )
goto LABEL_39;
}
v13 = (_KSCHEDULING_GROUP *)*((_QWORD *)Job + 127);
if( v13 )
{
KeRemoveSchedulingGroup(v13);
if( (*((_DWORD *)Object + 330) & 0x20) == 0 )
{
v8 = PspAddSchedulingGroupToJobChain((_EJOB *)Object, 0i64);
if( v8 < 0 )
{
KeInsertSchedulingGroup(
(_KSCHEDULING_GROUP *)(*((_QWORD *)Job + 126) + 128i64),
*(_KSCHEDULING_GROUP_POLICY *)(*((_QWORD *)Job + 126) + 128i64),
0i64);
LABEL_39:
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x624A7350u);
goto LABEL_6;
}
}
KeInsertSchedulingGroup(
(_KSCHEDULING_GROUP *)(*((_QWORD *)Job + 126) + 128i64),
*(_KSCHEDULING_GROUP_POLICY *)(*((_QWORD *)Job + 126) + 128i64),
(_KSCHEDULING_GROUP *)(*((_QWORD *)Object + 126) + 128i64));
}
else
{
v14 = *((_QWORD *)Object + 127);
if( v14 )
*((_QWORD *)Job + 127) = v14;
}
v15 = Job;
if( v5 != 4 )
v15 = Object;
ObfReferenceObjectWithTag(v15, 0x73507350ui64);
v16 = (PVOID *)*((_QWORD *)Object + 133);
v17 = (_QWORD *)((char *)Job + 1040);
if( *v16 != (char *)Object + 1056 )
__fastfail(3u);
*v17 = (char *)Object + 1056;
*((_QWORD *)Job + 131) = v16;
*v16 = v17;
*((_QWORD *)Object + 133) = v17;
*((_QWORD *)Job + 134) = Object;
*((_QWORD *)Job + 135) = *((_QWORD *)Object + 135);
v18 = *((_BYTE *)Object + 874) + 1;
*((_QWORD *)Job + 138) = v12;
*((_BYTE *)Job + 874) = v18;
if( v12 > 2 )
{
if( v12 > 3 )
{
v23 = *((_QWORD *)Object + 138) - 2i64;
if( *((_QWORD *)Object + 138) != 2i64 )
{
do
{
PoolWithTag[v23] = *(VOID **)(*((_QWORD *)Object + 139) + 8 * v23 - 8);
--v23;
}
while( v23 );
}
}
*PoolWithTag = (VOID *)*((_QWORD *)Object + 134);
*((_QWORD *)Job + 139) = PoolWithTag;
PoolWithTag = 0i64;
}
if( v5 == 4 )
{
PspUnlinkJobProcess((_EJOB *)Object, Process);
MmLinkJobProcess(Job, Process);
}
PspSetEffectiveJobLimits(Job, 0i64);
*((_DWORD *)Job + 214) += *((_DWORD *)Object + 214);
*((_DWORD *)Job + 216) += *((_DWORD *)Object + 216);
*((_DWORD *)Job + 215) += *((_DWORD *)Object + 215);
*((_DWORD *)Job + 217) += *((_DWORD *)Object + 217);
*((_QWORD *)Job + 197) = *((_QWORD *)Object + 197);
if( (*((_DWORD *)Object + 330) & 0x1841000) != 0 )
_InterlockedOr((volatile signed __int32 *)Job + 330, *((_DWORD *)Object + 330) & 0x1841000);
for( i = 0; i < 3; ++i )
{
if( (unsigned int)(i - 1) > 1 )
{
v22 = (_EJOB *)*((_QWORD *)Object + 104);
if( v22 )
PspSetEffectiveRateControlJob(Job, v22);
}
}
if( *((_DWORD *)Object + 337) )
{
v20 = (INT64 *)Object;
}
else
{
v20 = (INT64 *)*((_QWORD *)Object + 169);
if( v20 )
goto LABEL_60;
}
if( !v20 )
{
if( *((_DWORD *)Job + 337) && v5 == 4 )
IoSetDiskIoAttributionOnProcess(*((VOID **)Job + 169), Process);
goto LABEL_34;
}
LABEL_60:
LODWORD(v25) = 5;
LOBYTE(v27) = 1;
PspEnumJobsAndProcessesInJobHierarchy(
Job,
(INT64 *)PspSetJobIoAttributionJobPreCallback,
0i64,
0i64,
JobPostCallback,
v25,
(VOID *)JobPostCallback[0],
v20,
v27,
v28,
v29,
v30);
LABEL_34:
v21 = (VOID *)*((_QWORD *)Object + 195);
if( v21 )
{
ObfReferenceObjectWithTag(v21, 0x624A7350ui64);
*((_QWORD *)Job + 195) = *((_QWORD *)Object + 195);
*((_QWORD *)Job + 196) = *((_QWORD *)Object + 196);
}
if( v5 == 7 )
_interlockedbittestandset((volatile signed __int32 *)Job + 331, 0);
v8 = 0;
goto LABEL_39;
}
_interlockedbittestandset((volatile signed __int32 *)Job + 331, 0);
}
LABEL_67:
v8 = 0;
goto LABEL_6;
}
v8 = PspBindProcessSessionToJob(Job, Process);
if( v8 >= 0 )
{
ObfReferenceObjectWithTag(Job, 0x73507350ui64);
MmLinkJobProcess(Job, Process);
}
v9 = (_QWORD *)*((_QWORD *)Job + 169);
if( !*((_DWORD *)Job + 337) )
{
if( !v9 )
goto LABEL_6;
v9 = (_QWORD *)v9[169];
}
IoSetDiskIoAttributionOnProcess(v9, Process);
LABEL_6:
if( Process && v8 >= 0 && PsCpuFairShareEnabled )
{
if( PsGetProcessSessionId((INT64)Process) )
PspEstablishDfssHierarchy((__int64)Job, Process, v5);
}
return v8;
}Referenced by:
PspAssignProcessToJob
PspImplicitAssignProcessToJob