Определение того, какое приложение читает или записывает данные из драйвера схемы фильтра Mac OS

Я хочу научиться разрабатывать драйвер схемы фильтра Mac OS, и я использую модифицированную версию примера приложения SimpleCryptoDisk из книги Mac OS X Internals. Источник, который я использую, находится здесь.

В качестве следующей цели я хочу изменить это, чтобы отслеживать, какие приложения выполняют чтение и запись, и в конечном итоге распечатать количество байтов, которые были прочитаны и записаны каждым приложением.

Я вижу, что в вызове read() есть указатель на клиент (* IOService), однако я не нашел способа получить задачу / процесс из этого объекта. Я думал о вызове API для определения текущего процесса, но так как этот код выполняется в KEXT (в ядре), я не думаю, что это поможет мне определить процесс пользовательского пространства.

Я нашел там IOServer API с именем newUserClient(), который содержит task_t, что, я полагаю, достаточно, чтобы как-то получить имя приложения. Однако я не уверен, как связать этот вызов с вызовом read().

Обычно я просто экспериментально пробую кучу вещей, но, поскольку я работаю в ядре, сначала я хочу осторожно поступить и избежать путаницы. Так что, если кто-то может дать мне какие-либо подсказки, чтобы получить имя процесса для чтения или записи, это было бы здорово.

1 ответ

Решение

Я думал о вызове API для определения текущего процесса, но так как этот код выполняется в KEXT (в ядре), я не думаю, что это поможет мне определить процесс пользовательского пространства.

Это в значительной степени лучшее, что вы собираетесь получить; API не пропускает конечного инициатора ввода / вывода. Однако в большинстве случаев вызов будет выполнен в результате активности файловой системы, инициированной системным вызовом ввода-вывода, и будет выполняться в контексте (ядра) процесса пользовательского пространства. Итак proc_* API (от <sys/proc.h> в большинстве случаев предоставит вам информацию, которая вам кажется необходимой.

IOService::newUserClient() имеет дело с пользовательскими процессами, напрямую взаимодействующими с ядром IOService объекты через пользовательские библиотеки IOKit. Это не как IOStorage Вызовы ввода / вывода вызываются, хотя, они проходят через IOMediaBSDClient который обеспечивает связь между файлами блочных устройств в /dev/ и IOStorage стек.

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