Linux 将文件描述符解析为文件名/文件路径
我目前正在开发一个简单的内核模块,它可以窃取系统调用,例如Linux 将文件描述符解析为文件名/文件路径,linux,linux-kernel,ubuntu-14.04,Linux,Linux Kernel,Ubuntu 14.04,我目前正在开发一个简单的内核模块,它可以窃取系统调用,例如open、read、write,并用一个简单的函数替换它们,该函数将打开、读取、写入的文件记录到一个文件中,并返回原始的系统调用 我的问题是,我能够在read和write系统调用中获取文件描述符,但我无法理解如何使用相同的描述符获取文件名 目前,我可以使用以下代码访问与给定FD关联的文件结构: struct file*文件; file=fcheck(fd); 这个文件结构中有两个重要的实体,我认为这是我关心的问题: f_路径 f_ino
open
、read
、write
,并用一个简单的函数替换它们,该函数将打开、读取、写入的文件记录到一个文件中,并返回原始的系统调用
我的问题是,我能够在read
和write
系统调用中获取文件描述符,但我无法理解如何使用相同的描述符获取文件名
目前,我可以使用以下代码访问与给定FD关联的文件结构:
struct file*文件;
file=fcheck(fd);
这个文件结构中有两个重要的实体,我认为这是我关心的问题:
f_路径
f_inode
dentry
或inode
或路径名吗?
我的方法正确吗?还是我需要做些不同的事情
我正在使用Ubuntu 14.04,我的内核版本是3.19.0-25-generic,用于内核模块的开发。
。f_inode
实际上是一个inode
.f_path->dentry
是一个dentry
通过->d_parent
链接遍历此dentry,直到触及f_path.mnt.mnt_root
dentry,然后收集dentry->d_name
组件,将构建文件相对于装入点的路径。这是通过,例如,使用,但更谨慎的方式来完成的
除了应在RCU读取部分中使用的
fcheck(fd)
,您还可以使用fget(fd)
,该方法应与fput()配对使用。
该方法完全不正确-请参阅
Linux已经有了一个可靠的机制来做这件事(审计)。如果你想实现它(我想是为了好玩),你应该把钩子大致放在审计的地方。LSM挂钩可能在适当的位置,但尚未检查。很抱歉没有及时确认,您的方法确实帮助了我。谢谢。