我正在尝试编写一个getdents()系统调用来列出调用getdents()返回的所有目录条目,但我遇到一个小问题,我似乎无法解决,不确定这是否是一个C错误(因为我还在学习它)或者是调用本身的东西。当我打印每个结构的d_name时,我总是缺少目录/文件的第一个字母。
Feb 13 11:39:04 node35 kernel: [ 911.353033] entry: ootkit.c
Feb 13 11:39:04 node35 kernel: [ 911.353035] entry: ootkit.mod.c
Feb 13 11:39:04 node35 kernel: [ 911.353036] entry: ootkit.ko
文件的名称是rootkit。*
我的代码:
asmlinkage int new_getdents(unsigned int fd, struct linux_dirent64 *dirp, unsigned int count)
{
int nread;
int bpos;
struct linux_dirent64 *d;
int (*orig_func)(unsigned int fd, struct linux_dirent64 *dirp, unsigned int count);
t_syscall_hook *open_hook;
open_hook = find_syscall_hook(__NR_getdents);
orig_func = (void*) open_hook->orig_func;
nread = (*orig_func)(fd, dirp, count);
d = dirp;
for (bpos = 0; bpos < nread;) {
d = (struct linux_dirent64 *) ((char*)dirp + bpos);
printk(KERN_INFO "%s\n", d->d_name);
bpos += d->d_reclen;
}
return nread;
}
答案 0 :(得分:2)
我最好的猜测是你混淆了getdents
系统调用的遗留版和“64”版本。即使在64位系统上,似乎还有一个遗留版本(没有64)编写缺少d_type
成员的结构(因此名称的第一个字符会被误解为d_type
成员如果你正在使用现代的“64”版本的结构),除了(正确的)getdents64
系统调用。