当前位置: 代码迷 >> GIS >> FltRegisterFilter 调用失败的处置
  详细解决方案

FltRegisterFilter 调用失败的处置

热度:363   发布时间:2016-05-05 06:29:28.0
FltRegisterFilter 调用失败的处理

??FltRegisterFilter调用失败的处理

?今天准备调试昨天的一个mini?filter的时候,突然系统蓝屏了,感觉很奇怪,因为在以前是没有问题,而且这几天也没有改过代码,怎么突然有问题了呢?于是启动windDBG进行调试。

?

一?调试??

DriverEntry里下了断点,运行到FltRegisterFilter时,返回值status给出了错误,是一个负数,但是这个数值是十进制的,显示的格式是On-1*********。不知道这样格式的数据代表什么样的错误。

???在WDK的文档中,我查了一下,FltRegisterFilter的返回值错误有如下的:

1.STATUS_INSUFFICIENT_RESOURCES?

内存分配失败

2.?STATUS_INVALID_PARAMETER?

有两种情况,一个是传入的第二个参数中的Version没有设置成FLT_REGISTRATION_VERSION,一个是传入的第二个参数中的命名提供者函数是一个非法的非NULL值。

????3.?STATUS_FLT_NOT_INITIALIZED?

Filter管理器还没有初始化就调用注册函数。需要确保filter管理器已经作为一个驱动启动了。

?

二?获取返回值

???由于在调试器中返回值是比较奇怪的格式:On-1*********。把后边的数当作十进制的数换算成16进制的,没有找到这个错误。在ntstatus.h中我找到了STATUS_FLT_NOT_INITIALIZED的值,定义是:

#define?STATUS_FLT_NOT_INITIALIZED???????((NTSTATUS)0xC01C0007L)

WDK文档中说过的其他值也找到了定义,但就是没有办法找到调试中返回的这个status值。

??既然在WinDBG中是显示成十进制的,那么联系到Visual?Studiao可以让变量按照16进制方式显示,是不是也可以让WinDBG显示16进制格式的值?我查了一下WinDBG的文档,介绍了n可以用来设置。但是试了一下发现没有效果,返回的status值还是那样的格式,没有变化。

??这样的办法不行,又想了一个办法:看内存。把status的内存显示出来,那么就能获取返回值的16进制表示。于是在WinDBG的帮助文件中查了一下d的用法,感觉dyd符合我的要求,显示了一下status,出来一个二进制的显示列表。粗看一下,没有搞明白。接着用dd,终于露出了status的庐山真面目,是C0000034

?

三?理解返回的错误值

??在知道了错误返回值后,终于找到了它的定义:

#define?STATUS_OBJECT_NAME_NOT_FOUND?????((NTSTATUS)0xC0000034L)

??不过这个返回值如果表示对象的名字没有发现,那么还是很令人很困惑的,因为在这里没有涉及到什么对象,不明白返回值里说的对象是指哪个对象。立即上Google搜索了一把,嘿嘿,出来了,有个人在邮件列表中问到了跟我现在一模一样的问题,后边有人回答他了,说是minifilter装载的时候,默认实例的名字设置不对,没有找到

??难道是我修改的filter的安装inf文件中设置有误,马上查看,确实是。改之,问题解决。

??