Хукаю в IDT вектор клавиатуры. Учитывая многоядерность системы набросал следующий простой код: Код (Text): vector = HalGetInterruptVector(Isa, 0, 1, 1, &irql, &affinity); for (CCHAR cpu = 0; cpu < KeNumberProcessors; cpu ++) { KeSetAffinityThread(KeGetCurrentThread(), 1 << cpu); IDT_INFO idt_info; IDT_ENTRY* idt; __asm sidt idt_info // IDT position idt = (IDT_ENTRY*)MAKELONG(idt_info.LowIDTbase, idt_info.HiIDTbase); real_kbd_handler[cpu] = MAKELONG(idt[_kbd_idt_vector].LowOffset, idt[_kbd_idt_vector].HiOffset); __asm cli idt[_kbd_idt_vector].LowOffset = LOW(ps2_kbd_hook); idt[_kbd_idt_vector].HiOffset = HIGH(ps2_kbd_hook); __asm sti } KeSetAffinityThread(KeGetCurrentThread(), (1 << KeNumberProcessors) - 1); Вкратце: пробегаем по всем процессорам, переключаем текущий поток на каждый из них, и, собственно, подменяем обработчик прерывания. Система падает на Код (Text): real_kbd_handler[cpu] = MAKELONG(idt[_kbd_idt_vector].LowOffset, idt[_kbd_idt_vector].HiOffset); В переменной idt есть некий адрес, но судя по всему, он не указывает таблицу IDT. Скажите, правилен ли мой метод подмены обработчика IDT. Может есть, что то более простое? P.S. Кстати, что меня смущает, HalGetInterruptVector вернул 0x193. Если я не ошибаюсь есть только 0хFF прерываний. В windbg установил, что настоящий вектор прерывания - 0х93. Попробовал менять его - та же картина.