Подскажите плз наиболее простой способ, как определить номера секторов/кластеров на логическом диске, в которых хранятся разные метаданные нужного нам файла в системе NTFS(время последнего открытия/изменения, серия кластеров и т.д.). Насколько помню, эти метаданные в NTFS начинаются с символов "FILE", потом следуют различные атрибуты файла. Спасибо за помощь!
Чтение MFT с открытого в RAW режиме диска и парсинг записей MFT. Сигнатура FILE имеется у файловых записей, тогда как остальные свойства (называемые аттрибуты), делятся на резидентные и нерезидентные. В каждой MFT находятся ссылки на аттрибуты файла, которые в свою очередь, могут находиться где угодно (если нерезидентные) и в самой FILE record (резидентные).
MFT record можно получить и документированным способом, без прямого чтения диска - FSCTL_GET_NTFS_FILE_RECORD http://msdn.microsoft.com/en-us/library/aa364568
Уважаемые, всем спасибо! 2Partner: отличные новости что есть документированный способ. Но всё-таки возвращаясь к парсеру, есть ли какая-либо документация по НТФС(например, книга Керри "Криминалистический Анализ файловых систем" или другие), которая позволит написать парсер, корректно работающий под икспи и вистой?
ntfs-3g - с исходниками есть Partner Получив MFT запись таким образом, все равно придется доставать аттрибуты нерезидентные (потоки и прочее) руками - если речь идет о просто данных файла - тогда все более или менее документировано и в статьях есть примеры (3 способа чтения занятых файлов, в число которых входит и прямое чтение с помощью полученной карты кластеров, занятых файлом), но топикстартер пишет про метаданные.
На выходе парсера должны быть метаданные файла, резидентные и нерезидентные аттрибуты. Самое трудное состоит в том, чтобы найти MFT Record который соответствует заданному фиксированному файлу, т.е. на входе имеем полный путь, например, D:\Trash\poem.txt, а на выходе должен быть номер кластера, в котором расположена запись МФТ, соответствующая этому файлу poem.txt. Как я понял FSCTL_GET_NTFS_FILE_RECORD эту трудность не решает...
Документированых способов нет. Придется все делать ручками. Или обратить внимание на уже существующие исходники. Алгорит нахождения индекса файла в MFT следующий. 1. Разбиваем полный путь на составляющие. 2. Считываем содержимое корневой директории. (MFT номер 5) 3. Ищем первую часть пути файла. 4. Если нашли считываем эту директорию и т.д. рекурсивно.
Нашел более простой способ - GetFileInformationByHandle(FileHandle, &FileInfo) Для NTFS индекс файла в MFT получаем следующим образом: ULONGLONG FileIndex = ((((ULONGLONG) FileInfo.nFileIndexHigh) <<32) + FileInfo. nFileIndexLow) & 0x0000FFFFFFFFFFFF; А дальше FSCTL_GET_NTFS_FILE_RECORD и содержимое MFT record у нас в карма.. т.е. в буфере.
2Partner: Громадный респект за более простой способ!!! Я уже начал думать, что действительно ВСЕ придется делать ручками... Ещё раз большое спасибо!
2Partner: индекс файла в МФТ как-нибудь связан с номером сектора/кластера в МФТ, в котором хранится МФТ Рекорд данного файла? Интересно, какую информацию можно извлечь из индекса как такового, не используя FSCTL_GET_NTFS_FILE_RECORD....
Индекс файла это просто порядковый номер записи в MFT (48 младших бит) и счетчик изменений файла (16 старших бит). Больше ничего.
В кернел моде $MFT (и все мета файлы) без проблем открываются NtCreateFile. В юзер моде, возможно, придется поиграться c правами/привелегиями.
Вот тут для меня проблема возникает. Вообще нет пока ни одной идеи как играться с правами/привилегиями и при помощи каких функций и т.д...