PspJobClose

void __fastcall PspJobClose(__int64 a1, __int64 a2, __int64 a3, unsigned __int64 a4){
  char v4; 
  _ETHREAD *CurrentThread; 
  void *v7; 
  v4 = 1;
  if( a4 <= 1 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    _InterlockedOr((volatile signed __int32 *)(a2 + 1320), 1u);
    PspLockJobExclusive(a2, (__int64)CurrentThread);
    if( (*(_DWORD *)(a2 + 256) & 0x2000) != 0 )
    {
      if( _interlockedbittestandset((volatile signed __int32 *)(a2 + 1320), 0x1Du)
        || (*(_DWORD *)(a2 + 1320) & 0x40000000) == 0 )
      {
        v4 = 0;
      }
      PspUnlockJob(a2, (__int64)CurrentThread);
      PspTerminateAllProcessesInJobHierarchy((_EJOB *)a2, 0i64, 0);
      PspLockJobExclusive(a2, (__int64)CurrentThread);
      if( v4 )
        PspBeginSiloTeardown(a2);
    }
    ExAcquirePushLockExclusiveEx(a2 + 1032, 0i64);
    v7 = *(void **)(a2 + 456);
    *(_QWORD *)(a2 + 456) = 0i64;
    PspUnlockJobMemoryLimitsExclusive((_EJOB *)a2, 0i64, 0i64);
    PspUnlockJob(a2, (__int64)CurrentThread);
    if( v7 )
      ObfDereferenceObjectWithTag(v7, 0x624A7350ui64);
  }
}

Referenced by:

No references.