#include // Needed by all modules #include // KERN_INFO #include // for_each_process, pr_info #include // For copy_to_user #include // kmalloc, apparantly #include // file_operations #include // proc_create #define PROC_FILE_NAME "prinfo" #define INITIAL_REPORT_SIZE (1024*8) char* query; size_t qlen = 1024; char* report; size_t reportlen; size_t read_spot; ssize_t returnresults(struct file *filp,char *buf,size_t count,loff_t *offp ) { // User has space for count // We want to give them reportlen - read_spot size_t len = (count > reportlen - read_spot)? (reportlen - read_spot):count; if(read_spot == reportlen){ read_spot = 0; return 0; } copy_to_user(buf, report + read_spot, len); read_spot += len; return len; } unsigned int call_count = 0; ssize_t doquery(struct file *filp,const char *buf,size_t count,loff_t *offp) { struct task_struct* task_list; unsigned int task_count = 0; int len = (qlen > count)? count:qlen; copy_from_user(query, buf, len); if(query[len-1] == '\n' || query[len-1] == ' ') query[len-1] = 0; else query[len] = 0; printk("Received Query: %s\n", query); report = kmalloc(INITIAL_REPORT_SIZE, 0); reportlen = 0; for_each_process(task_list) { if(strstr(task_list->comm, query)){ // This kind of thing: "Result 0: name_of_process\n" // Virtual Memory Areas: // Starting Address: task_list->mm->vm_start, vm_next is the next one! struct vm_area_struct *curr = task_list->mm->mmap; reportlen += snprintf(report + reportlen, INITIAL_REPORT_SIZE - reportlen, "Result %d [%d]: %s\n", task_count, task_list->pid, task_list->comm); while(curr){ if(curr->vm_file) reportlen += snprintf(report + reportlen, INITIAL_REPORT_SIZE - reportlen, "VMA: %lx (%s)\n", curr->vm_start, curr->vm_file->f_path.dentry->d_iname); else reportlen += snprintf(report + reportlen, INITIAL_REPORT_SIZE - reportlen, "VMA: %lx ()\n", curr->vm_start); // The filename: curr->vm_file.path->dentry->d_iname curr = curr->vm_next; } task_count++; } } read_spot = 0; return len; } struct file_operations proc_fops = { read: returnresults, write: doquery }; int init_module(void){ query = kmalloc(qlen, 0); proc_create(PROC_FILE_NAME,0,NULL,&proc_fops); return 0; } void cleanup_module(void){ remove_proc_entry(PROC_FILE_NAME,NULL); kfree(query); } MODULE_LICENSE("GPL");