问题标签 [driverkit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - macOS10.15+系统扩展和DriverKit如何开发读盘驱动
我已经通过 IOKit 开发了一个内核扩展(kext),但将来会被弃用。所以我想开发另一个使用 dext 的驱动程序来使用 DriverKit 替换 kext。但是我没有找到可执行的解决方案,就像我找不到某些类来替代 IOMedia。当我打算在我的代码中包含 IOKit 时,我发现 TARGET_OS_DRIVERKIT 是 1。有人可以帮助我吗?非常感谢!
c++ - 如何访问 CompleteAsyncIO 中的 IOMemoryBufferDescriptor,它是通过 AsyncIO on Interrupt EP 发送的
我正在尝试使用 AsyncIO 为中断 EP 发送请求,对于 AsyncIO,我创建了 IOMemoryBufferDescriptor,一旦 IOMemoryBufferDescriptor,创建成功,我使用 GetAddressRange 并将地址存储在 dext 的 ivars 结构中。对于这个请求完成(CompleteAsyncIO)是使用action-> GetReference()调用的,我得到了ivars结构,我期待从USB设备接收到中断完成的数据,不幸的是我没有看到相关数据。在 Wireshark 中,我尝试调试接收到的数据是 16 个字节,而 CompleteAsyncIO 实际字节也是 16 个。
使用 IOMemoryBufferDescriptor 从设备接收中断数据的正确方法是什么?
为 CompleteAsyncIO 创建 OSAction
USB 中断 EP 的 IOMemoryBufferDescriptor 分配:
发送 AsyncIO 请求中断 EP
框架调用的 CompleteAsyncIO
如何使用我使用 AsyncIO 发送的 IOBufferMemoryDescriptor 获取从 USB 设备接收的实际数据以完成中断?我需要将地址映射到当前进程地址空间吗?
我看到带有USB过滤器的wireshark只有实际数据长度匹配。
Wireshark 日志 a1 20 00 00 01 00 02 00 03 00 00 00 00 00 00 00 (16 字节数据) "3029","32.105745","64.16.4","host","USB","40"," URB_INTERRUPT in (submitted)" "3030","32.169565","64.16.4","host","USB","56","URB_INTERRUPT in (完成)"
macos - 在 ACM DEXT(IOUserUSBSerial) 的情况下如何调用 handleInterruptPacket 覆盖方法?
在 ACM Dext 中,handleInterruptPacket覆盖方法没有被系统调用。请让我知道有什么遗漏。
iig 文件:
cpp文件:
但是如果发送到中断 EP 的 AsyncIO 请求能够得到响应 AsyncIO 完成(CompleteAsyncIO)。请查看如何访问 CompleteAsyncIO 中的 IOMemoryBufferDescriptor,它是在中断 EP 上通过 AsyncIO 发送的
macos - 如何从一个 Dext 调用函数到另一个 Dext?
我正在尝试编写代码来调用从一个 dext 到另一个 dext 的函数。我已经浏览了下面的链接,它有关于sext to dext 通信的信息。 “NewUserClient”应该如何实现
我可以知道 Dext 到 Dext 通信的任何功能(或类)吗?如何从一个 dext 调用一个函数到另一个 dext?
xcode - DriverKit SDK 是否支持信号量?
我在 DriverKit 头文件中找不到像 semaphore_create/semaphore_wait/semaphore_signal/semaphore_destroy 这样的函数。Driverkit 中不支持,有替代方案吗?</p>
macos - 将无代码 KEXT 迁移到无代码 DEXT
我正在将无代码 KEXT 迁移到无代码 DEXT。我观看了 WWDC 视频并阅读了 Apple Developer 网站上的大部分信息。我遇到的困难不是找到做什么,而是如何开始。带有示例项目的不错的教程会有所帮助。
在我的无代码 KEXT 中,对于 4 个单独的设备,我有 IOKitPersonalities 用于 IOUSBDevice 和 IOUSBInterface 用于每个设备。KEXT 允许我将我的设备与我的“驱动程序”相匹配,这样 Apple HID 驱动程序就不会抓取它们。我希望在无代码 DEXT 中做同样或类似的事情。
到目前为止,我已经在应用程序中创建了一个名为 MyUsbDriver 的 DriverKit 目标(用于 DriverKit.framework),并添加了一个 USBDriverKit.framework。这在我的项目中添加了一个文件夹 MyUsbDriver,其中包含文件 MyUsbDriver.cpp、MyUsbDriver.iig、Info.plist 和 MyUsbDriver.entitlements。以下是我的问题:
看起来 IOService 的默认子类适用于 USB - 这与 KEXT 中的 IOClass 相同。真的吗?
DEXT 世界中的 IOUSBHostInterface 是否等同于 KEXT 世界中的 IOUSBInterface?
IOUSBHostDevice 是否等同于 IOUSBDevice?
对于无代码 DEXT,我是否需要对 .cpp 或 .iig 做任何事情?我的大部分工作不是在 plist 和 entitlements 文件中完成吗?
我的 MyUsbDriver 目标的框架和库中是否需要 USBDriverKit.framework?
我在哪里可以找到如何完成此迁移的体面示例?
任何帮助将不胜感激。
更新:
使用答案中的示例和其他链接,我能够得到一些东西。我确实有一个“Doh”时刻:我最初的测试项目类型是命令行工具,我永远无法嵌入 DEXT。我几乎只是手动编辑了 pbxproj 文件。然而,在查看 Scott Knight 的原始 USBApp 示例时,我意识到他使用的项目类型是 App,事后看来,这是有道理的,但当时令人困惑。
这是到目前为止我在我们已弃用的设备之一上匹配的 info.plist:
我不确定 IOResourceMatch - 值是 IOKit,这是我试图去的方向。
更新第二个:
进步!
我最终不得不手动更改我的 pbxproj 文件中的签名规定。禁用 SIP,在我的应用程序中设置系统扩展激活/停用并进行命令行签名。我发现这个存储库对激活码的一个体面的 Objective-C 示例很有帮助 - https://github.com/google/santa.git。一切构建和代码签名似乎都很成功。得到有趣的错误
更新 3:
我检查了我的 DEXT 和应用程序权利,看起来需要更新应用程序权利。这就是我现在的应用程序:
我错过了底部的两个。清理我的项目,构建,再次签名。当我尝试从 Xcode 运行时,仍然出现错误。当我从 Finder 运行我的应用程序时,我得到了系统首选项对话框。之后,Xcode 的结果仍然相同,现在从 Finder 运行时,应用程序只有一个闪光。我重新启动 - 仍然是相同的结果。但是,从终端运行 systemextensionsctl -list 时,我得到:
重新启动后,我得到这个:
所以,看起来我的系统扩展已经到位,但我实际上不确定为什么,因为我刚刚重新启动并且没有运行我的应用程序。
更新 4:
我发现我的权利问题只是文件的格式。我在 TextEdit 中对其进行了更改,现在我可以与我的设备进行通信了。这是我最终得到的结果:
objective-c - 激活无代码 DEXT 后获取 OSSystemExtensionErrorCodeSignatureInvalid
我构建了一个无代码 DEXT 来替换工作中的无代码 KEXT -将无代码 KEXT迁移到无代码 DEXT。我参考了一些网站和 GitHub 存储库将其组合在一起,并得到了其他 SO 用户的帮助。
我在关闭 SIP 的情况下运行,打开了开发者模式(systemextensionsctl developer on)。我正在按照此处概述的建议https://github.com/knightsc/USBApp/issues/1对应用程序和 dext 进行签名。
当我运行它嵌入的应用程序并请求激活扩展时,该功能似乎成功了。然而,我随后接到了一个电话——
当工作队列线程启动时,在我的 OSSystemExtensionRequestDelegate 派生请求对象上。错误是 OSSystemExtensionErrorCodeSignatureInvalid。我假设该线程与我用来构造 OSSystemExtensionRequest 的 dispatch_queue_t 相关。
通过搜索和 Apple 来源,我了解 OSSystemExtensionErrorCodeSignatureInvalid 与权利和签名有关。当我运行 systemextensionsctl list 我得到 -
当我运行 codesign -d -vvv --entitlements :- 时,我得到 -
不确定我在那里看到任何错误,并且代码签名脚本似乎运行正确。这是我的 DEXT 授权文件,其中为旧设备设置了 com.apple.developer.driverkit.transport.usb(与我的 DEXT info.plist 的 IOKitPersonalities 部分中列出的相同设备)-
因此,该扩展似乎处于活动状态并已启用,但在验证过程中出现了故障。
对此问题的任何帮助或输入将不胜感激。
更新:
只是为了笑,我运行了我的生产应用程序,它没有安装系统扩展,看看它是否会导致我的硬件匹配。由于安装了驱动程序,它确实如此。但是,当我尝试访问该设备时,我遇到了崩溃。这似乎仍然是进步。
driverkit - 如何从 DriverKit 驱动程序保存配置
我需要从 DriverKit 驱动程序中保存一些配置。我正在阅读如何在会话之间保存 kext 配置,在这种情况下,似乎首选的方法是从用户登陆应用程序中保存配置。由于 DriverKit 驱动程序位于用户领域,是否有更简单的方法可以做到这一点,或者首选解决方案与 kexts 相同吗?
最好将配置保存在某个持久的位置,即使安装 Dext 的应用程序已从系统中删除,这样在卸载应用程序然后重新安装时也能够保留配置。
macos - DriverKit 驱动程序如何通知应用程序?
我知道如何向 DriverKit 发送数据并取回一些值,即应用程序调用和驱动程序从应用程序中IOConnectCallStructMethod()
填写。OSData
structureOutput
在我的应用程序中,它正在使用IOConnectCallAsyncScalarMethod()
并且 kext 使用sendAsyncResult64()
来让应用程序知道事件的到来。但是该方法sendAsyncResult64()
在 DriverKit 中不可用。
我看到AsyncCompletion看起来像解决方案,但不知道要实现它。有谁知道该怎么做?如果有任何建议,请欣赏!
macos - 如何获得“com.apple.developer.driverkit.userclient-access”的权利?
我们已请求所有与 DriverKit 相关的权利。我们得到的如下:
com.apple.developer.driverkit
com.apple.developer.driverkit.transport.hid
com.apple.developer.driverkit.family.hid.device
com.apple.developer.driverkit.family.hid.eventservice
com.apple.developer.driverkit.family.hid.virtual.device
我们刚刚了解到,如果我们要分发能够与 DriverKit 通信的应用程序,com.apple.developer.driverkit.userclient-access
则需要授权。但是,我们不知道如何生成包含此权利的配置文件。在向 Apple 发送请求权利时,我们是否遗漏了什么?或者当我们选择适当的功能时,此权利已在某些项目上准备就绪?