问题标签 [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 投票
1 回答
107 浏览

multithreading - 回调是否序列化到 DriverKit 驱动程序?

我需要同时在批量、中断同步端点上排队进出请求。我可以期望来自这些请求的所有回调都一一到来吗?或者可以同时期待多个回调?

0 投票
1 回答
376 浏览

c++ - 如何创建 IOUSBHostPipe::CompleteAsyncIO 回调?

我正在编写一个 SystemExtension 来与 USB 设备通信。我最初的计划是创建一个Transfer分配必要的IOMemoryDe​​scriptor的类,然后传递我希望Transfer该类与之通信的接口。我希望将AsyncIO完成后产生的回调发送给班级。如果我需要将多个读取排队,我可以创建更多此类的实例。在回调中,我将解包数据,然后提交另一个readTransfercompleteCallback

TransferOSTypeAlloc(Transfer).

我面临的问题是创建 OSAction 失败并出现此堆栈跟踪:

如果我改为在连接 USB 设备时由系统实例化的类中定义、实现和创建回调(该类在 plist 中使用 key 指定IOUserClass),则创建OSAction对象可以正常工作。

调用IOUSBHostInterface::OpenIOUserClass通过将指向 的指针IOUserClass作为第一个参数传递给Open. 这样做应该可以吗?或者是否要求该IOService对象也是从AsyncIO.

0 投票
1 回答
76 浏览

macos - 如何覆盖 DriverKit OSData 内部缓冲区的一部分?

的文档OSData“......您可以向它们添加字节并覆盖字节数组的部分。” . 我可以看到一种附加字节的方法,但我不明白我如何能够覆盖缓冲区的一部分。

另一种选择是用于IONewZero分配一些我需要的类型的元素。我的情况是我只需要这个int

例子:

然后解除分配:

与使用/的解决方案相比,使用OSData对象有什么优势?IONewZeroIOSafeDeleteNULL

0 投票
1 回答
301 浏览

macos - 不在 USB DriverKit 的 Start 方法中调用

我正在编写一个 DriverKit dext 并且可以使用系统扩展框架激活它。我有 USB 的权利,即 com.apple.developer.driverkit设置为true com.apple.developer.driverkit.transport.usb已添加为字典但没有任何子值(它是空的)。

我期待在插入任何 USB 设备后被 dext 的 Start 方法调用,但我没有看到任何调用。

知道是否缺少任何步骤/配置吗?

0 投票
1 回答
146 浏览

macos - apple.developer.driverkit.transport.usb 的 idVendor

我正在阅读这篇内容丰富的帖子 如何设置“com.apple.developer.driverkit.transport.usb”权利?

我想问,我idVendor从哪里得到这个?它的价值应该是多少?

0 投票
1 回答
727 浏览

c++ - 如何在 DriverKit 系统扩展中分配内存并将其映射到另一个进程?

我已在我的应用程序中分配内存并将其指针和大小传递给 IOConnectCallStructMethod. 然后使用IOMemoryDescriptor::CreateMapping我将此内存映射到 DriverKit 系统扩展进程,并且可以写入此映射的内存位置并从我的应用程序中读取数据。

我现在想对系统扩展中分配的内存做类似的事情,然后将其映射到使用系统扩展的应用程序。我想在系统扩展中创建一组内存缓冲区,然后从应用程序写入它,然后IOConnectCallScalarMethod使用IOUSBHostPipe::AsyncIO. 当CompleteAsyncIO由于发送完成而出现回调时,我会通知应用程序现在可以将数据复制到发送的第一个缓冲区。这种机制可能可以使用IOConnectCallAsyncStructMethod, 以及OSAction在系统扩展中创建的对象来完成。我不明白的是如何将系统扩展中分配的内存映射到应用程序。

0 投票
1 回答
143 浏览

c++ - `new` 和 `delete` 可以在 DriverKit 驱动程序中使用吗?

DriverKit 提供IONewZeroIOSafeDeleteNULL. 那些不调用任何构造函数或析构函数。

假设我想在 ivars 结构中有一些课程。该类不需要继承自OSObjectnor IOService。我应该如何构造这个对象?如果我将它作为ivars结构中的成员,则不会调用我的类的构造函数。如果我在 ivars 结构中保留指向我的类的指针,我需要分配并调用类的构造函数。我可以使用new/delete吗?

0 投票
1 回答
3450 浏览

swift - 如何杀死系统扩展或网络扩展?

所以我正在用 Swift 构建一个带有网络扩展的 macOS 应用程序。经过一些测试,扩展仍然作为系统中的一个进程。我可以停止,也可以终止应用程序,但我无法停止、终止或卸载网络扩展。网络扩展一次又一次地出现。

我重新启动了 macOS,但网络扩展仍然作为一个进程存在。如何从系统中完全删除它?

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 投票
1 回答
353 浏览

swift - 将参数从 App Delegate 传递到系统扩展,Mac OS

我正在创建一个系统扩展并将其捆绑在 Mac OS Catalina 上的 Mac 应用程序中。我已经成功构建了应用程序并请求我的应用程序委托 (Swift) 激活扩展。我的系统扩展可以成功运行。

我的问题是,我需要以某种方式将请求激活扩展的应用委托的附加参数传递给我的系统扩展的主要功能。具体来说,我正在尝试传递运行应用程序的用户的用户名。有没有办法将额外的参数从委托传递给扩展?

我无法从系统扩展中获取当前用户,因为扩展始终以 root 身份运行。所以获取当前用户将返回root。

来自应用委托的相关代码:

我的系统扩展的主要功能:

如果我能以某种方式接收传入的用户名argv,那就太好了。我对其他解决方案持开放态度。底线是我需要以某种方式在两者之间传达这个用户名值。