进程关闭时,什么情况下不会回收句柄?
win32下,进程退出时,无论是正常退出、异常退出、强制中止,内核对象应该都得到释放(减少其引用计数),如通过CreateMutex、CreateFile、CreateFileMapping等建立的对象都是如此。但最近发现一些问题,涉及到全局命名的 Mutex、FileMapping, 似乎强制中止时引用计数不会减少。但问题是并非每次都发生,只有大概50%几率会这样。
具体情况如下:
- 一个shell扩展dll、一个exe程序,它们通过全局约定名字的Mutex、FileMapping(各一个)来通信。
- 但那个exe有bug,有时通信中会崩溃,然后系统弹框报错并询问是否中止。
- dll是用SendMessage等待exe回复后再继续的,exe中止后dll“正常”退出,但此时Mutex、FileMapping的引用计数“有时”不会减少。经查是exe中止时引用计数未减少。
- exe/dll确实已退出,因可以修改其文件名;若仍运行中是不能改的。
- mutex/filemapping的引用计数,是用另外的程序通过隐藏api NtQueryValue来查询的,正常时为1(因本程序打开时也占用1),但在出问题后为2,表明之前某个进程中止时没有释放。
- 另外用简单的exe和该shell插件通信,不论如何中止该exe、dll,引用计数都能减少。exe是其他同事写的,初步浏览过未发现有奇技淫巧,但未全局细读过。
没辙了,请问各位是否遇到过类似情况,求指点。或是有相关资料可供参考?先谢谢!