PspGetPreviousProcessThread
__int64 __fastcall PspGetPreviousProcessThread(__int64 a1, _QWORD *a2){
_ETHREAD *CurrentThread;
__int64 v3;
__int64 v5;
int v6;
INT64 *v7;
__int64 v8;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = a1 + 1504;
v5 = 0i64;
v6 = 0;
--*((_WORD *)CurrentThread + 242);
v7 = (INT64 *)(a1 + 1080);
ExAcquirePushLockSharedEx(a1 + 1080, 0i64);
if( a2 )
v8 = a2[158];
else
v8 = *(_QWORD *)(v3 + 8);
while( v8 != v3 )
{
v5 = v8 - 1256;
if( ObReferenceObjectSafeWithTag((PVOID)(v8 - 1256), 0x6E457350ui64) )
{
v6 = 1;
break;
}
v8 = *(_QWORD *)(v8 + 8);
}
if( _InterlockedCompareExchange64(v7, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v7);
KeAbPostRelease(v7);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
if( a2 )
ObfDereferenceObjectWithTag(a2, 0x6E457350ui64);
return v5 & -(__int64)(v6 != 0);
}Referenced by:
PspTerminateAllThreads