How to pause / resume any external process under Windows?

后端 未结 6 1427
粉色の甜心
粉色の甜心 2020-12-16 19:56

I am looking for different ways to pause and resume programmatically a particular process via its process ID under Windows XP.

Process suspend/resume tool does it wi

相关标签:
6条回答
  • 2020-12-16 20:14

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

    it works fine.

    PsSuspend and Pausep are two valid options.

    0 讨论(0)
  • 2020-12-16 20:14

    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.

    0 讨论(0)
  • 2020-12-16 20:15

    I'm not sure if this does the job, but with ProcessExplorer from MS Systernals you can suspend a process.

    It's been said here: https://superuser.com/a/155263 and I found it there too.

    0 讨论(0)
  • 2020-12-16 20:16

    read here and you also have psutil for python that you can use it like that:

    >>> import psutil
    >>> pid = 7012
    >>> p = psutil.Process(pid)
    >>> p.suspend()
    >>> p.resume()
    
    0 讨论(0)
  • 2020-12-16 20:16

    So, after I found about UniversalPauseButton, Googling for this ("windows SIGSTOP"), getting this question as the first search result (thanks Ilia K. your comment did its job), and reading the answers, I went back to checkout the code.

    Apparently, it uses undocumented NT kernel and Win32 APIs _NtSuspendProcess, _NtResumeProcess and _HungWindowFromGhostWindow.

    PsSuspend, the utility you mentioned and linked to probably uses these APIs, I couldn't verify this, the source code isn't supplied, only executables and a EULA, you can probably figure that out by disassembling the binary but it's against the EULA.

    so, to answer your specific question, checkout UniversalPauseButton's main.cpp, basically you call _NtSuspendProcess(ProcessHandle) and _NtResumeProcess(ProcessHandle), ProcessHandle being the handle of the process you want to pause or resume.

    0 讨论(0)
  • 2020-12-16 20:22

    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.

    0 讨论(0)
提交回复
热议问题