#include // Needed by all modules #include // KERN_INFO #include // for_each_process, pr_info #include #include #include // For proc filesystem #define BUFLEN 1024 char report_buffer[BUFLEN]; void make_process_report(const char* process_name) { struct task_struct* task_list; size_t process_counter = 0; int sofar = 0; printk("Running make_process_report, looking for %s (%lu characters)\n", process_name, strlen(process_name)); for_each_process(task_list) { ++process_counter; if(strstr(task_list->comm, process_name)){ printk("Found process %s\n", task_list->comm); sofar += snprintf(report_buffer+sofar, BUFLEN-sofar, "%s (%d)\n", task_list->comm, task_list->pid); // sofar += snprintf(report_buffer+sofar, BUFLEN-sofar, "state: %ld\n", task_list->state); sofar += snprintf(report_buffer+sofar, BUFLEN-sofar, "prio: %d\n", task_list->prio); sofar += snprintf(report_buffer+sofar, BUFLEN-sofar, "utime, stime, gtime: %llu, %llu, %llu\n", task_list->utime, task_list->stime, task_list->gtime); } } } ssize_t read_handler(struct file *filp, char *buf, size_t count, loff_t *offp) { register size_t len = strlen(report_buffer); size_t copylen = len - *offp; printk("len = %lu\n", len); printk("report_buffer contains %s\n", report_buffer); if(copylen > count) copylen = count; if(*offp == len) return 0; memcpy(buf, report_buffer + *offp, copylen); *offp += copylen; return copylen; } ssize_t write_handler(struct file *filp, const char *buf, size_t count, loff_t *offp) { char process_name[128]; memcpy(process_name, buf, count); process_name[count] = 0; if(process_name[count - 1] == '\n') process_name[count - 1] = 0; make_process_report(process_name); return count; } struct proc_ops proc_fops = { proc_write: write_handler, proc_read: read_handler }; int init_module(void) { proc_create("process_report", 0, NULL, &proc_fops); return 0; } void cleanup_module(void) { remove_proc_entry("process_report", NULL); } MODULE_LICENSE("MIT");