首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DriverKit中将我的灵巧与USB设备匹配?

如何在DriverKit中将我的灵巧与USB设备匹配?
EN

Stack Overflow用户
提问于 2022-03-03 13:14:34
回答 1查看 535关注 0票数 2

我正在编写一个driverkit扩展,其目标是阻止USB设备,如闪存驱动器。作为起点,我选择了app?language=objc的示例项目

为了不禁用键盘或鼠标,首先我尝试将我的灵巧与一个具体的USB驱动器匹配,我在注册表中找到了该驱动器的vendorId (注意十六进制到十进制转换)。问题是,当闪存盘被插入,系统不匹配我的灵巧,并继续与系统一。

怎么了?是否需要配置配置文件?有可能用这种方式来匹配任何设备吗?

司机权利档案:

代码语言:javascript
复制
<?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>

Info.plist:

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-08 13:52:07

这里有几个子问题,我将试着分别回答它们:

为了不禁用键盘或鼠标,首先我尝试将我的灵巧与一个具体的USB驱动器匹配,我在注册表中找到了该驱动器的vendorId (注意十六进制到十进制转换)。问题是,当闪存盘被插入,系统不匹配我的灵巧,并继续与系统一。 … idVendor 9128…IOProviderClass IOUSBHostDevice

在macOS上匹配USB设备遵循非常具体的规则。如果您不遵循这是苹果公司的文件中概述的匹配模式之一,则匹配通常会失败。

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

怎么了?是否需要配置配置文件?有可能用这种方式来匹配任何设备吗?

如果希望分发驱动程序,甚至希望在启用SIP的情况下在本地运行驱动程序,则需要配置配置文件。请注意,Apple通常只为特定请求的供应商in颁发应享权利;如果您的需求超出此范围,则需要直接与Apple联系。

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

我正在编写一个driverkit扩展,其目标是阻止USB设备,如闪存驱动器。

请注意,这将在一定程度上有限的有效性,如在早期系统引导期间,第三方kexts和DriverKit扩展不考虑匹配。。这意味着,任何在macOS启动时已经连接的设备,只要能被苹果的驱动程序所要求,都会与苹果自己的驱动程序相匹配,而不是你的驱动程序。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71337832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档