在Xcode中连接客户端和DriverKit

vuktfyat  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(148)

在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)。

whlutmcx

whlutmcx1#

空迭代器是IOServiceGetMatchingServices在没有匹配的服务时的有效输出(不幸的是?)。不能保证它在没有匹配的服务时为空,但你必须接受它作为可能的输出。
例如,下面的小程序在我的系统上触发了一个null迭代器:

#include <IOKit/IOKitLib.h>
#include <stdio.h>

int main()
{
    io_iterator_t iterator = IO_OBJECT_NULL;
    IOReturn ret = IOServiceGetMatchingServices(MACH_PORT_NULL,
        IOServiceNameMatching("MadeUpNameThatDefinitelyDoesntExist"), &iterator);
    printf("IOServiceGetMatchingServices -> 0x%x, iterator = 0x%x\n", ret, iterator);
    if (iterator != IO_OBJECT_NULL)
        IOObjectRelease(iterator);
}

字符串
运行时:

$ ./matching-services-null-iterator 
IOServiceGetMatchingServices -> 0x0, iterator = 0x0


例如,当你的驱动程序没有匹配任何设备时,你可能不希望有匹配的服务,所以你应该能够通过在没有插入设备的情况下运行代码来重现这个问题。

相关问题