IOCreatePlugInInterfaceForService 使用 kIOReturnNoResources/0xe00002be 失败
我正在将旧的基于 FireWire 的命令行实用程序重写为 XPCService。我需要一些有关 IOKit 功能的帮助。
IOCreatePlugInInterfaceForService()
时,它总是无法在 IOReturn.h 中返回 0xe00002be = kIOReturnNoResources
。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));
这与 macOS 上的某些安全功能有关吗?
已修改
我找到了解决方案。
- 在Info.plist中添加NSCameraUsageDescription,IOFireWireAVCUserClient就可以工作了。
- 如果沙箱化,还需要 com.apple.security.device.firewire。
即使功能沙箱关闭,tccd 也会验证 info.plist。
如果“隐私 - 摄像头使用说明”不可用,则沙盒拒绝使用 IOFireWireAVCUserClient 设备。
信息属性列表键参考/Cocoa键
添加 com.apple.security.device.usb : YES 到 plist 解决此问题。