防止经典驱动程序在OS X上打开USB设备

时间:2015-10-21 10:45:18

标签: macos usb driver iokit kernel-extension

我正在为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);

似乎它也没有用。

1 个答案:

答案 0 :(得分:1)

如果您的服务已成功匹配且probe() d,则其他关键字不会申请服务。如果您没有成功start(),如果某些内容重新启动匹配,则可能会在之后与另一个kext匹配。所以有些事情是对的,并且不可能仅从你的问题中分辨出它是什么,因为你还没有提供相关的代码,info.plist和ioreg摘录,更不用说你的代码&# 39; s调试输出......

所以我只能猜测:

  1. 为什么您认为需要使用kIOServiceSeize?如果您的kext与设备匹配,具有最高的探测分数并从probe()返回非空值,则其他驱动程序将无法抓取该设备(尚未)。如果您想确保对USB设备的独占访问权限,请使用kUSBOptionBitOpenExclusivelyMask open()选项。
  2. 如果您在open()期间probe(),请确保在返回之前close(),无论您返回什么值。在[{1}}中重新open()。 (无论如何通常都不需要覆盖start(),默认情况下它会返回probe()。)
  3. 您是否在I / O套件中设置了匹配类别?除非你有充分的理由,否则不要。
  4. 您是否在实际的驱动程序个性中匹配IOUSBInterface而不是IOUSBDevice,然后遍历服务图?或者以其他方式尝试声称设备而非I / O套件匹配?
  5. 你的kext是/ Library / Extensions(或/ System / Library / Extensions,如果有一个很好的理由,它不能进入​​/ LE)?如果没有,它就不会参与匹配。
  6. 我非常怀疑这与&#34; Classic&#34;据我所知,这是一种运行Mac OS 8&amp; amp;在早期版本的OS X中有9个应用程序。因此,除非您定位10.1左右,否则this不执行任何操作。