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.