我目前正在使用 USBDriverKit 框架为基于 USB 的外部大容量存储设备开发 DEXT。 IOUSBHostInterface 用作与接口端点通信的提供者,我成功了。根据 IOUSBHostInterface 文档,
要使用主机接口对象,请调用 Open 在接口和驱动程序之间创建新会话。成功打开会话后,您可以从接口请求信息并设置管道以与接口的端点进行通信。请记住关闭您在驱动程序的 Stop 方法中打开的会话。
但是,调用Open获得对USB接口的独占访问权,并且不允许其他服务访问该接口。此外,要放弃独占访问,可以调用 Close,但在 Stop 方法中,该方法在扩展的生命周期内(当 DEXT 卸载时)仅调用一次。
因此,Apple 的大容量存储相关的 KEXT(特别是与媒体和分区相关的)与接口不匹配,因此只要 DEXT 与接口匹配,相关驱动器的文件系统就不会被安装。
一旦调用 Close,独占访问就会丢失,Apple 的驱动程序会立即接管接口匹配(一旦发生这种情况,文件系统就会重新安装)。因此,调用 Close 然后尝试重新打开该界面的会话似乎也不起作用,因为 DEXT 不再与该界面匹配。
这种独占访问是 USBDriverkit 的限制吗?或者在这种情况下有什么方法可以解决这个问题吗?
这种独占访问是 USBDriverkit 的限制吗?或者在这种情况下有什么方法可以解决这个问题吗?
是的,这是 USBDriverKit 的一个基本限制。但它的存在有一个很好的理由:当另一个驱动程序也在使用 USB 接口并期望事情仍然有效时,您无法向 USB 接口发出 USB 请求。写入是一回事,但读取如何进行?如果大容量存储驱动程序和您的驱动程序在提交批量写入后都对批量读取进行排队,那么设备或操作系统将如何确保正确的读取进入正确的驱动程序?
可能的解决方法是:
来自评论:
我正在尝试使用 BOT 协议通过 USB 发送 SCSI 供应商命令。早些时候,通过将 IOSCSIPeripheralNub 作为提供程序,这可以通过 KEXT 实现(在这种情况下,Apple 的大容量存储驱动程序也在驱动程序堆栈中,因为不存在独占访问的情况)。
这正是 SCSIPeripheralsDriverKit 的用途。在 UserSendCDB
子类中调用
IOUserSCSIPeripheralDeviceType00
方法您应该能够处理供应商特定的命令。
[...]当 Apple 的 IOUSBMassStorageUASDriver 与 IOUSBHostInterface 匹配时 [...]
好吧,现在你在谈论 UAS,而你之前说你想使用 BOT。如果在 UAS 模式下不支持供应商命令,而仅在 BOT 模式下,它会变得很棘手,但由于它在 kext 下工作得很好,我怀疑实际上可能不是这种情况,并且命令将在 UAS 模式下工作?
虽然问题中没有提到,但我注意到有一个 iPadOS 标签。自 17.1 起,上述所有可能的解决方案都不可能在 iPadOS 上实现。该平台根本不提供必要的 SCSI 框架。