Мне нужен простой и легкий способ чтения NTFS MFT на сервере Windows, используя только C. Моя цель - программным способом вернуть набор каталогов и их разрешения для приложения, которое разрабатывает моя компания.
Каждый другой ответ, который я исследовал на StackOverflow и других местах, связан с использованием C++ или других языков и, как правило, очень раздут. Я почти уверен, что то, что я хочу, можно сделать всего несколькими строками кода, используя Windows API для вызова CreateFile (для получения дескриптора корневого тома) и DeviceIoControl (для чтения MFT). Но я не могу найти для этого простого решения C.
Обратите внимание, что, хотя я много лет являюсь разработчиком C# /. NET (а также знаю другие языки, включая Java и Python), я новичок в низкоуровневом программировании на C и вызовах Windows API. Я также понимаю, что есть бесплатный Mft2Csv, который делает именно это. Но фактический исходный код мне недоступен для реинжиниринга (GitHub имеет только исполняемые и вспомогательные файлы).
Я также понимаю, что могу просто проанализировать дерево каталогов, используя C# пространства имен .NET System.IO и System.Security.AccessControl. Но для моих целей это слишком медленно.
Я пробовал инструкции в stackoverflow.com/questions/21661798/…, но продолжал сталкиваться с ошибками разрешений, даже когда запускал код с повышенными правами администратора.
Анализ директории tress не только медленный ... он потенциально проблематичен, поскольку вы можете оказаться в рекурсивном обходе из-за символических ссылок. Чтение MFT - это просто головная боль, но это очень быстро. Код в вышеупомянутом ответе может прочитать MFT за пару секунд. Любая проблема с разрешениями может быть связана с тем, что вам нужно подтвердить некоторые привилегии в дополнение к тому, что вы являетесь администратором.
@AlexK. Я снова попытался использовать код из Как получить доступ к MFT через C#, но все равно получаю ошибку Windows 5 (доступ запрещен).





Видели Как получить доступ к MFT через C#? Для этого требуется довольно много работы, я бы не подумал, что реализация на C будет проще, чем реализация на C++ / #.