Kernel USBInterfaceOpen始终报告kIOReturnExclusiveAccess错误

Kernel USBInterfaceOpen始终报告kIOReturnExclusiveAccess错误,kernel,usb,iokit,kernel-extension,Kernel,Usb,Iokit,Kernel Extension,最近我头痛地遇到了这个问题,我已经花了一个星期的时间在这个问题上,但还是失败了。希望你能帮我把这块石头踢开,非常感谢 我的问题是: 我们公司为iPhone生产USB存储设备,实际上这个存储设备中有SD卡。现在,我们想开发一个Mac应用程序来更新此存储设备的固件。但每次我将存储设备连接到Mac时,Mac都会自动挂载它,而且每次调用USBInterfaceOpen时,我总是会使用kioreturneExclusiveAccess失败 我还尝试编写一个无代码kext来增加探测分数,但它仍然不起作用。我

最近我头痛地遇到了这个问题,我已经花了一个星期的时间在这个问题上,但还是失败了。希望你能帮我把这块石头踢开,非常感谢

我的问题是: 我们公司为iPhone生产USB存储设备,实际上这个存储设备中有SD卡。现在,我们想开发一个Mac应用程序来更新此存储设备的固件。但每次我将存储设备连接到Mac时,Mac都会自动挂载它,而且每次调用USBInterfaceOpen时,我总是会使用kioreturneExclusiveAccess失败

我还尝试编写一个无代码kext来增加探测分数,但它仍然不起作用。我不知道我是走错了路,还是在编写无代码kext时犯了一些错误,例如,编写了一些错误的IOClass、错误的bundle ID

我的无代码kext info.plist是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>BuildMachineOSBuild</key>
  <string>14E46</string>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleIdentifier</key>
  <string>com.mophie.MyDriverTest3</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>MyDriverTest3</string>
  <key>CFBundlePackageType</key>
  <string>KEXT</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1.0.3</string>
  <key>DTCompiler</key>
  <string>com.apple.compilers.llvm.clang.1_0</string>
  <key>DTPlatformBuild</key>
  <string>6E35b</string>
  <key>DTPlatformVersion</key>
  <string>GM</string>
  <key>DTSDKBuild</key>
  <string>14D125</string>
  <key>DTSDKName</key>
  <string>macosx10.10</string>
  <key>DTXcode</key>
  <string>0640</string>
  <key>DTXcodeBuild</key>
  <string>6E35b</string>
  <key>IOKitPersonalities</key>
  <dict>
    <key>MyDriverTest3</key>
      <dict>
        <key>CFBundleIdentifier</key>
        <string>com.apple.iokit.IOUSBFamily</string>
        <key>IOClass</key>
        <string>IOService</string>
        <key>IOProviderClass</key>
        <string>IOUSBDevice</string>
        <key>bcdDevice</key>
        <string>256</string>
        <key>idProduct</key>
        <integer>4369</integer>
        <key>idVendor</key>
        <integer>6631</integer>
      </dict>
  </dict>
  <key>OSBundleRequired</key>
  <string>Root</string>
</dict>
</plist>    

BuildMachineOSBuild
14E46
CfBundledDevelopmentRegion
EN
CbundleIdentifier
com.mophie.MyDriverTest3
CbundleInfo字典版本
6
CFBundleName
MyDriverTest3
CbundlePackageType
基特
CFBundleSignature
????
循环流化床锅炉
1.0.3
DTC编译器
com.apple.compilers.llvm.clang.1_0
DTPlatformBuild
6E35b
数据平台版本
转基因的
DTSDKBuild
14D125
DTSDKName
macosx10.10
DTXcode
0640
DTXcodeBuild
6E35b
伊奥基特个性
MyDriverTest3
CbundleIdentifier
com.apple.iokit.iosbfamily
IOClass
丢失服务
IOProviderClass
电子设备
BCD设备
256
idProduct
4369
idVendor
6631
OSBundleRequired
根
以下是我的存储设备的ioreg结果:

