USB устройството се показва два пъти в IORegistryExplorer, когато е изключено - като живо и като прекратено

Имам USB устройство, за което съм разработил kext без код, за да предпазя OS ​​X от превантивно улавяне. Kext просто кара устройството да съвпада с различен kext в IOBluetoothFamily.kext.

Забелязвам странно поведение, когато изпълнявам следното:

  • Рестартирайте само за да изчистите IO регистъра.
  • Стартирайте IORegistryExplorer.
  • Включете устройство, вземете: регистрирано, съответстващо, активно със запазване 10, заето 0.
  • Изключете устройството, записът става червен (прекратен обект).
  • Актуализирайте системния регистър: Прекратеният обект остава (както се очаква). Също така непрекратен обект се показва със същото съдържание като прекратения, освен че не е регистриран, не съответства, не е активен, запазва 4, заето 2.
  • Изчистване на прекратени обекти - само червеният запис ще изчезне. Другият запис остава.

Не изпълнявам друго приложение, което би имало достъп до устройството.

Възможно ли е kext, с който съвпадам, да има грешка?


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 и отказва прекратяването, или има множество родители в IO регистъра. Може да искате да опитате да използвате 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