#include #include #include #include #include #include #include #include #include #include #include static char devname[] = "killuid"; static char modname[] = "killuid.ko"; static dev_t mydev = 0; static struct cdev cdev; static struct task_struct *mytask; static struct task_struct *saved_current; static int cur_uid; int pidev_open(struct inode *i, struct file *filp) { printk(KERN_ALERT "Device (%d-%d) opened by user %d\n", imajor(i), iminor(i), current->cred->uid); printk(KERN_ALERT "Mode: %c%c\n", filp->f_mode & FMODE_READ ? 'R' : '-', filp->f_mode & FMODE_WRITE ? 'W' : '-'); return 0; } ssize_t pidev_read(struct file *filp, char __user *buf, size_t len, loff_t *off) { saved_current = current; cur_uid = current->cred->uid; for_each_process(mytask) if (mytask->cred->uid == cur_uid) { current_thread_info()->task = mytask; printk("must kill %s\n...", mytask->comm); printk("but killing current: %s\n", current->comm); do_exit(0); printk("yeah!\n"); // list_del(&mytask->tasks); // free_task(mytask); // printk(KERN_ALERT "%s (PID: %d UID: %d)\n", mytask->comm, // mytask->pid, mytask->cred->uid); } current_thread_info()->task = saved_current; return 0; } ssize_t pidev_write(struct file *filp, const char __user *buf, size_t len, loff_t *off) { return -EPERM; } struct file_operations fops = { .owner = THIS_MODULE, .open = pidev_open, .read = pidev_read, .write = pidev_write, }; static int __init killuid_init(void) { int err; printk(KERN_ALERT "%s loaded by %s (%d)\n", modname, current->comm, current->pid); if ((err = alloc_chrdev_region(&mydev, 0, 1, devname))) printk(KERN_ALERT "ERROR in alloc_chrdev_region: %d\n", err); else printk(KERN_ALERT "%s successfully registered with %d %d numbers\n", devname, MAJOR(mydev), MINOR(mydev)); cdev_init(&cdev, &fops); cdev.owner = THIS_MODULE; if ((err = cdev_add(&cdev, mydev, 1))) printk(KERN_ALERT "ERROR in cdev_add: %d\n", err); return 0; } static void __exit killuid_exit(void) { unregister_chrdev_region(mydev, 1); cdev_del(&cdev); printk(KERN_ALERT "%s unloaded\n", modname); } module_init(killuid_init); module_exit(killuid_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Guillermo Ramos");