【问题标题】:Getting the volume label of a Fat12 disk in C在 C 中获取 Fat12 磁盘的卷标
【发布时间】: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 它显示带有根目录中其他文件名称的标签。

标签: c fat diskimage


【解决方案1】:

所以我发现了问题。卷标似乎不再存储在前面提到的位置,并且通常作为特殊文件位于根目录中。

来源:http://www.ntfs.com/fat-partition-sector.htm

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2012-03-31
    • 2011-02-07
    • 1970-01-01
    • 2021-09-05
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多