Модификация IDT на многопроцессорной (многоядерной) системе

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 25 ноя 2008.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Хукаю в IDT вектор клавиатуры. Учитывая многоядерность системы набросал следующий простой код:
    Код (Text):
    1. vector = HalGetInterruptVector(Isa, 0, 1, 1, &irql, &affinity);
    2. for (CCHAR cpu = 0; cpu < KeNumberProcessors; cpu ++)
    3. {
    4.     KeSetAffinityThread(KeGetCurrentThread(), 1 << cpu);   
    5.     IDT_INFO idt_info;
    6.     IDT_ENTRY* idt;
    7.     __asm   sidt    idt_info // IDT position
    8.     idt = (IDT_ENTRY*)MAKELONG(idt_info.LowIDTbase, idt_info.HiIDTbase);   
    9.     real_kbd_handler[cpu] = MAKELONG(idt[_kbd_idt_vector].LowOffset, idt[_kbd_idt_vector].HiOffset);   
    10.     __asm   cli
    11.     idt[_kbd_idt_vector].LowOffset = LOW(ps2_kbd_hook);
    12.     idt[_kbd_idt_vector].HiOffset = HIGH(ps2_kbd_hook);
    13.     __asm   sti
    14. }
    15. KeSetAffinityThread(KeGetCurrentThread(), (1 << KeNumberProcessors) - 1);
    Вкратце: пробегаем по всем процессорам, переключаем текущий поток на каждый из них, и, собственно, подменяем обработчик прерывания.

    Система падает на
    Код (Text):
    1. 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. Попробовал менять его - та же картина.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    katrus
    Насколько я знаю обработчик седит на одном процессое и скорее всего за индексом 0.