2011-08-30 50 views
3

使用Win32 API只能使用SuspendThread()挂起单个线程,但在一次调用中不能完成一个进程。
迭代一个进程线程并暂时挂载它们并不是一个好的选择,因为它可能导致死锁和意外的行为。Windows:以原子级方式暂停整个过程?

这应该是在内核中使用来自DDK的函数(我不记得它的名字)。
如何将这个函数暴露给用户模式?

有没有其他的方式来实现这一点,而不去内核?

SysInternals进程管理器有一个选项来暂停进程。它是如何做到的?

+2

Windows调度线程挂起在过程中随机所有的时间。如果你在这样做的时候遇到了死锁,那么你需要修复你的线程错误。或者换一种说法,如果你的程序是正确的,你就不会死锁。 –

回答

2

ntdll.dll中未记录的函数NtSuspendProcess听起来像你在找什么。 Sysinternals pssuspend和进程管理器都使用这个。

关于无证函数的通常注意事项适用。

此答案的一些细节: How can I freeze the execution of a program?

+0

pssuspend.exe似乎没有直接从ntdll导入任何 – shoosh

+0

对不起,我的坏,你不能静态链接到ntdll,它使用'GetProcAddress'去它。 – shoosh

+0

它使用GetmoduleHandle(“ntdll.dll”)/ GetProcAddress(“NtSuspendProcess”)加载它 – John

2

实际上,这正是MiniDumpWriteDump看起来要做的事情 - 它在创建转储之前单独挂起进程中的所有线程(调用线程除外)。

这本身不应该导致死锁或意外的行为,但显然它可能是最好的做法从一个单独的过程。