如何手动将所有插入式USB设备连接到MacBook

如何手动将所有插入式USB设备连接到MacBook,c,swift,macos,usb,C,Swift,Macos,Usb,我的问题是我想手动处理USB设备插入时的处理方式。我不想让操作系统对插入的USB设备做任何事情,只想在它们插入时通知我它们的类型和ID。从那里,我可以选择合适的驱动程序来应用它,或者用自定义代码手动处理它 我读过MacOS是如何处理USB的,上面说: 如果你想让你的驱动被选中,你所需要做的就是为你的驱动添加键值对,这样你的驱动就会得到很高的分数。通常只需输入供应商id/型号的密钥就足够了。但是,我认为您可以覆盖匹配方法(设备驱动程序是用一组受限的C++编写的)来给您的驱动程序一个非常高的分数 我

我的问题是我想手动处理USB设备插入时的处理方式。我不想让操作系统对插入的USB设备做任何事情,只想在它们插入时通知我它们的类型和ID。从那里,我可以选择合适的驱动程序来应用它,或者用自定义代码手动处理它

我读过MacOS是如何处理USB的,上面说:

如果你想让你的驱动被选中,你所需要做的就是为你的驱动添加键值对,这样你的驱动就会得到很高的分数。通常只需输入供应商id/型号的密钥就足够了。但是,我认为您可以覆盖匹配方法(设备驱动程序是用一组受限的C++编写的)来给您的驱动程序一个非常高的分数

我还发现了以下3个库,用于获取有关USB驱动器中的内容的通知:

我只是不确定在发生任何事情之前(在自动选择并应用任何设备驱动程序之前),这些库是否会中断操作系统对所有USB设备的处理。我不希望发生任何事情,除了我可以访问上面的库中的设备及其类型,但我不确定他们是否会这样做

除此之外,我还没有太多的代码:

var usb = require('usb')
usb.getDeviceList()
但我想,在操作系统已经选择并应用了默认驱动程序之后,这将解决插入式设备的问题。我想这样做:

usb.blockDefaultOSDeviceHandler()
usb.on('device:plugged_in', function(data){
  if (data.type == 'keyboard') {
    if (data.modelNumber == '123') {
      // allow
      usb.applyKeyboardDriver('abc', data.modelNumber)
      usb.on('keyboard:event', logKeyboardEvent)
    } else {
      throw new Error('Unrecognized device')
    }
  } 
})
我希望库能够中断操作系统的所有默认行为,这样我就可以自己处理插入USB设备时应该做的事情。原因之一是USB设备可能是一个键盘,它会自动开始输入一些键。我想知道这是一个键盘,需要一个密码和一个我预先批准的特定驱动程序。诸如此类

我想在操作系统应用其默认处理规则之前访问任何新插入的USB设备。然后能够编写代码,手动处理每个插入设备的操作


如果只有在C中才有可能,那么知道如何在C中实现这一点将比node.js更好


答案在苹果关于USB设备的文档中。基本上,您希望覆盖自定义驱动程序中的
probe
函数,让它返回最高分数,以便覆盖所有其他驱动程序,并像正常一样实现驱动程序。是一些关于驱动程序选择和实例化过程的有用文档

在使用设备或任何服务提供商之前,必须找到其驱动程序并将其加载到内核中。I/O工具包定义了一个灵活的三阶段匹配过程,将候选驱动程序池缩小到一个或多个驱动程序。最终候选人(如果有多个候选人,则为m 然后加载ost(一个)并给予第一次机会来管理设备或服务提供商

每个被视为可加载内核扩展(KEXT)的设备驱动程序必须定义一个或多个个性,以指定它可以支持的设备类型

因为一个驱动程序可以包含多个匹配字典,每个字典为驱动程序定义不同的个性,所以可以为不同的设备加载相同的驱动程序代码。出于竞争的目的,I/O工具包将每个个性都视为一个驱动程序。如果在任何单一个性中,该系列所需的所有属性都匹配,则会加载驱动程序代码并为该设备提供运行机会

人格的一个共同特征是探索分数。探针分数是一个整数,反映驱动程序是否适合驱动特定设备。驾驶员的个性中可能有一个初始探针分数值,并且可以实现一个探针功能,该功能允许驾驶员根据其是否适合驾驶设备来修改该默认值。与其他匹配值一样,探测分数特定于每个族。这是因为,一旦匹配过程超过了班级匹配阶段,只有来自同一个家庭的人物才能参与竞争。有关探测分数和驱动程序在探测功能中所做操作的更多信息,请参阅设备探测

在启动时以及添加或删除设备时,每个检测到的设备(或其他服务提供商)都会执行驱动程序匹配过程。该过程在设备或服务的/System/Library/Extensions中动态定位最合适的驱动程序

如架构概述一章中的驱动程序匹配所述,当总线控制器驱动程序扫描其总线并检测到连接到总线的新设备时,将触发匹配过程。对于每个检测到的设备,控制器驱动程序都会创建一个nub。然后,I/O工具包启动匹配过程,并从设备获取用于匹配的值(例如,检查PCI寄存器)。为nub找到合适的驱动程序后,将注册并加载该驱动程序。该驱动程序可以创建自己的nub(可能通过从其家族继承的行为),从而启动匹配过程以找到合适的驱动程序

匹配过程如下所示:

  • 在类匹配步骤中,I/O工具包通过消除提供商服务(即nub)的任何错误类的驱动程序,缩小了潜在驱动程序列表的范围。例如,当搜索USB驱动程序时,可以排除SCSI类的所有驱动程序对象
  • 在被动匹配步骤中,驾驶员的个性(在驾驶员的