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

Van*_*ang 5 macos iokit driverkit

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

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

我看到AsyncCompletion看起来像解决方案,但不知道如何实现它。有人知道该怎么办吗?感谢任何建议!

pmd*_*mdj 6

IOUserClient::AsyncCompletion确实是 的替代品sendAsyncResult64()

要成功调用它,您需要保留在调度函数中提供的字段OSAction中提供的对象。然后,当您准备好发送异步结果时,调用completionIOUserClientMethodArgumentsExternalMethod

userclient->AsyncCompletion(saved_osaction, result, async_arguments, num_async_arguments);
Run Code Online (Sandbox Code Playgroud)

OSAction一旦不再需要该对象,请不要忘记释放它。异步参数数组将被传递到用户空间应用程序中的处理函数,与 kext 调用相同sendAsyncResult64()

请注意,您无法异步填充“小”structureOutput字段(4096 字节或更少),因为这些字段必须在ExternalMethod处理程序中返回。只有当缓冲区足够大以通过传递时,structureOutputDescriptor您才能保留该描述符并在初始ExternalMethod返回后用数据填充它。然而,这与 kext 没有什么不同。