GOPHERSPACE.DE - P H O X Y
gophering on sdf.org
/*
 * Greets: All GNU Generation
 *
 * Author: Paulus Gandung Prakosa (syn-attack@devilzc0de.org)
 */

#include 
#include 
#include 
#include 

#define __vsys_fatal_error(msg) { \
printk(KERN_ERR msg); \
}

#define __vsys_out(msg, fmt...) { \
printk(KERN_INFO msg, ##fmt); \
}

#define __self_likely(arg) __builtin_expect(!!(arg), 1)
#define __self_unlikely(arg) __builtin_expect(!!(arg), 0)

struct control_register {
unsigned long __cr0;
unsigned long __cr2;
unsigned long __cr3;
} __attribute__ ((packed));

static int __init __self_module_loader(void) {
struct control_register *cr_t;

cr_t = kmalloc(sizeof(*cr_t), GFP_KERNEL);
if (__self_unlikely(cr_t == NULL)) {
__vsys_fatal_error("Not enough memory to allocate.\n");
return -1;
}

#ifdef __x86_64__
__vsys_out("Current system architecture is 64-bit.\n");

asm volatile("movl %%cr0, %%rax\n"
     "movl %%rax, %0\n"
     "xorl %%rax, %%rax\n"
     "movl %%cr2, %%rax\n"
     "movl %%rax, %1\n"
     "xorl %%rax, %%rax\n"
     "movl %%cr3, %%rax\n"
     "movl %%rax, %2\n"
     "xorl %%rax, %%rax\n"
     : "=r" (cr_t->__cr0), "=r" (cr_t->__cr2), "=r" (cr_t->__cr3));
#elif defined(__i386__)
__vsys_out("Current system architecture is 32-bit.\n");

asm volatile("movl %%cr0, %%eax\n"
     "movl %%eax, %0\n"
     "xorl %%eax, %%eax\n"
     "movl %%cr2, %%eax\n"
     "movl %%eax, %1\n"
     "xorl %%eax, %%eax\n"
     "movl %%cr3, %%eax\n"
     "movl %%eax, %2\n"
     "xorl %%eax, %%eax\n"
     : "=r" (cr_t->__cr0), "=r" (cr_t->__cr2), "=r" (cr_t->__cr3));
#endif

__vsys_out("cr0: 0x%08lx\n", cr_t->__cr0);
__vsys_out("cr2: 0x%08lx\n", cr_t->__cr2);
__vsys_out("cr3: 0x%08lx\n", cr_t->__cr3);

kfree(cr_t);

return 0;
}

static void __exit __self_module_unloader(void) {
__vsys_out("Overall process done.\n");

return;
}

MODULE_AUTHOR("Paulus Gandung Prakosa (syn-attack@devilzc0de.org)");
MODULE_DESCRIPTION("Control Register");
MODULE_LICENSE("GPL");

module_init(__self_module_loader);
module_exit(__self_module_unloader);