PspJobClose

VOID __stdcall PspJobClose(_EPROCESS *Process, VOID *Object, UINT64 ProcessHandleCount, UINT64 SystemHandleCount){
  char v4; 
  _ETHREAD *CurrentThread; 
  VOID *v7; 

  v4 = 1;
  if( SystemHandleCount <= 1 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    _InterlockedOr((volatile signed __int32 *)Object + 330, 1u);
    PspLockJobExclusive((_EJOB *)Object, CurrentThread);
    if( (*((_DWORD *)Object + 64) & 0x2000) != 0 )
    {
      if( _interlockedbittestandset((volatile signed __int32 *)Object + 330, 0x1Du)
        || (*((_DWORD *)Object + 330) & 0x40000000) == 0 )
      {
        v4 = 0;
      }
      PspUnlockJob((_EJOB *)Object, CurrentThread);
      PspTerminateAllProcessesInJobHierarchy((_EJOB *)Object, 0i64, 0);
      PspLockJobExclusive((_EJOB *)Object, CurrentThread);
      if( v4 )
        PspBeginSiloTeardown((INT64)Object);
    }
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object + 129, 0i64);
    v7 = (VOID *)*((_QWORD *)Object + 57);
    *((_QWORD *)Object + 57) = 0i64;
    PspUnlockJobMemoryLimitsExclusive((_EJOB *)Object, 0i64, 0i64);
    PspUnlockJob((_EJOB *)Object, CurrentThread);
    if( v7 )
      ObfDereferenceObjectWithTag(v7, 0x624A7350ui64);
  }
}

Referenced by:

No references.