-2

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

4

2 回答 2

0

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

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

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

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

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

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

于 2015-06-18T12:39:39.317 回答
0

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

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

于 2015-07-01T15:30:52.527 回答