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
文件中设置有误,马上查看,确实是。改之,问题解决。
分享到:
相关推荐
4. **错误处理**:API调用可能会失败,需要处理各种可能的错误情况,例如权限不足、路径不存在、磁盘满等。 5. **安全考虑**:文件监视可能导致敏感信息暴露,因此在设计时应考虑隐私和安全性,仅监听需要关心的...
这通常通过调用`FltRegisterFilter`完成。同样,当不再需要过滤器时,应通过`FltUnregisterFilter`卸载。 2. **实例和卷**: MiniFilter可以附加到卷(存储设备)上,形成实例。每个实例都有自己的配置和回调函数,...
这涉及到DriverEntry函数,其中会调用FltRegisterFilter来注册MiniFilter,并设置回调函数。卸载时,需调用FltUnregisterFilter。 2. **实例化与去实例化**:当一个卷或目录被打开时,MiniFilter将创建一个实例数据...
这些函数会在对应的文件操作发生时被调用,允许我们在内核模式下对操作进行处理或修改。 6. **同步与异步操作**:内核与用户层通信时,需要处理同步和异步操作的问题,以避免阻塞或数据一致性问题。例如,使用I/O...
每个MiniFilter可以注册回调函数,这些函数会在特定的文件系统事件发生时被调用,如创建、打开、读取、写入、关闭文件等。 2. **注册Filter**:在开发过程中,首先需要编写注册函数,使MiniFilter在系统启动时加载...
这个技术允许开发者创建驱动程序,这些驱动程序能够在文件系统操作(如读取、写入、创建、删除等)发生时进行拦截和处理。通过这种方式,miniFilter驱动可以实现高级的数据保护、备份、加密、日志记录等功能。 标题...
Minifilter驱动是Windows操作系统内核层的一部分,用于文件系统过滤,它允许开发者在文件系统操作(如读取、写入、创建、删除等)发生时进行拦截和处理。 描述中的"vs2019的minifilter的初始化代码"指出我们将深入...
4. **注册驱动程序**:通过`FltRegisterFilter`函数注册MiniFilter驱动,并提供回调函数的地址,让系统知道何时调用它们。 5. **安装和卸载**:使用`FltLoadFilter`和`FltUnregisterFilter`等函数来安装和卸载驱动...