GWBas1c Ответов: 2

Учитывая идентификатор файла NTFS, есть ли какой-либо официальный способ получить имена файлов


Если у меня есть идентификатор файла NTFS, есть ли официальный способ получить имена файлов из этого идентификатора файла? (Кроме сканирования каждого файла на жестком диске...?)

Похоже, что я могу, по крайней мере, проверить, что идентификатор файла действителен, вызвав NtCreateFile, хотя в документации Microsoft есть большое жирное предупреждение о том, что API может быть изменен.

2 Ответов

Рейтинг:
1

Uilleam

Ладно, просто попробую это сделать, не могли бы вы использовать OpenFileById OpenFileById [^]чтобы дать вам ручку, тогда GetFileInformationByHandleEx [^]для возврата FILE_NAME_INFO[^]структура?

Я бы подумал, что есть способ получить имя непосредственно из идентификатора, но, возможно, эта возможность отсутствует, потому что идентификаторы файлов повторно используются системой, поэтому один и тот же идентификатор не всегда будет указывать на один и тот же файл с течением времени. Если система статична (только для чтения), это не будет проблемой, но все же, вероятно, это не очень хорошая практика.


Рейтинг:
1

Member 4348204

В NTFS сам файл $MFT имеет запись для каждого файла. Этот идентификатор файла имеет 16 бит и 48-бит индексного файла $MFT. FileId => [seq << 48 | mft_index]. Вы можете читать записи $MFT с помощью

DeviceIoControl(hVolume, FSCTL_GET_NTFS_FILE_RECORD, ...)
приобретать
NTFS_FILE_RECORD_OUTPUT_BUFFER
и получить доступ к его
FileRecordBuffer
член, который содержит информацию NTFS для fileId в файле
FileReferenceNumber
параметр системы
NTFS_FILE_RECORD_OUTPUT_BUFFER
соответствие с
NTFS_FILE_RECORD_INPUT_BUFFER
если только имя файла не является недопустимым.

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

Другими словами, данный fileId может ссылаться на несколько "имен файлов", если на него указывает несколько жестких ссылок. Таким образом, каноническое имя-это первая жесткая ссылка, найденная в атрибутах ключ-значение записи $MFT, которая затем проходит назад/вверх по родительскому дереву каталогов, чтобы построить канонический путь к файлу.