Lu Lin All Real Tech(1) 12 Apr 99 23:18:51 REAL TECH(1) DEAD PROCESS DETECTION 作者:陆麟 欢迎盗版,请注明作者 本文讨论一些真正的技巧上的问题. 这次提出的是一个有关DLL的问题. 问题的产生: 当一个进程开始,所有需要的DLL会被加载.或许在PE LOADER装载后,PROCESS开始前,或 在程序运行中.当然,被加载的DLL会收到一个DLL_PROCESS_ATTACH的消息.然后开始DLL 的初始化.当一个进程终止,DLL会收到DLL_PROCESS_DETACH消息,然后进行部分清理操作. 现在问题出现了.只有当进程是正常退出时DLL才会收到DLL_PROCESS_DETACH消息.当一 个进程进入死循环.被用户在TASK MANAGER里终止时,DLL根本就没机会收到 DLL_PROCESS_DETACH消息.那么就意味着DLL无法进行扫尾工作. 错误的解决方法: 有个程序员尝试在DLL里加入一段代码.用WaitSingalObject(hprocess,INFINITY)来监 测PROCESS的运行.看起来是个好方法.因为如果PROCESS被终止,那么该代码以后的代码 将会被执行.从而进行扫尾工作.但是事实上该段代码永远也不会被执行.因为DLL里的 代码属于进程.当进程被非正常终止,所有与进程相关的资源都将被释放.当然包括该段 DLL的进程和线程CONTEXT,该段代码永远也不会拥有CPU时间片. 正确的解决方法: 一种可行的方法是写个PROCESS监测进程.因为我们需要个独立于被监测进程的进程.使 得被监测进程的任何行为都不能影响到监测进程.这样,监测进程才真正有效.具体的写 作将涉及更多的技巧,而且根据不同的需要应该有不同的写法.所以空写是没有意义的. 我就不写了. 注意: 并非所有的DLL都需要这样的处理技巧.因为WIN32 OS在一个进程终止时会清除所有的资 源.无论进程是正常还是非正常终止.采用上述技巧的一个唯一的原因是非正常终止进程 后DLL因没有收到DLL_PROCESS_DETACH消息可能会造成数据丢失.所以监测进程必须完成 DLL_PROCESS_DETACH相同的数据维护功能.在其他条件下,监测进程没有存在的必要. 本来本文是在MSN的NEWS GROUP上看到一个程序员的提问才想写的.但是等本文写完,MSN 上已经有了答案.我也就不必多罗嗦了.贴到这里来给CFIDO润润色. ... 看了我的信可是大补啊!:).陆麟 --- 蓝波95 v2.54 [NR] * Origin: SHANG HAI WILL UNIVERSITY BBS(57956523) (6:654/1007)