views:

2592

answers:

4

Hello, i am looking for different ways to pause and resume programmatically a particular process via his process ID under Windows XP.

http://www.codeproject.com/KB/threads/pausep.aspx does it with SuspendThread / ResumeThread but warns about multithreaded programs and deadlocks problem.

PsSuspend looks ok : http://technet.microsoft.com/en-us/sysinternals/bb897540.aspx I wonder if it does anything special about deadlocks or use another method ?

Prefered languages : C++ / Python

A: 

I think there is a good reason why there is no SuspendProcess() function in Windows. Having such a function opens the door for an unstable system. You shall not suspend a process unless you created that process yourself. If you wrote that process yourself, you could use an event (see ::SetEvent() etc. in MSDN) or another kind of messaging to trigger a pause command in the process.

Andre
+2  A: 

If you "debug the debugger" (for instance, using logger.exe to trace all API calls made by windbg.exe), it appears that the debugger uses SuspendThread()/ResumeThread() to suspend all of the threads in the process being debugged.

PsSuspend may use a different way of suspending processes (I'm not sure), but it is still possible to hang other processes: if the process you're suspending is holding a shared synchronization object that is needed by another process, you may block that other process from making any progress. If both programs are well-written, they should recover when you resume the one that you suspended, but not all programs are well-written. And if this causes your program that is doing the suspending to hang, then you have a deadlock.

bk1e
+1  A: 

I tested http://www.codeproject.com/KB/threads/pausep.aspx on few softwares:

it works fine.

PsSuspend and Pausep are two valid options.

MechanTOurS
If you're careful in using it then it works fine. If you use it to create a deadlock then you create a deadlock.
Windows programmer
A: 

Who said windows was stable?