【发布时间】:2015-05-31 18:06:26
【问题描述】:
为了了解 Linux 内核,我编写了一个模块,它使用我的自定义 (custom_sys_open) 函数覆盖系统调用 sys_open。我的 custom_file_open 代码:-
#define CUSTOM_CHECK_FILE "/home/xxxx/Programming/kernel_module/custom.txt"
asmlinkage long custom_file_open(const char __user *fileName, int flags, umode_t mode)
{
long retVal = 0;
int len = strlen(fileName);
if(strcmp(fileName+len-9,"check.txt")== 0){
retVal= (*orig_file_open)(CUSTOM_CHECK_FILE, flag, mode);
}
return retVal;
}
它不起作用,在这种情况下 retVal 总是 -14。 但是,如果我只是将 CUSTOM_FILE_CHECK 字符串复制到“fileName”中,它就会像下面的代码一样开始工作:-
asmlinkage long custom_file_open(const char __user *fileName, int flags, umode_t mode)
{
long retVal = 0;
int len = strlen(fileName);
if(strcmp(fileName+len-9,"check.txt")== 0){
memcpy((void*)fileName, (void*)CUSTOM_CHECK_FILE, strlen(CUSTOM_CHECK_FILE));
retVal = (*orig_file_open)(fileName, flag, mode);
}
return retVal;
}
它按预期工作。但我无法理解:-
- 以前的自定义文件打开功能有什么问题?
- 将参数传递给原始文件打开系统调用时我做错了吗?
请帮助我理解这一点。
【问题讨论】:
标签: c linux filesystems kernel system-calls