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 管理器已经作为一个驱动启动了。

扫描二维码关注公众号,回复: 1379012 查看本文章

 

二 获取返回值

   由于在调试器中返回值是比较奇怪的格式: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 文件中设置有误,马上查看,确实是。改之,问题解决。

  

猜你喜欢

转载自luck-donkey.iteye.com/blog/992949