1

我想学习开发 Mac OS 过滤方案驱动程序,我正在使用 Mac OS X Internals 一书中的 SimpleCryptoDisk 示例应用程序的修改版本。我使用的来源是here

作为下一个目标,我想修改它以跟踪哪些应用程序正在执行读取和写入,并最终打印出每个应用程序读取和写入的字节数。

我在 read() 调用中看到有一个指向客户端 (* IOService) 的指针,但是我还没有找到从该对象获取任务/进程的任何方法。我正在考虑调用 API 来确定当前进程,但由于此代码在 KEXT(在内核中)中运行,我认为这不会帮助我识别用户级进程。

我在那里找到了一个名为 newUserClient() 的 IOServer API,其中包含 task_t,我认为它足以让我以某种方式获得应用程序名称。但是我不确定如何将此调用与 read() 调用联系起来。

通常我只是在实验上尝试一堆东西,但由于我在内核中工作,所以我想一开始要小心行事,避免把事情搞砸。因此,如果有人可以给我任何提示以获取读取或写入的进程名称,那就太好了。

4

1 回答 1

1

我正在考虑调用 API 来确定当前进程,但由于此代码在 KEXT(在内核中)中运行,我认为这不会帮助我识别用户级进程。

这几乎是您将获得的最好的;API 不会通过 I/O 的最终发起者。但在大多数情况下,调用将是由文件 I/O 系统调用触发的文件系统活动的结果,并将在用户空间进程的(内核)上下文中运行。因此,proc_*API(<sys/proc.h>大多数情况下会为您提供您似乎需要的信息。

IOService::newUserClient()IOService处理通过用户空间 IOKit 库直接与内核对象交互的用户进程。这不是IOStorage调用 I/O 调用的方式,它们通过IOMediaBSDClient提供块设备文件/dev/IOStorage堆栈之间的粘合剂的方式。

于 2018-12-14T15:14:47.630 回答