1

我目前正在尝试将物理硬盘作为 C 中的二进制数据流访问。我已经安装了一个图像 (.img),它可以从操作系统 (Win 7) 读取。

我的 C 程序只是尝试以只读二进制模式打开物理驱动器,然后从驱动器中读取一些数据。

但是,如果我只是从流中读取数据而不寻找任何地方,一切都很好,我会取回存储在驱动器中的数据,并且由于我在流中的偏移量 0 处,我能够读取 MBR磁盘上。

但是,如果我尝试fseek从原点(零)偏移任何偏移量,则fseek返回 -1,表示它做不到。

我猜这可能是访问物理磁盘的权限/环 3/用户级别问题,我可能必须编写一个驱动程序来获得内核级别访问权限才能做到这一点,我只是很困惑为什么我可以从第一个扇区读取一些数据很好,但我无法寻找任何其他偏移量。我已经包含了我在下面编写的 C 程序的一部分。

FILE *disk = fopen("\\\\.\\PhysicalDrive1, "rb+");
if (disk == NULL) {
    **error handle
 }
else { //Opened the drive sucessfully
fread(buffer, 1, 100, disk);
printf("Reading the first byte from buffer, it's:%d\n", buffer[0]);
//This works fine and I can read any byte within the initial buffer
int test = fseek(disk, 100, SEEK_SET);
printf("The value of fseek is:%d\n", test);
//This always returns -1, indicating the seek failed  
fclose(disk);
}
4

1 回答 1

1

引用msdn:

如果成功,fseek则返回 0。否则,它返回一个非零值。在无法搜索的设备上,返回值是undefined。如果 stream 是空指针,或者如果 origin 不是下面描述的允许值之一,则fseek调用无效参数处理程序,如参数验证中所述。如果允许继续执行,则这些函数设置errnoEINVAL并返回 -1。

C 标准 [ISO/IEC 9899:2011] 的第 7.21.9.2 节规定了 fseek() 在二进制模式下打开二进制文件时的以下行为:

二进制流不需要有意义地支持 wherece 值为 SEEK_END 的 fseek 调用。

此外,第 7.21.3 节的脚注 268 有这样的说法:

将文件位置指示器设置为文件结尾,与 fseek(file, 0, SEEK_END) 一样,对于二进制流(因为可能出现尾随空字符)或任何具有状态相关编码的流具有未定义的行为确保以初始换档状态结束。

很多低级的东西很重要,比如扇区对齐、文件系统等。这需要一个特定的驱动程序来帮助在驱动器中导航也需要考虑。

希望这可以帮助。

于 2013-01-24T18:31:16.810 回答