问题标签 [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.
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
,应用程序开始处理事件,但应用程序尚未完成事件。
我还想知道驱动程序中的哪个调度队列将用于调用块。
driverkit - USBSerialDriverKit中设置IOTTYBaseName的问题
我想知道如何在 USBSerialDriverKit 中设置 IOTTYBaseName。我尝试使用从 IOService 继承的 SetProperties 方法,如以下代码,但该方法返回 -301 错误代码。
c++ - 如何使用 PCIDriverKit 对 PCI BAR 进行内存映射?
如何将 PCI 基地址寄存器 (BAR) 从 PCIDriverKit 驱动程序 (DEXT) 内存映射到用户空间应用程序?
从驱动程序扩展到应用程序的内存映射可以通过在用户客户端子类(在驱动程序端)中实现IOUserClient::CopyClientMemoryForType然后调用IOConnectMapMemory64(从用户空间应用程序端)来完成。在这个相关的答案中已经很好地和彻底地解释了这一点。
唯一缺少的位是获取与所需 PCI BAR 对应的IOMemoryDescriptorCopyClientMemoryForType
,以便从实现中返回它。
示例代码
以另一种方式问,给定以下简化代码,将实现imaginaryFunctionWhichReturnsTheBARBuffer
什么?
在前面的代码ivars->pciDevice
中指的是一个即用型的IOPCIDevice(例如:它已经根据最新的最佳实践成功匹配、打开和配置)。
这意味着已经可以使用各种配置和内存读/写方法来访问所需 PCI BAR 内存的显式偏移量。缺少(或不清楚)的是如何使用这些 API(或等效的 API)将对应于 PCI BAR 的整个缓冲区映射到用户空间应用程序。
可能相关或不相关的随机注释
这个来自相关问题的答案:如何在 DriverKit 系统扩展中分配内存并将其映射到另一个进程?包含以下引用:
[...] 返回的内存描述符不必是我在示例中使用的 IOBufferMemoryDescriptor,它也可以是 PCI BAR 或其他。
这正是我想做的,所以至少听起来应该是可能的。剩下的唯一问题是如何实现它。
Apple 论坛上已经发布了一个类似的问题,尽管它尚未收到任何答案(截至撰写本文时),但它确实包含一些有用的提示。
看起来 PCIDriverKit 中有一个私有函数,签名如下:
很难说出它应该做什么(因为它没有记录),但签名似乎与我正在寻找的功能相匹配。但是,尝试使用它总是会导致错误代码(类似于原始论坛帖子中报告的错误代码)。错误代码似乎有所不同,具体取决于作为
IOService *forClient
) 传递的参数。该帖子的另一个优点是内核扩展 (KEXT) 可以使用getDeviceMemoryWithIndex来完成我们需要的工作(如果驱动程序被实现为现在似乎已弃用的 PCI 内核扩展)。
但是,此功能似乎不适用于驱动程序扩展 (DEXT)。因此,构建这个问题的另一个问题可能是:
getDeviceMemoryWithIndex
PCIDriverKit 驱动程序扩展的等价物是什么?
macos - MacOS PCI dext:分散收集 DMA 到应用程序缓冲区
我正在将使用 IOKit 编写的 MacOS PCI 驱动程序移植到新的 PCIDriverKit 框架中。
我能够使用在 dext 内分配的连续缓冲区(使用IOBufferMemoryDescriptor::Create
)执行 DMA。
但我也想对应用程序分配的缓冲区执行 DMA。
我真正想做的是:
- 在应用程序中分配一个对齐的缓冲区(例如
posix_memalign
) - 将指向此缓冲区的指针发送到 dext
- 在 dext 中,检索页面描述符列表,以便能够在不复制到(或从)该缓冲区的情况下执行 DMA。
在 IOKit 中,我们可以使用 和 等方法IOMemoryDescriptor::withAddressRange
来IODMACommand::gen64IOVMSegments
映射和检索分散聚集列表,但我无法在 PCIDriverKit 框架的 dext 中找到有关如何执行此操作的任何信息。
任何人都可以帮助我如何做到这一点?
macos - macOS NetworkingDriverKit - How can I register multiple ethernet interfaces?
I have tried extending IOUserNetworkEthernet
and calling RegisterEthernetInterface()
. This works perfectly for one ethernet interface, though the driver crashes when RegisterEthernetInterface
is called a second time (doesn't return an error code). I have tried registering with separate queues.
Another approach was extending IOUserClient
instead, and calling IOService::Create
to create child IOUserNetworkEthernet instances. Everything about this approach works (the children appear within ioreg). However, once I call RegisterEthernetInterface
on just one of the children, macOS crashes.
How would I go about creating a dext with multiple ethernet interfaces? Have I been approaching it the right way?
Appreciate any help.
driverkit - NetworkingDriverKit - 如何访问数据包数据?
我一直在创建一个虚拟以太网接口。我已经与控制应用程序打开了异步通信,每次有新数据包时,都会通知控制应用程序,然后询问数据包数据。数据包数据存储在一个简单的结构中,uint8_t[1600]
用于字节和uint32_t
长度。每次数据包可用时,dext 都能够使用虚拟数据填充此结构,并且虚拟数据在控制应用程序上可见。但是,我正在努力用真实的数据包数据填充它。
IOUserNetworkPacket
提供有关数据包的元数据。它包含数据包时间戳、大小等,但似乎不包含数据包的数据。有GetDataOffset()
和GetMemorySegmentOffset()
方法似乎返回数据包数据在其内存缓冲区中的位置的字节偏移量。我的直觉告诉我将此偏移量添加到数据包数据存储位置的指针上。问题是我不知道数据包实际存储在哪里。
我知道他们是由 管理的IOUserNetworkPacketBufferPool
,但我不认为那是他们的记忆所在。有CopyMemoryDescriptor()
给出IOMemoryDescriptor
其内容的方法。我尝试使用描述符创建一个IOMemoryMap
,使用它来调用GetAddress()
. 指向所有提到的对象的指针会导致垃圾数据。
我一定是完全错误的。如果有人知道如何访问数据包数据,或者有任何想法,我将不胜感激。谢谢。
内的代码片段IOUserClient::ExternalMethod
:
macos - MacOS 将 FrameBuffer 配置为 UserClient
我正在寻找更新现有的kext,它可以简单地打开IOFrameBuffer
并通过调用来修改配置setAttributeForConnection()
。我相信不再需要kext ,因为我可以通过以下调用作为用户客户端连接到帧缓冲区服务:
connection
我假设我现在需要调用一个方法IOConnectCallXXX()
来更改单个属性,但我无法弄清楚如何进行与 kext调用等效的调用:
到目前为止,我一直无法找到有关帧缓冲区连接的任何文档。是否有一个我可以使用调用connection
提供的函数列表来调用IOServiceOpen()
macos - 如何将我的 dext 与 DriverKit 中的 USB 设备匹配?
我正在编写一个驱动程序包扩展,其目标是阻止 USB 设备,例如闪存驱动器。作为起点,我在https://developer.apple.com/documentation/driverkit/communicating_between_a_driverkit_extension_and_a_client_app?language=objc选择了示例项目
为了不禁用键盘或鼠标,首先我尝试将我的 dext 与单个具体的 USB 驱动器匹配,我在注册表中找到了它的 vendorId(注意十六进制到十进制的转换)。问题是当插入闪存驱动器时,系统与我的 dext 不匹配并继续使用系统一。
怎么了?是否需要配置文件?甚至有可能以这种方式匹配任何设备吗?
司机授权文件:
信息列表: