IOServiceGetMatchingServices()在热插拔后返回nil隐藏的迭代器

时间:2019-06-12 09:45:55

标签: macos iokit

我正在维护一个用于访问USB设备的库,该设备将自身注册为HID设备,并使Mac应用程序能够执行各种漂亮的操作(GPIO,I2C等)。该库可以在这里找到:

https://github.com/codemercs-com/io-warrior-mac

自从我将项目升级到MacOS 10.13 SDK后,从DeviceAdded回调中调用IOServiceGetMatchingServices()会返回nil迭代器对象,但不会返回错误代码。

我的假设是,自从我在2002年左右开始编写该库以来,IOKit中的某些方面已经发生了根本变化。

我正在这样注册我的“设备插入”回调:

 result = IOServiceAddMatchingNotification(gNotifyPort,
                                          kIOFirstMatchNotification, matchingDict,
                                          IOWarriorAdded, NULL, &gIOWarriorAddedIter);

Source

当插入受支持的设备时,确实会调用此回调,但是当我随后调用IOServiceGetMatchingServices时,迭代器为nil,或者-如果已经连接了其他设备,则仅包含这些设备,而不包含新的设备插入。

io_iterator_t IOWarriorFindHIDDevices ()
{
    CFMutableDictionaryRef hidMatchDictionary = IOWarriorSetUpHIDMatchingDictionary ();

    // Set up matching dictionary to search the I/O Registry for HID devices we are interested in. Dictionary reference is NULL if error.
    if (NULL == hidMatchDictionary) {
        PrintErrMsg ("Couldn't create a matching dictionary.");
        return 0;
    }

    io_iterator_t hidObjectIterator;

    // Now search I/O Registry for matching devices.
    IOReturn ioReturnValue = IOServiceGetMatchingServices (kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator);
    if (ioReturnValue != kIOReturnSuccess) {
        PrintErrMsgIfIOErr(ioReturnValue, "IOServiceGetMatchingServices returned error");
        return 0;
    }
    if (hidObjectIterator == 0) {
        PrintErrMsg("IOServiceGetMatchingServices returned nil hidObjectIterator");
        return 0;
    }

    return hidObjectIterator;
}

Source

在应用程序启动时遍历可用设备时,发现所有设备都很好。

任何想法,我可能在做什么错,在这里?

0 个答案:

没有答案