如何开发 DEXT 以使用 USBDriverKit 将供应商 SCSI 命令发送到 USB 大容量存储设备?

问题描述 投票:0回答:1

我目前正在使用 USBDriverKit 框架为基于 USB 的外部大容量存储设备开发 DEXT。 IOUSBHostInterface 用作与接口端点通信的提供者,我成功了。根据 IOUSBHostInterface 文档,

要使用主机接口对象,请调用 Open 在接口和驱动程序之间创建新会话。成功打开会话后,您可以从接口请求信息并设置管道以与接口的端点进行通信。请记住关闭您在驱动程序的 Stop 方法中打开的会话。

但是,调用Open获得对USB接口的独占访问权,并且不允许其他服务访问该接口。此外,要放弃独占访问,可以调用 Close,但在 Stop 方法中,该方法在扩展的生命周期内(当 DEXT 卸载时)仅调用一次。

因此,Apple 的大容量存储相关的 KEXT(特别是与媒体和分区相关的)与接口不匹配,因此只要 DEXT 与接口匹配,相关驱动器的文件系统就不会被安装。

一旦调用 Close,独占访问就会丢失,Apple 的驱动程序会立即接管接口匹配(一旦发生这种情况,文件系统就会重新安装)。因此,调用 Close 然后尝试重新打开该界面的会话似乎也不起作用,因为 DEXT 不再与该界面匹配。

这种独占访问是 USBDriverkit 的限制吗?或者在这种情况下有什么方法可以解决这个问题吗?

macos usb iokit ipados driverkit
1个回答
0
投票

回答你的字面问题:

这种独占访问是 USBDriverkit 的限制吗?或者在这种情况下有什么方法可以解决这个问题吗?

是的,这 USBDriverKit 的一个基本限制。但它的存在有一个很好的理由:当另一个驱动程序也在使用 USB 接口并期望事情仍然有效时,您无法向 USB 接口发出 USB 请求。写入是一回事,但读取如何进行?如果大容量存储驱动程序和您的驱动程序在提交批量写入后都对批量读取进行排队,那么设备或操作系统将如何确保正确的读取进入正确的驱动程序?

可能的解决方法是:

  • 在您自己的驱动程序中完成一切。尽管 Apple 不推荐,但大多数情况下可以在 USBDriverKit 之上实现基于 SCSIControllerDriverKit 的驱动程序。因此,您可以实现一个驱动程序,正确地多路复用 SCSI 命令以及您想要执行的任何操作。
  • 退后一步,思考一下您试图在高层次上解决的情况和问题,而不是假设基于 USBDriverkit 的 dext 是实现它的方法。因此我在评论中提出了问题。

尝试解决您的实际问题:

来自评论:

我正在尝试使用 BOT 协议通过 USB 发送 SCSI 供应商命令。早些时候,通过将 IOSCSIPeripheralNub 作为提供程序,这可以通过 KEXT 实现(在这种情况下,Apple 的大容量存储驱动程序也在驱动程序堆栈中,因为不存在独占访问的情况)。

这正是 SCSIPeripheralsDriverKit 的用途。在 UserSendCDB

 子类中调用 
IOUserSCSIPeripheralDeviceType00
方法您应该能够处理供应商特定的命令。

[...]当 Apple 的 IOUSBMassStorageUASDriver 与 IOUSBHostInterface 匹配时 [...]

好吧,现在你在谈论 UAS,而你之前说你想使用 BOT。如果在 UAS 模式下不支持供应商命令,而仅在 BOT 模式下,它会变得很棘手,但由于它在 kext 下工作得很好,我怀疑实际上可能不是这种情况,并且命令将在 UAS 模式下工作?

iPadOS?

虽然问题中没有提到,但我注意到有一个 iPadOS 标签。自 17.1 起,上述所有可能的解决方案都不可能在 iPadOS 上实现。该平台根本不提供必要的 SCSI 框架。

© www.soinside.com 2019 - 2024. All rights reserved.