Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Структура для считывания кода клавиши в драйвере модели WDM  (Прочитано 10560 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ReaderOfDream
Интересующийся

ru
Offline Offline

« : 02-01-2010 18:26 » 

В старой модели драйверов, где подключается ntddk.h, использовалась структура PKEYBOARD_INPUT_DATA объявленная в "ntddkbd.h".
Как я понимаю, это до WDM использовалось. Нашел еще вариант со структурой PCONNECT_DATA, но это связано с классом kbd.
Суть вопроса - есть ли другие, скажем более обыденные вещи для получения кода нажатой клавиши в модели WDM?

Пишу простой драйвер-фильтр, который блокирует клавиатуру по нажатию особых клавиш.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 03-01-2010 11:06 » 

а примеры из DDK не смотрели? там вроде был по клавиатуре...
на вскидку разумеется не помню - DDK только на работе стоит... 
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ReaderOfDream
Интересующийся

ru
Offline Offline

« Ответ #2 : 03-01-2010 11:34 » 

Проблема в том, что у меня DDK для Win 7 (WDF), а драйвер пишу для Win XP(WDM). И как я понимаю там не те способы используются =) Попробую у "мелкомягких" поискать где-нибудь, но все равно расчитываю на вашу помощь)

UPD: Посмотрел пример "Kbfiltr - WDF Version" и увидел странное сочетание той же самой структуры KEYBOARD_INPUT_DATA со структурой WDF (хотя пример на это и показывает), но неужели мне никак не обойтись без ntddkbd.h (в нем объявлена KEYBOARD_INPUT_DATA)?
других примеров не нашел
« Последнее редактирование: 03-01-2010 11:58 от ReaderOfDream » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 03-01-2010 16:12 » 

не совсем понял вопроса... WDF - это обертка над WDM.
CONNECT_DATA используется при вызове IOCTL_INTERNAL_KEYBOARD_CONNECT для регистрации Callback-а KeyboardClassServiceCallback.
когда система  вызывает ваш callback, то передает ему структуру KEYBOARD_INPUT_DATA ...
что может быть более...?)

кстати...(сам хорошо не знаю, но рекомендую разобраться) там вроде несколько механизмов доступа... для PS/2 и USB клавиатур. так исторически получилось)
через порт 8042, через kbdclass и через HID. для начала настоятельно рекомендую разобраться чем они отличаются.
копать тут: http://msdn.microsoft.com/en-us/library/ms793246.aspx
может быть у руссиновича что нибудь толковое было... надо смотреть.

промежуточные версии DDK я все никак администрации форума не передам... хотя там и так выложено пара версий)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ReaderOfDream
Интересующийся

ru
Offline Offline

« Ответ #4 : 03-01-2010 17:27 » 

Хм. через CONNECT_DATA не стал разбираться, чую не в ту степь уведет меня, рано еще.
Вот как сделал:
устанавливаю функцию ReadComplete в IoSetCompletionRoutine на IRP_MJ_READ:

NTSTATUS ReadComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
{
...
PKEYBOARD_INPUT_DATA      KeyData;
if(NT_SUCCESS(Irp->IoStatus.Status))
    {
        KeyData = Irp->AssociatedIrp.SystemBuffer;
       // и далее уже KeyData->MakeCode содержит код нажатой клавиши.
      ...
     }
...
}

Сделал так, но тогда поясню вопрос, потому что как раз и хотел узнать как сделать по-другому =):
PKEYBOARD_INPUT_DATA  объявлена в ntddkbd.h, а это очень старый файл как я понимаю, еще до WDM пользовались им. И я хотел узнать были ли введены другие структуры для работы? чтобы не надо было подключать ntddkbd.h, а лишь wdm.h (конечно это глупый вопрос, но просто я педантичен, и этот вопрос меня заинтересовал, а я обычно стараюсь разобраться во всем до конца, когда меня мучает вопрос какой-нибудь =) )

За наводку на HID спасибо =) почитал, и разобрался какие бывают стеки драйверов для мыши и клавы) вот только щас еще kbdclass почитаю.


UPD:возник еще небольшой вопрос, я регистрирую свою функцию для одного пакета(которая выше указана), в примерах с kbdclass вот такой фильтр
VOID
KbFilter_ServiceCallback(
    IN PDEVICE_OBJECT  DeviceObject,
    IN PKEYBOARD_INPUT_DATA InputDataStart,
    IN PKEYBOARD_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    )
здесь передается буфер пакетов, от драйвера kbdclass в систему. Почему он передается набором? а не последовательно? и как долго набирается этот буфер? ведь это задержка по времени.. или идти читать Руссиновича и Они? =)
« Последнее редактирование: 03-01-2010 17:54 от ReaderOfDream » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 03-01-2010 18:35 » 

файл старый... а что, стандарт PS/2 c 1987 года сильно изменился?))))))) ничего страшного на самом деле... надеюсь от PS/2 не откажутся в ближайшее время...

Цитата
и вообще... первый вариант WDM v1.05 был реализован в Windows 98.  по большому счету за десять лет ничего не изменилось... кроме очередных бантиков... впрочем это уже другая история)

про буфер - имеются в виду InputDataStart и InputDataEnd? это же входные буфера. и потом даже и не буфера а стурктры... почему их два - не знаю, возможно рассчитывали на то, что будет необходимость отлавливать несколько одновременных нажатий - тогда так удобнее.... или если комп обработать не успеет (это они сейчас такие шустрые стали)... или что надо будет завершение нажатия ловить... вариантов много. но честно говоря, на сто процентов не знаю) как долго набирается - я так думаю это то, что пришло за одно прерывание от клавиатуры? пришло прерывание, в ISR драйвер начинает вычитывать внутренний буфер контроллера через порт I/O. и отдает парами(если есть)...
это предположение - вы меня проверяйте) я и соврать ненароком в пылу беседы могу)))

если сильно интересно, найдите описание на intel 8042 контроллер) раньше он отдельной микросхемой стоял.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
ReaderOfDream
Интересующийся

ru
Offline Offline

« Ответ #6 : 03-01-2010 18:44 » 

Хм. Да, наверное моя идея была немного глуповата, но зато меня теперь ничего не гложет) а по поводу InputDataStart InputDataEnd.. Мне кажется их там не два, а делается например так:
PKEYBOARD_INPUT_DATA KeyData=InputDataStart;
While (KeyData!=InputDataEnd)
{
   // и тут с каждым введеным символом можно делать что угодно
}
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 03-01-2010 20:58 » new

ааа.. ну да. так и есть)
"Pointer to the keyboard input data packet that immediately follows the last data packet in the input data buffer of the port device."
сам невнимательно смотрел)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines