diff options
| author | reo <emmadoth@protonmail.com> | 2023-01-04 23:37:42 +0100 |
|---|---|---|
| committer | reo <emmadoth@protonmail.com> | 2023-01-04 23:37:42 +0100 |
| commit | c1591a877aa61023fc7f5f5d2c46d355ccf00686 (patch) | |
| tree | 223db806c9a758fb5d4a1a960f834eba5dd50b7e | |
initial commit
| -rw-r--r-- | .gitignore | 6 | ||||
| -rw-r--r-- | Makefile | 11 | ||||
| -rw-r--r-- | README.md | 7 | ||||
| -rw-r--r-- | kworm.c | 84 |
4 files changed, 108 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fabd3e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.*o +*.cmd +*.mod* +*.order +*.symvers + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..24182e6 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +obj-m := kworm.o + +all: + make -C $(shell echo $$WSLKERN) M=$(PWD) modules + +clean: + make -C $(shell echo $$WSLKERN) M=$(PWD) clean + +bear: + make clean ; bear -- make + diff --git a/README.md b/README.md new file mode 100644 index 0000000..ca921cc --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +``` +make +sudo insmod kworm.ko +# get major number from kernel log +sudo mknod /dev/worm c <major number> 0 +cat /dev/worm +``` @@ -0,0 +1,84 @@ +#include <linux/init.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/fs.h> +#include <linux/delay.h> +#include <linux/uaccess.h> + +#define NAME "worm" + +MODULE_DESCRIPTION("worm"); +MODULE_LICENSE("BSD-3-Clause"); +MODULE_VERSION("1.0"); + +int worm_phase = 0; +static int major; + +static int dev_open(struct inode*, struct file*); +static int dev_release(struct inode*, struct file*); +static ssize_t dev_read(struct file*, char*, size_t, loff_t*); +static ssize_t dev_write(struct file*, const char*, size_t, loff_t*); + +static struct file_operations fops = { + .open = dev_open, + .read = dev_read, + .write = dev_write, + .release = dev_release +}; + +static int __init kworm_init(void) +{ + major = register_chrdev(0, NAME, &fops); + + if(major < 0) + { + printk(KERN_ALERT "kworm init failed\n"); + return major; + } + + printk(KERN_INFO "kworm init (%d)\n", major); + return 0; +} + +static void __exit kworm_exit(void) +{ + unregister_chrdev(major, NAME); + printk(KERN_INFO "kworm exit\n"); +} + +static int dev_open(struct inode* inodep, struct file* filep) +{ + printk(KERN_INFO "kworm opened\n"); + return 0; +} + + +static ssize_t dev_write(struct file* filep, const char* buffer, size_t len, loff_t* offset) +{ + printk(KERN_INFO "kworm read-only\n"); + return -EFAULT; +} + +static int dev_release(struct inode* inodep, struct file* filep) +{ + printk(KERN_INFO "kworm closed\n"); + return 0; +} + +static ssize_t dev_read(struct file* filep, char* buffer, size_t len, loff_t* offset) +{ + int errors = 0; + char *worm = "|\r(\r|\r)\r"; + int worm_len = 2; + worm_phase = (worm_phase % 4) + 1; + + mdelay(100); + + errors = copy_to_user(buffer, worm + ((worm_phase - 1) * 2), worm_len); + + return errors == 0 ? worm_len : -EFAULT; +} + +module_init(kworm_init); +module_exit(kworm_exit); + |
