Получить имя файла из смещения объема или сектора (Windows)

Я разрабатываю драйвер фильтра верхнего тома, он отслеживает блоки чтения/записи тома. Я получаю от него смещение тома и 1-й сектор (LBA), когда происходит какое-либо чтение/запись. Как я могу получить имя файла из смещения тома или 1-го сектора с помощью C/C++? Любая помощь приветствуется. Заранее спасибо.


person Jorge Chon    schedule 11.07.2012    source источник
comment
На таком низком уровне этой информации не существует. Это как если бы вам вручили атом углерода и спросили: от какого животного произошел этот атом?   -  person Raymond Chen    schedule 11.07.2012
comment
На самом деле я получаю смещение тома и 1-й сектор измененных файлов, но я не понимаю, как узнать, какой файл присутствует в этом секторе или смещении тома. Есть ли способ, который может помочь мне узнать любую информацию о файле с помощью секторов или смещения. Драйвер, который я разработал, находится на уровне громкости (верхний фильтр громкости) и ничего не знает о файлах, он имеет дело с блоками, секторами или смещением. Но в то же время я также хочу узнать имя файла в этих блоках. Вот и задал такой вопрос. Есть ли способ в C/C++?   -  person Jorge Chon    schedule 12.07.2012


Ответы (2)


Это почти возможно, вроде. Вы можете перечислить все файлы на томе, используя этот код. (Внимание! некоторые функции printf используют %lu вместо %I64u, поэтому некоторая печатаемая информация неверна, в первую очередь номера ссылок на файлы. основная логика в порядке.)

Для каждого найденного файла вы можете использовать FSCTL_GET_RETRIEVAL_POINTERS, чтобы найти его местоположение на диске.

Таким образом, вы можете создать базу данных заранее. Вы можете обновлять его в основном с помощью FSCTL_READ_USN_JOURNAL вместо того, чтобы постоянно пересканировать весь диск.

Однако, даже идентифицировав файл, который раньше находился в данном месте, вам нужно будет снова проверить его, если он был перемещен. Журнал USN, вероятно, не записывает, когда файлы перемещаются на диске без логического изменения.

И даже в этом случае нет гарантии, что файл не был перемещен, а затем возвращен обратно до того, как вы его проверили. Или файл может быть создан, а затем снова удален, прежде чем вы вообще сможете собрать для него какие-либо данные.

Итак, по существу: Нет. Вы не можете этого сделать.

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

person Harry Johnston    schedule 13.07.2012
comment
Привет, спасибо за помощь, не могли бы вы рассказать, как я могу сверить вывод, который я получил от FSCTL_GET_RETRIEVAL_POINTERS, с выводом FSCTL_READ_USN_JOURNAL. Заранее спасибо. - person Jorge Chon; 17.07.2012
comment
FSCTL_READ_USN_JOURNAL показывает изменения (новые, удаленные, измененные файлы) с момента первоначального перечисления файлов на томе. Это не имеет ничего общего с проверкой вывода FSCTL_GET_RETRIEVAL_POINTERS. Ответ по-прежнему нет, вы не можете этого сделать. - person Harry Johnston; 17.07.2012
comment
Также FSCTL_GET_RETRIEVAL_POINTERS можно использовать для поиска местоположения конкретного файла на диске, но как я могу найти местоположение каждого файла на диске. На самом деле я спрашиваю, как я могу получить имена всех файлов и узнать их местоположение. - person Jorge Chon; 19.07.2012
comment
Самая первая строка моего ответа содержит ссылку на код, который перечисляет все файлы на томе. - person Harry Johnston; 19.07.2012
comment
Привет, я использовал твой код, и он работает..! Но когда я выполняю ваш код, счетчик файлов показывает 88183 файла, всего нет. отображаемых имен файлов составляет около 8200, а в проводнике Windows отображается около 78 265 файлов. Почему такая большая разница? - person Jorge Chon; 23.07.2012
comment
Подсчет файлов в MFT включает каталоги, а также обычные файлы, тогда как Explorer, как мне кажется, считает файлы и каталоги отдельно. Проводник также будет учитывать только файлы, к которым имеет доступ текущий пользователь, есть некоторые каталоги, доступ к которым пользователям по умолчанию заблокирован. Написанный код показывает информацию только для файлов с именем test.txt (и родительских каталогов), поэтому, возможно, поэтому вы не видите имя файла, отображаемое для каждого учитываемого файла? - person Harry Johnston; 24.07.2012
comment
Привет, я закомментировал строку, которая показывает информацию только для файла test.txt. Вот так, //if (wcsncmp(filename, L"test.txt", 8) != 0) return; - person Jorge Chon; 24.07.2012
comment
Привет, также можно прочитать $LogFile? Если да, то как мы можем это прочитать? - person Jorge Chon; 24.07.2012
comment
Вы закомментировали строку выше этой, которая проверяет, что длина имени файла составляет ровно 8 символов? (Я понятия не имею, можно ли читать $LogFile.) - person Harry Johnston; 24.07.2012
comment
Привет, нет, я не комментировал эту строку. Должен ли я тоже прокомментировать эту строку? - person Jorge Chon; 24.07.2012
comment
Эй, я прокомментировал эту строку, и теперь она показывает почти все файлы. Но все же вопрос, если я печатаю имя файлов из функции show_record (USN_RECORD * record), то он показывает 89707 файлов, из функции check_record(USN_RECORD * record) показывает 88205 файлов. количество файлов составляет 88207 файлов. Почему существует разница в файлах между функцией 2, а также в количестве файлов? - person Jorge Chon; 24.07.2012
comment
Привет, я вижу только имена файлов, возможно ли отобразить имя файла с полным путем, используя этот код? - person Jorge Chon; 24.07.2012
comment
Привет, Можете ли вы сказать, что на самом деле делает эта функция printf, printf("FileName: %.*ls\n", filenameend - filename, filename);. Как я могу добавить вывод этого в одну переменную? - person Jorge Chon; 24.07.2012
comment
Это становится немного многословным для системы комментариев. Мой адрес электронной почты указан в моем профиле, пожалуйста, свяжитесь со мной там. - person Harry Johnston; 25.07.2012

FSCTL_LOOKUP_STREAM_FROM_CLUSTER делает то, что вы хотите, но это медленно.

person Bruno Martinez    schedule 03.05.2016