我知道如何向DriverKit发送数据并取回一些值,即应用程序调用IOConnectCallStructMethod(),驱动程序从应用程序中将OSData填充到structureOutput中。
在我的应用程序中,它使用IOConnectCallAsyncScalarMethod()和kext,使用sendAsyncResult64()让应用程序知道即将到来的事件。但是,DriverKit中不提供sendAsyncResult64()方法。
我看到AsyncCompletion看起来像是解决方案,但没有实现它的想法。有人知道怎么做吗?如果有任何建议,我将不胜感激!
发布于 2020-08-27 21:15:14
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返回后用数据填充它。然而,这与kext没有什么不同。
https://stackoverflow.com/questions/63553940
复制相似问题