【发布时间】:2017-04-03 15:20:17
【问题描述】:
我在尝试获取 C 中磁盘映像的卷标时遇到了奇怪的问题。我知道对于 FAT12 磁盘,这条信息位于偏移量 0x2b 或十进制的 43 处,长度为 11 个字节。无论如何,这是我现在的代码:
void main(int argc, char *argv[]) {
...
FILE *fp = fopen(argv[1], "rb");
printf("Volume Label: %s\n", seekData(fp, 43, 11));
...
}
unsigned char* seekData(FILE *fp, int offset, int bytes) {
unsigned char* buff = malloc(sizeof(unsigned char)*bytes);
fseek(fp, offset, SEEK_SET);
fread(buff, 1, bytes, fp);
rewind(fp);
return buff;
}
对于我使用的任何输入文件 (.IMA),我都会以十六进制返回 20 20 20 20 20 20 20 20 20 20 20。或者当上面的代码运行时只是Volume Label:(nothing here)。我在这里错过了一些非常明显的东西吗?任何帮助将不胜感激
【问题讨论】:
-
这是像硬盘一样的分区设备吗?在这种情况下,引导扇区位于 MBR 之后。您可能必须阅读 MBR 才能确定 FAT12 分区的起始位置。另外,你确定磁盘有标签吗?
-
我不知道它的质量,但这可能会有所帮助。 dailyfreecode.com/code/file-allocation-table-2866.aspx
-
与其从 C 代码开始,不如从十六进制编辑器开始。找出卷标真正在哪里,然后从那里开始。
-
buff 包含 11 个字节,并且不是 null 终止,您的 printf() 期望...将您的 printf 更改为: printf("Volume Label: %.11s\n", seekData(fp, 43, 11));
-
@Schwern 我正在使用 WinImage 创建的 IMA 文件上运行此代码。此外,当我运行代码以查找 OEM(偏移量 3)或文件系统类型(偏移量 54)时。我正确地得到了这些值。前者输出
MSDOS5.0,后者输出FAT12。在这一点上,我认为我的输入文件可能有问题,但我已经在上面贴了标签。除非标签选项与 WinImage 中的卷标签不同,否则我仍然很困惑为什么它没有出现。使用 xxd 它显示带有根目录中其他文件名称的标签。