使用 SetFilePointer 更改扇区中写入的位置不起作用?



我正在使用SetFilePointer 用某些东西重写MBR的后半部分,它是一个用户模式应用程序,我打开了PhysicalDrive的句柄

起初我尝试将 WriteFile 中的大小参数设置为 256,但写入文件给出了INVALID_PARAMETER错误,因为事实证明,根据对此处其他问题的一些搜索,这似乎是因为我们被迫在句柄是 PhysicalDrive 时写入扇区大小的乘法由于某种原因

然后我尝试将 filePointer 设置为 256,写入 512 字节,它们都没有返回错误,但由于某种未知原因,它从扇区的开头写入! 好像即使 SetFilePointer 的返回值正常,SetFilePointer 也不起作用,它返回 256

所以我的问题是:

  1. 当句柄是 PhysicalDrive 时,为什么写入大小必须乘以扇区大小? 还有哪些设备句柄是这样的?

  2. 为什么会发生这种情况,当我将文件指针设置为 256 时,WriteFile 仍然从头开始写入?

  3. 这不是真的多余吗,考虑到即使我想更改 1 个字节,我也必须读取整个扇区,更改一个字节然后写回它,而不仅仅是写入 1 个字节,这似乎要多 10 倍的开销! 难道没有一种更快的方法可以在扇区中写入几个字节吗?

我认为您正在混合文件系统和存储(块设备(。文件系统保持在存储设备堆栈上方。如果代码获取文件系统设备的句柄,则可以逐字节写入。但是,如果您正在访问存储设备堆栈,则只能逐个扇区(或块大小(写入。

正如您发现的那样,直接写入块设备肯定很慢。但是,在大多数情况下,人们只是与文件系统交谈。大多数文件系统驱动程序维护缓存并使用算法进行读取和写入以提高性能。

在看到实际代码之前,无法对基于文件指针的偏移量进行注释。但我想它可能没有扇区对齐或根本没有使用。

相关内容

  • 没有找到相关文章

最新更新