(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
供人类阅读。
我正在尝试用 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
供人类阅读。