Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 获取驱动程序的属性';父母(或祖先)_Macos_Usb_Device Driver_Scsi_Kernel Extension - Fatal编程技术网

Macos 获取驱动程序的属性';父母(或祖先)

Macos 获取驱动程序的属性';父母(或祖先),macos,usb,device-driver,scsi,kernel-extension,Macos,Usb,Device Driver,Scsi,Kernel Extension,我有一个USB连接的自定义SCSI设备的驱动程序,它实现了一些特定于供应商的命令。每个USB设备承载多个SCSI LUN。这可以很好地工作,但根据设备对SCSI LUN进行分组存在问题,从IOSCSILogicalUnitNub级别开始(我的驱动程序继承自该级别),没有将LUN链接在一起的标识功能(有SCSI逻辑单元号,但每个新设备都会发生冲突;它们都有一个单元0x0) 我想根据USBlocationID字段(或任何其他唯一密钥)将它们链接起来,但我不知道如何获取父USB设备,因为只有匹配SCS

我有一个USB连接的自定义SCSI设备的驱动程序,它实现了一些特定于供应商的命令。每个USB设备承载多个SCSI LUN。这可以很好地工作,但根据设备对SCSI LUN进行分组存在问题,从
IOSCSILogicalUnitNub
级别开始(我的驱动程序继承自该级别),没有将LUN链接在一起的标识功能(有SCSI逻辑单元号,但每个新设备都会发生冲突;它们都有一个单元0x0)

我想根据USB
locationID
字段(或任何其他唯一密钥)将它们链接起来,但我不知道如何获取父USB设备,因为只有匹配SCSI驱动程序的
io_服务\u t
。这也最好在应用程序端完成,而不是在驱动程序中完成,因为应用程序需要跟踪哪个服务具有哪些LUN,并且由哪个处理程序实例打开

IO注册表中的层次结构是:

MyUSB-SCSI Device@fd130000
 |-IOUSBCompositeDriver
 |-Mass Storage Class Interface@0     (has location ID 0xfd130000)
   |-IOUSBMassStorageClass
     |-IOSCSILogicalUnitNub@0         (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
     |
     |-IOSCSILogicalUnitNub@0
       |-com_Company_driver_MyDriver
         |-IOBlockStorageServices
           |-Manuf Device Media
             |-IOMediaBSDClient

如果设备的io_服务在变量_device中,则代码如下所示:

CFTypeRef _thing_you_want = IORegistryEntrySearchCFProperty(_device, kIOServicePlane, CFSTR("locationID"), NULL, kIORegistryIterateParents);
点击此处了解更多信息:


这似乎正是我想要的,但在父母身上找不到任何东西(
\u thing\u you\u want=NULL
),虽然它会很高兴地找到驱动程序本身的属性,例如
IOClass
kioregistryiteraterrursely
,但函数还需要在最后一个参数中添加OR'd标志,以查找高于父级的驱动程序。