问题标签 [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.

0 投票
1 回答
170 浏览

macos - macOS10.15+系统扩展和DriverKit如何开发读盘驱动

我已经通过 IOKit 开发了一个内核扩展(kext),但将来会被弃用。所以我想开发另一个使用 dext 的驱动程序来使用 DriverKit 替换 kext。但是我没有找到可执行的解决方案,就像我找不到某些类来替代 IOMedia。当我打算在我的代码中包含 IOKit 时,我发现 TARGET_OS_DRIVERKIT 是 1。有人可以帮助我吗?非常感谢!

0 投票
1 回答
138 浏览

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 发送的 IOBufferMemoryDe​​scriptor 获取从 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 (完成)"

0 投票
0 回答
66 浏览

macos - 在 ACM DEXT(IOUserUSBSerial) 的情况下如何调用 handleInterruptPacket 覆盖方法?

在 ACM Dext 中,handleInterruptPacket覆盖方法没有被系统调用。请让我知道有什么遗漏。

iig 文件:

cpp文件:

但是如果发送到中断 EP 的 AsyncIO 请求能够得到响应 AsyncIO 完成(CompleteAsyncIO)。请查看如何访问 CompleteAsyncIO 中的 IOMemoryBufferDescriptor,它是在中断 EP 上通过 AsyncIO 发送的

0 投票
1 回答
52 浏览

macos - 如何从一个 Dext 调用函数到另一个 Dext?

我正在尝试编写代码来调用从一个 dext 到另一个 dext 的函数。我已经浏览了下面的链接,它有关于sext to dext 通信的信息。 “NewUserClient”应该如何实现

我可以知道 Dext 到 Dext 通信的任何功能(或类)吗?如何从一个 dext 调用一个函数到另一个 dext?

0 投票
1 回答
63 浏览

xcode - DriverKit SDK 是否支持信号量?

我在 DriverKit 头文件中找不到像 semaphore_create/semaphore_wait/semaphore_signal/semaphore_destroy 这样的函数。Driverkit 中不支持,有替代方案吗?</p>

0 投票
1 回答
1143 浏览

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。以下是我的问题:

  1. 看起来 IOService 的默认子类适用于 USB - 这与 KEXT 中的 IOClass 相同。真的吗?

  2. DEXT 世界中的 IOUSBHostInterface 是否等同于 KEXT 世界中的 IOUSBInterface?

  3. IOUSBHostDevice 是否等同于 IOUSBDevice?

  4. 对于无代码 DEXT,我是否需要对 .cpp 或 .iig 做任何事情?我的大部分工作不是在 plist 和 entitlements 文件中完成吗?

  5. 我的 MyUsbDriver 目标的框架和库中是否需要 USBDriverKit.framework?

  6. 我在哪里可以找到如何完成此迁移的体面示例?

任何帮助将不胜感激。

更新:

使用答案中的示例和其他链接,我能够得到一些东西。我确实有一个“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 中对其进行了更改,现在我可以与我的设备进行通信了。这是我最终得到的结果:

0 投票
1 回答
230 浏览

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 部分中列出的相同设备)-

因此,该扩展似乎处于活动状态并已启用,但在验证过程中出现了故障。

对此问题的任何帮助或输入将不胜感激。

更新:

只是为了笑,我运行了我的生产应用程序,它没有安装系统扩展,看看它是否会导致我的硬件匹配。由于安装了驱动程序,它确实如此。但是,当我尝试访问该设备时,我遇到了崩溃。这似乎仍然是进步。

0 投票
0 回答
55 浏览

driverkit - 如何从 DriverKit 驱动程序保存配置

我需要从 DriverKit 驱动程序中保存一些配置。我正在阅读如何在会话之间保存 kext 配置,在这种情况下,似乎首选的方法是从用户登陆应用程序中保存配置。由于 DriverKit 驱动程序位于用户领域,是否有更简单的方法可以做到这一点,或者首选解决方案与 kexts 相同吗?

最好将配置保存在某个持久的位置,即使安装 Dext 的应用程序已从系统中删除,这样在卸载应用程序然后重新安装时也能够保留配置。

0 投票
1 回答
377 浏览

macos - DriverKit 驱动程序如何通知应用程序?

我知道如何向 DriverKit 发送数据并取回一些值,即应用程序调用和驱动程序从应用程序中IOConnectCallStructMethod()填写。OSDatastructureOutput

在我的应用程序中,它正在使用IOConnectCallAsyncScalarMethod()并且 kext 使用sendAsyncResult64()来让应用程序知道事件的到来。但是该方法sendAsyncResult64()在 DriverKit 中不可用。

我看到AsyncCompletion看起来像解决方案,但不知道要实现它。有谁知道该怎么做?如果有任何建议,请欣赏!

0 投票
1 回答
711 浏览

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 发送请求权利时,我们是否遗漏了什么?或者当我们选择适当的功能时,此权利已在某些项目上准备就绪?