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



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

在我的应用程序中,它使用IOConnectCallAsyncScalarMethod(),kext使用sendAsyncResult64()来让应用程序知道即将到来的事件。然而,方法sendAsyncResult64()在DriverKit中不可用。

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

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

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

userclient->AsyncCompletion(saved_osaction, result, async_arguments, num_async_arguments);

不要忘记在不再需要OSAction对象时释放它。异步参数数组将传递给用户空间应用程序中的处理程序函数,就像调用sendAsyncResult64()的kext一样。

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

最新更新