在C中获取Fat12磁盘的卷标

在C中获取Fat12磁盘的卷标,c,fat,diskimage,C,Fat,Diskimage,我花了很长时间试图获取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

我花了很长时间试图获取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
。或者当运行上述代码时,只需
卷标:(此处无任何内容)
。我是不是错过了一些非常明显的东西?任何帮助都将不胜感激,因此我找到了问题所在。卷标似乎不再存储在前面提到的位置,而通常作为一个特殊文件存储在根目录中

资料来源:


“卷标。此字段用于存储卷标,但卷标现在作为特殊文件存储在根目录中。”

因此我发现了问题。卷标似乎不再存储在前面提到的位置,而通常作为一个特殊文件存储在根目录中

资料来源:


“卷标。此字段用于存储卷标,但卷标现在作为特殊文件存储在根目录中。”

这是像硬盘驱动器一样的分区设备吗?在这种情况下,引导扇区位于MBR之后。您可能需要阅读MBR以确定FAT12分区的起始位置。另外,你确定磁盘有标签吗?我不知道它的质量,但这可能会有所帮助。与其从C代码开始,不如从十六进制编辑器开始。找出卷标的真正位置,然后从那里开始。buff包含11个字节,并且不是以null结尾的,这是printf()所期望的。。。将printf更改为:printf(“卷标:%.11s\n”,seekData(fp,43,11))@Schwern我正在用WinImage创建的IMA文件上运行此代码。另外,当我运行查找OEM(偏移量3)或文件系统类型(偏移量54)的代码时。我正确地得到了这些值。前者的输出是MSDOS5.0,后者是FAT12。在这一点上,我想这可能是我的输入文件有问题,但我已经把它的标签。除非标签选项与WinImage中的卷标不同,否则我仍然不明白为什么它没有显示出来。使用xxd显示根目录中其他文件名的标签。这是像硬盘驱动器一样的分区设备吗?在这种情况下,引导扇区位于MBR之后。您可能需要阅读MBR以确定FAT12分区的起始位置。另外,你确定磁盘有标签吗?我不知道它的质量,但这可能会有所帮助。与其从C代码开始,不如从十六进制编辑器开始。找出卷标的真正位置,然后从那里开始。buff包含11个字节,并且不是以null结尾的,这是printf()所期望的。。。将printf更改为:printf(“卷标:%.11s\n”,seekData(fp,43,11))@Schwern我正在用WinImage创建的IMA文件上运行此代码。另外,当我运行查找OEM(偏移量3)或文件系统类型(偏移量54)的代码时。我正确地得到了这些值。前者的输出是MSDOS5.0,后者是FAT12。在这一点上,我想这可能是我的输入文件有问题,但我已经把它的标签。除非标签选项与WinImage中的卷标不同,否则我仍然不明白为什么它没有显示出来。它使用xxd显示标签以及根目录中其他文件的名称。