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.