又遇到一个很好玩的内核资源泄漏样本,分享一下。
某台WinXP sp3系统出现了死机现象,该现象是在安装了我的驱动后才出现的,第一反应是“MD,怎么又泄漏了”。
以下是分析过程:

!poolused的输出

0: kd> !poolused 2

Sorting by NonPaged Pool Consumed

           NonPaged                  Paged
Tag     Allocs         Used     Allocs         Used

tsni     62403     33947232          0            0	UNKNOWN pooltag 'tsni', please update pooltag.txt
FMvo     21652     21825376          0            0	FLT_VOLUME structure , Binary: fltmgr.sys
SBcx     10828     11780864          0            0	UNKNOWN pooltag 'SBcx', please update pooltag.txt
Devi     32861     10905648          0            0	Device objects 
FMis     10841      6503328          0            0	FLT_INSTANCE structure , Binary: fltmgr.sys
Drti     10844      5899136          0            0	UNKNOWN pooltag 'Drti', please update pooltag.txt
FMrr     21682      2425184          0            0	Per-processor Cache-aware rundown ref structure , Binary: fltmgr.sys
FMct     10841      2339864          0            0	TRACK_COMPLETION_NODES structure , Binary: fltmgr.sys
Tef2       220      2242016          0            0	UNKNOWN pooltag 'Tef2', please update pooltag.txt
WPSd       278      1677896          0            0	UNKNOWN pooltag 'WPSd', please update pooltag.txt
MmCm        30       963440          0            0	Calls made to MmAllocateContiguousMemory , Binary: nt!mm
Pp       10822       779184        287        33456	UNKNOWN pooltag 'Pp  ', please update pooltag.txt
DmaB        34       729088          0            0	UNKNOWN pooltag 'DmaB', please update pooltag.txt
Io       16786       693632        156         6480	general IO allocations , Binary: nt!io
Thre      1033       661120          0            0	Thread objects , Binary: nt!ps
File      3038       465648          0            0	File objects 
FMwi     10831       433240          0            0	Work item structures , Binary: fltmgr.sys
iAEC       183       361992          0            0	UNKNOWN pooltag 'iAEC', please update pooltag.txt
SEY4      2970       332752          0            0	UNKNOWN pooltag 'SEY4', please update pooltag.txt

可见fltmgr的卷相关资源占用特别严重(tag名以"FM"开头的几项,如"FMvo"和"FMi"等)
fltmgr.sys是微软的文件过滤驱动,一般可以排除由它导致资源泄漏的可能性。于是想到可能是基于fltmgr的minifilter驱动引起此故障。
于是继续列举系统中目前以存在的minifilter驱动。

!fltkd.filters的输出

0: kd> !fltkd.filters

Filter List: 8999805c "Frame 1" 
   FLT_FILTER: 897e5ba8 "SEyeFilter" "382020"
      FLT_INSTANCE: 89965510 "SEyeFilter - Top Instance" "382020"
      FLT_INSTANCE: 89964b50 "SEyeFilter - Top Instance" "382020"
   FLT_FILTER: 89e8be68 "SPBBCDrv" "365100"
      FLT_INSTANCE: 89987420 "SPBBCDrv" "365100"
      FLT_INSTANCE: 89984008 "SPBBCDrv" "365100"
   FLT_FILTER: 89e4aba8 "eeCtrl" "329010"
      FLT_INSTANCE: 89ec5c28 "eeCtrl" "329010"
      FLT_INSTANCE: 899ba008 "eeCtrl" "329010"
   FLT_FILTER: 89ab9568 "SRTSP" "329000"
      FLT_INSTANCE: 89981de0 "SRTSP" "329000"
      FLT_INSTANCE: 89982270 "SRTSP" "329000"
      FLT_INSTANCE: 896dd780 "SRTSP" "329000"
      FLT_INSTANCE: 896be9d8 "SRTSP" "329000"
   FLT_FILTER: 893e0e30 "vfsmfd" "263410"
      FLT_INSTANCE: 893f6008 "VEAI" "263400"
      FLT_INSTANCE: 89649008 "VEAI" "263400"
      FLT_INSTANCE: 895ee008 "VEAI" "263400"
      FLT_INSTANCE: 895f0008 "VEAI" "263400"
      FLT_INSTANCE: 893f67c0 "Default" "263410"
   FLT_FILTER: 8971bb58 "WavxDMgr" "145300"
      FLT_INSTANCE: 89cf58b0 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 8997b400 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 896de608 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 896d7998 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 89230cf0 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 87018878 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 870076a8 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 87018b30 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 870032d0 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 8700e970 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 87003008 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 87003580 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 86fffdb0 "WavxDMgr Instance" "145300"
      FLT_INSTANCE: 86ff02d0 "WavxDMgr Instance" "145300"
      ... 省略若干重复输出

发现WavxDmgr这个minifilter对卷设备进行了上万次的挂载(有上万条“FLT_INSTANCE: XXXXXXXX “WavxDMgr Instance” “145300””),
因此占用了大量的Nonpaged Pool资源。有理由猜测某种操作触发了WavxDmgr的BUG,导致它疯狂的进行挂载操作,最终导致系统资源耗尽而死机。

以“WavxDmgr”为关键字搜索,可以找到这么一篇文章:Novell ZENworks 11 SP2

其中有一段相关的说明:

2.6.3 数据加密与 Tablet PC 上的 Dell ControlPoint Security Manager 不兼容
如果将数据加密策略应用到使用 Dell ControlPoint Security Manager 的 Tablet PC,设备将无法重引导到操作系统。
此问题是因 Dell ControlPoint Security Manager 驱动程序 (WavxDMgr.sys) 过渡使用文件系统堆栈所致。对于任何使用名称解析且晚于该安全管理器驱动程序装载的文件系统过滤器驱动程序,都可能会发生同样的结果。

而我的驱动正好符合“使用名称解析且晚于该安全管理器驱动程序装载的文件系统过滤器驱动程序”,于是触发了WavxDmgr的资源泄漏BUG。

验证

0: kd> !for_each_module s -a @#Base @#End "tsni"
a7e0f300  74 73 6e 69 14 02 00 00-68 c9 54 80 50 c9 54 80  tsni....h.T.P.T.
a7e10ba3  74 73 6e 69 68 14 02 00-00 53 53 53 68 e0 f2 e0  tsnih....SSSh...

0: kd> lm a a7e0f300
start    end        module name
a7ddb000 a7e14180   WavxDMgr   (deferred)             

0: kd> lm a a7e10ba3
start    end        module name
a7ddb000 a7e14180   WavxDMgr   (deferred)             

0: kd> !for_each_module s -a @#Base @#End "SBcx"
a7e0e114  53 42 63 78 00 00 00 00-00 00 00 00 00 00 00 00  SBcx............

0: kd> lm a a7e0e114
start    end        module name
a7ddb000 a7e14180   WavxDMgr   (deferred)             

0: kd> !for_each_module s -a @#Base @#End "Drti"
a7dde5ad  44 72 74 69 68 18 02 00-00 6a 00 ff 15 e8 df e0  Drtih....j......

0: kd> lm a a7dde5ad
start    end        module name
a7ddb000 a7e14180   WavxDMgr   (deferred)             

就是这厮!