Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Железо. Написание драйверов
Перезагрузить страницу Драйвер-фильтр. Озвучиваем мышь
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Graf_L Graf_L вне форума
Member
 
Сообщений: 134
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.03.2005
По умолчанию Драйвер-фильтр. Озвучиваем мышь - 27.05.2006, 13:12

Добрый день, Господа!

У меня такая задача: написать драйвер-фильтр для мышки. Суть фильтра в том, чтобы её озвучить: т.е. чтобы динамик издавал различные звуки при щелчке и при движении.

Я читал Солдатова, смотрел пример из DDK... Что-то большой ясности не появилось.

С основными процедурами драйвера, я вроде бы разобрался. Но вот принцип мне не понятен:
Что именно происходит, когда идет движение мышки или нажатие кнопки? Фильтр ловит прерывание?

Буду очень благодарен тому, кто напишет функцию, перехватывающую это событие, и опишет структуру соответствующего IRP пакета. То есть, как мне понять, что именно произошло (нажатие кнопки, движение....).

Очень-очень надо!
Ответить с цитированием
  (#2 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию Re: Драйвер-фильтр. Озвучиваем мышь :) - 31.05.2006, 11:41

Цитата:
Originally posted by Graf_L
[b]Добрый день, Господа!
Что именно происходит, когда идет движение мышки или нажатие кнопки? Фильтр ловит прерывание?
Да ничего не происходит. Подключаешь свой фильтр к стеку устройства DevicePointerClass0 и пропускаешь все IRP вниз. При обработке IRP_MJ_READ устанавливаешь процедуру завершения IRP, а в ней забираешь из AssociatedIrp.SystemBuffer структуру MOUSE_INPUT_DATA. Подробности в MSDN.
Ответить с цитированием
  (#3 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию Re: Драйвер-фильтр. Озвучиваем мышь :) - 31.05.2006, 11:41

Цитата:
Originally posted by Graf_L
[b]Добрый день, Господа!
Что именно происходит, когда идет движение мышки или нажатие кнопки? Фильтр ловит прерывание?
Да ничего не происходит. Подключаешь свой фильтр к стеку устройства DevicePointerClass0 и пропускаешь все IRP вниз. При обработке IRP_MJ_READ устанавливаешь процедуру завершения IRP, а в ней забираешь из AssociatedIrp.SystemBuffer структуру MOUSE_INPUT_DATA. Подробности в MSDN.
Ответить с цитированием
  (#4 (permalink)) Старый
Graf_L Graf_L вне форума
Member
 
Сообщений: 134
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.03.2005
По умолчанию 01.06.2006, 12:03

Спасибо.

Еще у меня такой вопрос: как сделать так, чтобы мышка звучала?
То есть, как издать звук понятно:

Код:
HalMakeBeep(<частота>); // включить динамик с заданной частотой звука

HalMakeBeep(0); // выключить динамик
Допустим, я обнаружил, что была нажата кнопка на мышке:
я включаю динамик. Он должен 1 секунду звучать. Но busy-loop в режиме ядра делать-то нельзя! Как мне ждать эту секунду? Насколько я понимаю, нужно как-то связать событие с таймером.

Подскажите, как это сделать..
Ответить с цитированием
  (#5 (permalink)) Старый
Graf_L Graf_L вне форума
Member
 
Сообщений: 134
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.03.2005
По умолчанию 01.06.2006, 12:03

Спасибо.

Еще у меня такой вопрос: как сделать так, чтобы мышка звучала?
То есть, как издать звук понятно:

Код:
HalMakeBeep(<частота>); // включить динамик с заданной частотой звука

HalMakeBeep(0); // выключить динамик
Допустим, я обнаружил, что была нажата кнопка на мышке:
я включаю динамик. Он должен 1 секунду звучать. Но busy-loop в режиме ядра делать-то нельзя! Как мне ждать эту секунду? Насколько я понимаю, нужно как-то связать событие с таймером.

Подскажите, как это сделать..
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию 05.06.2006, 13:14

Попробуй KeDelayExecutionThread, хотя, при задержке в 1 с при каждом движении мыши она будет "немного тормозить" А с таймером, заморочек много, хотя можно повесить DPC функцию на него и в ней уже выключать спикер. Лучше бы, ИМХО, вынести "озвучку" в пользовательский режим - там можно хоть МП3 играть и выбор звуков можно организовать...
Ответить с цитированием
  (#7 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию 05.06.2006, 13:14

Попробуй KeDelayExecutionThread, хотя, при задержке в 1 с при каждом движении мыши она будет "немного тормозить" А с таймером, заморочек много, хотя можно повесить DPC функцию на него и в ней уже выключать спикер. Лучше бы, ИМХО, вынести "озвучку" в пользовательский режим - там можно хоть МП3 играть и выбор звуков можно организовать...
Ответить с цитированием
  (#8 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 05.06.2006, 20:37

а разве нельзя передавать команды внешней программе?
Ответить с цитированием
  (#9 (permalink)) Старый
Graf_L Graf_L вне форума
Member
 
Сообщений: 134
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.03.2005
По умолчанию 06.06.2006, 21:02

Вот DPC на таймер - то, что нужно. Хотелось бы про это поподробнее).

А в пользовательском режиме - нельзя. Курсовая у меня такая - работать в режиме ядра.

----------

Fuud, каким образом ты предлагаешь передавать команды внешней программе?
Ответить с цитированием
  (#10 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 06.06.2006, 21:24

Не знаю, но многи приложения так делают. Например по нажатию клавишы на клаве запускают word и тому подобное. Сам дрова никогда не писал, так что ни за что отвечать не могу. Разве что у меня попутный вопрос - что вообще может драйвер?
Ответить с цитированием
  (#11 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию 07.06.2006, 09:53

1. Делаем KeInitializeTimer и KeInitializeDpc
2. Когда включили спикер, вызываем KeSetTimer с указанием задержки и нашей процедуры отложенного вызова
3. В самой процедуре выключаем спикер

Цитата:
Originally posted by Fuud
[b]Разве что у меня попутный вопрос - что вообще может драйвер?
Ну, много чего... например он может так уронить винду, как ни одно пользовательское приложение не сможет и придется долго и муторно поднимать ее, матерясь на криворукого Билли при этом.
Ну а кто ж еще виноват то кроме него?
Ответить с цитированием
  (#12 (permalink)) Старый
Graf_L Graf_L вне форума
Member
 
Сообщений: 134
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.03.2005
По умолчанию Re: Драйвер-фильтр. Озвучиваем мышь :) - 10.06.2006, 17:01

Спасибо, kelz!

Раньше я использовал пример фильтра из DDK (moufiltr). Там процедура завершения IRP-пакета устанавливается как-то хитро, в Intrnal_IOCtl при IOCTL_INTERNAL_MOUSE_CONNECT.

В общем-то меня там все устраивало, пока я не захотел изменять IRP-пакет. Там это почему-то не получаестя.

Тогда решил воспользоваться другим способом устанавливить процедуру завершения:

Цитата:
Originally posted by kelz
[b]Подключаешь свой фильтр к стеку устройства DevicePointerClass0 и пропускаешь все IRP вниз. При обработке IRP_MJ_READ устанавливаешь процедуру завершения IRP, а в ней забираешь из AssociatedIrp.SystemBuffer структуру MOUSE_INPUT_DATA. Подробности в MSDN.
Но возникла проблема:
Мой драйвер вообще не попадает в процедуру ReadRoutine!

Предполагаю, потому что нет символьной ссылки?

Цитата:
Originally posted by kelz
[b]Подключаешь свой фильтр к стеку устройства DevicePointerClass0
Я подключаю фильтр так:
Код:
dx->LowerFdo = IoAttachDeviceToDeviceStack(fdo, pdo);
Надо где-то указать DevicePointerClass0
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,274
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 10.06.2006, 19:19

Так откуда берется PDO ?
Его как раз и надо искать по имени
Ответить с цитированием
  (#14 (permalink)) Старый
Graf_L Graf_L вне форума
Member
 
Сообщений: 134
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.03.2005
По умолчанию 10.06.2006, 23:49

Цитата:
Originally posted by Alexiski
[b]Так откуда берется PDO ?
Его как раз и надо искать по имени
Код:
NTSTATUS AddDevice(IN PDRIVER_OBJECT   Driver, IN PDEVICE_OBJECT  pdo)
{
.......................
}
Его передает Диспетчер Ввода/Вывода в процедуру AddDevice.
Ответить с цитированием
  (#15 (permalink)) Старый
Graf_L Graf_L вне форума
Member
 
Сообщений: 134
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.03.2005
По умолчанию 10.06.2006, 23:51

Цитата:
Originally posted by Alexiski
[b]Так откуда берется PDO ?
Его как раз и надо искать по имени
Код:
NTSTATUS AddDevice(IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pdo)
{
.......................
}
Его передает Диспетчер Ввода/Вывода в процедуру AddDevice.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фильтр Канни sanya3112 Вопросы начинающих программистов 0 12.04.2012 00:54
Сетевой фильтр phyhoz163 Блоки питания 2 25.08.2011 06:02
Не удалось загрузить драйвер этого устройства. возможно драйвер поврежден или отсутс inze Драйвера 2 30.01.2011 23:48
Сетевой фильтр buzzkill Блоки питания 39 17.06.2010 02:20
Фильтр для интернета Stanislav88 Софт и программы 1 17.03.2009 17:33
фильтр от пыли mogwai Моддинг 49 02.12.2008 17:57
Фильтр в ADOQuery Cplushka SQL 1 22.06.2008 19:38
Фильтр -драйвер как его создать Mailo Железо. Написание драйверов 3 20.01.2008 03:28
Фильтр mariza112 Visual Basic 1 18.06.2007 08:34
навесной фильтр Kopper Задания за деньги 3 29.04.2007 00:27
Драйвер-фильтр как его написать LuckyDevil Железо. Написание драйверов 0 27.09.2005 12:03



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов