Как драйвер 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возвращается. Однако это не отличается от кекстов.

Другие вопросы по тегам