首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >核心音频用户空间插件驱动程序沙箱防止数据交互从另一个进程

核心音频用户空间插件驱动程序沙箱防止数据交互从另一个进程
EN

Stack Overflow用户
提问于 2015-10-15 01:21:34
回答 1查看 2.5K关注 0票数 9

我正在开发一个基于developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html示例的核心音频用户空间hal插件

在插件实现中,我计划从另一个进程(即CFMessagePort )获取音频数据。

但是,在试图创建端口CFMessagePortCreateLocal的控制台中出现了以下错误.

sandboxd251:(2597) coreaudiod(2597)拒绝马赫寄存器com.mycompnay.audio

我做了一些搜索,然后来到了这篇文章。

技术问答QA1811 index.html关于在plist中添加AudioServerPlugIn_MachServices,但仍然没有成功。

我还需要做些什么(比如添加权利、代码符号),或者这不是正确的方法。我不确定MesssagePort机制是否在沙箱下继续工作。XPC服务是否可行?

非常感谢你抽出时间。任何帮助都是非常感谢的。

更新1:

我应该创建一个远程端口,而不是音频插件中的本地端口。尽管如此,在plist中使用AudioServerPlugIn_MachServices属性。现在没有sandboxd559:(552) coreaudiod(552)在控制台中拒绝马赫查找/注册消息。

但是,在我的音频hal插件(客户端)中,我有

CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService"); CFMessagePortRef port = CFMessagePortCreateRemote(kCFAllocatorDefault, port_name);端口返回值为0。我在一个不同的应用程序中尝试过这个,它运行得很好。

这是我的服务器端:

代码语言:javascript
运行
复制
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.apple.audio.DriverHelper1314:插件名为SimpleAudioPlugIn.driver,需要扩展名为com.mycompnay.audio.XPCService的mach服务的沙箱。

有人知道为什么吗?

更新2

我注意到,当我使用带有coreaudiod的调试模式时,它确实成功地获得了mach服务的对象引用。(在我尝试xpc_service方法时也发生了同样的事情) 项目方案设置

有人吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-15 13:05:27

我很确定我在我的AudioServerPlugIn中遇到了同样的问题。我可以查找并使用我尝试过的每一个Mach服务,除了我创建的那些服务。而我所创造的那些都是从一个正常的过程中正常工作的。

最后,我阅读了达莫诺明,并发现coreaudiod (它承载HAL插件)正在使用全局引导命名空间,但是我的服务被注册到每个用户的引导命名空间中。而且由于“使用全局命名空间的进程只能看到全局名称空间中的服务”,所以我的插件无法看到我的服务。

您可以使用launchctl来测试这一点,方法是让它运行注册服务的程序,但使用与coreaudiod相同的引导命名空间。你可能需要无根残疾。

代码语言:javascript
运行
复制
# launchctl bsexec $(pgrep coreaudiod) your_service_executable

在运行时,再尝试从您的插件连接。

从daemons图标的表2中可以看到,只有launchd守护进程使用全局引导命名空间。这就解释了为什么coreaudiod会使用它。我认为这意味着您的Mach服务需要由launchd守护进程创建。

要创建一个launchd.plist,请在/Library/LaunchDaemons中为您的服务创建一个one。将其所有者设置为root:wheel,并使其只能由所有者写。在其中,设置MachServices键并添加服务名称:

代码语言:javascript
运行
复制
<key>MachServices</key>
<dict>
    <key>com.mycompany.audio.XPCService</key>
    <true/>
</dict>

然后注册它:

代码语言:javascript
运行
复制
# launchctl bootstrap system /Library/LaunchDaemons/com.mycompany.audio.XPCService.plist

这就是我最后得到的结果:com.bearisdriving.BGM.XPCHelper.plist.template。注意,如果没有UserName/GroupName键,守护进程将作为root运行。( 我的服务插件的代码也在回购中,以防有帮助。)

不幸的是,我最终不得不使用XPC,但我首先尝试了CFMessagePort,它运行得很好。

无论插件是否签名,似乎都能很好地工作。不过,正如您所说的,您确实需要在您的AudioServerPlugIn_MachServices中使用Info.plist密钥。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33138275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档