我正在迁移一个无代码的KEXT到一个无代码的灵巧。我看过WWDC的视频,并在苹果开发者网站上阅读了很多信息。我遇到的困难不是找到该做什么,而是找到如何开始。一个很好的教程与一个例子项目将有帮助。
在我的无代码的KEXT中,对于4种不同的设备,我为每个设备都提供了IOKitPersonalities和IOUSBInterface。KEXT允许我将我的设备与我的“驱动程序”相匹配,这样苹果的HID驱动程序就不会抓取它们。我希望在无代码灵巧中做同样的或类似的事情。
到目前为止,我已经在应用程序中创建了一个名为DriverKit的DriverKit.framework目标,并添加了一个USBDriverKit.framework。它将一个文件夹MyUsbDriver添加到我的项目中,其中包含MyUsbDriver.cpp、MyUsbDriver.iig、Info.plist和MyUsbDriver.entitlements文件。以下是我的问题:
中的IOUSBInterface。
IOUSBDevice?与
,
任何帮助都将不胜感激。
更新:
使用这个例子和答案中的其他链接,我能够把一些东西组合在一起。我确实有一个"Doh“时刻:我最初的测试项目类型是命令行工具,我永远无法获得嵌入的灵巧。我几乎只是手工编辑了pbxproj文件。然而,在查看Scott的原始示例USBApp时,我意识到他使用的是was的项目类型,事后看来,这是合理的,但当时令人困惑。
下面是我到目前为止要在我们的一个废弃设备上匹配的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>MyUsbDrver</key>
<dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleIdentifierKernel</key>
<string>com.apple.kpi.iokit</string>
<key>IOClass</key>
<string>IOUserService</string>
<key>IOMatchCategory</key>
<string>com.apple.null.driver</string>
<key>IOProviderClass</key>
<string>IOUsbHostInterface</string>
<key>IOResourceMatch</key>
<string>IOKit</string>
<key>IOUserClass</key>
<string>MyUsbDrver</string>
<key>IOUserServerName</key>
<string>Home.MyUsbDrver</string>
<key>bConfigurationValue</key>
<integer>1</integer>
<key>bInterfaceNumber</key>
<integer>0</integer>
<key>idProduct</key>
<integer>2</integer>
<key>idVendor</key>
<integer>5843</integer>
</dict>
</dict>
<key>OSBundleUsageDescription</key>
<string>Codless DEXT to match on IOKit.</string>
</dict>
</plist>我对IOResourceMatch不太确定--它的价值是IOKit,这就是我想要走的方向。
更新第二个:
进步!
最后,我不得不手动更改pbxproj文件中的签名条款。禁用SIP,在我的应用程序中设置系统扩展激活/停用,并执行命令行签名.我发现这个存储库对于激活代码- https://github.com/google/santa.git的一个不错的目标-C示例是有帮助的。所有构建和代码签名似乎都是成功的。得到有趣的错误
SystemExtension "Home.MyUsbDrver" request did fail: Error Domain=OSSystemExtensionErrorDomain Code=8 "(null)"更新3:
我检查了我的右转和应用程序的权利,它看起来像应用程序的权利需要更新。这就是我现在要做的应用程序:
<?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.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.developer.system-extension.install</key>
<true/>
<key>com.apple.developer.system-extension.uninstall</key>
<true/>
</dict>
</plist>我错过了倒数第二名。清理我的项目,建造,重新签署。当我尝试从Xcode运行时,仍然得到了错误。当我从Finder运行我的应用程序时,我得到了系统首选项对话框。在那之后,Xcode的结果还是一样的,现在,当从Finder运行的时候,这个应用程序只是一闪而过。我重新启动了-结果还是一样。但是,当我运行systemextensionsctl -list时,从终端可以得到:
3 extension(s)
--- com.apple.system_extension.driver_extension
enabled active teamID bundleID (version) name [state]
<REDACTED> Home.MyUsbDrver (1.0/1) Home.MyUsbDrver [terminated waiting to uninstall on reboot]
* * <REDACTED> Home.MyUsbDrver (1.0/1) Home.MyUsbDrver [activated enabled]
<REDACTED> Home.MyUsbDrver (1.0/1) Home.MyUsbDrver [activated waiting to upgrade]重新启动后,我得到了这样的信息:
1 extension(s)
--- com.apple.system_extension.driver_extension
enabled active teamID bundleID (version) name [state]
* * <REDACTED> Home.MyUsbDrver (1.0/1) Home.MyUsbDrver [activated enabled]因此,看起来我的系统扩展已经到位,但我不知道为什么,因为我刚刚做了一个新的重新启动,没有运行我的应用程序。
更新4:
我发现了我的权利的问题只是文件的格式。我在TextEdit中改变了它,现在我可以和我的设备通信了。以下是我最后得到的结果:
<?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.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.usb</key>
<array>
<dict>
<key>idVendor</key>
<integer>VID0</integer>
<key>idProductArray</key>
<array>
<integer>PID0</integer>
<integer>PID1</integer>
<integer>PID2</integer>
<integer>PID3</integer>
<integer>PID4</integer>
</array>
</dict>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
</dict>
</plist>发布于 2020-08-04 13:52:55
我拼命想让同样的事情开始工作。最后,我成功地获得了一个工作灵巧,它禁用了Apple驱动程序的特定供应商ID /产品ID组合。我们已经获得了供应商ID的DriverKit权限。
这对我有用。我尝试完全删除.iig和.cpp文件,但与KEXTs不同,似乎需要编译一些代码才能使签名正常工作。因此,我只得到了一个空的IOService子类。
中的IOUSBInterface。
我相信是这样的。我使用了IOUSBHostInterface,我们在KEXT中使用了IOUSBInterface。
IOUSBDevice?与
我不知道,但我相信是的。
,
我不需要更改.cpp和.iig文件中的任何内容。在释放os_log(OS_LOG_DEFAULT, "Hello World");文件之前,您可能需要删除.cpp文件中的.cpp行。但是,在调试过程中,我很有必要判断是否正在加载DEXT。您可以在终端中运行log stream --source | grep 'HELLO'以查找日志。
我的灵巧链接反对DriverKit.framework。我不知道是否需要。
也许这些可以帮上忙:
我为自己和未来的开发人员记下了一些笔记。
在开发DriverKit扩展(dext)期间,执行以下操作:
csrutil disable)。记住再次启用它!通过运行systemextensionsctl developer on启用
/Library/Extensions和/或/System/Library/Extensions中删除它。确保重新启动()
提示和注意事项
团队上获得了DriverKit权限。
加载扩展的应用程序
pkill -9 "System Preferences"; open /System/Library/PreferencePanes/Security.prefPane来解决这个问题。systemextensionsctl卸载右转或重置系统状态。但是,这实际上并不会改变驱动程序匹配,因此您需要重新启动。慷慨。我使用这个终端命令是因为我很懒:osascript -e 'tell app "System Events" to restart'.ioreg -lirc IOUSBHostInterface.:
ioreg来检查设备是否与扩展匹配:IOProviderClass设置为IOUSBHostInterface,而不是在Info.plist文件中设置IOResources。(作为参考,KEXT使用的是苹果拥有deprecated)的IOUSBInterface类之一)
Info.plist中插入版本,以确保您实际使用的是正确的版本。(systemextensionsctl将显示它加载的版本).https://stackoverflow.com/questions/63212902
复制相似问题