我有一个USB连接的自定义SCSI设备的驱动程序,它实现了一些供应商特定的命令。每个USB设备承载多个SCSI LUN。这很快乐,但根据设备对SCSI LUN进行分组存在问题,从IOSCSILogicalUnitNub
级别开始(我的驱动程序继承自),没有将LUN链接在一起的标识功能(有SCSI逻辑单元号,但是它们会碰撞每个新设备;它们都有一个单元0x0)。获取驱动程序父级(或祖先)的属性
我想按照USB locationID
字段(或任何其他唯一键)将它们全部链接起来,但我不知道如何获得父USB设备,只给出匹配的io_service_t
SCSI驱动程序。在应用程序方面而不是在驱动程序方面,这也会更好,因为应用程序需要跟踪哪个服务具有哪个LUN并且由该处理程序的哪个实例打开。
在IO注册的层次是:
MyUSB-SCSI [email protected]
|-IOUSBCompositeDriver
|-Mass Storage Class [email protected] (has location ID 0xfd130000)
|-IOUSBMassStorageClass
|[email protected] (has SCSI LUN number, unique in this device, but not globally)
| |-com_Company_driver_MyDriver (my driver)
| |-IOBlockStorageServices
| |-Manuf Device Media (these are strings from the device firmware)
| |-IOMediaBSDClient
|
|[email protected]
|-com_Company_driver_MyDriver
|-IOBlockStorageServices
|-Manuf Device Media
|-IOMediaBSDClient
这似乎确实是我想要的,但它不在父母中找到任何东西('_thing_you_want = NULL'),尽管它会愉快地找到驱动程序本身的属性,比如'IOClass'。 – Inductiveload
'kIORegistryIterateRecursively'另外需要作为函数的最后一个参数中的OR'd标志来查找比父级更高的驱动程序。 – Inductiveload