`

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 文件中设置有误,马上查看,确实是。改之,问题解决。

  

分享到:
评论

相关推荐

    vc++ 文件监视 2个api实现

    4. **错误处理**:API调用可能会失败,需要处理各种可能的错误情况,例如权限不足、路径不存在、磁盘满等。 5. **安全考虑**:文件监视可能导致敏感信息暴露,因此在设计时应考虑隐私和安全性,仅监听需要关心的...

    微软微过滤器MiniFilter的源码

    这通常通过调用`FltRegisterFilter`完成。同样,当不再需要过滤器时,应通过`FltUnregisterFilter`卸载。 2. **实例和卷**: MiniFilter可以附加到卷(存储设备)上,形成实例。每个实例都有自己的配置和回调函数,...

    miniFilter(所有框架代码以及对应的PPT资料,可以直接拿来进行修改即可完成各种驱动)

    这涉及到DriverEntry函数,其中会调用FltRegisterFilter来注册MiniFilter,并设置回调函数。卸载时,需调用FltUnregisterFilter。 2. **实例化与去实例化**:当一个卷或目录被打开时,MiniFilter将创建一个实例数据...

    minifilter_内核通信_DEMO_minifilter_

    这些函数会在对应的文件操作发生时被调用,允许我们在内核模式下对操作进行处理或修改。 6. **同步与异步操作**:内核与用户层通信时,需要处理同步和异步操作的问题,以避免阻塞或数据一致性问题。例如,使用I/O...

    MiniFilter 驱动开发的例子 2

    每个MiniFilter可以注册回调函数,这些函数会在特定的文件系统事件发生时被调用,如创建、打开、读取、写入、关闭文件等。 2. **注册Filter**:在开发过程中,首先需要编写注册函数,使MiniFilter在系统启动时加载...

    miniFilter自带的例子,跟微软的一样

    这个技术允许开发者创建驱动程序,这些驱动程序能够在文件系统操作(如读取、写入、创建、删除等)发生时进行拦截和处理。通过这种方式,miniFilter驱动可以实现高级的数据保护、备份、加密、日志记录等功能。 标题...

    minifilter_vs2019minifilter_vs2019minifilter_minifilter_minifilt

    Minifilter驱动是Windows操作系统内核层的一部分,用于文件系统过滤,它允许开发者在文件系统操作(如读取、写入、创建、删除等)发生时进行拦截和处理。 描述中的"vs2019的minifilter的初始化代码"指出我们将深入...

    MiniFilterDriver:简单的minifilter驱动程序

    4. **注册驱动程序**:通过`FltRegisterFilter`函数注册MiniFilter驱动,并提供回调函数的地址,让系统知道何时调用它们。 5. **安装和卸载**:使用`FltLoadFilter`和`FltUnregisterFilter`等函数来安装和卸载驱动...

Global site tag (gtag.js) - Google Analytics