Я разрабатываю драйвер фильтра верхнего тома, он отслеживает блоки чтения/записи тома. Я получаю от него смещение тома и 1-й сектор (LBA), когда происходит какое-либо чтение/запись. Как я могу получить имя файла из смещения тома или 1-го сектора с помощью C/C++? Любая помощь приветствуется. Заранее спасибо.
Получить имя файла из смещения объема или сектора (Windows)
Ответы (2)
Это почти возможно, вроде. Вы можете перечислить все файлы на томе, используя этот код. (Внимание! некоторые функции printf используют %lu
вместо %I64u
, поэтому некоторая печатаемая информация неверна, в первую очередь номера ссылок на файлы. основная логика в порядке.)
Для каждого найденного файла вы можете использовать FSCTL_GET_RETRIEVAL_POINTERS
a>, чтобы найти его местоположение на диске.
Таким образом, вы можете создать базу данных заранее. Вы можете обновлять его в основном с помощью FSCTL_READ_USN_JOURNAL
a> вместо того, чтобы постоянно пересканировать весь диск.
Однако, даже идентифицировав файл, который раньше находился в данном месте, вам нужно будет снова проверить его, если он был перемещен. Журнал USN, вероятно, не записывает, когда файлы перемещаются на диске без логического изменения.
И даже в этом случае нет гарантии, что файл не был перемещен, а затем возвращен обратно до того, как вы его проверили. Или файл может быть создан, а затем снова удален, прежде чем вы вообще сможете собрать для него какие-либо данные.
Итак, по существу: Нет. Вы не можете этого сделать.
(Могут быть некоторые сценарии, в которых возможно другое решение. Например, если ваш драйвер может сделать снимок содержимого тома в интересующей вас точке, вы можете изучить снимок, чтобы определить рассматриваемый файл. хотя у вас есть собственный стек NTFS. Возможно, вы сможете позаимствовать код NTFS из Linux. По сути, это еще больше усилий, чем оно того стоит.)
//if (wcsncmp(filename, L"test.txt", 8) != 0) return;
- person Jorge Chon; 24.07.2012
show_record (USN_RECORD * record)
, то он показывает 89707 файлов, из функции check_record(USN_RECORD * record)
показывает 88205 файлов. количество файлов составляет 88207 файлов. Почему существует разница в файлах между функцией 2, а также в количестве файлов?
- person Jorge Chon; 24.07.2012
printf("FileName: %.*ls\n", filenameend - filename, filename);
. Как я могу добавить вывод этого в одну переменную?
- person Jorge Chon; 24.07.2012
FSCTL_LOOKUP_STREAM_FROM_CLUSTER делает то, что вы хотите, но это медленно.