(视窗)使用 C 读取磁盘的引导扇区

(Windows) Reading the boot sector of disks with C

提问人:OnixIsThePewterGod 提问时间:5/27/2022 最后编辑:JabberwockyOnixIsThePewterGod 更新时间:5/27/2022 访问量:145

问:

我正在尝试使用 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:

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

在带有 MinGW GCC 的 Win10 上运行。

C Windows File-IO IO 引导加载程序

评论

3赞 stark 5/27/2022
r不是字符串。
1赞 Jabberwocky 5/27/2022
您正在尝试使用说明符打印 。用。您还需要检查是否失败并采取相应的措施。int%s%dfopen
0赞 Anders 5/28/2022
睡眠应该做什么?
0赞 OnixIsThePewterGod 6/1/2022
@Anders 它使 cmd 窗口保持打开状态,以便我可以看到输出。

答:

2赞 ShadowRanger 5/27/2022 #1

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

其次,假设您想查看数据,而不仅仅是读取的字节数,那么引导扇区很可能在早期包含字符,这将导致扫描假定字符串已经完成。如果你想查看数据,要么把它放到其他文件中进行检查,要么把它逐个字符编码为十六进制,然后写给人类阅读。NUL%sfwritestdout

评论

0赞 OnixIsThePewterGod 5/28/2022
我的上帝,我不使用是愚蠢的!我想我累了什么的。当我更改它时,它显示 0 为非管理员,512 显示为管理员👍。%d