如何获得正在 OS X 上读取文件的通知?

How can I get notifications that a file is being read on OS X?

我有一个可以在 Windows 上运行的软件。该软件有两个组件:在内核模式下工作的文件系统 minifilter 驱动程序和与驱动程序对话的用户模式组件。驱动程序接收有关 IO 中断请求的通知,例如 IRP_MJ_READ. A sample application that does this can be found on github。这适用于 Windows.

支持的任何用户和大多数文件系统

我需要为 OS X(仅限桌面和服务器)开发类似的软件。我看过的东西:

我的保留意见是:FSEvents 的性能可能不是很好,因为我需要监视根 / 文件夹和任何已安装的设备。我对内核队列和系统调用的了解非常有限 API 劫持可能使移植到不同的 OS X 版本变得非常困难,并可能导致与 AV 或 OS 保护(例如 PaX 加固)的冲突).

问题: OS 上的任何用户正在读取根目录 / 中任何(递归)文件夹中的文件时,我如何得到通知X?

使用内核扩展 Kernel Authorization provides the File Operation Scope,允许您监控所有 vnode 的 KAUTH_FILEOP_OPEN 操作。

KAUTH_FILEOP_OPEN操作将在访问所有文件之前调用,从而允许您监控文件访问。

如果您想要更细粒度的操作,VNode scope 提供了更大的操作集,包括 KAUTH_VNODE_READ_DATA,但请注意,此范围可能非常嘈杂,会触发大量任何时候的动作。

可以在 Singh 的 Mac OS X Internals

中找到此类内核扩展的示例代码

FSEvents 的性能没有问题;如果您使用 Spotlight and/or 时间机器,它已经 运行 在您的系统上。如果有更有效的方法从头开始重新实现它,我会感到非常惊讶。因此,如果它在其他方面都满足您的要求,我会接受它。