从osx内核扩展(kext)

时间:2017-07-23 07:34:44

标签: macos filesystems kernel-extension xnu

我已经通过WA读取预定义的本地文件状态来检查kext上下文中的本地fsid是什么。

static inline uint64_t get_fsid(const vfs_context_t ctx, const vnode_t vp) {
    struct vnode_attr vap;
    VATTR_INIT(&vap);
    VATTR_WANTED(&vap, va_fsid);
    vnode_getattr(vp, &vap, ctx);
    return (uint64_t)vap.va_fsid;
}

另一种选择是从用户空间计算fsid并将此信息传递给驱动程序(使用getmntinfo

但是,我更喜欢直接从内核空间获取这些数据,而不依赖于当前存在的任何文件。是否有支持此请求的KPI?

1 个答案:

答案 0 :(得分:1)

您可以使用函数

遍历系统中的所有挂载点
int vfs_iterate(int, int (*)(struct mount *, void *), void *);

对于每个mount对象,您可以使用

检查其fsid
struct vfsstatfs *  vfs_statfs(mount_t);

vfsstatfs有一个f_fsid字段。

<sys/mount.h>中声明并记录了函数和结构。这些功能在BSD KPI中导出。