我知道如何将数据发送到DriverKit并返回一些值,即应用程序调用IOConnectCallStructMethod()
,驱动程序从应用程序填充structureOutput
中的OSData
。
在我的应用程序中,它使用IOConnectCallAsyncScalarMethod()
,kext使用sendAsyncResult64()
来让应用程序知道即将到来的事件。然而,方法sendAsyncResult64()
在DriverKit中不可用。
我看到AsyncCompletion看起来像一个解决方案,但不知道如何实现它。有人知道该怎么做吗?如果有任何建议,不胜感激!
IOUserClient::AsyncCompletion
确实是sendAsyncResult64()
的替代品。
要成功调用它,您需要保留ExternalMethod
调度函数中提供的IOUserClientMethodArguments
的completion
字段中提供的OSAction
对象。然后,当您准备发送异步结果时,调用
userclient->AsyncCompletion(saved_osaction, result, async_arguments, num_async_arguments);
不要忘记在不再需要OSAction
对象时释放它。异步参数数组将传递给用户空间应用程序中的处理程序函数,就像调用sendAsyncResult64()
的kext一样。
请注意,您不能异步填充";"小";structureOutput
字段(4096字节或更少(,因为这些字段必须在ExternalMethod
处理程序中返回。只有当缓冲区足够大,可以通过structureOutputDescriptor
传递时,才能保留该描述符,并在初始ExternalMethod
返回后用数据填充它。然而,这与kexts没有什么不同。