【发布时间】:2019-01-14 17:00:43
【问题描述】:
我正在尝试了解 IOFilterScheme KEXT 是如何工作的,以便最终自己开发一个。我已经尝试了一些示例程序并获得了基本的加密功能,例如使用this sample。
但是,当我添加 printf() 语句并查看控制台日志时,我看到了一些令人困惑的行为。具体来说,我几乎从来没有看到 read() 调用,除了我配置东西时的一些进程(如 mount_hfs 和 fsck_hfs)。
例如,如果我从某个应用程序(例如:vim)在卷(从已安装的磁盘映像)上写入一个新文件,那么我将在控制台日志中看到相应的 write(),其正确的 PID 为'vim'。我在使用其他应用程序时也会看到这一点。
但是,如果我尝试从另一个应用程序(例如 Sublime Text 编辑器)读取同一个文件,该文件可以正常打开,但我在控制台日志中从未看到任何相应的 read() 条目。
虽然我可以通过查看 DMG 文件来判断示例加密正在工作,但我看到的行为有两个问题:
1) 我很难理解在读写方面发生了什么。
2) 最终,我想编写一个 KEXT,其行为因正在读取或写入的应用程序而异。为此,我需要每个尝试访问该文件的应用程序(至少是该应用程序第一次访问该文件)的实际 read()。
经过一些研究,Mac OS 上的块设备似乎有某种缓冲,但我无法找到太多细节。实验上,我尝试在 read() 和 write() 调用中执行这一行,但没有效果
super::IOStorage::synchronize(client, 0, 0);
如果有人能告诉我如何更好地控制缓冲以便我可以看到实际的 read() 调用,那就太好了。如果那是不可能的,那么我可能不得不在不同的级别编写我的加密驱动程序。然而,一个 IOFilterScheme KEXT 看起来(除了这一点)它真的很适合我的用例,所以我希望我可以让它工作。
【问题讨论】:
标签: macos kernel storage kernel-extension