Windows IFS:自己的文件系统与Notepad.exe



Windows 10 x64-实现了自己的文件系统,通常的目录遍历,复制,阅读,删除文件在DOS,git bash和explorer中工作。

,但无法在Notepad.exe!

中读取文件

我在文件系统驱动器e::::::::::::::::::::::::::::::::;"我遇到了错误:"%1不是有效的Win32应用程序"。但是,"复制e: a.file.txt c: a.file.txt; Notepad.exe C: a.file.txt"工作正常。wordpad.exe也可以正常工作。

由于我打印了所有 irps都来了,所以可能出了什么问题的范围(我希望(。特别是,运行notepad.exe它只会经过一些查询。我跳过了CLEANUPCLOSE,因为我所做的就是返回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中返回OVERFLOW是正确的,但是我仍然填写所有信息,分别截断了体积和文件名。

至于我返回的内容,我将Attributes设置为FILE_ATTRIBUTE_DIRECTORYFILE_ATTRIBUTE_NORMAL-没有其他。在fileBasic/fileall和DirectoryListing中。当这是错误的时,bash会将所有内容显示为角色设备,所以我知道现在已经设置了,因为它们是常规文件或目录。

可能相关的是,如果我将Notepad.exe复制到E:我无法运行"此应用程序无法在此PC上运行"或以" bash" exect格式错误运行"。因此,好像我还返回错误的Filetype。但这只是它调用的3个函数,只有fileattributes是相关的(以及FileStandard的目录布尔值(。

我现在已经重新编写了OVERFLOW逻辑几次,但是我相信将fileNameLength设置为适合名称所需的总长度是正确的返回的尺寸(从未大于输入尺寸(?

什么样的牺牲需要工作!?

因此,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来源中。

最新更新