Я пишу расширение ядра сетевого фильтра для OS X.
Я хочу назвать что-то вроде обратных вызовов в kext.
Например, в функции data_in, когда я получаю пакет tcp, я хочу вызвать этот обратный вызов из пользовательского приложения. Приложение изменяет этот пакет, и я внедряю его.
Как сделать это взаимодействие между kext и пользовательским приложением?
Прежде всего, вы не хотите блокировать обратный вызов data_in — вы должны «проглотить» пакет, отправить его в пространство пользователя, а когда он вернется, повторно внедрить его в соединение.
Существует несколько способов обмена данными с процессами в пользовательском пространстве. Наиболее удобный способ обмена сетевыми пакетами, вероятно, контроль ядра механизм, который по сути позволяет открыть сокетное соединение между пользовательской программой и вашим kext.
Apple имела обыкновение предлагать пример исходного кода, «tcplognke», который делал нечто очень похожее, но, похоже, исчез с их собственного сайта. Кто-то любезно, кажется, сохранил его и предлагая его для скачивания — Мне кажется, сейчас все в порядке, но, очевидно, будьте осторожны при загрузке материалов со случайных сайтов.