我正在寻找不同的方法来通过 Windows XP 下的进程 ID 以编程方式暂停和恢复特定进程。
进程挂起/恢复工具使用SuspendThread
/ResumeThread
但警告多线程程序和死锁问题。
PsSuspend看起来不错,但我想知道它是否对死锁有什么特别之处或使用其他方法?
首选语言:C++ / Python
如果您“调试调试器”(例如,logger.exe
用于跟踪由 进行的所有 API 调用windbg.exe
),则调试器似乎使用SuspendThread()
/ResumeThread()
挂起正在调试的进程中的所有线程。
PsSuspend 可能使用不同的挂起进程的方式(我不确定),但仍然有可能挂起其他进程:如果您正在挂起的进程正在持有另一个进程所需的共享同步对象,您可能会阻塞其他过程没有取得任何进展。如果两个程序都写得很好,当您恢复暂停的那个时,它们应该会恢复,但并非所有程序都写得很好。如果这导致您正在执行挂起的程序挂起,那么您就有了死锁。
我不确定这是否有效,但使用 MS Systernals 的 ProcessExplorer,您可以暂停一个进程。
这里有人说过:https ://superuser.com/a/155263我也在那里找到了它。
阅读这里,你也有 psutil for python,你可以像这样使用它:
>>> import psutil
>>> pid = 7012
>>> p = psutil.Process(pid)
>>> p.suspend()
>>> p.resume()
因此,在我发现UniversalPauseButton之后,谷歌搜索(“windows SIGSTOP”),将此问题作为第一个搜索结果(感谢 Ilia K。您的评论完成了它的工作),并阅读了答案,我回去检查代码.
显然,它使用未记录的 NT 内核和 Win32 API _NtSuspendProcess
,_NtResumeProcess
并且_HungWindowFromGhostWindow
.
PsSuspend,您提到并链接到的实用程序可能使用了这些 API,我无法验证这一点,没有提供源代码,只有可执行文件和 EULA,您可能可以通过反汇编二进制文件来解决这个问题,但它违反 EULA .
因此,要回答您的具体问题,请查看UniversalPauseButton的主要内容。cpp,基本上你调用_NtSuspendProcess(ProcessHandle)
and _NtResumeProcess(ProcessHandle)
,ProcessHandle
作为你想要暂停或恢复的进程的句柄。
我认为 Windows 中没有 SuspendProcess() 函数是有充分理由的。拥有这样的功能为不稳定的系统打开了大门。除非您自己创建了该进程,否则您不得暂停该进程。如果您自己编写了该流程,您可以使用事件(参见 MSDN 中的 ::SetEvent() 等)或其他类型的消息传递来触发流程中的暂停命令。