So far this is all I've been able to come up with:
Code:
#ifdef PAW_API_MSW
/*BOOL CALLBACK EnumThreadWndProc( HWND hwnd, LPARAM lParam );*/
BOOL CALLBACK term_window( HWND hwnd, LPARAM lParam )
{ return PostMessageA( hwnd, WM_QUIT, EXIT_FAILURE, 0 ); }
BOOL CALLBACK segv_window( HWND hwnd, LPARAM lParam )
{ return PostMessageA( hwnd, WM_QUIT, ERROR_INVALID_ACCESS, 0 ); }
RAWPAW_API pawd pawsigid( pawjd tid, PAWSIG sig )
{
pawd err = 0;
HANDLE thread = OpenThread( THREAD_ALL_ACCESS, FALSE, tid );
if ( !thread )
return -1;
switch ( sig )
{
case PAWSIG_KILL: TerminateThread( thread, EXIT_SUCCESS ); break;
case PAWSIG_TERM:
err = -(EnumThreadWindows( tid, term_window, 0 ) != TRUE);
break;
case PAWSIG_STOP: SuspendThread( thread ); break;
case PAWSIG_CONT: ResumeThread( thread ); break;
default: err = -1;
}
CloseHandle( thread );
return err;
}
static pawd pawsig_threads( DWORD pid, PAWSIG sig )
{
HANDLE threads = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, pid );
THREADENTRY32 thread;
BOOL valid = FALSE;
if ( !threads )
return -1;
thread.dwSize = sizeof(THREADENTRY32);
for
(
valid = Thread32First(threads, &thread)
; valid == TRUE
; pawsigid( thread.th32ThreadID, sig )
, valid = Thread32Next(threads, &thread)
);
CloseHandle(threads);
return 0;
}
RAWPAW_API pawd pawsigpid( pawjd pid, PAWSIG sig )
{
pawd err = 0;
HANDLE proc = NULL;
switch ( sig )
{
case PAWSIG_KILL:
proc = OpenProcess( PROCESS_TERMINATE, FALSE, pid );
if ( !proc )
return -1;
TerminateProcess( proc, EXIT_SUCCESS );
CloseHandle( proc );
break;
default:
err = pawsig_threads(pid,sig);
}
return err;
}
#else
RAWPAW_API pawd pawsigid( pawjd tid, PAWSIG sig )
{ return pthread_kill( tid, pawsignals[sig] ); }
RAWPAW_API pawd pawsigpid( pawjd pid, PAWSIG sig )
{ return kill( pid, pawsignals[sig] ); }
#endif
Not even sure ERROR_INVALID_ACCESS is the right code to mimic SEGV