windows 如何终止进程?

How does windows terminate processes?

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

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

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

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

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

我不认为有可能在不更改内核部分的情况下更改该行为。

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

您应该能够创建一个内核驱动程序来调用 PsSetCreateProcessNotifyRoutineEx 来为进程 start/end 创建一个回调例程。您的回调将被称为 "just before the last thread to exit the process is destroyed."

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