gpt4 book ai didi

windows - 最近,我正在进行一个需要驱动器原始读/写扇区的项目

转载 作者:可可西里 更新时间:2023-11-01 11:10:47 27 4
gpt4 key购买 nike

之前,我在这里发布了一个问题,询问有关如何从驱动器读取和写入数据的建议,而不是通过像“aaa.txt”这样的文件标签,而只是扇区..我被建议尝试阅读和写作....但新问题出现了……毛茸茸的参数

int _read( int handle, void *buffer, unsigned int count );

当我使用该功能并想从驱动器读取扇区时...我似乎需要将计数设置为 x*512。它必须是 512 字节的几倍...

为什么???是否有一些原始函数允许我直接逐字节使用...谢谢...btb,如果我想那样做,我应该开发自己的 I/O 驱动程序吗?谢谢

最佳答案

对设备的读取和写入都必须扇区对齐,并且字节数必须是扇区大小的整数倍。

不要对扇区大小做出假设,您应该查询任何设备的扇区大小,并动态地使用它。硬盘驱动器的典型尺寸为 512,光驱驱动器的典型尺寸为 2048。

如果您想要允许您在设备上逐字节读取的函数,而不会产生浪费的开销,请尝试这个技巧:

FILE *file_pointer = fopen("/path/to/device", "rb");
size_t sector_size;
ioctl(fd, BLKSSZGET, &sector_size);
setvbuf(file_pointer, NULL, _IOFBF, sector_size);

如果您需要在 Windows 上获取扇区大小,您可以使用 IOCTL_DISK_GET_DRIVE_GEOMETRY 调用 DeviceIoControl() .

Stdio 会将查找与 s 对齐并读取大小为 s 的 block 。此外,您可以使用 posix_memalign() 提供自己的缓冲区, 或 _aligned_malloc() ,如果您的底层 stdio 实现不这样做。

编辑:清除评论中的一些困惑

您正在使用扇区大小为 512 且带有 FILE *f; 的设备。您 fseek() 偏移 37。f 的位置已更新,但设备上未进行任何搜索。你 fread() 500 字节。 lseek() 以偏移量 0 调用。512 个字节被读入 f 的缓冲区。字节 37 到 512 被复制到您提供的缓冲区。 lseek() 被调用,偏移量为 512。读取了 512 个字节,您期望的剩余 463 个字节被复制到您传递给 fread()。如果您现在 fread() 一个字节,它会简单地从 f 中的现有缓冲区中复制出来,而不会影响设备。

关于windows - 最近,我正在进行一个需要驱动器原始读/写扇区的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1648943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com