Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
__u32 new_addr; // адрес нового обработчика исключения #BP
/*
* Считываем адрес таблицы IDT и формируем новую таблицу
*/
idt_addr = get_idt_addr();
printk(KERN_INFO "Old IDT address - 0x%08x ",(__u32)(idt_addr));
set_new_idt();
printk(KERN_INFO "New IDT address - 0x%08x ",(__u32)(idtr.base));
new_handler = (__u32)&my_handler; // адрес ф-ии my_handler
/*
* Сохраняем адрес старого обработчика #BP, определяем адрес
* нового и производим замену адресов в новой таблице IDT
*/
old_handler = get_handler(i);
new_addr = (__u32)&my_stub;
set_handler(i, new_addr);
return 0;
}
Во время выгрузки модуля необходимо восстановить старую таблицу IDT. Ее адрес сохранен в переменной idt_addr. Адрес обработчика #BP восстанавливать не надо, так как в старой таблице он остался без изменений.
void cleanup_module()
{
unsigned long flags;
/*
* Заносим адрес таблицы IDT в поле base структуры idtr
* а затем командой LIDT загружаем его в регистр IDTR
*/
idtr.base = (__u32)idt_addr;
__save_flags(flags);
__cli();
__asm__("lidt %0"::"m" (idtr));
__restore_flags(flags);
/*