【问题标题】:Prevent classic drivers from opening usb device on OS X防止经典驱动程序在 OS X 上打开 USB 设备
【发布时间】:2015-10-21 10:45:17
【问题描述】:

我正在为 OS X 上的 USB 设备开发 kext 驱动程序。在这个驱动程序中,我有一个指向对象 IOUSBDevice *device 的指针(它可以在 start() 和 probe() 函数中接收),我有一个问题: 可以在 probe() 函数中打开设备 (device->open(this, kIOServiceSeize)),但在其他函数中 open()return false,因为它看起来像经典驱动程序控制设备。

我找到文章User-Mode USB Device Arbitration并尝试创建“skeleton”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>

是否可以通过编程方式设置“ClassicMustNotSeize”属性,例如在我的驱动程序的 probe() 函数中?

我试过了:

device->setProperty("ClassicMustNotSeize", true);

而且好像也不行。

【问题讨论】:

    标签: macos usb driver iokit kernel-extension


    【解决方案1】:

    如果您的已成功匹配并且probe()d,其他 kext 将不会要求服务。如果你没有成功start(),如果某些东西重新启动匹配,它可能会在稍后被另一个 kext 匹配。所以有些地方不对劲,仅凭您的问题无法判断是什么,因为您没有提供相关代码、info.plist 和 ioreg 摘录,更不用说您的代码的调试输出了……

    所以我只能猜测:

    1. 为什么你认为你需要使用kIOServiceSeize?如果您的 kext 与设备匹配,具有最高的探测分数并且从probe() 返回非空值,则没有其他驱动程序(目前)会抓取该设备。如果要确保对 USB 设备的独占访问,请使用 kUSBOptionBitOpenExclusivelyMask 选项到 open()
    2. 如果您在probe() 期间open(),请确保在返回之前close(),无论您返回什么值。在start() 中回复open()。 (通常不需要覆盖probe(),默认情况下它会返回this。)
    3. 您是否在 I/O 套件个性中设置了匹配类别?除非你有充分的理由,否则不要这样做。
    4. 您是否在实际驱动程序个性中匹配 IOUSBInterface 而不是 IOUSBDevice,然后遍历服务图?或者以其他方式试图通过 I/O 套件匹配以外的方式声明设备?
    5. 您的 kext 是否在 /Library/Extensions(或 /System/Library/Extensions,如果有充分的理由不能在 /LE 中)?否则不参与匹配。
    6. 我非常怀疑这与“经典”有什么关系,据我所知,这是在 OS X 的早期版本中运行 Mac OS 8 和 9 应用程序的一种方式。所以除非你的目标是 10.1 或所以,ClassicMustNotSeize 什么都不做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多