2015-05-14 48 views
-1

以下输出属于FAT32磁盘文件。我想用C程序显示每个文件的所有文件和相应分配的扇区。如何解析原始“磁盘”数据?

我无法通过遵循指南找到根目录。 (示例1 - 在http://www.tavi.co.uk/phobos/fat.html中查找根目录)看起来0x16和0x17是00.所以它们不指向任何东西?

我一遍又一遍地阅读文档,我很累。有人可以解释我做错了什么,或者如何通过简单的步骤来做到这一点?

任何帮助表示赞赏!谢谢。

替代资源:http://wiki.osdev.org/FAT#FAT_32_2

0000000: eb58 906d 6b66 732e 6661 7400 0201 2000 .X.mkfs.fat... . 
0000010: 0200 0000 00f8 0000 2000 4000 0000 0000 ........ [email protected] 
0000020: 400d 0300 0306 0000 0000 0000 0200 0000 @............... 
0000030: 0100 0600 0000 0000 0000 0000 0000 0000 ................ 
0000040: 8000 29c8 a726 5e4e 4f20 4e41 4d45 2020 ..)..&^NO NAME 
0000050: 2020 4641 5433 3220 2020 0e1f be77 7cac FAT32 ...w|. 
0000060: 22c0 740b 56b4 0ebb 0700 cd10 5eeb f032 ".t.V.......^..2 
0000070: e4cd 16cd 19eb fe54 6869 7320 6973 206e .......This is n 
0000080: 6f74 2061 2062 6f6f 7461 626c 6520 6469 ot a bootable di 
0000090: 736b 2e20 2050 6c65 6173 6520 696e 7365 sk. Please inse 
00000a0: 7274 2061 2062 6f6f 7461 626c 6520 666c rt a bootable fl 
00000b0: 6f70 7079 2061 6e64 0d0a 7072 6573 7320 oppy and..press 
00000c0: 616e 7920 6b65 7920 746f 2074 7279 2061 any key to try a 
00000d0: 6761 696e 202e 2e2e 200d 0a00 0000 0000 gain ... ....... 
00000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U. 
0000200: 5252 6141 0000 0000 0000 0000 0000 0000 RRaA............ 
0000210: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000220: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000230: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000240: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000250: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000260: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
.... 

我用这些来创建文件:

dd if=/dev/zero of=disk.img bs=1k count=100000 
losetup /dev/loop0 disk.img 
mkdosfs -s 1 -F 32 /dev/loop0 100000 
+0

你不能做什么?你知道启动块大小。它告诉你FAT的大小(以及一些数学)以及你有多少。然后你知道FAT开始的位置(刚启动后),以及它们的时间。在他们之后你有根目录。另请注意,你的教程讲的是FAT16,而不是FAT32。 –

+0

偏移量:36. 长度:4 btyes。该部分在数据中提到什么? – mmswe

+0

偏移32?不,引导记录是512字节(实际上引导记录中0x0b *值为0x0e)。长度4字节?不,它的值是0x16乘以0x10的值。结果是块(不是字节!)。然后结果必须乘以0x0b的值。这是引导rect +保留块(可选)+总脂肪大小的总大小。顺便说一句,这不是FAT32,但FAT16,注意是非常重要的:http://www.easeus.com/resource/fat32-disk-structure.htm –

回答

0

我甚至无法按照引导发现的根目录。 (例1 - 在 http://www.tavi.co.uk/phobos/fat.html找到根目录)看起来0x16和0x17是00. 所以他们不指向任何东西?

提到的文件是关于FAT16的,所以它不适用于你的FAT32文件系统;请参阅Alternative resource
据此,扇区中FAT的大小在长度为4(以字节为单位)的偏移量36(= 0x24,从标准引导记录开始)处;在C中,你可以使用e访问它(假设有一个指向引导记录的unsigned char *FAT32fs,并且你在一个小端系统中)。 G。

#include <stdint.h> 
    uint32_t FATsectors = *(uint32_t *)&FAT32fs[36]; 

在您的示例文件中,此大小为0x00000603(= 1539)。