繁体   English   中英

如何将我的 dext 与 DriverKit 中的 USB 设备匹配?

[英]How to match my dext with an USB device in DriverKit?

我正在编写一个驱动程序包扩展,其目标是阻止 USB 个设备,例如 flash 个驱动器。 作为起点,我选择了示例项目https://developer.apple.com/documentation/driverkit/communicating_between_a_driverkit_extension_and_a_client_app?language=objc

为了不禁用键盘或鼠标,首先我尝试将我的 dext 与单个具体的 USB 驱动器匹配,我在注册表中找到了它的 vendorId(知道十六进制到十进制的转换)。 问题是,当插入 flash 驱动器时,系统与我的 dext 不匹配,并继续使用系统一。

怎么了? 为此需要配置文件吗? 甚至可以通过这种方式匹配任何设备吗?

驾驶员权利文件:

<?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>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.developer.driverkit</key>
    <true/>
    <key>com.apple.developer.driverkit.transport.usb</key>
    <array>
        <dict>
            <key>idVendor</key>
            <integer>9128</integer>
        </dict>
    </array>
</dict>
</plist>

信息.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>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>DeviceControlDriver</key>
        <dict>
            <key>idVendor</key>
            <integer>9128</integer>
            <key>CFBundleIdentifier</key>
            <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
            <key>CFBundleIdentifierKernel</key>
            <string>com.apple.kpi.iokit</string>
            <key>IOClass</key>
            <string>IOUserService</string>
            <key>IOProviderClass</key>
            <string>IOUSBHostDevice</string>
            <key>IOUserClass</key>
            <string>DeviceControlDriver</string>
            <key>IOUserServerName</key>
            <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
            <key>UserClientProperties</key>
            <dict>
                <key>IOClass</key>
                <string>IOUserUserClient</string>
                <key>IOUserClass</key>
                <string>DeviceControlDriver</string>
            </dict>
        </dict>
    </dict>
    <key>OSBundleUsageDescription</key>
    <string></string>
</dict>
</plist>

这里有几个子问题,我将尝试单独解决它们:

为了不禁用键盘或鼠标,首先我尝试将我的 dext 与单个具体的 USB 驱动器匹配,我在注册表中找到了它的 vendorId(知道十六进制到十进制的转换)。 问题是,当插入 flash 驱动器时,系统与我的 dext 不匹配,并继续使用系统一。

[…]

 <key>idVendor</key> <integer>9128</integer> … <key>IOProviderClass</key> <string>IOUSBHostDevice</string>

在 macOS 上匹配 USB 设备遵循非常具体的规则。 如果您不遵循Apple 文档中概述的其中一种匹配模式,匹配通常会失败

您正试图单独匹配idVendor 这是行不通的,您需要匹配idVendor + idProduct或列出的其他模式之一。

怎么了? 为此需要配置文件吗? 甚至可以通过这种方式匹配任何设备吗?

如果您希望分发您的驱动程序,或者甚至在启用 SIP 的情况下在本地运行它,您将需要一个配置文件。 请注意,Apple 通常只为特定请求的供应商 ID 颁发权利; 如果您还需要 go,则需要直接与 Apple 联系。

对于没有有效代码签名的本地测试,可以禁用SIP; 您仍然需要在签名中嵌入有效的权利,但您可以使用与权利不匹配的配置文件。

我正在编写一个驱动程序包扩展,其目标是阻止 USB 个设备,例如 flash 个驱动器。

请注意,这将有些有限的效果,因为第 3 方 kexts 和 DriverKit 扩展不考虑在早期系统启动期间进行匹配 这意味着任何可以由 Apple 的驱动程序声明并且在 macOS 启动时已经连接的设备将始终匹配 Apple 自己的驱动程序,而不是你的。

对于 USB,您可以在某种程度上通过使用USBDeviceReEnumerate function 强制重新枚举来解决此问题。请注意,这模拟了硬拔出,因此对于已安装的存储设备,您应该先干净地卸载,例如。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM