我正在为OS X上的USB设备开发kext驱动程序。在这个驱动程序中,我有一个指向对象IOUSBDevice *device
的指针(它可以在start()和probe()函数中接收)和我有一个问题:可以在probe()函数中打开设备(device->open(this, kIOServiceSeize)
),但在其他函数open()
中返回false,因为它看起来像经典驱动程序在设备上控制。
我找到了文章User-Mode USB Device Arbitration并尝试创建"骨架" kext设置" ClassicMustNotSeize"属性为true,但似乎它不起作用,我仍然无法打开设备。
<?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>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.sample.iokit.ClassicNotSeizeDriver</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<key>IOKitPersonalities</key>
<dict>
<key>MyUSBDevice</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleUSBMergeNub</string>
<key>IOClass</key>
<string>AppleUSBMergeNub</string>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>IOProviderMergeProperties</key>
<dict>
<key>ClassicMustNotSeize</key>
<true/>
</dict>
<key>idProduct</key>
<integer>1</integer>
<key>idVendor</key>
<integer>10978</integer>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.driver.AppleUSBMergeNub</key>
<string>1.8.3b1</string>
<key>com.apple.iokit.IOUSBFamily</key>
<string>1.8</string>
</dict>
</dict>
</plist>
是否可以设置&#34; ClassicMustNotSeize&#34;以编程方式,例如在我的驱动程序的probe()函数?
我试过了:
device->setProperty("ClassicMustNotSeize", true);
似乎它也没有用。
答案 0 :(得分:1)
如果您的服务已成功匹配且probe()
d,则其他关键字不会申请服务。如果您没有成功start()
,如果某些内容重新启动匹配,则可能会在之后与另一个kext匹配。所以有些事情是对的,并且不可能仅从你的问题中分辨出它是什么,因为你还没有提供相关的代码,info.plist和ioreg摘录,更不用说你的代码&# 39; s调试输出......
所以我只能猜测:
kIOServiceSeize
?如果您的kext与设备匹配,具有最高的探测分数并从probe()
返回非空值,则其他驱动程序将无法抓取该设备(尚未)。如果您想确保对USB设备的独占访问权限,请使用kUSBOptionBitOpenExclusivelyMask
open()
选项。open()
期间probe()
,请确保在返回之前close()
,无论您返回什么值。在[{1}}中重新open()
。 (无论如何通常都不需要覆盖start()
,默认情况下它会返回probe()
。)this
不执行任何操作。