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

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

vn
Offline Offline

« : 06-09-2008 17:21 » 

Я хочу написать драйвер, который передает сразу данные с клавиатуры в Приложение.
Как я понял, что нужно:
- Перехватит данные, вводимые с клавиатуры с помобщью драйвера.
- Передать эти данные сразу (realtime) в Приложение.

Используемык функции наверно:
 -HalBeginSystemInterrupt, HalEndSystemInterrupt, HalGetInterruptVector, KeInsertQueueDpc, KeInitializeDpc, ObReferenceObjectByHandle,  ObfDereferenceObject, KeClearEvent, KeSetEvent.
 
 Но я не знаю как реализовать этот драйвер.
 Подскажите как мне надо делать, чтобы написать такой тип драйрер.
 
« Последнее редактирование: 12-09-2008 21:58 от Ochkarik » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-09-2008 17:43 » 

а обязательно драйвер ? Глобальный клаво-хук не подойдёт ? )
Записан

Ochkarik
Модератор

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

« Ответ #2 : 06-09-2008 20:51 » 

для начала DDK. установить, почитать.
там кстати и примеры есть.
взять понравившийся пример и попробовать скомпилить.
в частности тебе нужен драйвер-фильтр. там точно был пример клавиатурного дарйвера и точнно был пример драйвера-фильтра... а вот вместе - не помню. под рукой DDK нет.
DDK рекомендую из KMDF брать.

PS и осторожнее со словом realtime;)
да, и в общем то зачем сразу драйвер? типа это круто?)))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #3 : 06-09-2008 22:29 » 

kbfiltr
из DDK.
все уже давно ЕСТЬ!
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #4 : 07-09-2008 10:44 » 

Спасибо всем за рекоментдование !
 Но дело у меня такое:
 У меня есть некое Source Code и в котором нехватает имено *.sys файл и у меня тоже есть откомпилорованный этот драйвер, но сам проект для него нету. Я диассемблировал этого драйвера и получил такой код как описанно в прикрепленном файле, в котором я видел, что использовали такие функции как: HalBeginSystemInterrupt, HalEndSystemInterrupt, HalGetInterruptVector, KeInsertQueueDpc, KeInitializeDpc, ObReferenceObjectByHandle,  ObfDereferenceObject, KeClearEvent, KeSetEvent,
 что связанно с прерыванием и обработки DPC. А фильтр так не делает.
 Я тоже изучил DDK, разные книги, но для реализации имено такого драйвера еще не знаю как.
 Что мне делать ?

* Disass_psmkb2k.txt (75.55 Кб - загружено 1042 раз.)
Записан
Ochkarik
Модератор

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

« Ответ #5 : 07-09-2008 12:49 » 

смотря что вам надо?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #6 : 08-09-2008 01:32 » 

Тут я хотел перенаправить данные, поступаемые с клавиатуры в мою программу, что другая программа не может получить доступ к клаве пока моя программа еще находиться в активном состоянии. Т.е Хук нельзя залезит в поток данных.
 Кто - то почитал прикрепленный код ?.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #7 : 08-09-2008 03:44 » 

buisyhanh, что-то твой файл хреново выглядит. Unicode вроде, но через с строчку - мусор.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #8 : 08-09-2008 04:40 » 

Цитата
Тут я хотел перенаправить данные, поступаемые с клавиатуры в мою программу, что другая программа не может получить доступ к клаве пока моя программа еще находиться в активном состоянии. Т.е Хук нельзя залезит в поток данных.
Хмм... Если перехваченные данные с клавиатуры твоя прога не должна передавать пока не обработает, то тут без разницы драйвер или хук - все равно будет тормозить (в случае длительной обработки). Ну а если вышеописанное условие не нужно, то обработку данных можно делать в отдельном потоке, вызывая его из хуковой процедуры.
Записан
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #9 : 08-09-2008 07:48 » 

Извините всем, те кто скачал прикрепленный тест файл. Да - Мусорб Я дам *.pdf файл вам.

Хмм... Если перехваченные данные с клавиатуры твоя прога не должна передавать пока не обработает, то тут без разницы драйвер или хук - все равно будет тормозить (в случае длительной обработки). Ну а если вышеописанное условие не нужно, то обработку данных можно делать в отдельном потоке, вызывая его из хуковой процедуры.

  Тут в драйвер используют Isr routine, как я изучил код ассемблера. И видно что сразу обрабатываются данные, набираемые на клаве в приложение.
 
 
Записан
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #10 : 08-09-2008 07:54 » 

Вот тут польный диассемберный код моего драйвера.
Как понимаю, что в нем использовал ISR for keyboard  и данные, набираемые с клавы как-то отправить через DeviceIoControl buffer к приложению. Но задержки не были. Как только вводить сразу появить символы.
 Вы кто - то может пояснить ?

* DisFullPsmkbd2k.pdf (114.85 Кб - загружено 1161 раз.)
Записан
sss
Специалист

ru
Offline Offline

« Ответ #11 : 08-09-2008 08:15 » 

Пипец, почему не машинный код?

Что значит - как-то отправить? DPC или WorkItem не подойдут ? Или отправлять сразу с повышенных IRQL, что бы realtime был?

Записан

while (8==8)
Ochkarik
Модератор

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

« Ответ #12 : 08-09-2008 10:09 » 

buisyhanh, не будет там никакой задержки. на любой реализации что через фильтр, что через ISR.
потому что 1-10мс вы глазами не заметите.

была бы мышь - тогда понятно... там опрос и до килогерца может быть... а тут... ну 10 Гц... ну 30... навряд ли больше.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #13 : 08-09-2008 10:52 » 

Да использовали DPC для прерывания, и заменили ISR для клавы на DPC для Клавы. я изучил код программы и некоторые примеры в Инете видел, что в замене ISR использовли DPC когда происходит прерывание клавы. Но как-то в драйвере обрабатываются данные, чтобы могли передать их в output buffer нашей программы. После чего мы можем обрабатывать как хотим. Видно с моего кода, будет простая обработка в драйвере и в программе, так как сразу появляются на экране набираемые символы.
 У кого есть примера для такого типа драйвера или кто-то мог бы по просту дать мне обьяснение прикрепленного кода?.
 С благодарностью.
Записан
Ochkarik
Модератор

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

« Ответ #14 : 08-09-2008 13:53 » 

Да использовали DPC для прерывания, и заменили ISR для клавы на DPC для Клавы.
- извините, не понятно что имелось в виду. попробуйте построить фразу иначе.

я изучил код программы и некоторые примеры в Инете видел, что в замене ISR использовли DPC когда происходит прерывание клавы.
- аналогично.

Но как-то в драйвере обрабатываются данные, чтобы могли передать их в output buffer нашей программы. После чего мы можем обрабатывать как хотим.
- ЧТО ВЫ ИМЕЛИ В ВИДУ?

Видно с моего кода, будет простая обработка в драйвере и в программе, так как сразу появляются на экране набираемые символы.
 У кого есть примера для такого типа драйвера или кто-то мог бы по просту дать мне обьяснение прикрепленного кода?.
 С благодарностью.
- к сожалению подробный разбор дизасемблированного листинга требует много времени. и честно говоря не очень интересно.
если в кратце, то судя по наличию комадны iret он должен модифицировать IDT и подставлять свой обработчик прерывания. впрочем могу ошибаться. в какой последовательности он действует дальше - разбираться долго.

- примеры есть в DDK. есть пример работы с PS/2 портом: pnpi8042.
есть примеры драйвера фильтра. есть

PS я так понял, что русский не ваш родной язык?
может быть проще будет если вы напишете вопросы на английском?
« Последнее редактирование: 08-09-2008 13:58 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
RXL
Технический
Администратор

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

WWW
« Ответ #15 : 08-09-2008 14:00 » 

PS я так понял, что русский не ваш родной язык?
может быть проще будет если вы напишете вопросы на английском?
IP записан за Вьетнамом.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #16 : 08-09-2008 15:58 » 

Да, русский - не мой родной язык, причем уже три года не говорил по нему. Но извините меня за не внимательностью когда я выразил свои смысли в русском. Я живу во Вьетнаме.
 Спасибо всем за хорощие ответы.
 Я имел ввилу, что для обработки прерывания клавиатуры в драйвере используется вместо ISR (Interrupt Service Routine) Рутин подобного типа  DPC (Deffered Procedure Call).
 И как Ochkarik написал правильно. Я изучил код одного драйыера, в котором есть замена обработчика прерывания клавиатуры на определяемый программистом обработчик прерывания. Здесь использовали фунцию HalGetInterruptVector для модификации IDT.
MappedIrqKeyboard = HalGetInterruptVector(Internal,0,KEYBOARD_IRQ,0,&DirqlKeyboard,&Affinity);
 Как я понял, что нужно написать свой обработчик прерывания. Но еще не знаю, как указать на этот обработчик в драйвере.
Пипец, почему не машинный код?

Что значит - как-то отправить? DPC или WorkItem не подойдут ? Или отправлять сразу с повышенных IRQL, что бы realtime был?


 И наверно sss вы поняли как делать ?.
Записан
Ochkarik
Модератор

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

« Ответ #17 : 08-09-2008 16:16 » 

http://chpie.tistory.com/attachment/dk1.pdf
к сожалению не знаю на каком языке, но по теме.

http://coding.derkeiler.com/pdf/Archive/Assembler/comp.lang.asm.x86/2005-11/msg00311.pdf
- тоже по теме. на английском.

просмотрите данные ссылки по поиску:
http://www.google.ru/search?complete=1&hl=ru&rls=GGLG%2CGGLG%3A2005-41%2CGGLG%3Aru&q=HalGetInterruptVector+keyboard&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #18 : 08-09-2008 17:10 » 

http://chpie.tistory.com/attachment/dk1.pdf
к сожалению не знаю на каком языке, но по теме.

http://coding.derkeiler.com/pdf/Archive/Assembler/comp.lang.asm.x86/2005-11/msg00311.pdf
- тоже по теме. на английском.

просмотрите данные ссылки по поиску:
http://www.google.ru/search?complete=1&hl=ru&rls=GGLG%2CGGLG%3A2005-41%2CGGLG%3Aru&q=HalGetInterruptVector+keyboard&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=
- Первый на кореанском языке, я скачал и смотрел его.
 Спасибо Ochkarik.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #19 : 09-09-2008 01:23 » 

buisyhanh, извините конечно, но меня обескураживают фразы типа "использовали вместо ISR DPC". Как можно вообще такое применить? Вам необходимо засунуть (IoConnectInterrupt) свою подпрограмму ISR в цепочку обработчиков прерывания. Затем, когда будет вызвана Ваша ISR, внутри этой подпрограммы Вы "намечаете" (IoRequestDPC, DpcForIsr) DPC. DPC это опять же подпрограмма в Вашем драйвере, которая будет повторно вызвана системой, но уже на пониженном уровне прерывания. Почему нужно DPC? Например: при передаче сигнала приложению об готовности буферов, как правило, драйвер устанавливает в сигнальное состояние (KeSetEvent) один из объектов синхронизации системы (событие например). На повышенных IRQL вызывать такие функции как KeSetEvent нельзя. А если говорить об прямой передаче буфера приложению? Возможно конечно, закрепив общий участок памяти. Но это плохо. Потому что тогда приложение должно постоянно проверять изменения в буфере, загружая процессор.
Записан

while (8==8)
Ochkarik
Модератор

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

« Ответ #20 : 09-09-2008 07:56 » 

sss,
А если говорить об прямой передаче буфера приложению? Возможно конечно, закрепив общий участок памяти. Но это плохо. Потому что тогда приложение должно постоянно проверять изменения в буфере, загружая процессор.
- обычно синхронизируется собятием или APC.
- либо для скорости и потоковой обработки дважды: событие + счетчик изменений.
- либо на отложенных запросах Read/IOCTL.

а насчет остального:
ISR (и соответственно IoConnectInterrupt)- не используется. вместо нее - переписывается вектор IDT.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sss
Специалист

ru
Offline Offline

« Ответ #21 : 09-09-2008 08:43 » 

Ochkarik, я и не спорю. Но переписывать вектор IDT это грубо слишком. А как потом вызывать предыдущий обработчик, если он как "честная Маша" присоединялся к цепочки с помощью IoConnectInterrupt ?
Записан

while (8==8)
Ochkarik
Модератор

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

« Ответ #22 : 09-09-2008 08:47 » 

sss, что значит как? - как обычно. перез заменой вектора запомнить старое значение, и вызвать после себя. впрочем не знаю как там буфер клавиатуры себя поведет при двойном считывании... если это вообще требуется.

PS да вообще какое то решение ломовое...
вполне подошел бы стандартный драйвер фильтр - он в примерах есть. всем условиям он отвечает. интерфейс привести только в соответствие.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sss
Специалист

ru
Offline Offline

« Ответ #23 : 09-09-2008 09:00 » 

Ochkarik, понял, понял. Скорее всего там (в IDT) вызов менеджера обработчиков ISR.
Я просто подумал, как узнать контекст предыдущей ISR? Потом понял - там не сама ISR, а прыжок на код обработки списков ISR. В принципе нормально тогда... Только замес с чтением контроллера.
Записан

while (8==8)
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #24 : 09-09-2008 10:05 » 

