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 它只经过少量查询。我跳过了 CLEANUP
和 CLOSE
,因为我所做的只是 return STATUS_SUCCESS
和 Information=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
现在,我相信我在FileFsVolumeInformation
和FileAllInformation
中returning OVERFLOW
是正确的,但我仍然填写了所有信息,只是t运行分别设置卷名和文件名。
至于我 return,我将 Attributes
设置为 FILE_ATTRIBUTE_DIRECTORY
或 FILE_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
来源中。
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 它只经过少量查询。我跳过了 CLEANUP
和 CLOSE
,因为我所做的只是 return STATUS_SUCCESS
和 Information=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
现在,我相信我在FileFsVolumeInformation
和FileAllInformation
中returning OVERFLOW
是正确的,但我仍然填写了所有信息,只是t运行分别设置卷名和文件名。
至于我 return,我将 Attributes
设置为 FILE_ATTRIBUTE_DIRECTORY
或 FILE_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
来源中。