Как драйвер DriverKit уведомляет приложение?
Я знаю, как отправить данные в DriverKit и вернуть некоторые значения, то есть вызов приложения IOConnectCallStructMethod()
и водитель заполняют OSData
в structureOutput
из приложения.
В моем приложении он использует IOConnectCallAsyncScalarMethod()
и кекст с использованием sendAsyncResult64()
чтобы приложение узнало о входящих событиях. Однако метод sendAsyncResult64()
недоступен в DriverKit.
Я видел, что AsyncCompletion выглядит как решение, но не знаю, как его реализовать. Кто-нибудь знает, как это сделать? Ценю, если есть предложения!
1 ответ
IOUserClient::AsyncCompletion
действительно замена sendAsyncResult64()
.
Для успешного вызова вам необходимо сохранить OSAction
объект поставлен в completion
поле IOUserClientMethodArguments
поставляется в вашем ExternalMethod
функция отправки. Затем, когда вы будете готовы отправить асинхронный результат, вызовите
userclient->AsyncCompletion(saved_osaction, result, async_arguments, num_async_arguments);
Не забудьте отпустить OSAction
объект, когда он вам больше не нужен. Массив асинхронных аргументов будет передан в функцию-обработчик в приложении пользовательского пространства, как и при вызове kext.sendAsyncResult64()
.
Обратите внимание, что вы не можете асинхронно заполнить "small" structureOutput
поля (4096 байт или меньше), так как они должны быть возвращены в ExternalMethod
обработчик. Только если буфер достаточно велик для передачи черезstructureOutputDescriptor
можете ли вы сохранить этот дескриптор и заполнить его данными после начального ExternalMethod
возвращается. Однако это не отличается от кекстов.