buisyhanh, извините конечно, но меня обескураживают фразы типа "использовали вместо ISR DPC". Как можно вообще такое применить? Вам необходимо засунуть (IoConnectInterrupt) свою подпрограмму ISR в цепочку обработчиков прерывания. Затем, когда будет вызвана Ваша ISR, внутри этой подпрограммы Вы "намечаете" (IoRequestDPC, DpcForIsr) DPC. DPC это опять же подпрограмма в Вашем драйвере, которая будет повторно вызвана системой, но уже на пониженном уровне прерывания. Почему нужно DPC? Например: при передаче сигнала приложению об готовности буферов, как правило, драйвер устанавливает в сигнальное состояние (KeSetEvent) один из объектов синхронизации системы (событие например). На повышенных IRQL вызывать такие функции как KeSetEvent нельзя. А если говорить об прямой передаче буфера приложению? Возможно конечно, закрепив общий участок памяти. Но это плохо. Потому что тогда приложение должно постоянно проверять изменения в буфере, загружая процессор.
Тут понял по принципу, но я смотрел на прикрепленный диассемблерный код драйвера, то видно не использовали IoConnectInterrupt(...) фунции. Как по документу Microsoft:
 http://technet.microsoft.com/en-us/sysinternals/bb963898.aspx
То испольлзовали в драйвере другие функции типа:KiDispatchInterrupt(...).
 А  в Undocumented NT еще использовали KiUnexpectedInterrupt(...) и поведение этой функции похоже на то, что в диассемблерном коде.
 На счет проверка буффера не нужно бы,вместо этого использовали обьект синхронизации (с использованием функции CreateEvent) и передать его  HANDLE к драйверу (by DeviceIoControl(...)). В драйвере мы будем установить состояние этото обьекта после DPC (обработка прерывания  - передача данной с клавы в буффер). А приложение после регистрации изменения состояния обьекта синхронизации будет посылать новый DeviceIoControl (...,IOCTL_GET_BUFFER,0,0,Outputbuffer, OuputLength, pReturned,NULL) к драйверу для получения данной буффера и опять изменить состояние обьекта синхронизации.
 По этой логике, то нужно как-то получить данные с клавиатуры. Но с использованием каких-то структура, переменной или функции я еще не знаю.
 
Записан
Ochkarik
Модератор

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

« Ответ #25 : 09-09-2008 15:01 » 

buisyhanh,
вам надо написать идентичный драйвер?
или надо повторить интерфейс драйвера?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #26 : 10-09-2008 02:48 » 

buisyhanh,
вам надо написать идентичный драйвер?
или надо повторить интерфейс драйвера?
Мне надо написать специальное драйвер для связи клавиатуры с моим приложением без помощи драйверов системы как 8042prt.sys, kbdclass.sys. И в драйвер напишу просто как захватчик вводимые информации с клавиатуры и передать его приложению - Т.е отдельный канал передачи данных.
 Это похоже на Keylogger, но в режиме ядра. И для регистрации в системе такого типа драйвера нужно получить соглащение Microsoft.
Записан
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #27 : 10-09-2008 02:53 » new

buisyhanh,
вам надо написать идентичный драйвер?
или надо повторить интерфейс драйвера?
Мне надо написать специальное драйвер для связи клавиатуры с моим приложением без помощи драйверов системы как 8042prt.sys, kbdclass.sys. И в драйвер напишу просто как захватчик вводимые информации с клавиатуры и передать его приложению - Т.е отдельный канал передачи данных.
 Это похоже на Keylogger, но в режиме ядра. И для регистрации в системе такого типа драйвера нужно получить соглащение Microsoft.
Извините меня за не грамотный тест.

Мне надо написать специальный драйвер для связи клавиатуры с моим приложением,но без помощи драйверов системы как 8042prt.sys, kbdclass.sys. И в драйвере напишу просто захватчик вводимых информаций с клавиатуры и передать его приложению - Т.е отдельный канал передачи данных.
 Это же похоже на Keylogger, но в режиме ядра. И для регистрации в системе такого типа драйвера нужно получить соглащение Microsoft.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #28 : 10-09-2008 03:22 » 

ОК buisyhanh. Для начала все таки ответь - установлен ли DDK и Visual C? Есть рабочий скелет простого legacy драйвера?
Записан

while (8==8)
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #29 : 10-09-2008 07:48 » 

 Есть у меня все исходные коды DDK и VC. Но не знаю какие из них брать. Дело только не в выборе, а то что как видно то код моего драйвера должен очень короткий и быстро работает без задержки. 
 Как видели в диассемблерном коде, то как-то очень коротко написали драйвер и он эффективно работает. Так как он только созает Обьект и перехвает данные (char or int ) и передает в приложению.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines