问题标签 [macos-system-extension]

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 投票
0 回答
53 浏览

macos - 端点安全扩展中的 xpc

我正在开发一个端点安全扩展。主应用程序使用 pyobjc 在 Python 2.7.18 中运行。为了在应用程序和扩展之间建立通信,我尝试了 NSXPCConnection。我成功地将值发送到 Extension。但是在 pyobjc 中使用块并不成功。首先我进入了这个问题。我使用这个解决方案解决了它。在那之后得到问题

后来我想到了使用 XPC 的 C Api。但这里的问题是 xpc_main 阻塞了那个主线程。

xpc_main 调用了 dispatch_main 并且没有执行实际的扩展代码。我在 info.plist 中添加了 XPCService dict,并将 RunLoopType 添加为 NSRunLoop,如链接中所示

如果 xpc_main 和 Endpoint 扩展可以一起工作,请帮助我。NSXPCListner工作正常。如果 xpc_main 不可能,那么我们如何使用 pyobjc 执行块。

0 投票
1 回答
147 浏览

macos - 如何实现虚拟音频驱动并将其发布到 Apple App Store?

在会议视频中的 3:38-4:00,Baek San Chang 似乎表示不允许将 AudioDriverKit 用于虚拟音频设备

视频:https ://developer.apple.com/videos/play/wwdc2021/10190/

他是这样说的:

请记住,提供的示例代码纯粹是出于演示目的,它会创建一个与硬件设备无关的虚拟音频驱动程序,因此不会授予此类用例的权利。

对于只需要设备的虚拟音频驱动程序,应继续使用音频服务器插件驱动程序模型。

示例代码的提及有点令人困惑;他的意思是说不会为虚拟设备授予硬件访问权限吗?这似乎很明显。

但是,如果他的意思是驱动程序工具包扩展(com.apple.developer.driverkit 和 com.apple.developer.driverkit.allow-any-userclient-access)的权利将不会授予虚拟音频设备,这就是 AudioServerPlugins 的原因应该还用,那就另当别论了。

我们是否允许为虚拟设备使用 AudioDriverKit 扩展?

将扩展程序与应用程序捆绑在一起而不需要安装程序的好处是在允许的情况下使用扩展程序的重要原因。

我需要创建一个虚拟音频驱动程序,向用户呈现一个虚拟麦克风和一个虚拟扬声器。然后,用户可以在 Skype、Zoom 等 3rd 方音频通信应用程序中选择这些虚拟端点。虚拟音频驱动程序实现然后在物理设备(由用户在虚拟驱动程序用户空间控制应用程序中选择)和虚拟设备之间路由音频。

要求虚拟音频驱动程序及其控制应用程序可以发布到苹果应用程序商店,供用户下载并安装在他们的机器上,没有任何问题。

我该怎么办?

0 投票
0 回答
24 浏览

xcode - XCode - 如何创建捆绑的 CLI 工具应用程序

我是 XCode 的新手,所以也许我遗漏了一些非常简单的东西,但是如何使用 XCode 创建一个 CLI 工具并将它与我编译的系统扩展捆绑在一起?

我想创建一个与我的系统扩展捆绑在一起的控制台应用程序并安装/卸载它。据我了解,扩展程序应驻留在应用程序的 Contents/Library/SystemExtensions 中(来自此处的信息)。

根据我的发现,我只成功地制作了一个 GUI/UI 应用程序,而不是一个可以在其中捆绑东西的 CLI 应用程序。

0 投票
0 回答
56 浏览

c++ - 我什么时候可以调用 OSAction::Cancel 处理程序?

我有一个负责 USB 设备的 Driverkit 驱动程序。驱动程序解压缩 USB 数据包中的数据,并将数据写入应用程序和驱动程序之间共享的缓冲区。共享缓冲区由应用程序使用IOConnectCallAsyncMethod. 当应用程序准备好使用缓冲区时,驱动程序会IOUserClient::AsyncCompletion使用一个OSAction对象进行调用。该OSAction对象也是作为IOConnectCallAsyncMethod应用程序调用的结果而创建的。OSAction每个共享缓冲区有一个对象。

如果处理应用程序中事件的机制出现错误,我会告诉驱动程序停止调用OSAction对象,并且处理应用程序中事件的线程将停止。在这一点上,我不能确定我已经处理了应用程序中的所有事件,并且当我向驱动程序发送消息以重新启动时,我想确保在停止之前没有事件在等待处理的队列中应用程序。

我看过OSAction::Cancel,它允许您传递一个应在取消回调时调用的处理程序。此方法的文档说在任何正在进行的回调完成执行后系统调用的处理程序块。

飞行中”回调是什么意思?

我调用Cancel所有OSAction对象,并为每个对象递减一个计数器OSAction以跟踪取消完成(类似于 Apple 的这个示例项目)。问题是我看不到该块被调用。

我什么时候可以调用块?我能想到的一些不同的情况是:

  • 一个OSAction从未传递给AsyncCompletion.
  • OSAction传递给但应用AsyncCompletion程序未处理事件的 。
  • OSAction传递给的AsyncCompletion,应用程序开始处理事件,但应用程序尚未完成事件。

我还想知道驱动程序中的哪个调度队列将用于调用块。

0 投票
1 回答
310 浏览

c++ - 如何使用 PCIDriverKit 对 PCI BAR 进行内存映射?

如何将 PCI 基地址寄存器 (BAR) 从 PCIDriverKit 驱动程序 (DEXT) 内存映射到用户空间应用程序?

从驱动程序扩展到应用程序的内存映射可以通过在用户客户端子类(在驱动程序端)中实现IOUserClient::CopyClientMemoryForType然后调用IOConnectMapMemory64(从用户空间应用程序端)来完成。在这个相关的答案中已经很好地和彻底地解释了这一点。

唯一缺少的位是获取与所需 PCI BAR 对应的IOMemoryDe​​scriptorCopyClientMemoryForType ,以便从实现中返回它。

示例代码

以另一种方式问,给定以下简化代码,将实现imaginaryFunctionWhichReturnsTheBARBuffer什么?

在前面的代码ivars->pciDevice中指的是一个即用型的IOPCIDevice(例如:它已经根据最新的最佳实践成功匹配、打开和配置)。

这意味着已经可以使用各种配置内存读/写方法来访问所需 PCI BAR 内存的显式偏移量。缺少(或不清楚)的是如何使用这些 API(或等效的 API)将对应于 PCI BAR 的整个缓冲区映射到用户空间应用程序。

可能相关或不相关的随机注释

  • 这个来自相关问题的答案:如何在 DriverKit 系统扩展中分配内存并将其映射到另一个进程?包含以下引用:

    [...] 返回的内存描述符不必是我在示例中使用的 IOBufferMemoryDe​​scriptor,它也可以是 PCI BAR 或其他。

    正是我想做的,所以至少听起来应该是可能的。剩下的唯一问题是如何实现它。

  • Apple 论坛上已经发布了一个类似的问题,尽管它尚未收到任何答案(截至撰写本文时),但它确实包含一些有用的提示。

    看起来 PCIDriverKit 中有一个私有函数,签名如下:

    很难说出它应该做什么(因为它没有记录),但签名似乎与我正在寻找的功能相匹配。但是,尝试使用它总是会导致错误代码(类似于原始论坛帖子中报告的错误代码)。错误代码似乎有所不同,具体取决于作为IOService *forClient) 传递的参数。

    该帖子的另一个优点是内核扩展 (KEXT) 可以使用getDeviceMemoryWithIndex来完成我们需要的工作(如果驱动程序被实现为现在似乎已弃用的 PCI 内核扩展)。

    但是,此功能似乎不适用于驱动程序扩展 (DEXT)。因此,构建这个问题的另一个问题可能是:getDeviceMemoryWithIndexPCIDriverKit 驱动程序扩展的等价物是什么?

0 投票
1 回答
50 浏览

macos - MacOS PCI dext:分散收集 DMA 到应用程序缓冲区

我正在将使用 IOKit 编写的 MacOS PCI 驱动程序移植到新的 PCIDriverKit 框架中。

我能够使用在 dext 内分配的连续缓冲区(使用IOBufferMemoryDescriptor::Create)执行 DMA。

但我也想对应用程序分配的缓冲区执行 DMA。

我真正想做的是:

  • 在应用程序中分配一个对齐的缓冲区(例如posix_memalign
  • 将指向此缓冲区的指针发送到 dext
  • 在 dext 中,检索页面描述符列表,以便能够在不复制到(或从)该缓冲区的情况下执行 DMA。

在 IOKit 中,我们可以使用 和 等方法IOMemoryDescriptor::withAddressRangeIODMACommand::gen64IOVMSegments映射和检索分散聚集列表,但我无法在 PCIDriverKit 框架的 dext 中找到有关如何执行此操作的任何信息。

任何人都可以帮助我如何做到这一点?