Здравствуйте, Ignoramus, Вы писали:
I>Господа!
I>Хочу написать драйвер, который, подобно хуку мышки, будет пропускать через себя ввод через это устройство и передавать сообщения моему приложению.
I>На данный момент мне удалось "написать" WDM-драйвер пустышку, который устанавливается как "upper filter" к какому-либо устройству и выдает в DebugPrint информацию обо всех IOCTL, которые этому устройству передаются системой.
I>Теперь меня интересуют следующие ламерские
вопросы:
I>1) Можно ли из ядра передавать сообщения окнам?
Напрямую нельзя. Только через приложение (сервис), работающее в паре с драйвером, т.е. из user mode.
Окна реализуются в подсистеме win32 и компоненты ядра ничего о них не знают.
I>Обязательно всем (broadcast) или можно указать конкретное окно?
I>Как получить хендл окна из ядра?
Никак, Такого объекта в ядре нет и соответственно нет нужных функций. Все это реализовано в user-mode.
I>(Я читал, что для общения драйвера с приложениями обычно используются объекты ядра (event, mutant etc.), но ведь это, I>насколько я понимаю, довольно медленный механизм, а если сообщения "сыпятся" очередями, то будет тормозить? Так хочется I>просто послать сообщение...
)
Все функции для общения с окнами доступны только из юзер-мода.
I>2) Каким образом проходят сообщения от lower драйверов? Т.е. в отличие от IOCTL, которые передаются системой "сверху вниз", сообщения от реальных устройств очевидно движутся в обратном направлении, т.е. "снизу вверх". Как выглядят сообщения от lower драйверов в upper драйвере? Какой механизм используется чтобы сообщить системе о возникновении ввода? Как сообщения затем "расбрасываются" по окнам системой?
Если отвечать на вопросы подробно, то понадобится несколько часов. Ты неправильно преставляешь себе архитектуру ядра. Читай документацию DDK, она входит в последние MSDN и есть в онлайне.
I>Спасибо.
WBR, Alexey