Определение того, какое приложение читает или записывает данные из драйвера схемы фильтра 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
стек.