PspGetNextJob
_LIST_ENTRY **__fastcall PspGetNextJob(_EJOB *Job){
_ETHREAD *CurrentThread;
_LIST_ENTRY **v3;
__int64 *v4;
bool v5;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
v3 = 0i64;
ExAcquirePushLockSharedEx(&PspJobListLock, 0i64);
if( Job )
v4 = (__int64 *)*((_QWORD *)Job + 3);
else
v4 = (__int64 *)PspJobList;
if( v4 != &PspJobList )
{
while( !ObReferenceObjectSafeWithTag((INT64)(v4 - 3), 1850045264i64) )
{
v4 = (__int64 *)*v4;
if( v4 == &PspJobList )
goto LABEL_6;
}
v3 = (_LIST_ENTRY **)(v4 - 3);
}
LABEL_6:
if( _InterlockedCompareExchange64(&PspJobListLock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&PspJobListLock);
KeAbPostRelease(&PspJobListLock);
v5 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
if( v5
&& ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
{
KiCheckForKernelApcDelivery();
}
if( Job )
ObfDereferenceObjectWithTag(Job, 0x6E457350ui64);
return v3;
}Referenced by:
PspEnforceLimits
PspGetNextSilo