С помощью простенькой программы (рис. 1) мы можем прочитать в оперативную память (в буфер с адреса 240) любой сектор любого жесткого диска (MBR или GPT), но адресация порций файлов производится с помощью кластеров, а программа использует адресацию LBA. Поэтому нужно уметь переводить номер нужного кластера в номер начального сектора этого кластера и знать размер кластера.
Рис. 1
Разделы FAT12/16 состоят из системных областей (Boot-сектор, FAT1, FAT2, каталог) и области данных (состоящей из кластеров пронумерованных с номера 2).
Разделы FAT32состоят из системных областей (область резервных секторов, содержащая Boot-сектор и FSINFO, и FAT1, FAT2), и области данных (состоящей из кластеров пронумерованных с номера 2). Корневой каталог в FAT32 расположен в области данных.
Разделы NTFS состоят из кластеров пронумерованных с номера 0, вся информация в разделе (метафайлы, каталоги, программы, данные ...) — все хранится в виде файлов.
Принципы организации хранения информации в виде файлов в разделах FAT :
Принципы организации хранения информации в виде файлов в разделах NTFS:
Пример пересчета номера кластера (5 кластер) в номер сектора (размер кластера 2 сектора) для FAT32 показан на рис. 2:
Рис. 2
Размер области резервных секторов, содержащей Boot-сектор и FSINFO, и размер FAT1, FAT2 (в секторах)указан в Boot-секторе (номер начального кластера корневого каталога тоже указан в Boot-секторе), а адрес Boot-сектора (начальный сектор раздела) указан в соответствующей строке таблицы разделов в MBR. Используя эту информацию легко найти начальный сектор области данных раздела (номер начального сектора кластера 2 (на рис. 2 это сектор 104). Допустим нам нужен номер нач. сектора 5-го кластера, который является начальным кластером файла корневого каталога.
Номер нач. сектора 5-го кластера = (5 - 2) х 2 + 104 = 10А. Из номера искомого кластера вычитаем 2 т. к. нумерация кластеров начинается с номера 2. Полученное число умножаем на количество секторов в кластере (2) и результат прибавляем к номеру начального сектора области данных раздела (104). Получили номер начального сектора 5-го кластера равный 10А.
Пример пересчета номера кластера (5 кластер) в номер сектора (размер кластера 2 сектора) для раздела NTFS:
Рис. 3
Адрес Boot-сектора (начальный сектор раздела 100) указан в соответствующей строке таблицы разделов в MBR.
В разделе NTFS в LBA 100 находится Boot-сектор раздела, а в нем по адресу 30 от начала 8 байтов содержат номер начального кластера файла $MFT (напримерравный 5).
Номер нач. сектора 5-го кластера = (5 х 2) + 100 = 10А. Номер нужного кластера умножаем на размер кластера (2) и полученный результат прибавляем к номеру начального сектора раздела (100).