C-Linux内核-协助使用当前的_uid()

C-Linux内核-协助使用当前的_uid(),c,linux,operating-system,interceptor,C,Linux,Operating System,Interceptor,我一直在做一项任务的一部分,但我很难解决。要求拦截系统调用open,并将其替换为仅针对普通用户的新系统调用open,并在系统日志中打印出用户id和文件名。否则它将只执行标准的系统打开调用。以下是困扰我的部分问题: #include <linux/kernel.h> #include <linux/module.h> #include <linux/syscalls.h> unsigned long **sys_call_table; asmlinkage

我一直在做一项任务的一部分,但我很难解决。要求拦截系统调用open,并将其替换为仅针对普通用户的新系统调用open,并在系统日志中打印出用户id和文件名。否则它将只执行标准的系统打开调用。以下是困扰我的部分问题:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/syscalls.h>

unsigned long **sys_call_table;

asmlinkage long (*ref_sys_open)(const char *filename, int flags, umode_t mode);
asmlinkage long (*ref_sys_close)(unsigned int fd);

asmlinkage long new_sys_open(const char *filename, int flags, umode_t mode) {

    if (current_uid() >= 1000) {

    printk(KERN_INFO "User %d is opening file: %s\n", current_uid(), filename);

    } else {

    (*ref_sys_open)(filename, flags, mode);

    }

    return 0;
}
我想知道如何比较int 1000和type uid\u t val


另一方面,我是否正确调用了旧版本的系统调用?

from,
uid\u t
只是
\uu内核uid32\u t
的一个typedef,根据from,
uid\u t
只是
\uu内核uid32\u t
的一个typedef,根据

我的编译器说:
unsigned int
对于binary>=(具有'kuid\t'和'unsigned int')的操作数无效,如果(current\u uid()>=reg\u users){^您应该使用
current\u uid().val>=reg_用户
哈哈,就是这样!非常感谢!简单问一个问题,我对原始sys open函数的调用是否正确?我可以轻松混合指针,希望您仔细检查是的。它是正确的。您也可以直接调用ref_sys_open,而无需取消引用。我的编译器说:二进制的操作数无效>=(有'kuid't'和'unsigned int')如果(current\u uid()>=reg\u users){^您应该使用
current\u uid().val>=reg_用户
哈哈,真是这样!非常感谢!只是一个简单的问题,我对原始sys open函数的调用是否正确?我可以轻松混合指针,希望您仔细检查是的。它是正确的。您也可以直接调用ref_sys_open,而无需取消引用它。
typedef struct {
  uid_t val;
} kuid_t;