(Windows)用C读取磁盘引导扇区

(Windows) Reading the boot sector of disks with C

我正在尝试用 C 读取磁盘的引导扇区。我打算修改代码以将其用于其他磁盘,例如 USB 闪存驱动器。我试过这段代码作为测试:

#include<stdio.h>
#include<unistd.h>

int main(){
  FILE *fp;
  char buf[512];

  fp = fopen("\\.\PhysicalDrive0", "rb");
  int r = fread(buf, 1, 512, fp);
  printf("Elements read: %s", r);
  sleep(3);
  fclose(fp);
  return 0;
}

当我编译它并 运行 它时,我得到(字面意思)Elements read: (null)。 如果我 运行 作为管理员,我会得到 Elements read: .

为什么我无法正确读取引导扇区,如何修复代码?

运行 Win10 与 MinGW GCC。

首先,r 是读取的字符数,您将其视为指向 C-style 字符串的指针。为了有机会工作,您需要将 buf 而不是 r 传递给您的 printf 调用,或者将 %s 更改为 %d 所以您正在打印整数值,而不是试图将其视为指向字符串的指针。读取失败(当您缺少权限时)returns 0,printf 有助于显示为 (null) 而不是段错误;成功读取 returns 一个整数,当它被视为指向一个垃圾地址的指针时,该地址可能几乎不可读,但恰好只包含 NUL 个字符,因此不会打印任何内容。

其次,假设您想要查看数据,而不仅仅是获取读取的字节数,引导扇区很可能在早期包含 NUL 个字符,这将导致 %s 扫描假设字符串已经完成。如果你想查看数据,要么 fwrite 将其保存到其他文件以供检查,要么将其逐个字符编码为十六进制并将其写入 stdout 供人类阅读。