Vista: oбработчик прерывания клавиатуры

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

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Есть простенький обработчик прерывания клавиатуры (ps/2) заменяющий коды нажимаемых клавишь на другие.
    Код (Text):
    1. __asm   cli
    2. UCHAR chr = READ_PORT_UCHAR(KBD_PORT_DATA);
    3. WRITE_PORT_UCHAR(0х64, 0xD2); // echo back    
    4. chr = новый сканкод;
    5. wait_kbd();
    6. WRITE_PORT_UCHAR(0х60, chr);  
    7. __asm   sti
    wait_kbd() простенькая функция ожидающая готовность контроллера.
    Под XP код такой обработчик работает как часы. Под вистой блюскринит... Обнаружил, что проблема возникает из за WRITE_PORT_UCHAR(0х60, chr), то есть без это строчки все работает. Ниже - данные из минидампа. Никак не могу понять - причем здесь неверный адрес? Все параметры WRITE_PORT_UCHAR находятся в nonpageable area.

     
  2. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Как насчет хранения chr в регистре?
     
  3. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Dian
    Завтра попробую, но какая разница? Ведь стек находится в nonpageble area.
     
  4. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Сколько ядер сейчас? А сколько их было на ХР? )

    READ_PORT_UCHAR - какой IRQL для нее д.б. в Висте? Для того, чтобы посмотреть IRQL - KeGetCurrentIrql().

    сli задирает IRQL, причем иногда м. задирать очень сильно.

    Для предотвращения переключения контекста посоветовал бы использовать связку KeRaiseIrql(DISPATCH_LEVEL,..) <твой код> KelowerIrql(...).

    Еще посоветовал бы зажать исполнение этого кода на определенном ядре (см. affinity - так вроде, не помню точно, да и сами ф-ии не помню).
     
  5. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Пока мой код не потдерживает нескоько ядер. Запускаю исключительно под vmware с одним ядром.
     
  6. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Переполнение стека, м.б. vmware эмулирует новое прерывание от клавиатуры при
    Код (Text):
    1. WRITE_PORT_UCHAR(0х60, chr);
     
  7. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Хмм, хорошая идея, надо почитать доки по ps/2. Только странно, почему есть разница между xp и vista. По идее такие вещи должны быть системно независимы.
     
  8. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    По идее работа с портами не может быть ограничена IRQL. Более того, работа чаще всего ведется на очень высоких уровнях.

    И забивает на IF? (Выясняется методом тыка - установкой затычки)
     
  9. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    может так попробывать?
    Код (Text):
    1. //WRITE_PORT_UCHAR(0х60, chr);
    2. __asm mov al, chr
    3. __asm out 0x60,al
     
  10. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    ams007
    ты жжошь=))) какой иркл , это обычная инструкция in al,port
     
  11. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Попробовал. Очевидно, проблема в рекурсивном вызове прерывания. Если добавить ограничение, что-б вывод в порт производился один единственный раз (просто добавил счетчик) - работает и в Vista. Буду думать дальше. Большое спасибо за помощь!
     
  12. 4VR

    4VR New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2008
    Сообщения:
    25
    katrus
    это не будет работать для usb - клавиатур. А некоторые ps/2 клавы вешаются при попытке записи в них сканкодов. Это так, на всякий случай. Способ ненадёжный это.
     
  13. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    4VR
    меня интересует исключительно ps/2.
    Можно подробнее? Какие клавиатуры вешаются?
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    katrus
    Это не клавиотура. А контроллер клавиотуры. Тут нужно знать материнку и ее Super I/O.
     
  15. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    А можно это реализовать с помощью драйвера-фильтра ?
     
  16. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Можно. Если честно, сейчас так и делаю. Но хочется уйти глубже (ближе к железу).