c - Windows 物理驱动器访问 fopen 和 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:%dn", 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:%dn", test);
//This always returns -1, indicating the seek failed  
fclose(disk);
}

引用自 msdn

如果成功,fseek返回 0。否则,它将返回非零值。在无法查找的设备上,返回值未定义。如果 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), 对二进制流具有未定义的行为 (因为可能存在尾随空字符)或对于任何具有 状态相关编码,不能肯定以初始结尾 移位状态。

许多低级问题,如扇区对齐、文件系统等,需要特定的驱动程序来帮助浏览驱动器,也需要考虑。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新