Macos Don';I don’我不知道为什么我的OS X kext的探测分数更低

Macos Don';I don’我不知道为什么我的OS X kext的探测分数更低,macos,bluetooth,iokit,kernel-extension,Macos,Bluetooth,Iokit,Kernel Extension,我试图有选择地屏蔽和禁用某些USB设备。为此,我编写了一个iBinterface驱动程序,为idProduct、idVendor和bcdDevice指定通配符。只要我不想禁用给定设备,我就将probeScore设置为0并返回 probeScore方法在几乎所有情况下都有效,我可以看到我的驱动程序依次在system.log中考虑每个USB设备。但在蓝牙USB主机控制器的情况下,内核将我的驱动程序连接到它,尽管我的探测分数为0。相比之下,如果我的驱动程序不存在,则Bluetooth USB主机控制器

我试图有选择地屏蔽和禁用某些USB设备。为此,我编写了一个
iBinterface
驱动程序,为
idProduct
idVendor
bcdDevice
指定通配符。只要我不想禁用给定设备,我就将
probeScore
设置为0并返回

probeScore
方法在几乎所有情况下都有效,我可以看到我的驱动程序依次在
system.log
中考虑每个USB设备。但在蓝牙USB主机控制器的情况下,内核将我的驱动程序连接到它,尽管我的探测分数为0。相比之下,如果我的驱动程序不存在,则Bluetooth USB主机控制器的探测分数为90000


的确,我的驱动程序将
OSBundleRequired
指定为
Root
,但蓝牙USB主机控制器将
OSBundleRequired
指定为
安全引导
,这似乎使它们处于相同的地位。另一方面,我和其他人一样也有Yosemite蓝牙问题,我的蓝牙鼠标在登录后才响应,这表明蓝牙USB主机控制器可能在启动后才加载。

完全重写了答案,因为我误解了这个问题

首先

“请注意,您不应将自己的IOProbeScore属性添加到USB驱动程序的属性列表中。”

这可能就是为什么你对探针分数不太满意的原因。(请注意,上述建议仅适用于USB设备;不考虑Thunderbolt等)


如果修改您的个性匹配词典使其与所讨论的设备不匹配是不切实际的(听起来您想在运行时做出决定,所以这是一个很好的理由),那么覆盖您的驱动程序的
probe()
方法,并根据您是否需要(拦截器)有选择地从中返回
this
NULL
驱动程序是否认领设备。从
probe()
返回
NULL
应该总是有效的-如果它引起了问题,您的代码中很可能有错误。

我确实在机器上启用了FileVault 2,这可能会影响解锁驱动器之前的可见内容。当我以单用户模式启动并尝试显式加载
/System/Library/Extensions/IOBluetoothFamily.kext/Contents/PlutIns/broadcombluethostcontrollerusbtransport.kext
时,即使系统在登录后加载该驱动程序时没有问题,我也会收到一个无效的签名错误。也许我需要问这个问题。
kextcache
命令行工具有一个
-print diagnostics
标志,这可能有助于查明问题。@pmdj我在使用kextcache时遇到了一些问题。我尝试了
sudo-kextcache-system-caches-print diagnostics-v6
和其他一些选项,但没有找到我想要的。你想到了什么用法?它会告诉你为什么加载kext可能不起作用。显然没有。看看我对可能发生的事情的回答。我们是否有沟通失误?我使用的是10.10和kext开发模式,我的问题不是kext无法加载,而是它捕获了通常由Bluetooth USB主机控制器驱动的硬件,即使我返回了一个负的匹配分数。我之前试过返回空分,但一路上有些恐慌,所以我认为返回一个难以置信的低分可能更优雅。啊,好吧,你是对的,我误解了你的问题。如果你想让苹果的驱动程序接管,那么如果缩小匹配标准是不现实的,那么从被覆盖的
probe()
返回
NULL
确实是不匹配的最佳方式。如果这引起了恐慌,那么代码中就有一个bug;拒绝探针不是天生的。IOProbeScore对于USB设备来说是出了名的不可靠,所以我并不十分惊讶您从中没有多少乐趣。好的,我已经更新了我的答案,希望它有用。如果您在返回
NULL
后仍有崩溃,请随意打开另一个问题,我会尽力诊断。:-)对不起,这是白费力气。谢谢,这是有道理的。只要我不想接管一个设备,我就可以随意返回NULL,并且我会忽略system.log中难看的“*::probe fails”条目。我的成绩不好,所以我们在这方面做得很好。