#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <linux/time.h>
#include <asm/uaccess.h>
#define __NR_mysyscall 2
MODULE_DESCRIPTION("my system call");
MODULE_AUTHOR("jerry");
MODULE_LICENSE("Dual BSD/GPL");
#define MODULE_NAME "mysystemcall"
static int (*anything_saved)(void);
static void try_write_file(const char* filename, const void* data, int len);
/**
* clear WP bit of CR0, and return the original value
*/
unsigned int clear_and_return_cr0(void)
{
unsigned int cr0 = 0;
unsigned int ret;
asm volatile ("movl %%cr0, %%eax"
: "=a"(cr0)
);
ret = cr0;
/* clear the 20 bit of CR0, a.k.a WP bit */
cr0 &= 0xfffeffff;
asm volatile ("movl %%eax, %%cr0"
:
: "a"(cr0)
);
return ret;
}
/** set CR0 with new value
*
* @val : new value to set in cr0
*/
void setback_cr0(unsigned int val)
{
asm volatile ("movl %%eax, %%cr0"
:
: "a"(val)
);
}
static asmlinkage int sys_mycall(int flag, struct timeval *current_time){
struct timeval temp;
try_module_get(THIS_MODULE);
do_gettimeofday(&temp);
if(copy_to_user(current_time,&temp,sizeof(temp))){
module_put(THIS_MODULE);
return -EFAULT;
}
if(flag){
char buffer[100];
sprintf(buffer, "Current time:\t%lds, %ldus.\n", temp.tv_sec, temp.tv_usec);
try_write_file("/dev/tty", buffer, strlen(buffer));
}
module_put(THIS_MODULE);
return 0;
}
int __init init_addsyscall(void){
unsigned int returnN;
returnN = clear_and_return_cr0();
long *systable;
systable=(long*)0xc03868a0;
anything_saved=(int(*)(void))(systable[__NR_mysyscall]);
systable[__NR_mysyscall]=(unsigned long)sys_mycall;
setback_cr0(returnN);
return 0;
}
void __exit exit_addsyscall(void){
unsigned int returnN;
returnN = clear_and_return_cr0();
long *systable;
systable=(long*)0xc03868a0;
//extern long sys_call_table[];
systable[__NR_mysyscall] = (unsigned long)anything_saved;
setback_cr0(returnN);
}
module_init(init_addsyscall);
module_exit(exit_addsyscall);
void try_write_file(const char* filename, const void* data, int len){
mm_segment_t old_fs;
struct file* file = filp_open(filename, O_RDONLY, 0);
if(IS_ERR(file))
return;
if((!file-> f_op)||(!file->f_op->write)){
filp_close(file, NULL);
return;
}
old_fs = get_fs();
set_fs(get_ds());
file->f_op->write(file, data, len, &file->f_pos);
set_fs(old_fs);
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
my_syscall.zip (26个子文件)
my_syscall
.syscall.mod.o.cmd 14KB
Module.symvers 0B
Module.markers 291B
makefile~ 270B
syscall.c 2KB
syscall.o 81KB
syscall.c~ 2KB
Makefile~ 208B
syscall.mod.o 36KB
syscall.mod.c 919B
.project 2KB
.cproject 29KB
.tmp_versions
syscall.mod 95B
.syscall.ko.cmd 234B
.my_syscall.o.cmd 19KB
Makefile 205B
.syscall.o.cmd 19KB
.my_syscall.mod.o.cmd 14KB
syscall.ko 116KB
modules.order 55B
Debug
sources.mk 384B
syscall.d 34B
subdir.mk 753B
objects.mk 230B
makefile 969B
.my_syscall.ko.cmd 246B
共 26 条
- 1
资源评论
Kinonoyomeo
- 粉丝: 75
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功