2015-11-05 10 views
3

У меня есть часть программного обеспечения, которое работает на Windows. Программное обеспечение имеет два компонента: драйвер файловой системы minifilter, который работает в режиме ядра и компонент пользовательского режима, который говорит с драйвером. Драйвер получает уведомления о запросах прерывания ввода-вывода, например IRP_MJ_READ. Пример приложения, который это делает, можно найти на github. Это работает для любого пользователя и большинства файловых систем, поддерживаемых Windows.Как получить уведомления о том, что файл читается в OS X?

Мне нужно разработать аналогичную часть программного обеспечения для OS X (только для настольных компьютеров и серверов). Вещи, которые я посмотрел на:

Мои оговорки: FSEvents может быть не очень производительным , так как мне нужно отслеживать корневую папку d любых установленных устройств. У меня очень ограниченное понимание очередей ядра и системных вызовов. Устранение API-интерфейсов может сильно затруднить перенос в разные версии OS X и может привести к конфликтам с защитой AV или ОС (например, упрочнение PaX).

Вопрос: как я могу получить уведомление о том, что файл в любом (рекурсивный) папку в корне / прочитаются любым пользователем на OS X?

+0

еще один вопрос для вас: собираетесь ли вы использовать песочницу или использовать ее в магазине приложений Mac? –

+0

Не уверен, что бы ни было легче и что бы это ни позволяло мне делать. Я думаю, что AV-файлы доступны через магазин, и песочница, вероятно, не позволит мне делать то, что мне нужно. – oleksii

ответ

4

С расширением ядра Kernel Authorization предоставляет File Operation Scope, что позволяет отслеживать действие KAUTH_FILEOP_OPEN для всех vnodes.

Перед вызовом всех файлов будет вызываться действие KAUTH_FILEOP_OPEN, что позволит вам контролировать доступ к файлам.

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

Пример кода для такого расширения ядра можно найти в Сингха Mac OS X Internals

1

Там нет ничего плохого с исполнением FSEvents; если вы используете Spotlight и/или Time Machine, он уже работает в вашей системе. Я был бы очень удивлен, если бы был более эффективный способ переопределить его с нуля. Поэтому, если он будет соответствовать вашим требованиям любым другим способом, я бы пошел с этим.

+0

FSEvents не предоставляет мне идентификатор процесса (или имя процесса) и идентификатор безопасности пользователя (или имя пользователя). Пример, которым я пользуюсь после: Боб читает файл в/tmp/banana с приложением bananareader.jar в 7:50. Я думаю, что FS-события могут только предоставить мне файл/tmp/banana, который был прочитан в 7:50. – oleksii