从 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 中导出。
我有 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
对象,您可以使用
struct vfsstatfs * vfs_statfs(mount_t);
vfsstatfs
有一个 f_fsid
字段。
函数和结构都在 <sys/mount.h>
中声明和记录。这些功能在 BSD KPI 中导出。