буфер клавиш kbdclass

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

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Пожалуйста, обьясните мне зачем нужен CTL_CODE IOCTL_INTERNAL_I8042_HOOK_KEYBOARD и как его обрабатывать. На русском языке в инете я об этом не нашёл, а английского я не знаю. А спрашиваю я потому, что PS/2 клава ведёт себя как-то неадекватно, хотя USB клава с моим фильтром работает более менее нормально
     
  2. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    и ещё вопрос такой: если заменить скан-код в полях makecode и flags в структуре KEYBOARD_INPUT_DATA на 0, хоть какая-то реакция винды будет или это эквивалентно как если фильтр вообще не пропустил бы этот callback дальше?
     
  3. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Найдите в интернете и скачайте книгу Уолтера Они "Использование Windows Driver Model". Там есть ответы на все ваши вопросы. Но Си все-таки придется выучить.
     
  4. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    так я английского не знаю. вон она у меня лежит, а что толку-то? а на русском я ее не нашел(
     
  5. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
  6. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    rttgedt, большое спасибо за книгу, однако, просмотрев её мельком, ничего не нашёл о нуле в makecode
     
  7. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    зато там есть про это
    Что касается таких специфичных тем как "нуль в makecode" то могу посоветовать ковырять исходники WDK и читать собственно WDK. Но тут без английского никак. Если вы принципиально учить английский не хотите, то забудьте про драйвера - русскоязычных источников практически нет. Лично я делал так - открывал WDK, открывал переводчик гугл и все непонятные мне слова переводил. И так до полного просветления. А вы как хотели, без труда, как говорится, и рыбки не пожрешь.
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Извините, а в какой главе главе говорится о IOCTL_INTERNAL_I8042_HOOK_KEYBOARD? что-то я не могу найти
     
  9. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    В главе номер 9 подробно рассказывается о макросе CTL_CODE, кодах ввода-вывода IOCTL_* и о том как они обрабатываются.
     
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Ещё у меня такая проблема: мой фильтр принимает callback, обрабатывает его и отправляет дальше. Следом, при определённых условиях, он отправляет свой собственный callback, если он тут же принимает и отправляет новый callback, то он проходит раньше собственного, отправленного раньше. Я уж пробовал и так:
    Код (Text):
    1. kbproc proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    2. push eax
    3. push ecx
    4.     push    InputDataConsumed
    5.     mov eax, pDeviceObject
    6.     push    InputDataEnd
    7. assume eax:ptr DEVICE_OBJECT
    8. mov ecx, [eax].DeviceExtension
    9. assume eax:nothing
    10. assume ecx:ptr FiDO_DEVICE_EXTENSION
    11.     push    InputDataStart
    12.     push    [ecx].UPPER_CONNECT_DATA.ClassDeviceObject
    13.     call    [ecx].UPPER_CONNECT_DATA.ClassService
    14. assume ecx:nothing
    15. pop ecx
    16. pop eax
    17. ret
    18. kbproc endp
    19. KKbFilter_ServiceCallback proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    20. local kInputDataEnd:PKEYBOARD_INPUT_DATA
    21. .if okk == 0
    22. inc okk
    23. jmp nmm
    24. .endif
    25. invoke KeWaitForSingleObject, addr ikevent, Executive, KernelMode, FALSE, 0
    26. nmm:
    27. ..............................
    28. Push  ecx
    29.     invoke KeInitializeEvent, addr ikevent, NotificationEvent, FALSE
    30. pop ecx
    31. .if remmm == 0
    32. invoke kbproc, pDeviceObject, InputDataStart, InputDataEnd, InputDataConsumed
    33. .endif
    34. invoke oszlp, pDeviceObject, kInputDataEnd; создает и отправляет собственный callback при определённых условиях
    35.     invoke KeSetEvent, addr ikevent, IO_NO_INCREMENT, FALSE
    36. ..............
    37. ret
    38. KKbFilter_ServiceCallback endp
    и так:
    Код (Text):
    1. kbproc proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    2. push eax
    3. push ecx
    4.     push    InputDataConsumed
    5.     mov eax, pDeviceObject
    6.     push    InputDataEnd
    7. assume eax:ptr DEVICE_OBJECT
    8. mov ecx, [eax].DeviceExtension
    9. assume eax:nothing
    10. assume ecx:ptr FiDO_DEVICE_EXTENSION
    11.     push    InputDataStart
    12.     push    [ecx].UPPER_CONNECT_DATA.ClassDeviceObject
    13.     call    [ecx].UPPER_CONNECT_DATA.ClassService
    14. assume ecx:nothing
    15. pop ecx
    16. pop eax
    17. ret
    18. kbproc endp
    19. kbproc proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    20. ...........
    21. lea eax, [ecx].g_EventSpinLock
    22. push ecx
    23.  fastcall KfAcquireSpinLock, eax
    24. mov bl, al
    25. .if remmm == 0
    26. invoke kbproc, pDeviceObject, InputDataStart, InputDataEnd, InputDataConsumed
    27. .endif
    28. invoke oszlp, pDeviceObject, kInputDataEnd; создает и отправляет собственный callback при определённых условиях
    29. pop ecx
    30. lea eax, [ecx].g_EventSpinLock
    31.      .if bl == DISPATCH_LEVEL
    32.          fastcall KefReleaseSpinLockFromDpcLevel, eax
    33.      .else
    34.          and edx, 0FFh
    35.          fastcall KfReleaseSpinLock, eax, edx
    36.      .endif
    37. ret
    38. KKbFilter_ServiceCallback endp
    всё равно проходит вперед( Что посоветуете?
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    rttgedt, я прочитал главу 9, но описания IOCTL_INTERNAL_I8042_HOOK_KEYBOARD я так и не нашёл
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Блин, умники, а это что?
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Это на английском!
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну так выучи уже!
    Хотя бы до технического уровня.
     
  15. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Llirik
    http://code.google.com/p/ngdbg/wiki/Intro
    Также для работы с клавиатурой осуществляется внутренний документированный перехват ISR клавиатуры с помощью i/o control code'а драйвера i8042 - IOCTL_INTERNAL_I8042_HOOK_KEYBOARD. Он позволяет задать обработчик, который будет вызываться из ISR практически сразу после получения прерывания и это позволяет нам отреагировать на нажатие горячих клавиш, а так же следить за состояниями Num, Caps и Scroll lock в Windows.
    http://www.delphimaster.net/view/1-1180368669
    Назначить обработчик на IRP_MJ_INTERNAL_DEVICE_CONTROL. в нем по приходу IOCTL_INTERNAL_KEYBOARD_CONNECT в IRP стеке придет структура CONNECT_DATA в (Parameters.DeviceIoControl.Type3InputBuffer), в ней переназначаешь ClassService на свой KeyboardClassServiceCallback вида
    VOID KeyboardClassServiceCallback (
    IN PDEVICE_OBJECT DeviceObject,
    IN PKEYBOARD_INPUT_DATA InputDataStart,
    IN PKEYBOARD_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed );.
    После чего к тебе пойдет IOCTL_INTERNAL_I8042_HOOK_KEYBOARD. Теперь в Type3InputBuffer будет идти структура INTERNAL_I8042_HOOK_KEYBOARD.
    Тебе нужно переопределить контекст устройства на свой и заменить InitializationRoutine (которе будет отвечать за инициализацию - что не обязательно, но вдруг тебе понадобится создавать выделять допбуффера или т.п.) и непосредственно IsrRoutine в который будут приходить данные.
    В DDK идет пример простого клавиатурного фильтра.
     
  16. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Блин, ну что за человек, в книге есть алгоритм - как обрабатывать подобные запросы. Вся специфическая информация есть в ДДК! То что вы не знаете английский - это ваша проблема, а не людей с этого форума! Миру в целом глубоко плевать на сей прискорбный факт!
     
  17. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    У кого есть ntdd8042.inc дайте пожалуйста, но чтоб со всеми структурами
     
  18. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А как определить, что клавиша нажата или отпущена?
     
  19. Llirik

    Llirik Member

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