PspEnumJobsAndProcessesInJobHierarchy

NTSTATUS __stdcall PspEnumJobsAndProcessesInJobHierarchy(
        _EJOB *RootJob,
        INT64 *JobPreCallback,
        _EJOB *a3,
        VOID *a4,
        INT64 *JobPostCallback,
        _EJOB *a6,
        VOID *a7,
        INT64 *ProcessCallback,
        _EPROCESS *a9,
        VOID *a10,
        VOID *Context,
        UINT64 Flags){
  unsigned int v12; 
  unsigned int v14; 
  int v15; 
  _EJOB *v16; 
  _EJOB *NextChildJob; 
  _QWORD *i; 
  __int64 v19; 
  _EJOB *v21; 
  _ETHREAD *CurrentThread; 
  INT64 *v23; 
  _EPROCESS *v24; 
  VOID *v25; 
  VOID *v26; 
  UINT64 v27; 
  INT64 *JobPreCallbacka; 
  _EJOB *v29; 
  VOID *v30; 

  v30 = a4;
  v29 = a3;
  JobPreCallbacka = JobPreCallback;
  v12 = (unsigned int)a6;
  if( ((unsigned __int8)a6 & 8) != 0 )
    v14 = (unsigned int)a6 | 1;
  else
    v14 = (unsigned int)a6 & 0xFFFFFFFE;
  v15 = 0;
  v16 = RootJob;
  if( ((unsigned __int8)a6 & 8) != 0 )
    v12 = (unsigned int)a6 | 1;
  while( 1 )
  {
    if( (v12 & 2) == 0 )
    {
      LODWORD(v21) = v12;
      v15 = PspCallJobHierarchyCallbacks(
              v16,
              JobPreCallback,
              a3,
              a4,
              JobPostCallback,
              v21,
              CurrentThread,
              v23,
              v24,
              v25,
              v26,
              v27);
      if( v15 < 0 )
        goto LABEL_17;
      v12 = v14;
    }
    NextChildJob = 0i64;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    PspLockJobShared(v16, CurrentThread);
    for( i = (_QWORD *)*((_QWORD *)v16 + 132); i != (_QWORD *)((char *)v16 + 1056); i = (_QWORD *)*i )
    {
      if( ObReferenceObjectSafeWithTag((INT64)(i - 130), 1850045264i64) )
      {
        NextChildJob = (_EJOB *)(i - 130);
        break;
      }
    }
    PspUnlockJob(v16, CurrentThread);
    if( !NextChildJob )
    {
      v19 = *((_QWORD *)v16 + 134);
      if( v16 != RootJob )
      {
        while( 1 )
        {
          if( (v12 & 2) != 0 )
          {
            LODWORD(v21) = v14;
            v15 = PspCallJobHierarchyCallbacks(
                    v16,
                    JobPreCallbacka,
                    v29,
                    v30,
                    JobPostCallback,
                    v21,
                    CurrentThread,
                    v23,
                    v24,
                    v25,
                    v26,
                    v27);
            if( v15 < 0 )
              goto LABEL_17;
          }
          NextChildJob = PspGetNextChildJob((_EJOB *)v19, v16);
          if( !NextChildJob )
          {
            v16 = (_EJOB *)v19;
            v19 = *(_QWORD *)(v19 + 1072);
            if( v16 != RootJob )
              continue;
          }
          break;
        }
      }
    }
    v16 = NextChildJob;
    if( !NextChildJob )
      break;
    a4 = v30;
    a3 = v29;
    JobPreCallback = JobPreCallbacka;
  }
  if( (v12 & 2) == 0 )
    return v15;
  LODWORD(v21) = v12;
  v15 = PspCallJobHierarchyCallbacks(
          RootJob,
          JobPreCallbacka,
          v29,
          v30,
          JobPostCallback,
          v21,
          CurrentThread,
          v23,
          v24,
          v25,
          v26,
          v27);
LABEL_17:
  if( v16 )
  {
    while( v16 != RootJob )
    {
      ObfDereferenceObjectWithTag(v16, 0x6E457350ui64);
      v16 = (_EJOB *)*((_QWORD *)v16 + 134);
    }
  }
  return v15;
}

Referenced by:

NtSetInformationJobObject
PspAllocateAndQueryNotificationChannel
PspEnforceLimits
PspEstablishJobHierarchy
PspFreezeJobTree
PspQueryJobHierarchyAccountingInformation
PspQueryJobHierarchyProcessIdList
PspSetJobIoAttribution
PspSetJobRateControl