我有一个文件过滤器驱动程序,它应该在特定情况下禁止文件/目录访问。
我正在使用IoRegisterFsRegistrationChange
来获取有关文件系统更改的通知,并附加到相应的卷设备对象。
它通常是一个传递过滤器。它唯一处理的是IRP_MJ_CREATE
(实际上不允许某些类型的文件/目录访问)。所有其他IRP
和快速I / O请求都只是传递给底层设备。
除了一件事之外,它还可以。如果在系统启动期间加载驱动程序(SERVICE_SYSTEM_START
) - 因为我不太明白系统页面文件被禁用。用户登录后,会显示“性能选项”弹出对话框。虚拟内存分页文件被禁用(这是触发此对话框弹出IMHO的原因)。
如果驱动程序在稍后阶段动态加载 - 没有明显的问题,一切正常。
我尝试禁用IRP_MJ_CREATE
的处理(只是像所有其他请求一样传递它),但没有任何变化。
据我所知,如果没有看到代码,通常很难说问题出在哪里。但无论如何,这是一个众所周知的问题吗?我该怎么检查?这是不以正确方式传递某些请求的症状,或者将设备对象附加到卷设备对象的偶然事实可能会导致这样的问题吗?
欢迎所有可能的想法。提前谢谢。
答案 0 :(得分:1)
找到问题的原因。问题既不是处理快速I / O请求,也不是我的设备如何连接到目标设备。
发现后,最终我没有在驱动程序调度表中包含一个I / O调度处理程序。也就是说,我的代码是:
for (UINT i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
pDriverObject->MajorFunction[i] = Dispatch;
它应该是:
for (UINT i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
pDriverObject->MajorFunction[i] = Dispatch;
我错过的功能是IRP_MJ_PNP
- 即插即用管理器请求处理程序。这是文件系统驱动程序所必需的。修复代码后,问题就消失了。
感谢所有担心的人:)