从 osx 内核扩展 (kext) 检查本地文件系统 fsid

Checking local filesystem fsid from osx kernel extension (kext)

我有 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;
}

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

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

您可以使用函数

遍历系统中的所有挂载点
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 中导出。