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