Не знаю, почему мой kext OS X с более низкой оценкой теста сопоставляется

Я пытаюсь выборочно проверять и отключать определенные USB-устройства. Для этой цели я написал драйвер IOUSBInterface, который определяет подстановочные знаки для idProduct, idVendor и bcdDevice. Каждый раз, когда я не хочу отключить данное устройство, я устанавливаю probeScore в 0 и возвращаюсь.

Подход probeScore работает почти во всех случаях, и я вижу, как мой драйвер рассматривает каждое USB-устройство по очереди в system.log. Но в случае USB-хост-контроллера Bluetooth ядро ​​прикрепляет к нему мой драйвер, несмотря на то, что моя оценка проверки равна 0. Для сравнения, если моего драйвера нет, хост-контроллер Bluetooth USB соответствует оценке проверки, равной 90 000.

Это правда, что мой драйвер указывает OSBundleRequired как Root, но хост-контроллер Bluetooth USB указывает OSBundleRequired как Safe Boot, что, казалось бы, ставит их в один ряд. С другой стороны, у меня те же проблемы Yosemite Bluetooth, что и у других, и моя Bluetooth-мышь не отвечает до тех пор, пока я не войду в систему, предполагая, что USB-хост-контроллер Bluetooth может не загружаться до окончания загрузки.


person Neil Steiner    schedule 30.09.2015    source источник
comment
У меня включен FileVault 2 на машине, что может повлиять на то, что видно перед разблокировкой моего диска. Когда я загружаюсь в однопользовательском режиме и пытаюсь явно загрузить /System /Library/Extensions/IOBluetoothFamily.kext/Contents/PlutIns/BroadcomBluetoothHostControllerUSBTransport.kext, я получаю сообщение об ошибке неверной подписи, хотя у системы нет проблем с загрузкой этого драйвера после входа в систему. Возможно, мне нужно задать этот вопрос на Задать вопрос другому.   -  person Neil Steiner    schedule 01.10.2015
comment
Инструмент командной строки kextcache имеет флаг -print-diagnostics, который может помочь определить проблему.   -  person pmdj    schedule 02.10.2015
comment
@pmdj У меня проблемы с kextcache. Я пробовал sudo kextcache -system-caches -print-diagnostics -v 6 и некоторые другие варианты, но не нашел того, что искал. Какое использование вы имели в виду?   -  person Neil Steiner    schedule 05.10.2015
comment
Это показало бы любую причину, по которой загрузка вашего kext может не работать. Очевидно, что нет. Смотрите мой ответ о том, что, как я подозреваю, может происходить.   -  person pmdj    schedule 21.10.2015


Ответы (1)


Полностью переписанный ответ, так как я неправильно понял вопрос

Во-первых, из первых уст:

"Обратите внимание, что никогда не следует добавлять собственное свойство IOProbeScore в список свойств драйвера USB".

Вероятно, поэтому вы не испытываете особого удовольствия от тестового результата. (Обратите внимание, что приведенная выше рекомендация относится только к USB-устройствам; не обращайте внимания на Thunderbolt и т. д.)

Если изменение вашего словаря соответствия личности, чтобы он не соответствовал рассматриваемому устройству, нецелесообразно (похоже, вы хотите решить во время выполнения, так что это веская причина), тогда переопределите метод probe() вашего драйвера и выборочно верните this или NULL из него в зависимости от хотите ли вы, чтобы ваш (блокирующий) драйвер требовал устройство или нет. Возврат NULL из probe() всегда должен работать - если это вызывает проблемы, скорее всего, у вас где-то есть ошибка в коде.

person pmdj    schedule 21.10.2015
comment
Может, у нас тут недопонимание? Я использую 10.10 и kext-dev-mode, и моя проблема не в том, что мой kext не загружается, а в том, что он захватывает оборудование, обычно управляемое хост-контроллером Bluetooth USB, даже когда я вернуть отрицательный результат матча. Раньше я пытался вернуть NULL, но по пути у меня возникла паника, поэтому я подумал, что, возможно, было бы более изящно вернуть невероятно низкую оценку. - person Neil Steiner; 23.10.2015
comment
Аааа, хорошо, вы правы, я неправильно понял ваш вопрос. Если вы хотите, чтобы драйвер Apple взял на себя управление, то, если сужение критериев соответствия нецелесообразно, возвращение NULL из вашего переопределенного probe() действительно является лучшим способом не соответствовать. Если это вызывает панику, то в вашем коде есть ошибка; это не свойственно отклонению зонда. Общеизвестно, что IOProbeScore ненадежен для USB-устройств, поэтому я не очень удивлен, что вы не испытываете от этого особой радости. - person pmdj; 23.10.2015
comment
Хорошо, я обновил свой ответ на что-то, что, надеюсь, будет полезно. Если у вас все еще возникают сбои после возврата NULL, не стесняйтесь задавать еще один вопрос, и я сделаю все возможное, чтобы диагностировать. :-) Извините за погоню за дикими гусями. - person pmdj; 23.10.2015
comment
спасибо, это имеет смысл. Я могу смело возвращать NULL всякий раз, когда не хочу завладевать устройством, и я буду игнорировать неприглядные записи *::probe fails в system.log. И у меня нет IOProbeScore в моем plist, так что на этот счет у нас все хорошо. - person Neil Steiner; 23.10.2015