【发布时间】:2010-11-07 11:21:54
【问题描述】:
如果你想阻止一个进程被终止,一种方法是挂接到 TerminateProcess(或 NtTerminateProcess)。如果进程正在终止自身(例如,因为您关闭了它的窗口),则提供给这些函数的句柄为 NULL,因此您可以使用 GetCurrentProcess() 和 GetModuleFileNameEx() 找出正在终止的可执行文件。由于 GetCurrentProcess() 返回一个伪句柄,您可以毫无问题地访问它。
但是,如果一个进程正在终止另一个进程,则提供的句柄不是 NULL。它表示正在终止的进程。问题是,您无法获得有关该过程的信息。您可以简单地返回一个“拒绝访问”的代码,而不是调用原始的 [Nt]TerminateProcess(),但是该毯子会阻止所有进程终止其他进程 - 这是一个坏主意。
句柄必须代表有效的东西,否则 TerminateProcess 将无法用它做任何有用的事情——但我什至不能在它上面调用 GetProcessId(),我得到 ERROR_INVALID_HANDLE(或 ERROR_ACCESS_DENIED)。我尝试了从帮助和在线收集的各种方法,包括获得调试权限(成功)和 DuplicateHandle()(同样的错误)和 ZwQueryInformationProcess() 来获取 ID(STATUS_ACCESS_DENIED)。我什至无法枚举进程,因为它们返回 ID,而且我无法获取 ID,而且 OpenProcess() 总是返回一个新的句柄,所以我无法比较句柄。
我只能假设句柄有 PROCESS_TERMINATE 正确,没有别的。我知道由于数字版权管理,Vista 和更高版本具有受保护的进程,但我使用 ProcessExplorer 作为我的试验品,所以它绝对不是媒体应用程序!
有谁知道我还能如何获得有关从此句柄终止的进程的任何信息?
【问题讨论】: