【问题标题】:Windows physical drive access fopen and fseekWindows 物理驱动器访问 fopen 和 fseek
【发布时间】:2013-01-08 12:57:43
【问题描述】:

我目前正在尝试将物理硬盘作为 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);
}

【问题讨论】:

  • 只要你从头开始,你能读吗?是不是只有寻找失败?还是在一定数量的字节后读取失败?
  • 我刚刚尝试从头开始读取 512 个字节,然后是 2048 个字节,两者都完美读取。只是 fseek 失败了。
  • 我假设寻零也失败了。有时 Windows 错误日志中有消息。这些可以通过“附件”中的某些工具访问,只有机器管理员才能访问。
  • 是的,寻零也会失败。每次我运行程序时,都会有一个错误日志写入“管理事件”日志文件,指出:“磁盘上的文件系统结构已损坏且无法使用......”至少,它们似乎与正在运行的程序一致。
  • 尝试仅以 rb 模式而不是 rb+ 模式打开它。

标签: c windows file fseek


【解决方案1】:

引用自msdn:

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

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

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

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

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

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

希望这会有所帮助。

【讨论】:

  • 谢谢问。我认为对于我需要做的事情,逻辑分区访问似乎有效,所以我现在将使用它,而不是尝试在物理驱动器上寻找。谢谢。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多