我正在研究一个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
,则记事本会返回无法找到该文件的错误。
答案 0 :(得分:0)
按照@MJZ的建议,我对着记事本运行了ProcessMonitor,以同时在文件系统内部和外部打开文件。区别在于,在工作案例中,发出了IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
。没有向我的驾驶员发出此类IRP。事实证明,打开/创建文件时,我没有设置/初始化文件对象的SectionObjectPointer
。