2015-11-05 50 views
3

在一个项目中,我最近尝试通过osx 10.9.5上的libusb访问USB存储设备。但显然有些默认驱动程序声称该设备,我无法访问它。当我尝试通过libusb访问它时,它会返回“我没有足够的权限”。用于USB存储设备的无代码kext

当我在Ubuntu中执行(java)应用程序时,一切正常。

我在互联网上的研究证明,提供一个与更高探测器核心上的设备相匹配的无代码kext可以防止默认驱动程序声明该设备。这将完全解决问题,因为卸载IOUSBMassStorage kext使得可以使用设备执行我们想要的操作。

我的创建无代码kext的尝试没有解决,因为它似乎不会在启动时加载,也不会在我使用kextload时加载。至少这就是我猜测的,因为我无法卸载它,也无法在列出的任何地方找到它。

我的Info.plist的最新版本是这样的:在运行sudo kextutil -t -n /path/to/my.kext当这些诊断返回

<?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>OSBundleLibraries</key> 
    <dict/> 
    <key>CFBundleDevelopmentRegion</key> 
    <string>English</string> 
    <key>CFBundleGetInfoString</key> 
    <string>Test USB Stick</string> 
    <key>CFBundleIdentifier</key> 
    <string>de.mischok.testkext</string> 
    <key>CFBundleInfoDictionaryVersion</key> 
    <string>6.0</string> 
    <key>CFBundleName</key> 
    <string>Test USB Device</string> 
    <key>CFBundlePackageType</key> 
    <string>KEXT</string> 
    <key>CFBundleSignature</key> 
    <string>????</string> 
    <key>CFBundleVersion</key> 
    <string>1.0.0</string> 
    <key>IOKitPersonalities</key> 
    <dict> 
     <key>Device Driver</key> 
     <dict> 
      <key>CFBundleIdentifier</key> 
      <string>de.mischok.testkext</string> 
      <key>IOClass</key> 
      <string>IOUSBUserClientInit</string> 
      <key>IOProviderClass</key> 
      <string>IOUSBDevice</string> 
      <key>idProduct</key> 
      <integer>357</integer> 
      <key>idVendor</key> 
      <integer>4871</integer> 
      <key>bcdDevice</key> 
      <integer>4352</integer> 
      <key>bConfigurationValue</key> 
      <integer>1</integer> 
      <key>bInterfaceNumber</key> 
      <integer>0</integer> 
     </dict> 
     <key>Interface Driver</key> 
     <dict> 
      <key>CFBundleIdentifier</key> 
      <string>de.mischok.testkext</string> 
      <key>IOClass</key> 
      <string>IOUSBUserClientInit</string> 
      <key>IOProviderClass</key> 
      <string>IOUSBInterface</string> 
      <key>idProduct</key> 
      <integer>357</integer> 
      <key>idVendor</key> 
      <integer>4871</integer> 
      <key>bcdDevice</key> 
      <integer>4352</integer> 
      <key>bConfigurationValue</key> 
      <integer>1</integer> 
      <key>bInterfaceNumber</key> 
      <integer>0</integer> 
     </dict> 
    </dict> 
    <key>OSBundleRequired</key> 
    <string>Local-Root</string> 
</dict> 
</plist> 

Diagnostics for /Users/user/Desktop/testv1-0.kext: 
Warnings: 
    Personality CFBundleIdentifier names a kext that doesn't declare an executable: 
     'Interface Driver' -> 'de.mischok.testkext' 
     'Device Driver' -> 'de.mischok.testkext' 

Code Signing Failure: not code signed 
Warnings: 
    Personality CFBundleIdentifier names a kext that doesn't declare an executable: 
     'Interface Driver' -> 'de.mischok.testkext' 
     'Device Driver' -> 'de.mischok.testkext' 

/Users/user/Desktop/testv1-0.kext appears to be loadable (including linkage for on-disk libraries). 

,因为它说的内核扩展应该是可加载的,我认为它应该管用。但是,而不是工作,SYSTEM.LOG中记录此,与sudo kextload /path/to/my.kext加载内核扩展时:

Nov 5 12:28:58 users-MacBook-Pro.local sudo[528]: user : TTY=ttys000 ; PWD=/Users/user ; USER=root ; COMMAND=/sbin/kextload /Users/user/Desktop/testv1-0.kext 
Nov 5 12:28:58 users-MacBook-Pro.local com.apple.kextd[12]: WARNING - Invalid signature -67062 0xFFFFFFFFFFFEFA0A for kext "/Users/user/Desktop/testv1-0.kext" 

因为它仅仅是一个警告,我认为这是成功加载。但只要我插上设备的,将USB探测器输出看起来是这样的:

Nov 5 12:57:11.911 [6] Device Descriptor Dump 
Nov 5 12:57:11.911 [6]  bLength 18 
Nov 5 12:57:11.911 [6]  bDescriptorType 1 
Nov 5 12:57:11.911 [6]  bcdUSB 768 (0x0300) 
Nov 5 12:57:11.911 [6]  bDeviceClass 0 
Nov 5 12:57:11.911 [6]  bDeviceSubClass 0 
Nov 5 12:57:11.911 [6]  bDeviceProtocol 0 
Nov 5 12:57:11.911 [6]  bMaxPacketSize0 9 
Nov 5 12:57:11.911 [6]  idVendor 4871 (0x1307) 
Nov 5 12:57:11.911 [6]  idProduct 357 (0x0165) 
Nov 5 12:57:11.911 [6]  bcdDevice 4352 (0x1100) 
Nov 5 12:57:11.911 [6]  iManufacturer 1 
Nov 5 12:57:11.911 [6]  iProduct 2 
Nov 5 12:57:11.911 [6]  iSerialNumber 3 
Nov 5 12:57:11.911 [6]  bNumConfigurations 1 
Nov 5 12:57:11.916 [5] Finding device driver for DEVICE, matching personality using com.apple.iokit.IOUSBUserClient, score: 106999, wildCard = 3 
Nov 5 12:57:11.916 [6]  Matched: idVendor (4871) idProduct (357) bcdDevice (4352) 
Nov 5 12:57:11.916 [6]  Didn't Match: nothing 
Nov 5 12:57:11.917 [5] Finding device driver for DEVICE, matching personality using com.apple.driver.AppleUSBComposite, score: 50000, wildCard = 0 
Nov 5 12:57:11.917 [6]  Matched: bDeviceClass (0) bDeviceSubClass (0) 
Nov 5 12:57:11.917 [6]  Didn't Match: nothing 
Nov 5 12:57:11.918 [5] Finding device driver for DEVICE, matching personality using com.apple.driver.AppleUSBCDC, score: 60000, wildCard = 0 
Nov 5 12:57:11.918 [6]  Matched: bDeviceClass (0) bDeviceSubClass (0) bDeviceProtocol (0) 
Nov 5 12:57:11.918 [6]  Didn't Match: nothing 

这是唯一的个性相匹配的发生,所以我不知道,我所应该做的,所以我的内核扩展将匹配我的设备甚至是负载?

回答

3
  1. 使用kextutil而不是kextload。它提供了更好的诊断。
  2. 指定IOClass IOUSBUserClientInit的I/O Kit特性必须指定CFBundleIdentifiercom.apple.iokit.IOUSBUserClient,因为那是该类所在的地方。
  3. 要加载未签名的kext,它必须位于10.9.x上的/System/Library/Extensions
+0

非常感谢!这对我很有帮助,虽然我不再使用'IOUSBUserClientInit',因为我的设备是存储设备。你的答案仍然是100%正确的。 – daniel