开发过程中,我习惯会一直开着verifier进行测试,绝大部分非逻辑错误都能被揪出来。
这两天测试部的同事反馈说貌似驱动有资源泄漏,我第一反应是“不会吧,有资源泄漏verifer早崩了”。
测试了一下,发现还真是驱动嫌疑最大,于是开启verifer和压力测试工具,跑了一会,停掉驱动。发现没有bsod,一脑子不理解。
看了下驱动停止后,内核内存情况:
0: kd> !poolused 7
Sorting by NonPaged Pool Consumed
Pool Used:
NonPaged Paged
Tag Allocs Frees Diff Used * Allocs Frees Diff Used
Proc 12980 1 12979 8618056 * 0 0 0 0 Process objects , Binary: nt!ps
LSwi 1 0 1 2576384 * 0 0 0 0 initial work context
SePa 955604 942626 12978 2247904 * 17 16 1 16 Process audit image names and captured polity structures , Binary: nt!se
TCPt 47617 47580 37 1423848 * 1 1 0 0 TCP/IP network protocol , Binary: TCP
SeTd 372125 359104 13021 833344 * 372125 359104 13021 1145088 Security Token dynamic part , Binary: nt!se
.... 省略若干不相干信息
SEY6 0 0 0 0 * 1 1 0 0 UNKNOWN pooltag 'SEY6', please update pooltag.txt
SEYC 1448369 1448369 0 0 * 0 0 0 0 UNKNOWN pooltag 'SEYC', please update pooltag.txt
SEYB 0 0 0 0 * 47738 47738 0 0 UNKNOWN pooltag 'SEYB', please update pooltag.txt
SEY5 0 0 0 0 * 1 1 0 0 UNKNOWN pooltag 'SEY5', please update pooltag.txt
SEYA 46294 46294 0 0 * 0 0 0 0 UNKNOWN pooltag 'SEYA', please update pooltag.txt
SEY4 1186033 1186033 0 0 * 0 0 0 0 UNKNOWN pooltag 'SEY4', please update pooltag.txt
SEY3 1 1 0 0 * 1 1 0 0 UNKNOWN pooltag 'SEY3', please update pooltag.txt
SEY9 0 0 0 0 * 47008 47008 0 0 UNKNOWN pooltag 'SEY9', please update pooltag.txt
SEY2 0 0 0 0 * 1 1 0 0 UNKNOWN pooltag 'SEY2', please update pooltag.txt
SEY1 0 0 0 0 * 54507 54507 0 0 UNKNOWN pooltag 'SEY1', please update pooltag.txt
SEYD 1419958 1419958 0 0 * 0 0 0 0 UNKNOWN pooltag 'SEYD', please update pooltag.txt
.... 省略若干不相干信息
TOTAL 79306657 79234060 72597 22806272 38472704 38412253 60451 29841272
其中SEY?就是我的驱动使用的tag,发现没有泄漏,更一头雾水了。最后瞅到第一行,nnd,‘Proc’这个tag明显有问题,基本没释放。
检查了一下代码,发现之前从网上摘的一段获取进程路径的函数,里面的错误结束分支没有释放EPREOCESS和句柄……
赶紧改掉了,这个bug存在了好多年啊,横跨我的几个驱动,之前从osr上摘下来的时候只是稍微调整了一下功能,没有再仔细审查……
警钟警钟~
有从我那篇《驱动中获取进程完整路径名》(@TODO)里拷代码的朋友也赶紧更新吧,对不住大伙~
几点体会:
- 别偷懒。不是自己写的代码更要仔细检查,哪怕出自osr这种权威级论坛。
- verifer不是万能的(至少在win2k3之前的版本),别偷懒。
- 别偷懒。