进程关闭时,什么情况下不会回收句柄?

dengsf 2011-09-28 12:37:43
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是其他同事写的,初步浏览过未发现有奇技淫巧,但未全局细读过。

没辙了,请问各位是否遇到过类似情况,求指点。或是有相关资料可供参考?先谢谢!
...全文
274 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengsf 2011-09-28
  • 打赏
  • 举报
回复
补充:
NtQueryValue写错了,应为NtQueryObject。
dengsf 2011-09-28
  • 打赏
  • 举报
回复
确实是插件dll没退出。
真奇怪,explorer.exe已设为“多进程”、“尽快unload插件”。正常测试时,关掉文件夹窗口(debug时打开)dll就退出,但异常时偶然会unload。。。看来注册表设置只是建议。
非常感谢 2 楼!
cczlp 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 dengsf 的回复:]
因可以修改其文件名;若仍运行中是不能改的[/Quote] 如果运行中的文件不被锁定, 是可以改名的.你先确认是否真的退出了,看看进程.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