#include #include #include #include #include #include static u64 kern_page; // u64 - macro meaning unsigned 64 bits static gate static struct desc_ptr default_idtr; // to save existing idtr static int __init IDT_rebuild(void) { struct desc_ptr idtr; // here we're going to store our new interupts table pr_info("---IDT-REBUILD INITIATED---"); store_idt(&default_idtr); // getting current idtr and store it pr_info("obtained idtr"); pr_info("allocating new memory page"); kern_page = __get_free_page(GFP_KERNEL); if (!kern_page) { return -ENOMEM; } idtr.address = kern_page; // going to store idtr.size = default_idtr.size; return 0; } static void __exit IDT_restore(void) { struct desc_ptr idtr; store_idt(&idtr); if (idtr.address != default_idtr.address || idtr.size != default_idtr.size) { load_idt(&default_idtr); free_page(kern_page); } } module_init(IDT_rebuild); module_exit(IDT_restore); MODULE_LICENSE("GPL");