1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Определение состояния клавиши в IsrRoutine

Тема в разделе "WASM.NT.KERNEL", создана пользователем Llirik, 26 авг 2011.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    422
    В KbFilter_ServiceCallback из примера DDK kbfiltr.c состояние клавиши определяется проверкой на чётность члена структуры KEYBOARD_INPUT_DATA Flags. Если число чётное, то клавиша нажата, а если не чётное, то произошло её отпускание. В IsrRoutine же Flags не меняется и остаётся всегда чётным. Вот я и спрашиваю: как в IsrRoutine определить, что клавиша нажата или отпущена?
     
  2. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    422
    Неужели никто и никогда не делал фильтра клавиатуры такого рода?
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    422
    Тогда, скажите мне пожалуйста, как сделать нормальное залипание клавиш на PS/2 клавиатуре? Или на этом форуме кроме Сетевое программирование никто ничего не знает? Что бы я не спросил -всё молчёк(
     
  4. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Llirik,можешь поделиться изысканиями в этой теме?Ты перехватываешь нажатие клавиш в IsrRoutine какого драйвера?
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    422
    Вот конкретный мини-пример моей проблемы
    Код (Text):
    1. KKbFilter_ServiceCallback proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    2. mov eax, InputDataStart
    3. assume eax:ptr KEYBOARD_INPUT_DATA
    4. .if [eax].MakeCode == 36h
    5. .if [eax].Flags == 1
    6. .if zl1 == 0
    7. inc zl1
    8. ret
    9. .else
    10. dec zl1
    11. .endif
    12. .endif
    13. .endif
    14.     push    InputDataConsumed
    15.     mov eax, pDeviceObject
    16.     push    InputDataEnd
    17. assume eax:ptr DEVICE_OBJECT
    18. mov ecx, [eax].DeviceExtension
    19. assume eax:nothing
    20. assume ecx:ptr FiDO_DEVICE_EXTENSION
    21.     push    InputDataStart
    22.     push    [ecx].UPPER_CONNECT_DATA.ClassDeviceObject
    23.     call    [ecx].UPPER_CONNECT_DATA.ClassService
    24. assume ecx:nothing
    25. ret
    26. KKbFilter_ServiceCallback endp
    Почему с USB-клавой этот код залипания правого Shift`а действует, а с PS/2 нет? не найдя ответа я и полез в IsrRoutine, но там я не смог понять, как определить, что клавиша нажата или отпущена( как быть?
     
  6. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    422
    я сделал залипание и в IsrRoutine
    Код (Text):
    1. KbFilter_IsrHook proc pDeviceObject:PDEVICE_OBJECT, CurrentInput:PKEYBOARD_INPUT_DATA, CurrentOutput:DWORD, StatusByte:UCHAR, DataByte:PUCHAR, ContinueProcessing:PBOOLEAN, ScanState:PKEYBOARD_SCAN_STATE
    2. aeju:
    3. cmp calllocku, 0
    4. jnz aeju
    5. lock inc calllocku
    6. mov zl1u, 0
    7. mov mkk, 0
    8. mov nkk, 0
    9. push ebx
    10. push edi
    11. push esi
    12. xor       edx,edx
    13. xor ecx, ecx
    14. mov ebx, CurrentInput
    15. assume ebx:ptr KEYBOARD_INPUT_DATA
    16. .............................................
    17. функция залипания
    18. ..............................................
    19. mov eax, pDeviceObject
    20. assume eax:ptr DEVICE_OBJECT
    21. mov ecx, [eax].DeviceExtension
    22. assume eax:nothing
    23. assume ecx:ptr FiDO_DEVICE_EXTENSION
    24. mov esi, ContinueProcessing
    25. .if  [ecx].IsrRoutine != 0
    26.     push    ScanState
    27.     push    esi
    28.     push    DataByte
    29.     push    DWORD PTR StatusByte
    30.     push    CurrentOutput
    31.     push    CurrentInput
    32. push [ecx].UpperContext
    33. call [ecx].IsrRoutine
    34. test    al, al
    35. je fff
    36. cmp BYTE PTR [esi], 0
    37. je fff
    38. .endif
    39. mov BYTE PTR [esi], 1
    40. fff:
    41. pop esi
    42. pop edi
    43. pop ebx
    44. lock dec calllocku
    45. ret
    46. KbFilter_IsrHook endp
    , но когда моя функция не пускает дальше клавишу с флагом 02, то есть прыгает сразу на fff, то уследующей нажатой клавиши почему-то меняется флаг. скажем нажал я клавишу с флагом 02, а получаю клавишу с флагом 00 или наоборот. Что за бред?
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    422
    С той проблемой с залипанием в KKbFilter_ServiceCallback я давно уже разобрался. Оказывается если драйвер не посылает Callback дальше, то надо записывать в InputDataConsumed количество обработанных структур KEYBOARD_INPUT_DATA, иначе драйвер порта будет повторно слать этот же Callback. Но у меня возникла другая проблема с залипанием конкретно Shift`ов и Ctrl`ов. Залипание, которое я привёл в примере работает без проблем, но я написал дополнительную функцию и теперь моё залипание может работать как стандартное залипание Виндоус, но при включённом Num Lock это залипание почему-то как-то перестаёт работать, хотя фильтр Four-F`а показывает, что функции в моём драйвере работают так как надо. Залипание всех остальных клавиш вроде бы работает и при включённом Num Lock
    В чём может причина и как это исправить?