Нет API для чтения напрямую из $ Secure, точно так же, как нет API для чтения напрямую из $ MFT. (Есть FSCTL_QUERY_FILE_LAYOUT, но это просто дает вам абстрактную интерпретацию содержимого MFT.)
Поскольку вы сказали, что можете читать $ MFT, похоже, что вы используете дескриптор громкости для чтения непосредственно с тома, как chkdsk и подобные инструменты. Это позволяет вам читать все, что вы хотите, при условии, что вы знаете, как интерпретировать структуры на диске. Таким образом, ваш вопрос сводится к тому, как правильно интерпретировать файл $ Secure.
Я не буду давать вам фрагменты кода или точные структуры данных, но я дам вам очень хорошие советы. На самом деле возможны два подхода.
Первый подход - вы можете сканировать вперед в $ SDS. Все дескрипторы безопасности находятся в порядке SecurityId. Вы обнаружите, что в различных 16-байтовых выровненных смещениях будет 20-байтовый заголовок, который включает в себя SecurityId среди другой информации, и после этого есть дескриптор безопасности в сериализованной форме. Значения SecurityId будут отображаться в порядке возрастания в $ SDS. Также каждая альтернативная область 256 КБ в $ SDS является зеркалом предыдущей области 256 КБ. Чтобы сократить работу пополам, рассмотрим только регионы 0..256K-1, 512K..768K-1 и т. Д.
Второй подход заключается в использовании индекса $ SII, также являющегося частью файла $ Secure. Структура этого B-дерева очень похожа на структуру каталогов в NTFS. Записи индекса в $ SII имеют SecurityId в качестве индекса для поиска, а также содержат смещение байтов, к которому вы можете перейти в $ SDS, чтобы найти соответствующий заголовок и дескриптор безопасности. Этот подход будет более производительным, чем сканирование $ SDS, но требует, чтобы вы знали, как интерпретировать гораздо больше структур.