Крис Касперски - Восстановление данных. Практическое руководство
Как видно, Microsoft тщательно позаботилась о своих пользователях и тщательно проработала структуру динамических дисков, что для нее, вообще говоря, нехарактерно.
Основные сведения о загрузочном секторе
Первый сектор логического диска носит название загрузочного (boot). Он содержит код самозагрузки (bootstrap code) и важнейшие сведения о геометрии диска, без которых раздел просто не будет смонтирован. Структура загрузочного сектора определяется архитектурными особенностями конкретной файловой системы. В частности, структура загрузочного сектора NTFS описана в табл. 5.6.
Таблица 5.6. Строение загрузочного сектора NTFS
Смещение Размер Описание 0x00 3 bytes Инструкция перехода 0x03 8 байт OEM ID — идентификатор 0x0B 25 bytes BPB 0x24 48 bytes Extended BPB 0x54 426 bytes Bootstrap Code 0x01FE WORD 55 AAВ начале всякого сектора расположена трехбайтная машинная команда перехода на код самозагрузки (обычно она имеет вид EB 52 90, хотя возможны и различные вариации). Так происходит потому, что при загрузке boot-сектора в память управление передается на его первый байт, а код самозагрузки по туманным историческим соображениям был отодвинут в конец сектора (для NTFS верхняя граница составляет 54h байт), вот и приходится прыгать блохой!
С третьего по одиннадцатый байты (считая от нуля) хранится идентификатор производителя, определяющий тип и версию используемой файловой системы (например, MSDOS5.0 для FAT16, MSWIN4.0/MSWIN4.1 для FAT32 и NTFS — для NTFS). Если это поле окажется искаженным, то драйвер не сможет смонтировать диск. В ряде случаев драйвер может даже счесть такой диск не отформатированным.
ПримечаниеС дисками, отформатированными для использования FAT, Windows 2000 будет работать даже в том случае, если поле OEM ID запорчено. В отношении NTFS это не так.
Следом за идентификатором расположен 25-байтовый блок параметров BIOS (BIOS Parameter Block, BPB), хранящий сведения о геометрии диска (количество цилиндров, головок, секторов, размер сектора, количество секторов в кластере и т.д.). Если эта информация окажется утерянной или искаженной, то нормальное функционирование драйвера файловой системы станет невозможным. Причем, в отличие от информации о числе цилиндров/головок/секторов, которая дублирует информацию, содержащуюся в MBR, а при ее утере элементарно восстанавливается описанным выше способом, размер кластера определить не так-то просто! Позже мы обсудим этот вопрос более подробно, пока же вполне достаточно сослаться на табл. 5.7, в которой указаны размеры кластера томов NTFS, по умолчанию выбираемые штатной утилитой форматирования.
Таблица 5.7. Размеры кластеров, по умолчанию выбираемые штатной утилитой форматирования в Windows 2000
Размер диска Размер кластера <512 Мбайт 1 сектор < 1 Гбайт 2 сектора < 2 Гбайт 4 сектора > 2 Гбайт 8 секторовПри выборе размера кластера вручную Windows 2000 поддерживает следующий размерный ряд: 1 сектор, 2 сектора, 4 сектора, 8 секторов, 16 секторов, 32 сектора, 64 сектора и 128 секторов. Чем больше размер кластера, тем слабее фрагментация и выше предельно адресуемый объем дискового пространства. Однако потери от грануляции с увеличением размера кластера тоже растут. Впрочем, размеры кластеров редко задаются вручную.
К блоку параметров BIOS вплотную примыкает его продолжение — расширенный блок параметров BIOS (extended BPB), хранящий номер первого кластера MFT, ее размер в кластерах, номер кластера с зеркалом MFT, а также некоторую другую служебную информацию. В отличие от FAT16/FAT32, MFT может располагаться в любом месте диска (для борьбы с BAD-секторами это актуально). При нормальном развитии событий MFT располагается практически в самом начале диска (где-то в районе четвертого кластера) и, если только она не была перемещена, то ее легко найти глобальным поиском (искать следует строку FILE* по смещению о от начала сектора). При разрушении или некорректном заполнении расширенного блока параметров BIOS драйвер файловой системы отказывается монтировать раздел, объявляя его не отформатированным.
Следом за расширенным блоком параметров BIOS идет код самозагрузки (Bootstrap Code), который ищет на диске загрузчик операционной системы (у операционных систем из семейства Windows NT это — файл ntldr), загружает его в память и передает ему управление. Если код самозагрузки отсутствует, загрузка операционной системы становится невозможной, однако при подключении восстанавливаемого диска вторым раздел должен быть прекрасно виден. Повреждение кода самозагрузки вызывает перезагрузку компьютера или его зависание.
Наконец, завершает загрузочный сектор уже известная нам сигнатура 55h AAh, без которой он ни за что не будет признан загрузочным. Подробная информация обо всех полях загрузочного сектора NTFS приведена в табл. 5.8.
Таблица 5.8. Значения полей загрузочного сектора NTFS
Смещение Размер Описание 0x00 3 байта Инструкция перехода 0x03 8 байт OEM ID 0x0B WORD Количество байт на сектор (для жестких дисков всегда 512) 0x0D BYTE Количество секторов на кластер 0x0E WORD Количество зарезервированных секторов, всегда равно 0 0x10 3 байта He используется NTFS и всегда должно быть равно 0 0x13 WORD Не используется NTFS и всегда должно быть равно 0 0x15 BYTE Дескриптор носителя (media descriptor) — для жестких дисков всегда равен 0xF8 0x16 WORD Не используется NTFS и всегда должно быть равно 0 0x18 WORD Количество секторов на дорожку 0x1A WORD Количество головок 0x1C DWORD Количество скрытых секторов 0x20 DWORD Не используется NTFS и всегда должно быть равно 0 0x24 DWORD Не используется NTFS и всегда должно быть равно 0 0x28 8 байт Общее количество секторов (total sector) 0x30 8 байт Логический номер кластера, с которого начинается MFT 0x38 8 байт логический номер кластера, с которого начинается зеркало MTF 0x40 DWORD Количество кластеров на сегмент (File Record Segment) 0x44 DWORD Количество кластеров на блок индексов (index block) 0x48 8 байт Серийный номер тома 0x50 DWORD Контрольная сумма (0 — не подсчитывать). 0x54 426 байт Код самозагрузки (Bootstrap Code) 0x01FE WORD Сигнатура 55 AAТехника восстановления загрузочного сектора