2015-05-14 4 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 бт. что этот раздел относится к данным? – mmswe

+0

Смещение 32? Нет, загрузочная запись - 512 байт (фактически значение 0x0b * в 0x0e в загрузочной записи). Длина 4 байта? Нет, это значение от 0x16, умноженное на значение от 0x10. Результат - в блоках (не байтах!). Тогда результат должен быть умножен на значение в 0x0b. Это общий размер загрузочных прямоугольных + зарезервированных блоков (необязательно) + общий размер жира. BTW, это НЕ 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 в секторах равен смещению 36 (= 0x24, начиная с начальной загрузочной записи) с длиной 4 (в байтах); в C вы можете получить к нему доступ (при условии, что есть unsigned char *FAT32fs, указывающий на загрузочную запись, и вы находитесь в системе little-endian) с e. г.

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

В вашем файле примера этот размер 0x00000603 (= 1539).

Смежные вопросы