Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Атрибут полного имени $FILE_NAME ⇐ ПредыдущаяСтр 3 из 3
Атрибут полного имени файла хранит имя файла в соответствующем пространстве имен. Таких атрибутов у файла можно быть и несколько (например, win32-имя и MS-DOS имя). Здесь же хранятся и жесткие ссылки (hard link), если они есть.
Структура атрибута $FILE_NAME. Списки отрезков (data runs) Тела нерезидентных атрибутов хранятся на диске в одной или нескольких кластерных цепочках, называемых отрезками (runs). Отрезком называется последовательность смежных кластеров, характеризующаяся номером начального кластера и длиной. Совокупность отрезков называется списком, run-list'ом или data run'ом. Внутренний формат представления списков не то, чтобы сложен, но явно не прост, за что получил прозвище brain damage format'а (формата, срывающего крышу и обламывающего кайф). Для экономии места длина отрезка и номер начального кластера хранятся в полях переменной длины. То есть, если размер отрезка умещается в байт (т.е. его значение не превышает 255), он и хранится в байте. Соответственно, если размер отрезка требует для своего представления двойного слова, он и хранится в двойном слове. Сами же поля размеров хранятся в 4-байтовых ячейках, называемых нибблами (nibble) или полубайтами. Шестнадцатеричная система исчисления позволяет легко переводить байты в нибблы и наоборот. Младший ниббл равен (X & 15), а старший - (X / 16). Легко видеть, что младший ниббл соответствует младшему шестнадцатеричному разряду байта, а старший - старшему. Например, 69h состоит из двух нибблов - младший равен 9h, а старший - 6h. Список отрезков представляет собой массив структур, каждая из которых описывает характеристики " своего" отрезка, а в конце списка находится завершающий нуль. Первый байт структуры состоит из двух полубайтов: младший задает длину поля начального кластера отрезка (условно обозначаемого буквой F), старший - количество кластеров в отрезке (L). Поле длины отрезка идет следом. В зависимости от значения L оно может занимать от одного до восьми байт (более длинные поля недопустимы). Первый байт поля стартового кластера файла расположен по смещению 1 + L байт от начала структуры (что соответствует 2 + 2 * L нибблам). Кстати говоря, в документации Linux-NTFS Project (версия 0.4) поля размеров начального кластера и количества кластеров в отрезке перепутаны местами.
Структура одного элемента списка отрезков.
Покажем, как с этим работать на практике. Допустим, мы имеем следующий run-list, соответствующий нормальному нефрагментированному файлу (что может быть проще!): " 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. Отсчитываем четыре байта от начала run-list'а и переходим к декодированию следующего отрезка: 32h - два байта на поле длины отрезка (равное в данном случае 0114h) и три байта на поле номера начального кластера (0211E5h). Следовательно, второй отрезок (run 2) начинается с кластера 0211E5h и продолжается вплоть до кластера 0211E5h + 114h = 212F9h. Третий отрезок (run 3): 31h - один байт на поле длины и три байта на поле начального кластера, равные 42h и 0300AAh соответственно. Поэтому третий отрезок (run 3) начинается с кластера 0300AAh и продолжается вплоть до кластера 0300AAh + 42h = 300ECh. Завершающий нуль на конце run-list'а сигнализирует о том, что это последний отрезок в файле. Таким образом, подопытный файл состоит из трех отрезков, разбросанных по диску в следующем живописном порядке: 342573h - 3425ABh; 0211E5h - 212F9h; 0300AAh - 300ECh. Остается только прочитать его с диска!
Начиная с версии 3.0, NTFS поддерживает разряженные (sparse) атрибуты, т.е. такие, которые не записывают на диск кластеры, содержащие одни нули. При этом поле номера начального кластера отрезка может быть равным нулю, что означает, что данному отрезку не выделен никакой кластер. Поле длины содержит количество кластеров, заполненных нулями. Их не нужно считывать с диска. Вы должны самостоятельно изготовить их в памяти. Кстати говоря, далеко не все дисковые доктора знают о существовании разряженных атрибутов (если атрибут разряжен, его флаг равен 8000h), и интерпретируют нулевую длину поля номера начального кластера весьма странным образом. Последствия такого " лечения" обычно оказываются очень печальными. Пространства имен (name spaces) NTFS изначально проектировалась как системно-независимая файловая система, способная работать со множеством различных подсистем: win32, MS-DOS, POSIX и т.д. Поскольку каждая из них налагает свои собственные ограничения на набор символов, допустимых для использования в имени файла, NTFS вынуждена поддерживать несколько независимых пространств имен (name space). POSIX Допустимы все UNICODE-символы (с учетом регистра), за исключением символа нуля (NULL), обратного слеша ('/') и знака двоеточия (': '). Последнее, кстати говоря, не ограничение POSIX, а ограничение NTFS, использующей этот символ для доступа к именованным атрибутам. Максимально допустимая длина имени составляет 255 символов. Win32 Доступны все UNICOE-символы (без учета регистра), за исключением следующего набора: '" ' (кавычки), '*' (звездочка), '/' (прямой слеш), ': ' (двоеточие), '< ' (знак меньше), '> ' (знак больше), '? ' (вопросительный знак), '\' (обратный слеш), '|' (символ конвейера). К тому же, имя файла не может заканчиваться на точку или пробел. Максимально допустимая длина имени составляет 255 символов. MS-DOS Доступны все символы пространства имен win32 (без учета регистра), за исключением: '+' (знак плюс), ', ' (знак запятая), '.' (знак точка), '; ' (точна с запятой), '=' (знак равно). Имя файла не должно превышать восьми символов, за которыми следует необязательное расширение с длиной от одного до трех символов.
|