3

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

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

我看到AsyncCompletion看起来像解决方案,但不知道要实现它。有谁知道该怎么做?如果有任何建议,请欣赏!

4

1 回答 1

3

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

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

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

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

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

于 2020-08-27T13:15:13.767 回答