提问人:OnixIsThePewterGod 提问时间:5/27/2022 最后编辑:JabberwockyOnixIsThePewterGod 更新时间:5/27/2022 访问量:145
(视窗)使用 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:
为什么我无法正确读取引导扇区,如何修复代码?
在带有 MinGW GCC 的 Win10 上运行。
答:
2赞
ShadowRanger
5/27/2022
#1
首先是读取的字符数,您将其视为指向 C 样式字符串的指针。为了有机会工作,您需要将 ,而不是 ,传递给您的调用,或者更改为 这样您正在打印整数值,而不是试图将其视为指向字符串的指针。失败的读取(当您缺少权限时)返回 0,这有助于显示为而不是段错误;成功的读取会返回一个整数,当将其视为指针时,该整数指向一个垃圾地址,该地址可能几乎不可读,但恰好只包含字符,因此不会打印任何内容。r
buf
r
printf
%s
%d
printf
(null)
NUL
其次,假设您想查看数据,而不仅仅是读取的字节数,那么引导扇区很可能在早期包含字符,这将导致扫描假定字符串已经完成。如果你想查看数据,要么把它放到其他文件中进行检查,要么把它逐个字符编码为十六进制,然后写给人类阅读。NUL
%s
fwrite
stdout
评论
0赞
OnixIsThePewterGod
5/28/2022
我的上帝,我不使用是愚蠢的!我想我累了什么的。当我更改它时,它显示 0 为非管理员,512 显示为管理员👍。%d
评论
r
不是字符串。int
%s
%d
fopen