Windows IFS:自己的文件系统 VS notepad.exe

Windows IFS: own filesystem VS notepad.exe

Windows 10 x64 - 实现了自己的文件系统,通常的目录遍历、复制、读取、删除文件在 DOS、git bash 和资源管理器中工作。

但无法读取 notepad.exe!

中的文件

我的文件系统驱动器 E: 上有一个名为 "a.file.txt" 的 "hello world" 文本文件,如果我尝试使用 "notepad.exe E:\a.file.txt" 在记事本中读取它,我会收到错误消息: “%1 不是有效的 Win32 应用程序”。 但是,"copy E:\a.file.txt C:\a.file.txt ; notepad.exe C:\a.file.txt" 工作得很好。 wordpad.exe 也可以正常工作。

自从我打印了所有 IRP 之后,就没有太多可能出错的地方了(我希望如此)。特别是,运行ning notepad.exe 它只经过少量查询。我跳过了 CLEANUPCLOSE,因为我所做的只是 return STATUS_SUCCESSInformation=0.

IRP_MJ_CREATE: FileObject FFFFC686327AAB20 name '\' flags 0x0
dispatcher: exit: 0x0 OK Information 0x1
query_directory_FileFullDirectoryInformation: starting Search pattern 'a.file.txt' type 3 Index 0, Restart 0, Single 1
comparing names 'a.file.txt' == 'a.file.txt'
dispatcher: exit: 0x0 OK Information 0x78
IRP_MJ_CREATE: FileObject FFFFC68632887080 name '\a.file.txt' flags 0x0
dispatcher: exit: 0x0 OK Information 0x1
fsDispatcher: enter: major 10: minor 0: IRP_MJ_QUERY_VOLUME_INFORMATION
query_volume_information: FileFsVolumeInformation
dispatcher: exit: 0x80000005 Overflow Information 0x18
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION
query_information: FileAllInformation
   file_basic_information
   file_standard_information
   file_position_information
   * query_information: FileNameInformation
   file_name_information: remaining space 8 str.len 20 struct size 8
* file_name_information: partial name of "a"
dispatcher: exit: 0x80000005 Overflow Information 0x68
IRP_MJ_CREATE: FileObject FFFFC68631BD6BB0 name '\a.file.txt' flags 0x0
dispatcher: exit: 0x0 OK Information 0x1
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION
* query_information: FileNetworkOpenInformation
dispatcher: exit: 0x0 OK Information 0x38
fsDispatcher: enter: major 18: minor 0: IRP_MJ_CLEANUP
dispatcher: exit: 0x0 OK Information 0x0
fsDispatcher: enter: major 2: minor 0: IRP_MJ_CLOSE
dispatcher: exit: 0x0 OK Information 0x0
IRP_MJ_CREATE: FileObject FFFFC68631AD39D0 name '\' flags 0x0
dispatcher: exit: 0x0 OK Information 0x1
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION
query_information: FileNameInformation
* file_name_information: name of \
dispatcher: exit: 0x0 OK Information 0xa
fsDispatcher: enter: major 10: minor 0: IRP_MJ_QUERY_VOLUME_INFORMATION
* query_volume_information: FileFsVolumeInformation
dispatcher: exit: 0x0 OK Information 0x20
fsDispatcher: enter: major 10: minor 0: IRP_MJ_QUERY_VOLUME_INFORMATION
query_volume_information: FileFsAttributeInformation
dispatcher: exit: 0x0 OK Information 0x18
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION fsDeviceObject
query_information: FileBasicInformation
dispatcher: exit: 0x0 OK Information 0x28

现在,我相信我在FileFsVolumeInformationFileAllInformation中returning OVERFLOW是正确的,但我仍然填写了所有信息,只是t运行分别设置卷名和文件名。

至于我 return,我将 Attributes 设置为 FILE_ATTRIBUTE_DIRECTORYFILE_ATTRIBUTE_NORMAL - 没有别的。在 FileBasic/FileAll 和 DirectoryListing 中。如果这是错误的,bash 会将所有内容显示为字符设备,所以我知道它现在已设置,因为它们是常规文件或目录。

可能相关的是,如果我将 notepad.exe 复制到 E: 我不能 运行 它 "This app can't run on this PC" 或 bash "Exec format error"。所以就好像我 return 输入了错误的文件类型。但它只调用了 3 个函数,并且只有 FileAttributes 相关(和 FileStandard 的 Directory boolean)。

我现在已经多次重写 OVERFLOW 逻辑,但我相信将 fileNameLength 设置为适合名称所需的总长度是正确的,即使它没有'都适合,但信息字段是总大小 returned(绝不会大于输入大小)?

notepad.exe需要什么样的牺牲才能奏效!?

因此,notepad.exe 值得注意,因为它使用内存映射文件来读取文件,而 mmap 文件在我的文件系统中不起作用。我使用 zezula.net 中的 TestFile 发现它不工作。为了使 mmap 工作,我必须在 IRP_MJ_CREATE 中分配 FileObject->SectionObjectPointer = &vp->SectionObjectPointers。大多数情况下,这存储在您的 Fcb 中(如 FileObject->fscontext 中),并且仅定义为 SECTION_OBJECT_POINTERS SectionObjectPointers;.

还需要注意根据 fastfat 样本来源刷新 IRP_MJ_CLEANUP 中的 mmap 页面。

还相关的是设置调用 FsRtlRegisterFileSystemFilterCallbacks(),您希望在其中至少定义 PreAcquireForSectionSynchronization 回调来处理部分的锁。也在 fastfat 来源中。