【问题标题】:How does windows terminate processes?windows如何终止进程?
【发布时间】:2015-06-18 11:17:23
【问题描述】:

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

为了获得有关进程终止的通知,我正在这样做。

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() 完成之前退出。我想要一种方法来停止进程的退出并运行我的逻辑。

【问题讨论】:

  • 到目前为止,我可以通过等待进程句柄来获得通知,但我想停止目标进程的执行(停止进程的退出),直到我运行我的代码然后让进程执行.
  • 你能添加你的代码吗,你有吗?并描述你想要达到的目标?流程和代码不是很清楚。
  • 如果你的意思是你想让一个被强制终止的进程(通过 TerminateProcess)在它被终止之前运行代码,那是不可能的。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    根据我自己的经验,我假设 windows 在进程终止时执行以下操作:

    1. 标记要终止的进程
    2. 终止进程的所有线程
    3. 清理(释放内存、释放句柄……)
    4. 终止进程

    一旦第 1 步完成,该进程就注定失败,因为调度程序不会激活该进程的任何线程。激活其中一个线程可能会导致它们发疯,因为该进程处于部分破坏状态(例如,内存可能被释放,句柄被破坏,...),这可能会导致严重的麻烦!

    我认为不改变内核部分就不可能改变这种行为。

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

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2011-07-10
      • 2010-11-26
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2019-08-01
      • 2011-04-02
      相关资源
      最近更新 更多