用于USB存储设备的无码kext [英] Codeless kext for usb storage device
本文介绍了用于USB存储设备的无码kext的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在最近的一个项目中,我试图在OSX 10.9.5上通过libusb访问USB存储设备。但很明显,某个默认驱动程序认领了这个设备,我无法访问它。当我尝试通过libusb访问它时,它返回"权限不足"。
当我在Ubuntu中执行(Java)应用程序时,一切都正常工作。
我在Internet上的研究表明,提供一个在较高探测内核上与设备匹配的无码kext将阻止默认驱动程序声明该设备。这将完全解决问题,因为卸载IOUSBMassStorage kext可以使用设备执行我们所需的操作。
我创建无代码kext的尝试没有如我所希望的那样工作,因为它似乎既不会在启动时加载,也不会在我使用kextload
时加载。至少我是这么想的,因为我不能卸载它,也不能在任何列出的地方找到它。
My 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>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>
运行sudo kextutil -t -n /path/to/my.kext
时返回以下诊断:
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).
因为它说kext应该是可加载的,所以我认为它应该可以工作。但是,当使用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
这些是唯一发生的个性匹配,所以我想知道,我应该做些什么才能使我的kext与我的设备匹配,甚至加载?
推荐答案
- 使用
kextutil
,而不是kextload
。它提供了更好的诊断。 - 将IOClass指定为
IOUSBUserClientInit
的I/O工具包角色必须指定CFBundleIdentifier
的com.apple.iokit.IOUSBUserClient
,因为这是该类所在的位置。 - 若要加载无符号kext,它必须位于10.9.x上的
/System/Library/Extensions
中。
这篇关于用于USB存储设备的无码kext的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文