2015-06-18 112 views
-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()完​​成之前退出目标进程。我想要一种方法来阻止流程退出并运行我的逻辑。

+0

到目前为止,我可以通过等待进程句柄来获得通知,但是我想停止目标进程的执行(停止进程的退出),直到我运行我的代码片段,然后让该进程执行。 –

+0

你可以添加你的代码吗,你到目前为止?并描述你想要达到的目标?这个过程和一个代码不是很清楚。 –

+0

如果你的意思是你想要一个被强制终止的进程(通过TerminateProcess)在终止之前运行代码,那是不可能的。 –

回答

0

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

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

0

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

由于我自己的经验,我认为Windows不会以下的进程终止:

  1. 马克过程将被终止
  2. 终止进程
  3. 清理的所有线程(空闲内存,释放手柄,...)
  4. 终止进程

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

我不认为有可能改变那个行为,而不改变内核的一部分。

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