【发布时间】:2015-02-09 09:34:04
【问题描述】:
如何借助 Mac OSX IO Kit 库识别 USB 端口上连接的设备是否为大容量存储设备?让我们在 Mac OSX 系统上连接一个示例 USB 键盘和 USB 闪存驱动器。如何仅区分大容量 USB 设备?
【问题讨论】:
-
IOKit 编程指南会告诉你。 IOKit 是一个非常典型的集合和获取键值游戏。 IOKit 中有多种类型的设备。开始阅读并开始查看标题。这将非常容易。
如何借助 Mac OSX IO Kit 库识别 USB 端口上连接的设备是否为大容量存储设备?让我们在 Mac OSX 系统上连接一个示例 USB 键盘和 USB 闪存驱动器。如何仅区分大容量 USB 设备?
【问题讨论】:
您可以使用磁盘仲裁框架的DADiskCopyIOMedia function 访问与特定磁盘对应的 IOService 节点(IOMedia 对象)。您可以从那里向上走 IOService 树到您的 IOUSBInterface/IOUSBDevice。
或者,您可以使用 I/O 套件匹配来通过其 IOKit 类查找系统中的所有 USB 大容量存储或 USB 连接的 SCSI (UAS) 节点。键盘也是如此(它们是 I/O Kit 的 HID 系列的一部分)。
我建议在 IORegistryExplorer 中查看系统的 IOService 树。
【讨论】:
long usbSubDeviceClass = kUSBMassStorageRBCSubClass;<br> numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &usbSubDeviceClass); CFDictionarySetValue(matchingDict, CFSTR(kUSBDeviceSubClass), numberRef);
IOUSBMassStorageClass 是 USB 大容量存储接口和设备的驱动类名称,IOUSBAttachedSCSI 是 UAS 的驱动类名称。据我所知,它们都充当 IOUSBInterface 和 IOUSBDevice nubs 的客户端。它们还在它们下面生成一个 SCSI 设备树。