USB-устройство дважды отображается в IORegistryExplorer при отключении от сети - как действующее, так и отключенное

У меня есть USB-устройство, для которого я разработал кекст без кода, чтобы OS X не захватила его заранее. Kext просто заставляет устройство соответствовать другому kext в IOBluetoothFamily.kext.

Я замечаю странное поведение, когда выполняю следующие действия:

  • Перезагрузитесь, чтобы очистить реестр ввода-вывода.
  • Запустите IORegistryExplorer.
  • Подключите устройство, получите: зарегистрировано, сопоставлено, активно с сохранением 10, занято 0.
  • Отключите устройство, запись станет красной (прерванный объект).
  • Обновите реестр: Прерванный объект остается (как и ожидалось). Также отображается незавершенный объект с тем же содержимым, что и завершенный, за исключением того, что он не зарегистрирован, не соответствует, не активен, сохраняет 4, занят 2.
  • Очистить завершенные объекты - исчезнет только красная запись. Остается другая запись.

У меня нет других приложений, которые могли бы получить доступ к устройству.

Возможно ли, что в кексте, с которым я сопоставляю, есть ошибка?


person GTAE86    schedule 05.10.2011    source источник


Ответы (1)


По моему опыту, IORegistryExplorer (и USB Prober) имеют тенденцию сохранять объекты в живых (часто делая невозможным выгрузку kexts), закрытие IORegistryExplorer решает проблему.

person Hasturkun    schedule 05.10.2011
comment
Я наблюдаю такое же поведение с ioreg из командной строки. По мере того, как я подключаю / отключаю устройства, список неактивных устройств с ненулевым сохраненным счетчиком увеличивается. - person GTAE86; 05.10.2011
comment
Другое дело - я разработал приложение для работы с этими USB-устройствами. Я зарегистрировался для получения уведомления о добавлении / удалении устройства. Я получаю уведомление о добавлении всех своих устройств, но получаю уведомление об удалении только для первого. Может ли это быть связано с этим или это другая проблема? - person GTAE86; 05.10.2011
comment
@ GTAE86: вы можете задать это в новом вопросе, но в целом вы должны обычно получать kIOTerminatedNotification уведомления, когда kext завершается, если только он не реализует requestTerminate и не отклоняет завершение или не имеет нескольких родителей в реестре ввода-вывода. Вы можете попробовать использовать kextunload для принудительного завершения этих экземпляров (которые должны отправить уведомление). - person Hasturkun; 06.10.2011
comment
Я следил за несколькими моделями уведомлений устройств, которые видел в материалах Apple и в Интернете. Я зарегистрировался на kIOFirstMatchNotification (устройство добавлено) и kIOTerminatedNotification. Однако из другого примера я увидел вместо этого вызов IOSeviceAddInterestNotification при добавлении устройства, и этот код работает довольно хорошо. Я знаю, что kext не выгружается, когда я извлекаю свое устройство - не уверен, что это должно быть. - person GTAE86; 06.10.2011
comment
@ GTAE86: kexts выгружаются автоматически через некоторое время после исчезновения последнего экземпляра, а не мгновенно. Я предлагал kextunload посмотреть, не застревает ли ваш код, обрабатывающий уведомления. Я думаю, что основное различие между использованием IOSeviceAddInterestNotification и IOServiceAddMatchingNotification - это использование итератора. Вы можете убедиться, что выполняете итерацию на всем протяжении итератора, иначе уведомление не будет повторно активировано. - person Hasturkun; 06.10.2011
comment
Может быть проблема с итерацией, но у меня есть IteratorNext в do / while. Я изменил его на шаблон IOServiceAddInterestNotification, и он работает хорошо. Большая разница, которую я вижу между ними, заключается в том, что последний позволяет очень точно уведомлять о том, что происходит с данным устройством. - person GTAE86; 07.10.2011