PspTerminateThreadByPointer
NTSTATUS __stdcall PspTerminateThreadByPointer(PVOID Thread, UINT64 ExitStatus, UINT8 DirectTerminate){
INT64 v4;
unsigned int v5;
_EJOB *v8;
INT64 ExitStatusa;
v4 = *((_QWORD *)Thread + 68);
v5 = ExitStatus;
if( (*((_DWORD *)Thread + 324) & 0x20) != 0 && (*(_DWORD *)(v4 + 1124) & 0x40000008) == 0 )
{
LODWORD(v8) = PsGetProcessServerSilo(v4);
LODWORD(ExitStatusa) = v5;
PspCatchCriticalBreak(
(INT8 *)"Terminating critical thread 0x%p(in %s)\n",
Thread,
(UINT8 *)(v4 + 1448),
v8,
ExitStatusa);
}
if( DirectTerminate && Thread == KeGetCurrentThread() )
{
_InterlockedOr((volatile signed __int32 *)Thread + 324, 1u);
PspExitThread(v5);
__debugbreak();
}
if( (*((_DWORD *)Thread + 29) & 0x400) != 0 )
return -1073741790;
if( (*(_DWORD *)(v4 + 2172) & 1) != 0 )
return -1073741637;
if( !_interlockedbittestandset((volatile signed __int32 *)Thread + 324, 0) )
*((_DWORD *)Thread + 338) = v5;
KeRequestTerminationThread((_KTHREAD *)Thread);
return 0;
}Referenced by:
NtTerminateProcess
NtTerminateThread
PsDispatchIumService
PsTerminateSystemThread
PspSystemThreadStartup
PspTerminateAllThreads
PspUserThreadStartup