其他
一引言前段时间因有需要我必须摘除一个MiniFilter的回调,了解的人都知道FltUnregisterFilter是移除MiniFilter的API,但是MSDN强调过这个API只能模块自身使用,于是当我尝试拿他去对我的目标驱动手时,代码进入FltUnregisterFilter后就一去不返了。二一篇启发性文章在看雪上拜读到这篇文章(https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458474374&idx=2&sn=f9d7aa29896869bc9a748d7bdfd61426&chksm=b18e670c86f9ee1a5228821364bcc870767ca4bad19dceee879794e5b82d4e70562e644047c7&scene=27),文中定位了阻塞的原因:进入FltUnregisterFilter后,ExWaitForRundownProtectionRelease会检查filter对象的引用计数,按照MSDN的解释,如果不为0那么就会阻塞。作者的实验场景中此时引用计数为2,那么一定也就阻塞了。作者再观察使用PCHunter来摘除MiniFilter的过程,发现在进入ExWaitForRundownProtectionRelease之前这个filter对象的引用计数已经变为了0,于是他猜测PCHunter使用APIExReleaseRundownProtection来减少了引用计数。因此他也在自己驱动中在调用FltUnregisterFilter之前添加执行了ExReleaseRundownProtection,然后成功了。三有没有问题我使用作者这个方法在一个环境下测试成功了,但是换了一个环境后并没成功,原因是要摘除的filter的引用计数在ExWaitForRundownProtectionRelease之前并不能到达0:执行ExReleaseRundownProtection后进入FltUnregisterFilter之时引用计数值为0x7623:执行到ExWaitForRundownProtectionRelease之时这个引用计数值还剩0x6:接着进入ExWaitForRundownProtectionRelease就再次一去不返了。四寻找一个真正的解决方法所以我需要调多次ExReleaseRundownProtection吗?如果是多次那么到底应该调几次才是恰当的?我尝试寻找一个真正的具有通用性的解决办法:我尝试连续调用ExReleaseRundownProtection,发现每次这个引用计数都会减少2:所以如果我循环“引用计数/2”次是不是就能清零了?如下:UINT64