首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将无代码的KEXT迁移到无代码的DEXT

将无代码的KEXT迁移到无代码的DEXT
EN

Stack Overflow用户
提问于 2020-08-02 06:05:23
回答 1查看 1.6K关注 0票数 5

我正在迁移一个无代码的KEXT到一个无代码的灵巧。我看过WWDC的视频,并在苹果开发者网站上阅读了很多信息。我遇到的困难不是找到该做什么,而是找到如何开始。一个很好的教程与一个例子项目将有帮助。

在我的无代码的KEXT中,对于4种不同的设备,我为每个设备都提供了IOKitPersonalities和IOUSBInterface。KEXT允许我将我的设备与我的“驱动程序”相匹配,这样苹果的HID驱动程序就不会抓取它们。我希望在无代码灵巧中做同样的或类似的事情。

到目前为止,我已经在应用程序中创建了一个名为DriverKit的DriverKit.framework目标,并添加了一个USBDriverKit.framework。它将一个文件夹MyUsbDriver添加到我的项目中,其中包含MyUsbDriver.cpp、MyUsbDriver.iig、Info.plist和MyUsbDriver.entitlements文件。以下是我的问题:

  1. 看起来IOService的默认子类对于USB来说是可以的--这与来自IOService的IOClass是一样的。是真的吗?

  1. 在右世界是IOUSBHostInterface,相当于KEXT-world?

中的IOUSBInterface。

IOUSBDevice?与

  1. 是IOUSBHostDevice等价的

  1. ,我需要对.cpp或.iig做些什么吗?我的大部分工作不是要在plist和应享权利文件中完成吗?

  1. 我需要USBDriverKit.framework在我的框架和MyUsbDriver目标库中吗?

  1. 在哪里可以找到一个很好的例子来说明如何完成迁移?

任何帮助都将不胜感激。

更新:

使用这个例子和答案中的其他链接,我能够把一些东西组合在一起。我确实有一个"Doh“时刻:我最初的测试项目类型是命令行工具,我永远无法获得嵌入的灵巧。我几乎只是手工编辑了pbxproj文件。然而,在查看Scott的原始示例USBApp时,我意识到他使用的是was的项目类型,事后看来,这是合理的,但当时令人困惑。

下面是我到目前为止要在我们的一个废弃设备上匹配的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>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示例是有帮助的。所有构建和代码签名似乎都是成功的。得到有趣的错误

代码语言:javascript
复制
SystemExtension "Home.MyUsbDrver" request did fail: Error Domain=OSSystemExtensionErrorDomain Code=8 "(null)"

更新3:

我检查了我的右转和应用程序的权利,它看起来像应用程序的权利需要更新。这就是我现在要做的应用程序:

代码语言: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.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时,从终端可以得到:

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

重新启动后,我得到了这样的信息:

代码语言:javascript
复制
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中改变了它,现在我可以和我的设备通信了。以下是我最后得到的结果:

代码语言: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.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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-04 13:52:55

我拼命想让同样的事情开始工作。最后,我成功地获得了一个工作灵巧,它禁用了Apple驱动程序的特定供应商ID /产品ID组合。我们已经获得了供应商ID的DriverKit权限。

  1. 看起来IOService的默认子类对于USB来说是可以的--这与来自IOService的IOClass是一样的。是真的吗?

这对我有用。我尝试完全删除.iig.cpp文件,但与KEXTs不同,似乎需要编译一些代码才能使签名正常工作。因此,我只得到了一个空的IOService子类。

  1. 在右世界是IOUSBHostInterface,相当于KEXT-world?

中的IOUSBInterface。

我相信是这样的。我使用了IOUSBHostInterface,我们在KEXT中使用了IOUSBInterface

IOUSBDevice?与

  1. 是IOUSBHostDevice等价的

我不知道,但我相信是的。

  1. ,我需要对.cpp或.iig做些什么吗?我的大部分工作不是要在plist和应享权利文件中完成吗?

我不需要更改.cpp.iig文件中的任何内容。在释放os_log(OS_LOG_DEFAULT, "Hello World");文件之前,您可能需要删除.cpp文件中的.cpp行。但是,在调试过程中,我很有必要判断是否正在加载DEXT。您可以在终端中运行log stream --source | grep 'HELLO'以查找日志。

  1. 我需要USBDriverKit.framework在我的框架和MyUsbDriver目标库中吗?

我的灵巧链接反对DriverKit.framework。我不知道是否需要。

  1. 在哪里可以找到一个很好的例子来说明如何完成迁移?

也许这些可以帮上忙:

我为自己和未来的开发人员记下了一些笔记。

在开发DriverKit扩展(dext)期间,执行以下操作:

通过运行systemextensionsctl developer on启用

  • 系统扩展开发模式

  • 确保您没有安装旧的无代码的KEXT。(从/Library/Extensions和/或/System/Library/Extensions中删除它。确保重新启动(

)

提示和注意事项

  • 您可能需要一个包含DriverKit应享权利的手动配置配置文件。我认为我的问题是,我在企业开发团队而不是公共development.

团队上获得了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将显示它加载的版本).
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63212902

复制
相关文章

相似问题

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