IOCreatePlugInInterfaceForService 因 kIOReturnNoResources/0xe00002be 失败

问题描述 投票:0回答:2

IOCreatePlugInInterfaceForService 使用 kIOReturnNoResources/0xe00002be 失败

我正在将旧的基于 FireWire 的命令行实用程序重写为 XPCService。我需要一些有关 IOKit 功能的帮助。

  • 以下部分是获取FireWireAVCLibUnit的IOCFPlugInInterface。
    (与原始代码几乎相同;基本思想来自遗留的simpleAVC示例代码)。
  • 当我在 XPCService 中调用
    IOCreatePlugInInterfaceForService()
    时,它总是无法在 IOReturn.h 中返回
    0xe00002be = kIOReturnNoResources
  • 我已确认 XPC 服务没有沙箱、没有强化。
  • 原始命令行实用程序在 macOS 10.14 上完美运行,有人能给我关于这个主题的提示吗?

CFDictionaryRef dict = CFDictionaryCreateCopy(kCFAllocatorDefault, self.dict);
kern_return_t result = IOServiceGetMatchingServices(kIOMasterPortDefault, dict, &serviceIterator);
if (result == KERN_SUCCESS && serviceIterator != IO_OBJECT_NULL) {
    while ((service = IOIteratorNext(serviceIterator)) != IO_OBJECT_NULL) {
        SInt32 score = 0;
        kern_return_t result = IOCreatePlugInInterfaceForService(service,
                                                                 kIOFireWireAVCLibUnitTypeID,
                                                                 kIOCFPlugInInterfaceID,
                                                                 &interface,
                                                                 &score);
        if (result != KERN_SUCCESS) continue;
        // result 0xe00002be = kIOReturnNoResources in IOReturn.h
        break;
    }
}

其他详细信息

我在 opensource.apple.com 中找到了 IOCFPlugIn.c。经过基本核实后, -

IOCreatePlugInInterfaceForService()
未能
IOCFPlugIn->Start()
.

(*iunknown)->QueryInterface(iunknown, CFUUIDGetUUIDBytes(interfaceType),
                    (LPVOID *)&interface);
<snip>
kr = (*interface)->Probe(interface, plist, service, &score);
<snip>
haveOne = (kIOReturnSuccess == (*interface)->Start(interface, plist, service));
  • Probe() 返回了 kIOReturnSuccess,
  • Start() 失败,kIOReturnNoDevice = 0xe00002c0。并且haveOne = false。
  • 最后 IOCreatePlugInInterfaceForService() 返回 kIOReturnNoResources = 0xe00002be。

这与 macOS 上的某些安全功能有关吗?


已修改

  • 我发现带有相机访问的强化运行时被拒绝 FireWireAVCLibUnit(tccd 显示错误)。
  • 即使没有沙箱,没有检查 Xcode 中 XPC 服务的硬化,XPCservice 也是通过沙箱处理的。 (macOS 10.14.6 + Xcode 10.3)
  • 如果您有建议,我将不胜感激。
macos iokit
2个回答
2
投票

我找到了解决方案。
- 在Info.plist中添加NSCameraUsageDescription,IOFireWireAVCUserClient就可以工作了。
- 如果沙箱化,还需要 com.apple.security.device.firewire。


即使功能沙箱关闭,tccd 也会验证 info.plist。
如果“隐私 - 摄像头使用说明”不可用,则沙盒拒绝使用 IOFireWireAVCUserClient 设备。

信息属性列表键参考/Cocoa键


0
投票

添加 com.apple.security.device.usb : YES 到 plist 解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.