PspEstablishDfssHierarchy
int __fastcall PspEstablishDfssHierarchy(__int64 a1, _EPROCESS *a2, int a3){
VOID *SessionObjectByProcess;
_KSCHEDULING_GROUP *SessionSchedulingGroupByProcess;
_EPROCESS *v6;
int v7;
VOID *v8;
VOID *v9;
LODWORD(SessionObjectByProcess) = a3 - 1;
if( ((a3 - 1) & 0xFFFFFFFD) == 0 )
{
SessionSchedulingGroupByProcess = MmGetSessionSchedulingGroupByProcess(a2);
SessionObjectByProcess = MmGetSessionObjectByProcess(v6);
v8 = SessionObjectByProcess;
if( *(_QWORD *)(*(_QWORD *)(a1 + 1080) + 1008i64)
|| *(_KSCHEDULING_GROUP **)(a1 + 1016) == SessionSchedulingGroupByProcess )
{
if( v7 == 1 )
{
SessionObjectByProcess = *(VOID **)(a1 + 1080);
if( SessionObjectByProcess == (VOID *)a1
&& *(_QWORD *)(a1 + 1008)
&& !*(_DWORD *)(a1 + 216)
&& *(VOID **)(a1 + 1112) != v8 )
{
KeRemoveSchedulingGroup(*(_KSCHEDULING_GROUP **)(a1 + 1016));
KeInsertSchedulingGroup(
(_KSCHEDULING_GROUP *)(*(_QWORD *)(a1 + 1008) + 128i64),
*(_KSCHEDULING_GROUP_POLICY *)(*(_QWORD *)(a1 + 1008) + 128i64),
SessionSchedulingGroupByProcess);
v9 = *(VOID **)(a1 + 1112);
if( v9 )
ObfDereferenceObjectWithTag(v9, 0x624A7350ui64);
*(_QWORD *)(a1 + 1112) = v8;
LODWORD(SessionObjectByProcess) = ObfReferenceObjectWithTag(v8, 0x624A7350ui64);
}
}
}
else
{
if( *(_KSCHEDULING_GROUP **)(*(_QWORD *)(a1 + 1080) + 1016i64) != SessionSchedulingGroupByProcess )
{
*(_QWORD *)(*(_QWORD *)(a1 + 1080) + 1016i64) = SessionSchedulingGroupByProcess;
SessionObjectByProcess = *(VOID **)(a1 + 1080);
*((_QWORD *)SessionObjectByProcess + 139) = v8;
}
*(_QWORD *)(a1 + 1016) = SessionSchedulingGroupByProcess;
}
}
return(int)SessionObjectByProcess;
}Referenced by:
PspEstablishJobHierarchy