Есть простенький обработчик прерывания клавиатуры (ps/2) заменяющий коды нажимаемых клавишь на другие. Код (Text): __asm cli UCHAR chr = READ_PORT_UCHAR(KBD_PORT_DATA); WRITE_PORT_UCHAR(0х64, 0xD2); // echo back chr = новый сканкод; wait_kbd(); WRITE_PORT_UCHAR(0х60, chr); __asm sti wait_kbd() простенькая функция ожидающая готовность контроллера. Под XP код такой обработчик работает как часы. Под вистой блюскринит... Обнаружил, что проблема возникает из за WRITE_PORT_UCHAR(0х60, chr), то есть без это строчки все работает. Ниже - данные из минидампа. Никак не могу понять - причем здесь неверный адрес? Все параметры WRITE_PORT_UCHAR находятся в nonpageable area.
Сколько ядер сейчас? А сколько их было на ХР? ) READ_PORT_UCHAR - какой IRQL для нее д.б. в Висте? Для того, чтобы посмотреть IRQL - KeGetCurrentIrql(). сli задирает IRQL, причем иногда м. задирать очень сильно. Для предотвращения переключения контекста посоветовал бы использовать связку KeRaiseIrql(DISPATCH_LEVEL,..) <твой код> KelowerIrql(...). Еще посоветовал бы зажать исполнение этого кода на определенном ядре (см. affinity - так вроде, не помню точно, да и сами ф-ии не помню).
Переполнение стека, м.б. vmware эмулирует новое прерывание от клавиатуры при Код (Text): WRITE_PORT_UCHAR(0х60, chr);
Хмм, хорошая идея, надо почитать доки по ps/2. Только странно, почему есть разница между xp и vista. По идее такие вещи должны быть системно независимы.
По идее работа с портами не может быть ограничена IRQL. Более того, работа чаще всего ведется на очень высоких уровнях. И забивает на IF? (Выясняется методом тыка - установкой затычки)
может так попробывать? Код (Text): //WRITE_PORT_UCHAR(0х60, chr); __asm mov al, chr __asm out 0x60,al
Попробовал. Очевидно, проблема в рекурсивном вызове прерывания. Если добавить ограничение, что-б вывод в порт производился один единственный раз (просто добавил счетчик) - работает и в Vista. Буду думать дальше. Большое спасибо за помощь!
katrus это не будет работать для usb - клавиатур. А некоторые ps/2 клавы вешаются при попытке записи в них сканкодов. Это так, на всякий случай. Способ ненадёжный это.