Windows如何终止进程?

时间:2015-06-18 11:17:24

标签: windows winapi process win32-process windows-kernel

我正在开发一个应用程序,它应该在进程终止之前运行代码。我可以写一个内核模块来实现这一点。但我应该参与哪些功能?

要获得有关终止流程的通知我正在这样做。

HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 1234);
DWORD wait = WaitForSingleObject(handle, INFINITE);
// Some block of code here that does the business logic.
handleProcessTermination();

我的问题是在我的函数handleProcessTermination()完​​成之前退出目标进程。我想要一种方法来停止流程的退出并运行我的逻辑。

2 个答案:

答案 0 :(得分:0)

我认为没有办法推迟终止流程。即使停止该进程的所有线程也无济于事,因为进程的终止是由内核完成的。

由于我自己的经验,我假设Windows在进程终止时执行以下操作:

  1. 标记要终止的流程
  2. 终止流程的所有主题
  3. 清理(可用内存,释放句柄,......)
  4. 终止流程
  5. 完成第1步后,由于调度程序不会激活该进程的任何线程,因此该进程注定失败。激活其中一个线程可能会导致它们发生狂暴,因为进程处于部分破坏状态(例如内存可能被释放,句柄被破坏,......),这可能会造成严重的麻烦!

    我不认为有可能在没有内核部分的情况下改变这种行为。

    旁注:如果在WaitForSingleObject(thread, ...)之前发出WaitForSingleObject(process, ...)信号,那将是一件有趣的事情。

答案 1 :(得分:0)

您应该能够创建一个调用PsSetCreateProcessNotifyRoutineEx的内核驱动程序,以便在进程开始/结束时创建回调例程。您的回调将被调用“就在退出进程的最后一个线程被销毁之前。”

这将不允许您永久“停止”进程终止,但允许您在进程结束之前注入一些代码。