在Xcode项目中(macOS应用程序),我正在使用DriverKit(和HIDDriverKit)框架。我在客户端应用程序和驱动程序之间的连接中遇到了问题,这是由“IOKit”框架实现的。通过调用函数“IOServiceGetMatchingServices”,“迭代器”的值正确返回,然后与驱动程序进行通信。但是,在TestFlight上发布版本后,在某些系统上,“迭代器”的值返回0,并且不可能与驱动程序通信。我用命令“systemextensionsctl list”检查了激活的驱动程序的状态,驱动程序端没有问题,并且“Enabled”和“Active”的值用星号标出。
AppSandbox = True,SIP:enable
ret = IOServiceGetMatchingServices(kIOMainPortDefault, IOServiceNameMatching(dextIdentifier), &iterator);
if (ret != kIOReturnSuccess)
{
goto fail;
}
while ((service = IOIteratorNext(iterator)) != IO_OBJECT_NULL) {
ret = IOServiceOpen(service, mach_task_self(), 0, &connection);
if(ret == kIOReturnSuccess)
{
break;
}
else
{
syslog(LOG_WARNING, "Error");
}
IOObjectRelease(service);
}
字符串
“ret”的返回值始终为0(kIOReturnSuccess),但“iterator”为null(0)。
1条答案
按热度按时间whlutmcx1#
空迭代器是
IOServiceGetMatchingServices
在没有匹配的服务时的有效输出(不幸的是?)。不能保证它在没有匹配的服务时为空,但你必须接受它作为可能的输出。例如,下面的小程序在我的系统上触发了一个null迭代器:
字符串
运行时:
型
例如,当你的驱动程序没有匹配任何设备时,你可能不希望有匹配的服务,所以你应该能够通过在没有插入设备的情况下运行代码来重现这个问题。