防止macOS通用键盘驱动程序捕获usb设备

时间:2017-06-26 15:33:59

标签: c macos usb kernel-extension

我试图在C中为usb设备(带按钮的pentablet)编写macOS用户级驱动程序。

目前,这款平板电脑被系统识别为通用鼠标和通用键盘。由于应用于pentablet按钮的快捷方式不可自定义,我想为此编写自己的驱动程序。

什么工作:

我可以使用设备中的hidapi(http://www.signal11.us/oss/hidapi/)读取原始数据,如下所示:

A   B    C    D    E    F    G    H
10  192  228  50   157  43   0    0

我发现,当我使用笔时,列B-H的值会根据笔的位置,压力和点击而改变。

我的问题:

但是,我无法弄清楚如何访问设备的按钮。每当我按下其中一个时,他们的硬编码键组合就会被触发。由于列A的值永远不会改变,我假设设备仍被系统捕获为通用键盘,因此该列从不向我显示当前按下的按钮并触发它的键组合

每当我按下其中一个按钮时,全部触发按住ALT / Option + Shift ,另外一些触发一个角色,其中一个触发音量。

因此,我的方法是使用无代码kext来阻止系统捕获设备。但这也不起作用 - 设备仍然被系统捕获为通用键盘。

我已停用csrutilkextload,我的kext位于/Library/Extensions,我收到一条成功的消息,即已加载kext:

Warnings:
    Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done):
        Tablet

Code Signing Failure: code signature is invalid
Warnings:
    Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done):
        Tablet

/Library/Extensions/foobartablet.kext appears to be loadable (not including linkage for on-disk libraries).
kext-dev-mode allowing invalid signature -67050 0xFFFFFFFFFFFEFA16 for kext "/Library/Extensions/foobartablet.kext"
kext signature failure override allowing invalid signature -67050 0xFFFFFFFFFFFEFA16 for kext "/Library/Extensions/foobartablet.kext"
Loading /Library/Extensions/foobartablet.kext.

这是我的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>BuildMachineOSBuild</key>
    <string>13C64</string>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleGetInfoString</key>
    <string>1.0 Copyright © Adis Durakovic</string>
    <key>CFBundleIdentifier</key>
    <string>com.adisdurakovic.huitablet</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleShortVersionString</key>
    <string>Huion Tablet 1.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>DTCompiler</key>
    <string>com.apple.compilers.llvm.clang.1_0</string>
    <key>DTPlatformBuild</key>
    <string>5A2053</string>
    <key>DTPlatformVersion</key>
    <string>GM</string>
    <key>DTSDKBuild</key>
    <string>13A595</string>
    <key>DTSDKName</key>
    <string>macosx10.9</string>
    <key>DTXcode</key>
    <string>0501</string>
    <key>DTXcodeBuild</key>
    <string>5A2053</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>Tablet</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.apple.kpi.iokit</string>
            <key>IOClass</key>
            <string>IOService</string>
            <key>IOProviderClass</key>
            <string>IOUSBDevice</string>
            <key>idVendor</key>
            <string>9580</string>
            <key>idProduct</key>
            <string>110</string>
            <key>bcdDevice</key>
            <string>12288</string>
            <key>IOProbeScore</key>
            <integer>200000</integer>
        </dict>
        <key>TabletNew</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>com.apple.kpi.iokit</string>
            <key>IOClass</key>
            <string>IOService</string>
            <key>IOProviderClass</key>
            <string>IOUSBHostDevice</string>
            <key>idVendor</key>
            <string>9580</string>
            <key>idProduct</key>
            <string>110</string>
            <key>bcdDevice</key>
            <string>12288</string>
            <key>IOProbeScore</key>
            <integer>300000</integer>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict/>
</dict>
</plist>

这里也是我用于设备匹配的ioreg -i -w 0 -l -n "PenTablet"输出: https://adisdurakovic.com/pentablet.txt

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

由于您提到了SIP,我假设您在10.11或更高版本上测试它。您的render设置为IOProviderClass - 这只适用于10.10及更早版本。 10.11引入了一个全新的USB堆栈,新的类名为IOUSBDevice。我知道这并不是IORegistryExplorer / IOUSBHostDevice所说的:有一个翻译可以让老用户空间应用程序停止运转。在内核中,匹配ioreg的驱动程序将优先于匹配IOUSBHostDevice的驱动程序。如果你想同时支持两者,你可以为你的无代码kext添加额外的个性。对于带有代码的kexts ,如果遗留支持在您的情况下不起作用,则需要创建两个版本的kext。

可能影响它的另一件事是探测得分,虽然理论上你的 idVendor + idProduct + bcdDevice 规则应该已经有很高的分数。