summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorreo <emmadoth@protonmail.com>2023-01-04 23:37:42 +0100
committerreo <emmadoth@protonmail.com>2023-01-04 23:37:42 +0100
commitc1591a877aa61023fc7f5f5d2c46d355ccf00686 (patch)
tree223db806c9a758fb5d4a1a960f834eba5dd50b7e
initial commit
-rw-r--r--.gitignore6
-rw-r--r--Makefile11
-rw-r--r--README.md7
-rw-r--r--kworm.c84
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
+```
diff --git a/kworm.c b/kworm.c
new file mode 100644
index 0000000..7709a05
--- /dev/null
+++ b/kworm.c
@@ -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);
+