确定哪个应用程序正在从 Mac OS 过滤方案驱动程序中读取或写入数据

Determining which application is reading or writing data from within a Mac OS filter scheme driver

我想学习开发 Mac OS 过滤方案驱动程序,我正在使用 Mac [=30= 一书中的 SimpleCryptoDisk 示例应用程序的修改版本] X 内部结构。我使用的来源是 here.

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

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

我发现那里有一个名为 newUserClient() 的 IOS 服务器 API,其中包含 task_t,我认为这足以让我以某种方式获得应用程序名称。但是我不确定如何使用 read() 调用 link 此调用。

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

I was thinking of calling an API to determine the current process, but since this code is running in a KEXT (in the kernel) I don't think that will help me identify a user-land process.

这几乎是您将获得的最好的; API 没有通过 I/O 的最终发起者。但在大多数情况下,调用将作为文件系统 activity 由文件 I/O 系统调用触发的结果进行,并且将在用户的(内核)上下文中 运行 space 进程。所以 proc_* API(来自 <sys/proc.h> 大部分时间会为您提供您似乎需要的信息。

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