我正在编写一个driverkit扩展,其目标是阻止USB设备,如闪存驱动器。作为起点,我选择了app?language=objc的示例项目
为了不禁用键盘或鼠标,首先我尝试将我的灵巧与一个具体的USB驱动器匹配,我在注册表中找到了该驱动器的vendorId (注意十六进制到十进制转换)。问题是,当闪存盘被插入,系统不匹配我的灵巧,并继续与系统一。
怎么了?是否需要配置配置文件?有可能用这种方式来匹配任何设备吗?
司机权利档案:
<?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:
<?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>发布于 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函数强制重新枚举来解决这一问题。请注意,这会模拟硬拔出插头,因此对于已安装的存储设备,您应该首先卸载干净,例如。
https://stackoverflow.com/questions/71337832
复制相似问题