KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Компьютерное "железо" » Крис Касперски - Восстановление данных. Практическое руководство

Крис Касперски - Восстановление данных. Практическое руководство

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Крис Касперски, "Восстановление данных. Практическое руководство" бесплатно, без регистрации.
Перейти на страницу:

Таблица 6.10. Структура одного элемента списка отрезков

Смещение в нибблах Размер в нибблах Описание 0 1 Размер поля длины (L) 1 1 Размер поля начального кластера (S) 2 2*L Количество кластеров в отрезке 2+2*L 2*S Номер начального кластера отрезка

Покажем, как с этим работать на практике. Предположим, что мы имеем следующий список отрезков, соответствующий нормальному не фрагментированному файлу (что может быть проще!): 21 18 34 56 00. Попробуем его декодировать?

Начнем с первого байта — 21h. Младший полубайт (01h) описывает размер поля длины отрезка, старший (02h) — размер поля начального кластера. Следующие несколько байт представляют поле длины отрезка, размер которого в данном случае равен одному байту — 18h. Два других байта (34h 56h) задают номер начального кластера отрезка. Нулевой байт на конце сигнализирует о том, что это последний отрезок в файле. Таким образом, наш файл состоит из одного-единственного отрезка, начинающегося с кластера 5634h и заканчивающегося кластером 5634h + 18h == 564Ch.

Рассмотрим более сложный пример фрагментированного файла со следующим списком отрезков: 31 38 73 25 34 32 14 01 E5 11 02 31 42 AA 00 03 00. Извлекаем первый байт — 31h. Один байт приходится на поле длины, и три байта — на поле начального кластера. Таким образом, первый отрезок (run 1) начинается с кластера 342573h и продолжается вплоть до кластера 342573h + 38 == 3425ABh. Чтобы найти смещение следующего отрезка в списке, мы складываем размер обоих полей с их начальным смещением: 3 + 1 == 4. Отсчитываем четыре байта от начала списка отрезков и переходим к декодированию следующего отрезка: 32h — два байта на поле длины отрезка (равное в данном случае 0114h) и три байта — на поле номера начального кластера (0211E5h). Следовательно, второй отрезок (run 2) начинается с кластера 0211E5h и продолжается вплоть до кластера 0211E5h + 114h == 212F9h. Третий отрезок (run 3): 31h — один байт на поле длины и три байта — на поле начального кластера, равные 42h и 0300AAh соответственно. Поэтому третий отрезок (run 3) начинается с кластера 0300AAh и продолжается вплоть до кластера 0300AAh + 42h == 300ECh. Завершающий ноль на конце списка отрезков сигнализирует о том, что это последний отрезок в файле.

Таким образом, подопытный файл состоит из трех отрезков, разбросанных по диску в следующем живописном порядке: 342573h–3425ABh; 0211E5h–212F9h; 0300AAh–300ECh. Остается только прочитать его с диска! Нет ничего проще!

Начиная с версии 3.0, NTFS поддерживает разреженные (sparse) атрибуты, т.е. такие атрибуты, которые не записывают на диск кластеры, содержащие одни нули. При этом поле номера начального кластера отрезка может быть равным нулю, что означает, что данному отрезку не выделен никакой кластер. Поле длины содержит количество кластеров, заполненных нулями. Их не нужно считывать с диска. Вы должны самостоятельно изготовить их в памяти. Между прочим, далеко не все дисковые доктора знают о существовании разреженных атрибутов (если атрибут разрежен, его флаг равен 8000h), и интерпретируют нулевую длину поля номера начального кластера весьма странным образом. Последствия такого "лечения" обычно оказываются весьма печальными.

Пространства имен

NTFS изначально проектировалась как файловая система, не зависящая от платформы, способная работать с большим количеством различных подсистем, в том числе: Win32, MS-DOS, POSIX. Так как каждая из перечисленных подсистем налагает собственные ограничения на набор символов, допустимых для использования в имени файла, NTFS вынуждена поддерживать несколько независимых пространств имен (name spaces).

POSIX

Допустимы все символы UNICODE (с учетом регистра), за исключением символа нуля (NULL), обратной косой черты () и знака двоеточия (:). Последнее из перечисленных ограничений, кстати говоря, не есть ограничение POSIX. Напротив, это — внутреннее ограничение файловой системы NTFS, использующей этот символ для доступа к именованным атрибутам. Максимально допустимая длина имени составляет 255 символов.

Win32

Доступны все символы UNICODE (без учета регистра), за исключением следующего набора: кавычки ("), звездочка (*), косая черта (/), двоеточие (:), знак "меньше" (<), знак "больше" (>), вопросительный знак (?), обратная косая черта (), а также символ конвейера (|). Кроме того, имя файла не может заканчиваться точкой или пробелом. Максимально допустимая длина имени составляет 255 символов.

MS-DOS

Доступны все символы пространства имен Win32 (без учета регистра), за исключением следующих: знак плюса (+), запятая (,), точка (.), точка с запятой (;), знак равенства (=). Длина имени файла не должна превышать восьми символов, за которыми следует необязательное расширение имени файла, имеющее длину от одного до трех символов.

Назначение служебных файлов

NTFS содержит большое количество служебных файлов (метафайлов) строго определенного формата. Важнейший из метафайлов, $MFT, мы только что рассмотрели. Остальные метафайлы играют вспомогательную роль. Для восстановления данных детально знать их структуру необязательно. Тем не менее, если они окажутся искажены, то штатный драйвер файловой системы не сможет работать с таким томом, поэтому иметь некоторые представления о назначении каждого из них все же необходимо.

Краткие сведения о назначении важнейших метафайлов приведены в табл. 6.11. К сожалению, в пределах одной главы нет возможности подробно рассмотреть структуру всех существующих метафайлов, поэтому заинтересованным читателям рекомендуется искать эту информацию в документации к Linux-NTFS Project.


Таблица 6.11. Назначение основных метафайлов NTFS

Inode Имя файла ОС Описание 0 $MFT Любая Главная файловая таблица (Master File Table, MFT) 1 $MFTMirr Любая Резервная копия первых четырех элементов MFT 2 $LogFile Любая Журнал транзакций (transactional logging file) 3 $Volume Любая Серийный номер, время создания, флаг не сброшенного кэша (dirty flag) тома 4 $AttrDef Любая Определение атрибутов 5 . (точка) Любая Корневой каталог (root directory) тома 6 $Bitmap Любая Карта свободного/занятого пространства 7 $Boot Любая Загрузочная запись (boot record) тома 8 $BadClus Любая Список плохих кластеров (bad clusters) тома 9 $Quota Windows NT Информация о квотах (quota information) 9 $Secure Windows 2000 Использованные дескрипторы безопасности (security descriptors) 10 $UpCase Любая Таблица заглавных символов (uppercase characters) для трансляции имен 11 $Extend Windows 2000 Каталоги: $ObjId, $Quota, $Reparse, $UsnJrnl 12-15 не используется Любая Помечены как использованные, но в действительности пустые 16-23 не используется Любая Помечены как неиспользуемые Любой $ObjId Windows 2000 Уникальные идентификаторы каждого файла Любой $Quota Windows 2000 Информация о квотах (quota information) Любой $Reparse Windows 2000 Информация о точке передачи (reparse point) Любой $UsnJrnl Windows 2000 Журнал шифрованной файловой системы (journaling of encryption) >24 Пользовательский файл Любая Обычные файлы >24 Пользовательский каталог Любая Обычные каталоги

Практический пример

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*