Windows物理驱动器访问fopen和fseek

时间:2013-01-24 17:14:55

标签: c windows file fseek

我正在尝试在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);
}

更新

我没有尝试访问PhysicalDrive1,而是尝试在逻辑驱动器E:上执行fseek,而且它有效。我猜这是因为它是一个物理驱动器,fseek可能无法做到,但它似乎在逻辑分区上运行正常,所以我认为应该做我需要的。

我会把这个打开一段时间,以防万一有人能告诉我它为什么不起作用。)

感谢迄今为止的所有评论!

1 个答案:

答案 0 :(得分:1)

引自msdn:

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

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

  

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

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

  

将文件位置指示器设置为文件结尾,如同   fseek(file,0,SEEK_END)具有二进制流的未定义行为   (因为可能是尾随空字符)或任何流有   状态相关的编码,不能确定地在初始结束   转变状态。

许多低级别的东西很重要,比如扇区对齐,文件系统等。需要一个特定的驱动程序来帮助浏览驱动器也需要考虑。

希望这有帮助。

相关问题