minifilter可以替换文件系统的一部分吗?

时间:2018-06-07 15:06:03

标签: windows filesystems driver minifilter

我正在研究一个minifilter驱动程序,它“安装”在现有树中的指定目录下,例如c:\users\user\mymountpoint,并且从那一点开始替换所有“设备”的内容,其安装方式与在Linux工作下安装的方式大致相同。当微过滤器处于活动状态时,现有的基础文件/文件系统基本上被阻止/不可访问。

这一切都正常,直到我尝试运行可执行文件或打开一个文本文件(使用记事本)。在可执行文件的情况下,Windows给了我一个弹出窗口,告诉我“这个应用程序无法在你的PC上运行”而不试图从文件中读取(虽然它确实尝试从file.exe:Zone.Identifier读取,这不是' t present)。如果我尝试从Git Bash执行,它会读取该文件但是由于“Exec格式错误”而无法执行该文件。

对于文本文件,我得到“%1不是有效的Win32应用程序”,同时尝试打开Zone.Identifier元数据。但是我可以在DOS提示符下type file.txt,内容显示正常。

在这两种情况下,使用Git Bash提示符,我可以md5sum文件,并且内容与驱动器本身上的相同文件匹配。

我是否需要做一些事情来通知Windows这部分文件系统不是NTFS?目录或文件中是否有某些属性我没有返回以指示文件的某些内容?

ETA:根据@ MJZ的建议,我使用Process Monitor监控运行notepad.exe c:\path\to\mymountpoint\file.txt时的活动。

记事本执行以下操作:   - 打开包含目录
  - 该文件的文件列表是否有问题   - 关闭目录
  - 打开文件
  - 查询卷信息
  - 从文件中查询“AllInformation” (记事本在此请求中没有为文件名提供足够的空间。驱动程序填写可用空间并返回STATUS_BUFFER_OVERFLOW和所需大小
  - 关闭文件

此时我得到上述“%1”错误。如果我将AllInformation查询的返回值更改为STATUS_BUFFER_TOO_SMALL,则记事本会返回无法找到该文件的错误。

1 个答案:

答案 0 :(得分:0)

按照@MJZ的建议,我对着记事本运行了ProcessMonitor,以同时在文件系统内部和外部打开文件。区别在于,在工作案例中,发出了IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION。没有向我的驾驶员发出此类IRP。事实证明,打开/创建文件时,我没有设置/初始化文件对象的SectionObjectPointer