我试图通过读取磁盘映像的十六进制值来找出FAT12软盘文件系统上还有多少剩余可用空间。我的计划是计算值为0x000(空白空间)的FAT条目的数量。我不明白如何将FAT条目转换为可读格式。
我的代码:
#include<stdio.h>
#include<stdlib.h>
int freeSpace(FILE *fp){
int fat_entry;
fseek(fp, 512L, SEEK_SET); //start of first FAT
fread(&fat_entry,1,3,fp);
printf("THREE BYTES: %X \n", fat_entry);
//Finish calculating free space
return 0;
}
int main(int argc, char** argv)
{
FILE *fp;
int free_space;
if ((fp=fopen(argv[1],"rb")))
{
printf("Successfully opened the image file.\n");
free_space = freeSpace(fp)
printf("Free Space: %d\n", free_space);
}
else
printf("Fail to open the image file.\n");
fclose(fp);
return 0;
}
在我的十六进制编辑器中,从字节偏移512个字节开始的前三个字节为:FO FF FF
printf("THREE BYTES: %X \n", fat_entry);
的输出是:FFFFF0从大量的规范中,我已经了解到,如果我有3个字节的uv wx yz,则对应的12位FAT12条目将是xuv yzw。所以我想将FFFFF0转换成FF0 FFF的形式,这样我就可以检查任一条目是否为0x000。
关于如何读取正确的FAT12值,我感到非常困惑。我知道它与小的字节序和一些诡计有关,因为我要同时加载2个FAT12值以获得偶数个字节,但是我不知道该从何而来。
最佳答案
以下函数获取下一个群集。该功能来自我的档案。
word nextclust12 (cluster, BPB)
struct BPB *BPB; // BIOS parameter block
word cluster; // curent cluster: get next one
{
word *FAT, index, bytenum, j;
dword bloknum;
bytenum= cluster + cluster/2; /* multiply with 1.5 */
bloknum= bytenum / (3*512); /* in which 3-group is block */
index= bytenum % (3*512); /* position in 3-group */
/* read part of FAT */
if (!dosread (FAT_buf, BPB->disk, bloknum + BPB->reserved_bloks, 3))
return (BADBLOK12);
FAT= (word *) &FAT_buf[index]; /* get a word from that place */
if (even (cluster))
return ( *FAT & 0x0fff); /* set high 4 bits to zero */
else
return ( *FAT >> 4); /* shift FAT-entry to right */
}
代码不完整(需要大量的标头和其他C文件),因此将其视为伪代码。