PspEnumJobsAndProcessesInJobHierarchy

__int64 __fastcall PspEnumJobsAndProcessesInJobHierarchy(
        PVOID Object,
        __int64 (__fastcall *a2)(__int64, __int64),
        unsigned int (__fastcall *a3)(__int64, __int64),
        __int64 (__fastcall *a4)(_QWORD *, __int64),
        __int64 a5,
        int a6){
  char v6; 
  char v8; 
  int v9; 
  _EJOB *v10; 
  _EJOB *NextChildJob; 
  _LIST_ENTRY *i; 
  _EJOB *ParentJob; 
  _ETHREAD *CurrentThread; 
  __int64(__fastcall *v16)(__int64, __int64); 
  unsigned int(__fastcall *v17)(__int64, __int64); 
  __int64(__fastcall *v18)(_QWORD *, __int64); 
  v18 = a4;
  v17 = a3;
  v16 = a2;
  v6 = a6;
  if( (a6 & 8) != 0 )
    v8 = a6 | 1;
  else
    v8 = a6 & 0xFE;
  v9 = 0;
  v10 = (_EJOB *)Object;
  if( (a6 & 8) != 0 )
    v6 = a6 | 1;
  while( 1 )
  {
    if( (v6 & 2) == 0 )
    {
      v9 = PspCallJobHierarchyCallbacks((__int64)v10, a2, a3, a4, a5, v6);
      if( v9 < 0 )
        goto LABEL_17;
      v6 = v8;
    }
    NextChildJob = 0i64;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    PspLockJobShared((__int64)v10, (__int64)CurrentThread);
    for( i = v10->ChildJobListHead.Flink; i != &v10->ChildJobListHead; i = i->Flink )
    {
      if( ObReferenceObjectSafeWithTag(&i[-65], 0x6E457350ui64) )
      {
        NextChildJob = (_EJOB *)&i[-65];
        break;
      }
    }
    PspUnlockJob((__int64)v10, (__int64)CurrentThread);
    if( !NextChildJob )
    {
      ParentJob = v10->ParentJob;
      if( v10 != Object )
      {
        while( 1 )
        {
          if( (v6 & 2) != 0 )
          {
            v9 = PspCallJobHierarchyCallbacks((__int64)v10, v16, v17, v18, a5, v8);
            if( v9 < 0 )
              goto LABEL_17;
          }
          NextChildJob = PspGetNextChildJob(ParentJob, v10);
          if( !NextChildJob )
          {
            v10 = ParentJob;
            ParentJob = ParentJob->ParentJob;
            if( v10 != Object )
              continue;
          }
          break;
        }
      }
    }
    v10 = NextChildJob;
    if( !NextChildJob )
      break;
    a4 = v18;
    a3 = v17;
    a2 = v16;
  }
  if( (v6 & 2) == 0 )
    return(unsigned int)v9;
  v9 = PspCallJobHierarchyCallbacks((__int64)Object, v16, v17, v18, a5, v6);
LABEL_17:
  if( v10 )
  {
    while( v10 != Object )
    {
      ObfDereferenceObjectWithTag(v10, 0x6E457350ui64);
      v10 = v10->ParentJob;
    }
  }
  return(unsigned int)v9;
}

Referenced by:

NtSetInformationJobObject
PspAddSchedulingGroupToJobChain
PspAllocateAndQueryNotificationChannel
PspDoesJobHierarchyPermitUILimits
PspEnforceLimits
PspEnumProcessesInJobHierarchy
PspEstablishJobHierarchy
PspFreezeJobTree
PspIsSetJobIoAttribution
PspQueryJobHierarchyAccountingInformation
PspQueryJobHierarchyInterferenceCount
PspQueryJobHierarchyProcessIdList
PspRemoveIoAttribution
PspSendNoWakeChargeLimitNotification
PspSetBackgroundJobTree
PspSetEnergyTrackingStateJobTree
PspSetJobIoAttribution
PspSetJobRateControl
PspTerminateAllProcessesInJobHierarchy
PspTerminateSiloSubsystemProcesses