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

Using SetFilePointer to change the location to write in the sector doesn't work?

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

起初我试图将 WriteFile 中的大小参数设置为 256,但是 writefile 给出了 INVALID_PARAMETER 错误,因为它基于对其他问题的一些搜索而证明这是因为我们是出于某种原因,当句柄为 PhysicalDrive 时,被迫写入扇区大小的被乘数

然后我尝试将 filePointer 设置为 256,并写入 512 个字节,两者都 return 没有错误,但由于某些未知原因,它从扇区的开头开始写入!好像 SetFilePointer 没有工作,即使 SetFilePointer 的 return 值没问题,它 returns 256

所以我的问题是:

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

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

  3. 这样是不是很多余,考虑到即使我想改变1个字节,我也必须读取整个扇区,改变一个字节然后再写回去,而不是只写1个字节,好像是10倍的开销!在扇区中写入几个字节没有更快的方法吗?

我认为您将文件系统和存储(块设备)混合在一起。文件系统位于存储设备堆栈之上。如果您的代码获得文件系统设备的句柄,您可以逐字节写入。但是如果是访问存储设备栈,则只能逐扇区(或块大小)写入。

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

在看到实际代码之前无法评论基于文件指针的偏移量。但我猜它可能没有扇区对齐或者根本没有使用。