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