[英]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.