space pack@1a122000  <class IOUSBDevice, id 0x100001773, registered, matched, active, busy 0 (300 ms), retain 9>
+-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100001775, !registered, !matched, active, busy 0, retain 4>
 +-o IOUSBInterface@0  <class IOUSBInterface, id 0x100001776, registered, matched, active, busy 0 (293 ms), retain 8>
  +-o IOUSBMassStorageClass  <class IOUSBMassStorageClass, id 0x100001777, registered, matched, active, busy 0 (201 ms), retain 9>
   +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x100001779, registered, matched, active, busy 0 (99 ms), retain 7>
    +-o IOSCSIPeripheralDeviceType00  <class IOSCSIPeripheralDeviceType00, id 0x10000177a, !registered, !matched, active, busy 0 (13 ms), retain 9>
     +-o IOBlockStorageServices  <class IOBlockStorageServices, id 0x10000177d, registered, matched, active, busy 0 (13 ms), retain 6>
      +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x10000177e, registered, matched, active, busy 0 (12 ms), retain 47>
       +-o mophie SpacePack Media  <class IOMedia, id 0x100001784, registered, matched, active, busy 0 (12 ms), retain 11>
        +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100001785, registered, matched, active, busy 0 (0 ms), retain 6>
         +-o IOFDiskPartitionScheme  <class IOFDiskPartitionScheme, id 0x100001788, !registered, !matched, active, busy 0 (1 ms), retain 6>
          +-o Untitled 1@1  <class IOMedia, id 0x10000178a, registered, matched, active, busy 0 (1 ms), retain 10>
           +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000178b, registered, matched, active, busy 0 (0 ms), retain 7>
空间pack@1a122000  
+-o IousB复合驱动程序
+-oIOUSBInterface@0  
+-o IOUSBMassStorageClass
+-o iOSCSI外围设备ub
+-o IOSCSI外围设备类型00
+-o IOBlockStorageServices
+-IOBlockStorageDriver
+-o mophie太空包介质
+-o IOMediaBSDClient
+-o IOFDiskPartitionScheme
+-o无标题1@1  
+-o IOMediaBSDClient

希望你能在这个问题上帮助我,非常感谢,我非常感谢你的帮助

听起来您正试图使用提供的低级USB命令连接到USB大容量存储接口,并发送一些自定义命令以更新固件。由于该接口由苹果大容量存储驱动程序声明,因此您可能不允许这样做

相反,您可以尝试在设备上制作第二个USB接口,它是供应商定义的接口。您将能够连接到该接口并向设备发送任意控制传输。如果您的设备尚未安装,则它将成为复合设备

或者,您可以尝试某种黑客手段,通过大容量存储接口发送信号。例如,每当向设备写入具有特殊名称的文件时,这可能是设备进入引导加载程序模式进行固件更新的信号。

以下几点:

  • 无代码kext方法通常适用于这种情况
  • 通常,您的无代码kext将匹配(通过IOProviderClass)一个
    ioubInterface
    ,而不是
    ioubDevice
    。(例如,请参阅)
  • IOService
    的绑定标识符是
    com.apple.kpi.iokit
    ,而不是
    com.apple.iokit.iosbfamily
    ,尽管我怀疑这不应该是个问题
  • 您的无代码kext是否已正确签名和安装?(我曾经遇到过这样的情况,即/Library/Extensions/中的kext在引导时不起作用,至少在OSX 10.9.x上不起作用,这与/System/Library/Extensions不同,尽管它对于任何热插拔设备都可以正常工作。)请确保kext/Personal缓存是最新的,换句话说,每当您更新kext时,
    触摸扩展目录
    
  • kextutil-n
    说什么
  • 您是否尝试过设置personality属性以查看您的kext是否有机会与设备匹配
  • 根据固件更新命令的实现方式,您可以在设备节点上使用
    ioctl
    s。您可以通过ioctl向SCSI设备发送原始SCSI请求。我不确定这是否适用于USB大容量存储类,但它肯定适用于USB连接的SCSI(UAS)或任何其他“真正”的SCSI设备。显然,这只有在固件更新命令通过SCSI公开时才有帮助

如果在所有这些之后,您仍然被卡住,请提供与上述建议相关的更多信息

你好,David,非常感谢您的回复,但我们没有供应商定义的接口。我们的产品现在正在销售,由于iOS更新,iOS无法识别设备。因此,我们计划开发一款mac应用程序用于固件更新。windows版本非常简单,但对于mac来说,iBinterfaceInterface总是失败。我很难过。嗯,糟糕透了。难道没有一个硬件程序可以让客户遵循进入引导加载程序模式吗?由于固件总是可能损坏或开始出现错误,因此设备应设计有一个特殊的pin/按钮,在通电期间进行检查,以确定是否进入固件更新模式。是的,您的建议非常好,但是我们的固件没有这种机制。非常感谢您提供的FTDI示例。它提到的长期解决方案是修改应用程序,打开BSD层串行端口,以便与FTDI硬件通信。短期解决方案是实现无代码kext。也许我需要研究长期的解决方案。我按照你的建议试过了,但还是失败了。我使用kextutil-n,它说:警告:个性CbundleIdentifier不同于包含kext的(不一定是错误,但很少发生):MyDriverTest3代码签名失败