Как мне прочитать таблицу основных файлов NTFS в C (*не* C++)?

Мне нужен простой и легкий способ чтения 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. Но это слишком медленно для моих целей.


person Cade Bryant    schedule 08.01.2019    source источник
comment
Видел Как получить доступ к MFT через C# ? Для этого требуется довольно много работы, я бы не подумал, что реализация на C будет проще, чем на C++/#.   -  person Alex K.    schedule 08.01.2019
comment
Я попробовал инструкции в stackoverflow.com/questions/21661798/, но продолжал сталкиваться с ошибками разрешений, даже когда я запускал код с повышенными правами администратора.   -  person Cade Bryant    schedule 08.01.2019
comment
Анализ структуры каталога не только медленный... он потенциально проблематичен, поскольку вы можете оказаться в рекурсивном обходе из-за символических ссылок. Чтение MFT - это просто боль в шее, но это очень быстро. Код в вышеупомянутом ответе может прочитать MFT за пару секунд. Любая проблема с разрешениями может быть связана с тем, что вы должны отстаивать некоторые привилегии в дополнение к тому, что вы являетесь администратором.   -  person Clay    schedule 08.01.2019
comment
@АлексК. Я попытался снова, используя код в Как нам получить доступ к MFT через C# Но все равно получаю ошибку Windows 5 (отказано в доступе).   -  person Cade Bryant    schedule 08.01.2019