core audio user-space plug-in driver-sandbox предотвращает взаимодействие данных с другим процессом

Я работаю над плагином coreaudio user-space HAL на основе примера developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html

в реализации плагина я планирую получить аудиоданные из другого процесса, т. е. CFMessagePort

однако я получил следующую ошибку в консоли, пытаясь создать порт CFMessagePortCreateLocal...

sandboxd[251]: ([2597]) coreaudiod (2597) запретить Mach-регистр com.mycompnay.аудио

Я сделал некоторые googlging и пришел к этой статье

технические вопросы QA1811 https://developer.apple.com/library/mac/qa/qa1811/_index.html о добавлении AudioServerPlugIn_MachServices в plist, но по-прежнему без успеха.

есть ли что-то еще, что мне нужно сделать, чтобы сделать эту работу (например, добавление прав, код-знак), или это неправильный подход.? Я не уверен, что механизм MesssagePort работает больше под песочница. будут ли службы XPC жизнеспособными?

большое спасибо за ваше время. Любая помощь очень ценится


обновление 1:

Я должен создавать удаленный порт вместо локального в аудио плагине. Сказав это, с атрибутом AudioServerPlugIn_MachServices в plist. теперь нет sandboxd[559]: ([552]) coreaudiod (552) deny mach-поиск / Регистрация сообщение в консоли.

однако, в моем аудио hal плагин (на стороне клиента) у меня

CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService"); CFMessagePortRef port = CFMessagePortCreateRemote(kCFAllocatorDefault, port_name); port возвращает значение 0. Я пробовал это в другом приложении, и он работает просто отлично.

Это моя серверная сторона:

CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef  port = CFMessagePortCreateLocal(kCFAllocatorDefault, port_name, &callback, NULL, NULL);
CFRunLoopSourceRef runLoopSource =
CFMessagePortCreateRunLoopSource(nil, port, 0);

CFRunLoopAddSource(CFRunLoopGetCurrent(),
                   runLoopSource,
                   kCFRunLoopCommonModes);
CFRunLoopRun();

Я получил консольное сообщение об этом.

com.яблоко.звуковой.DriverHelper[1314]: плагин с именем SimpleAudioPlugIn.драйвер требует расширения песочницы для службы mach с именем com.mycompnay.звуковой.XPCService

кто-нибудь знает почему??


обновление 2

Я заметил, что когда я использую режим отладки с coreaudiod, он успешно получает ссылку на объект Службы mach. (то же самое произошло, когда я пытался использовать подход xpc_service) Настройка схемы проекта

кого??

1 ответов


Я уверен, что столкнулся с теми же проблемами в моем AudioServerPlugIn. Я мог посмотреть вверх и использовать каждую услугу Mach, которую я пытался, за исключением тех, которые я создал. И те, которые я создал, работали нормально из регулярного процесса.

в конце концов я прочитал в Daemonomicon и понял, что coreaudiod (на котором размещены Плагины HAL) использовало глобальное пространство имен bootstrap, но моя служба была зарегистрирована в пространстве имен bootstrap для каждого пользователя. И с "процессы, использующие глобальное пространство имен, могут видеть службы только в глобальном пространстве имен" мой плагин не мог видеть мою службу.

можно использовать launchctl чтобы проверить это, запустив программу, которая регистрирует вашу службу, но с тем же пространством имен bootstrap, что и coreaudiod. Вам, вероятно,нужно будет отключить rootless.

# launchctl bsexec $(pgrep coreaudiod) your_service_executable

С этим работает, попробуйте снова подключить плагин.

из таблицы 2 в Демономиконе, вы видно, что только демоны launchd используют глобальное пространство имен bootstrap. Это объясняет, почему coreaudiod использует его. И я думаю, это означает, что ваш сервис Mach должен быть создан демоном launchd.

чтобы сделать один, создайте launchd.файл plist к вашим услугам /Library/LaunchDaemons. Установите его владельца в root:wheel и сделать его доступным только для записи владельцем. В нем установите MachServices ключ и добавить название вашего сервиса:

<key>MachServices</key>
<dict>
    <key>com.mycompany.audio.XPCService</key>
    <true/>
</dict>

затем зарегистрировать это:

# launchctl bootstrap system /Library/LaunchDaemons/com.mycompany.audio.XPCService.plist

это то, что я закончил с: com.bearisdriving.ФОНОВАЯ МУЗЫКА.XPCHelper.файл plist.шаблон. Обратите внимание, что без UserName/GroupName ключи демон будет работать как root. (Код мои услуги и плагин также находится в этом РЕПО, если это полезно.)

к сожалению, мне пришлось использовать XPC, но сначала я попробовал CFMessagePort, и он работал нормально.

кажется, что все работает нормально подписан плагин или нет. Хотя, как вы говорите, вам нужен AudioServerPlugIn_MachServices введите свою информацию.файл plist.