Софтпанорама 1991, No. 4 (18) * ARTICLES * Составитель: Н.Н. БЕЗРУКОВ ************************************************************************ Гуртяк Д.А. (Донецк) ПЛАН ВОССТАНОВЛЕНИЯ ВИНЧЕСТЕРА ПРИ РАЗРУШЕНИИ УПРАВЛЯЮЩИХ СИСТЕМНЫХ БЛОКОВ Master Boot Record (MBR) и Boot Record. Этот текст представляет собой обобщение моего опыта по восстановлению разрушенных системных блоков при использовании драйвера Disk Manager и ДОС 3.30. Предполагается, что пользователь уже имеет навык работы с про- граммамиNorton Utilites 4.5 или Disk Editor 5.0. Прежде, чем браться за восстановление винчестера нужно узнать его ос- новные характеристики (Drive Info, Physical Characeristic), такие как Sides(Число сторон винчестера), Tracks(Число дорожек), Sector per track(Секторов на дорожку). Для тех, кто не знаком с форматами MBR и Boot Record ниже приведены соответствующие таблицы. ══════════════════════════════════════════════════════════════════════════════ Master Boot Record (MBR) Таблица разделов диска ══════════════════════════════════════════════════════════════════════════════ Самый первый сектор твердого диска (0/0/1 - Track/Side/Sector) содержит Главную корневую запись, которая загружается в память и выполняется. По- следняя часть этого сектора содержит таблицу разделов ── таблицу с 16- байтовыми элементами. Этой таблицей манипулирует программа Disk Manager. Смещ. Длина Содержимое ▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ┌──── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ────────┐ +0 1beH │ код загрузки и выполнения корневого сектора активного раздела │ ├───┴ ─ ┴ ─ ┴ ─ ┴ ─ ┼ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴ ─ ┴───────┘ . . . . . . +19eH 10H │ │ элемент раздела 6 (см. ниже) ├───┴ ─ ┴ ─ ┴ ─ ┴───┤ +1aeH 10H │ │ элемент раздела 5 ├───┴ ─ ┴ ─ ┴ ─ ┴───┤ +1beH 10H │ │ элемент раздела 1 ├───┴ ─ ┴ ─ ┴ ─ ┴───┤ +1ceH 10H │ │ элемент раздела 2 ├───┴ ─ ┴ ─ ┴ ─ ┴───┤ +1deH 10H │ │ элемент раздела 3 ├───┴ ─ ┴ ─ ┴ ─ ┴───┤ +1eeH 10H │ │ элемент раздела 4 ├───┴ ─ ┼ ─ ┴ ─ ┴───┘ +1feH 2 │ 55 aa │ подпись таблицы разделов (0aa55H) └───┴───┘ Структура элемента раздела ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ┌───┐ +0 1 │Boot Флаг загрузки: 0=не активен, 80H = активен │ │ Обычно равен 80h для раздела C: ├───┼ +1 1 │Hd │ Начало раздела: номер головки ├───┼───┐ +2 2 │Sec Cyl│ Начало раздела: сектор/цилиндр корневого сектора ├───┼───┘ +4 1 │Sys│ Код системы: 0=неизвестна, 1=DOS 12-бит FAT, 4=16-бит │ │ 51h- Disk Manager ├───┼ +5 1 │Hd │ Конец раздела: номер головки ├───┼───┐ +6 2 │Sec Cyl│ Конец раздела: сектор/цилиндр последнего сектора ├───┴───┼───┬───┐ +8 4 │ младш старш │ Относительный номер начального сектора ├───┴───┼───┴───┤ +0cH 4 │ младш старш │ Размер (число секторов) └───┴───┴───┴───┘ +10H начало следующего элемента раздела (или 0aa55H для последн.элемент Замечания:  Значения цилиндра и сектора занимают 10 и 6 бит соответственно: 1 1 1 1 1 1 ╓5┬4┬3┬2┬1┬0┬9┬8╥7┬6┬5┬4┬3┬2┬1┬0╖ ║c c c c c c c c C c S s s s s s║ ╙─┴─┴─┴─┴─┴─┴─┴─╨─┴─┴─┴─┴─┴─┴─┴─╜  Значение "относительного сектора" по смещению 08H в каждом разделе эквива- лентно головке, сектору и цилиндру начального адреса раздела. Относительный сектор 0 совпадает с цилиндром 0, головкой 0, сектором 1. Относительный но- мер сектора прирастает сначала по каждому сектору на головке, затем по каж- дой головке и наконец по каждому цилиндру. Применима формула: отн_сек = (#Цил * сек_на_цил * головок) + (#Гол * сек_на_цил) + (#Сек -1) ══════════════════════════════════════════════════════════════════════════════ Структура корневого сектора (Boot Record) ══════════════════════════════════════════════════════════════════════════════ Корневой сектор диска или раздела диска должен иметь следующий формат. Смещ. Длина Содержимое ▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ┌───┬───┬───┐ +0 3 │JMP│ xx xx │ Переход на код загрузки ├───┴───┴───┴───────────────────┐ +3 8 │'I' 'B' 'M' '3' '.' '2'│ OEM-имя компании и версия систем ├───┴───┼───┴───┴───┴───┴───┴───┘ +0bH 2 │SectSiz│ байт на сектор ├───┼───┘ +0dH 1 │ClustSiz секторов на единицу распределения (кластер) ├───┴───┐ +0eH 2 │ResSecs│ резервных секторов (секторов перед первой FAT) ├───┼───┘ +10H 1 │FatCnt число таблиц FAT ├───┴───┐ +11H 2 │RootSiz│ макс.число 32-байтовых элементов корневого оглавления ├───┴───┤ +13H 2 │TotSecs│ общее число секторов на носителе (раздел DOS) ├───┼───┘ +15H 1 │Media дескриптор носителя (то же, что 1-й байт FAT) ├───┴───┐ +16H 2 │FatSize│ число секторов в одной FAT ├───┴───┤ +18H 2 │TrkSecs│ секторов на дорожку (цилиндр) ├───┴───┤ +1aH 2 │HeadCnt│ число головок чтения/записи (поверхностей) ├───┴───┤ +1bH 2 │HidnSec│ спрятанных секторов (исп. в схемах разделения) └───┴───┘ 1eH размер форматированной порции корневого сектора начало кода и данных загрузки ══════════════════════════════════════════════════════════════════════════════ Ситуация N 1. 1. В один прекрасный момент один или несколько разделов винчестера перестали читаться и тестовые программы утверждают, что это не Hard Disk, а Drive. При этом с этим диском ДОС не может работать. Наиболее вероятной причиной этого может быть разрушение Boot Record этого диска. Адрес Boot Record можно найти в физическом секторе с координатами 0/0/1 (Track/Head/Sector) в соответствующем разделу элементе Partition Table. Далее надо перейти к этому сектору и просмотреть его в формате Boot Record (клавиша F7 в программе Disk Editor). Если в полях корневого сектора находится "мусор", то надо в ручную восстановить этот сектор. Надо забить нулями остальную часть загрузочного сектора или скопиро- вать на это место загрузочный сектор системной дискетты если раздел дис- ка активен (C:) Затем надо вручную заполнить управляющие поля этого сектора: Поле Boot Record │ Корректное значение ──────────────────────────────────────┼───────────────────────────────────────── OEM ID: │ Можете записать сюда свое имя Bytes per sector: │ 512 Sectors per cluster: │ ??? (См. дальше) Reserved sectors at beginning: │ 1 FAT Copies: │ 2 Root directory entries: │ 512 Total sectors on disk: │ Это значение берется из Partition Table │ (поле +0Ch в соответствующем элементе) Media descriptor byte: │ F8 Hex Sectors per FAT: │ ??? (См. дальше) Sectors per track: │ Значение берется из Drive Info Sides: │ Значение берется из Drive Info Special hidden sectors: │ Это значение равно значению Relative Sectors │ (Относительный номер начального сектора) │ (поле +08h в соответствующем элементе Part. Table) │ Если диск не загрузочный, то к этому значению │ прибавляется число 8388608 (800000h) ──────────────────────────────────────┴───────────────────────────────────────── В этой таблице остались незаполненными поля Sectors per FAT (Секторов на FAT) и Sectors per Claster (Секторов на кластер). Их надо вычислять дополнительно: Sectors per FAT : Просматриваем сектора диска, следующие за Boot Record, пока не найдем начало коренного каталога. Запоминаем координаты сектора каталога. Затем вычисляем относительный номер этого сектора относительно Boot Record из расчета, что известны Число Сторон на диске, Число Секторов на Дорожку и Относительный адрес Boot Record = 1. Затем находить искомое поле S/F: S/F := (<Относ. сектор каталога> -1) div 2. Sectors per Claster : Это значение надо подобрать из расчета, что оно может принимать значения 8 sect/clast или 4 sect/clast. ──────────────────────────────────────────────────────────────────────────── 2. В случае разрушения Partition Table Восстановить утраченные зна- чения гораздо сложней. Здесь самое сложное - это восстановить координаты начала и конца разделов диска. Это возможно только путем просмотра соде- ржимого винчестера и контекстного поиска строк, характерных для Boot Record каждого размера винчестера. В качестве примера таких строк можно предложить: "NOSYSTEM", "MSDOS3.3", "Disk Boot failure" и т.д. Если вам удастся выполнить эту кропотливую работу, остальное не пре- дставляет проблем. Поля элементов Partition Table заполняются следующим образом: Флаг загрузки: =0 или =80H для диска C: Начало раздела: номер головки \____ Найденное значения Начало раздела: сектор/цилиндр корневого сектора / координат начала раздела. Код системы: =1 для диска C: или =51h для остальных разделов Конец раздела: номер головки \____ Найденное значения Конец раздела: сектор/цилиндр последнего сектора / координат конца раздела. Относительный номер начального сектора : Вычисляется по формуле, приведенной ранее, в описании формата Part. Table Размер (число секторов) : = Относит. сектор начала следующего раздела минус Относит. сектор начала этого раздела ──────────────────────────────────────────────────────────────────────────── 3. В случае разрушения и MBR и Boot Record задача значительно усло- жняется. Могу только порекомендовать восстановить сначала MBR, а затем все остальное.