【发布时间】:2018-06-07 15:06:03
【问题描述】:
我正在开发一个微型过滤器驱动程序,该驱动程序“安装”在现有树中的指定目录,例如c:\users\user\mymountpoint,并用安装在 Linux 下工作的任何“设备”的内容替换从那时起的所有内容。当微过滤器处于活动状态时,现有的底层文件/文件系统基本上被阻止/不可访问。
在我尝试运行可执行文件或打开文本文件(使用记事本)之前,这一切都很好。对于可执行文件,Windows 给我一个弹出窗口,告诉我“此应用程序无法在您的 PC 上运行”,而无需尝试从文件中读取(尽管它确实尝试从不存在的 file.exe:Zone.Identifier 中读取) )。如果我尝试从 Git Bash 执行,它会读取文件,但会说由于“执行格式错误”而无法执行。
在文本文件的情况下,我得到“%1 不是有效的 Win32 应用程序”,还试图打开 Zone.Identifier 元数据。但是我可以在 DOS 提示符下 type file.txt 并且内容显示正常。
在这两种情况下,使用 Git Bash 提示符,我可以md5sum 文件,并且内容与驱动器本身上的相同文件匹配。
我需要做些什么来通知 Windows 这部分文件系统不是 NTFS 吗?目录或文件上是否有一些我没有返回来指示文件的属性?
ETA:根据@MJZ 的建议,我在运行notepad.exe c:\path\to\mymountpoint\file.txt 时使用进程监视器来监控活动。
记事本执行以下操作:
- 打开包含目录
- 是否列出相关文件的文件列表
- 关闭目录
- 打开文件
- 查询卷信息
- 从文件中查询“AllInformation”
(记事本没有为该请求中的文件名提供足够的空间。驱动程序填充可用空间并返回STATUS_BUFFER_OVERFLOW和所需的大小
- 关闭文件
此时我收到上述“%1”错误。如果我将AllInformation查询的返回值改为STATUS_BUFFER_TOO_SMALL,记事本会返回找不到文件的错误。
【问题讨论】:
-
看到所有文件系统请求服务于从 CMD 或 POWERSHELL 启动可执行文件会很有趣。见docs.microsoft.com/en-us/sysinternals/downloads/procmon
-
您还应该尝试 SUBST Z: c:\users\user\mymountpoint 并尝试从“新”驱动器 Z 启动可执行文件。您还应该使用 procmon 查看发出了哪些文件系统请求在那里。
-
SUBST 的事情是看看 Explorer/ProcessCreate 是否在从 C:\ 而不是 C:\users\user\mymountpoint\executable.exe 获取卷信息方面做了一些愚蠢的事情
-
从进程监视器收集的信息已添加到问题中。
-
我认为您需要做的是弄清楚您要模拟的文件系统(例如 ExFat/FAT32 或 NTFS)。从目标文件系统运行记事本(不要给它一个文件名,直接启动它)并查看报告的内容。您需要深入了解传入的参数和返回的结果的>详细信息
标签: windows filesystems driver minifilter