Определение того, какое приложение считывает или записывает данные из драйвера схемы фильтра Mac OS - PullRequest
0 голосов
/ 13 декабря 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 14 декабря 2018

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

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

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

...