PspTerminateThreadByPointer
__int64 __fastcall PspTerminateThreadByPointer(ULONG_PTR a1, int a2, char a3){
__int64 v4;
_EJOB *ProcessServerSilo;
INT64 ExitStatus;
v4 = *(_QWORD *)(a1 + 544);
if( (*(_DWORD *)(a1 + 1296) & 0x20) != 0 && (*(_DWORD *)(v4 + 1124) & 0x40000008) == 0 )
{
ProcessServerSilo = (_EJOB *)PsGetProcessServerSilo(v4);
LODWORD(ExitStatus) = a2;
PspCatchCriticalBreak(
(INT8 *)"Terminating critical thread 0x%p(in %s)\n",
(PVOID)a1,
(UINT8 *)(v4 + 1448),
ProcessServerSilo,
ExitStatus);
}
if( a3 && (struct _KTHREAD *)a1 == KeGetCurrentThread() )
{
_InterlockedOr((volatile signed __int32 *)(a1 + 1296), 1u);
PspExitThread((unsigned int)a2);
__debugbreak();
}
if( (*(_DWORD *)(a1 + 116) & 0x400) != 0 )
return 3221225506i64;
if( (*(_DWORD *)(v4 + 2172) & 1) != 0 )
return 3221225659i64;
if( !_interlockedbittestandset((volatile signed __int32 *)(a1 + 1296), 0) )
*(_DWORD *)(a1 + 1352) = a2;
KeRequestTerminationThread((_ETHREAD *)a1);
return 0i64;
}Referenced by:
NtTerminateProcess
NtTerminateThread
PsDispatchIumService
PsTerminateSystemThread
PspSystemThreadStartup
PspTerminateAllThreads
PspUserThreadStartup