- 论坛徽章:
- 0
|
本帖最后由 liu_19870919 于 2013-04-25 22:33 编辑
大家好,最近的工作需要我重写一下read系统调用。我通过 http://bbs.chinaunix.net/forum.p ... ;page=1#pid14608041 介绍的方法成功的替换了ext3的read系统调用。
代码如下:
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/file.h>
char *aim = "/root/tmp";
MODULE_AUTHOR("petsatan@sohu");
MODULE_DESCRIPTION("Get the kernel function address ");
MODULE_LICENSE("GPL");
typedef ssize_t (*read_t)(struct file *, char *, size_t, loff_t *);
read_t orig_aim_read = NULL;
ssize_t encry_read(struct file *file , char *buf , size_t count , loff_t *ppos)
{
printk("Congratulation! Now read file\n");
ssize_t encryfile;
encryfile = orig_aim_read(file ,buf ,count ,ppos);
return encryfile;
}
int switch_read(const char *p , read_t *orig_read , read_t new_read)
{
struct file *filep;
filep = filp_open(p , O_RDONLY , 0);
if(IS_ERR(filep))
return -1;
if(orig_read)
*orig_read = filep->f_dentry->d_inode->i_fop->read;
struct file_operations *fp =filep->f_dentry->d_inode->i_fop;
fp->read=new_read;
filp_close(filep,0);
return 0;
}
int unswitch_read(const char *p, read_t orig_read)
{
struct file *filep;
filep = filp_open(p , O_RDONLY , 0);
if(IS_ERR(filep))
return -1;
struct file_operations *fp = filep->f_dentry->d_inode->i_fop;
fp->read=orig_read;
filp_close(filep,0);
return 0;
}
static int encryfile_init(void)
{
switch_read(aim , &orig_aim_read , encry_read);
printk(" <1>read() has switch!\n");
return 0;
}
static void encryfile_cleanup(void)
{
unswitch_read(aim, orig_aim_read);
printk("<2>read() has unswitch! \n");
}
module_init(encryfile_init);
module_exit(encryfile_cleanup);
/root/tmp是本地磁盘的一个文件。
但是当我将/root/tmp改变为nfs文件系统上的文件(比如/mnt/nfs/tmp)的时候,只有操作文件/mnt/nfs/tmp时候,才调用我写的read,操作nfs上的其他文件的时候,并不调用新写的read。请大家帮我分析一下原因好吗? |
|