Привет. Во время исследования файловых систем иногда возникает задача определения, какому файлу принадлежит искомый сектор или кластер файловой системы.
Где это может быть нужно?
Навскидку придумаем различные сценарии, где такая тема может быть полезна:
- Программы низкоуровневого тестирования жёсткого диска обнаружили Bad Sector (не читаемый блок) и нужно узнать, на какой файл приходится этот сектор, чтобы понять, потеряна критически важная информация или нет.
- При помощи “глубокого поиска” прямо в дампе диска в каком-то секторе обнаружили текстовую строку и хотелось бы узнать, находится эта строка в каком-либо файле или в “свободном месте”.
- Некая программа работы с дисками выдала результат, выражаемый в номерах сектора (LBA) и нужно более-менее адекватно привязать номер сектора к файлу.
Сценарии могут быть различными, задачи – творческими. Важно, чтобы мы понимали, что такая операция возможно и могли применить её там, где нужно.
План действий
Определились с целями, переходим к действиям. Покажу я реализацию пары сценариев, дальше, по аналогии, можете уже сами:

Вот у нас на скриншоте приведён вариант, в котором файл ChromeSetup.exe начинается с логического сектора № 2542432.
Поможет нам найти файл (допустим, что мы знаем только номер сектора) миниатюрная программа NFI.EXE.

Работать с программой очень просто – на вход подаётся буква диска и номер логического сектора. На выходе имеем порядковый номер файла, путь и значения атрибутов. А также номера всех секторов, занятых данным файлом. Кстати, здесь же (в данном конкретном случае) мы видим два атрибута $DATA (второй с именем потока “Zone.Identifier”), что означает, что файл был скачан из Интернета. Ну какая-никакая, а информация.
Здесь я не зря упомянул слово “логического”, если имеется ввиду логический сектор, то отсчёт ведётся от начала раздела. Если же речь идёт о физическом секторе, то считать будем от начала диска. Это ключевой момент, потому как если мы будем выяснять, какой файл повреждён бэд-блоком, то Victoria выдаст нам физический номер сектора (от начала диска) и придётся применить некоторую арифметику, отняв от физического номера сектор начала раздела.
Сразу приведу пример. Вот на том же скрине (WinHEX) в правой части окна видим физический номер сектора – 2749280. А теперь глянем на границы раздела:

2749280 – 206848 = 2542432 в аккурат.
Т.е. если Victoria нам покажет нечитаемый сектор № 2749280 – то это как раз первый сектор нашего файла. А если она покажет сектор между 2048 и 206848, то это вообще не на этом разделе, а на Partition 1 исходя из скриншота. Надеюсь, понятно. Если не очень, то вот схема:

Весь диск делится на разделы (и может быть незанятое место), Victoria оперирует секторами всего диска, а программы вроде NFI – секторами в пределах раздела. Перевести одни в другие не составит труда, если знать границы раздела. Узнать их можно при помощи множества программ. В частности – WinHEX.
Теперь, что касается кластеров. Кластер – более крупная единица выделения, чем сектор. Размер кластера = N * размер сектора. Довольно часто в качестве N выбирается число 8, таким образом, что размер кластера становится равен 4096 байт (4 Кбайт). В самом деле, возьмите небольшой файлик и посмотрите его свойства:

Наверняка замечали, что размер файла фактический и размер на диске отличаются? (На диске – будет как раз кратный размеру кластера), а фактический – равен размеру атрибута $DATA. Всё дело в том, под файл выделяется минимум 1 кластер. И второй файл в этот кластер уже не может быть записан (при обычных условиях), даже если размер позволяет.
Вернёмся к поиску файлов по номеру кластера. Мне удалось найти файл по номеру только на живой системе, на примонтированном разделе пока не получилось.

fsutil volume querycluster E: 55901
Покажет файл, которым занят кластер № 55901 на разделе E:
Comments: