2012-09-24 94 views
0

我有一个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 

回答

0

如果您的设备io_service_t在变量_device,那么代码看起来像:

CFTypeRef _thing_you_want = IORegistryEntrySearchCFProperty(_device, kIOServicePlane, CFSTR("locationID"), NULL, kIORegistryIterateParents); 

去这里的更多信息:

http://developer.apple.com/library/mac/#documentation/devicedrivers/conceptual/AccessingHardware/AH_IOKitLib_API/AH_IOKitLib_API.html

+1

这似乎确实是我想要的,但它不在父母中找到任何东西('_thing_you_want = NULL'),尽管它会愉快地找到驱动程序本身的属性,比如'IOClass'。 – Inductiveload

+1

'kIORegistryIterateRecursively'另外需要作为函数的最后一个参数中的OR'd标志来查找比父级更高的驱动程序。 – Inductiveload