是否有可能从外部检测到“结束进程”?

有没有办法检测到一个程序是由Windows任务pipe理器的“结束进程”结束? 我知道,在应用程序结束之前(不是将应用程序构build为驱动程序并挂接ZwTerminateProcess),不可能做到这一点,但是我不知道是否有办法从外部注意到它。 我不想停止程序的终止,只是为了知道它是由“结束进程”(而不是以任何其他方式)结束。

可能有更好的方法 – 但如何使用简单的标志?

当然,你必须在进程/程序的内存之外的地方坚持这个标志 – 就像注册表,数据库或文件系统一样。 从本质上讲,当应用程序启动时,当应用程序通过常规手段关闭时,将标志设置为“真”,将标志设置为“False”。

每次应用程序启动时,您都可以检查该标志,以确定在上次执行该标志时是否没有正确关闭标志。

使用OpenProcess打开进程的句柄,然后使用WaitForSingleObject之类的等待函数等待该句柄。 您可以使用GetExitCodeProcess获取进程的退出状态。 如果您需要程序在等待时保持对用户输入的响应,请确保在单独的线程上等待(或者可以使用零超时定期轮询,但请记住轮询的性能结果 – 不推荐)。

完成后,不要忘记调用CloseHandle 。 过程对象不会完全从操作系统中删除,直到其所有的句柄都关闭,所以如果忘记调用CloseHandle ,就会泄漏资源。

请注意,无法区分正常退出或强制终止的进程。 即使你有一个约定,你的程序只能以0(成功)或1(失败)的状态正常退出,其他一些进程可能会调用TerminateProcess(YourProcess, 1) ,这与普通的失败模式是无法区分的。

根据文档, ExitProcess使用DLL_PROCESS_DETACH调用所有加载的DLL的入口点,而TerminateProcess则不使用。 (退出主函数会导致对ExitProcess的调用,就像大多数未处理的异常一样) 。

您可能也想看看应用程序恢复和重新启动 。

一种选择可能是创建一个“看门狗”应用程序(可能安装为服务),该应用程序通过ManagementEventWatcher类(在System.Management命名空间中)监视用于停止进程的WMI事件。

您可以在一个时间间隔内查询您的流程死亡情况,或者提出一些事件驱动的方式来提醒您的流程死亡。

这里有一个例子 (它是用C#),可以让你开始。