PsGetPreviousProcess

NTSTATUS __stdcall PsGetPreviousProcess(PVOID Object){
  _ETHREAD *CurrentThread; 
  __int64 *v3; 
  int v4; 
  __int64 *v5; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0i64;
  v4 = 0;
  PspLockProcessListShared(CurrentThread);
  v5 = (__int64 *)qword_140C1E078;
  if( Object )
    v5 = (__int64 *)*((_QWORD *)Object + 138);
  while( v5 != &PsActiveProcessHead )
  {
    v3 = v5 - 137;
    if( ObReferenceObjectSafeWithTag((INT64)(v5 - 137), 1850045264i64) )
    {
      v4 = 1;
      break;
    }
    v5 = (__int64 *)v5[1];
  }
  PspUnlockProcessListShared(CurrentThread);
  if( Object )
    ObfDereferenceObjectWithTag(Object, 0x6E457350ui64);
  return(unsigned __int64)v3 & -(__int64)(v4 != 0);
}

Referenced by:

NtGetNextProcess