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

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

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

« : 01-09-2007 09:53 » 

Всем привет!

Я пишу драйвер фильтр который слушает I/O. Сам драйвер работает, но мне нужно теперь что-бы драйвер

разговаривал с программой в User Mode. Мне нужно что-бы когда драйвер ловит I/O, он посылал сообщение

программе в User Mode, и ждал ответа. И только после ответа что-бы он продолжал обработку данного IRP.

Может кто-то подскажет как это лучше сделать?

Буду очень благодарен...
Записан
dimm
Гость
« Ответ #1 : 01-09-2007 14:57 » 

А чем events не устраивают?
Создать в драйвере именованное событие: IoCreateNotificationEvent(...)
А потом при необходимости вызвать KeSetEvent(...) - тем самым уведомить приложение.
Но мне кажется надо пересмотреть логику работы драйвера - чтоб он не зависел от клиентского приложения, т.е. не ждал ответа от него. А если например, клиентское ПО повисло, или пользователь выгрузил его в неподходящее время?
Записан
HighLander
Постоялец

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

« Ответ #2 : 01-09-2007 15:10 » 

А как работать с Notification Events? Они могут дать мне то что мне нужно?

Я не могу поменять логику работы, потаму что в Write IRP я остонавливаю все и жду ответа от программы, а если я закончу IRP, то я его потеряю... Notification Events могут дать мне это?

А может есть другой способ? Передавать информацию через память и ждать с помощью цыкла?

Спасибо!
Записан
dimm
Гость
« Ответ #3 : 02-09-2007 10:20 » 

Как-то непонятно Жаль Получается user mode приложение является частью драйвера? Т.е., я так понял, это драйвер-фильтр, фильтрует определенные запросы (на запись) по определенным правилам, так?
Тогда лучше в драйвере иметь таблицу правил, по которым будут запросы фильтроваться, а клиентское ПО будет только изменять эту таблицу (добавлять/удалять/редактировать правила).

А управление драйвером (т.е. работу с ним от клиентского ПО) надо делать через управляющие коды - как это обычно делается (во всех примерах). Можно конечно в цикле проверять общую (между драйвером и приложением) память на предмет изменений, но мне такой способ кажется крайне ненадежным.
Записан
HighLander
Постоялец

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

« Ответ #4 : 02-09-2007 13:45 » 

"...Можно конечно в цикле проверять общую (между драйвером и приложением) память на предмет изменений..."

Как это можно сделать?

А есть способ лучше это сделать? Потаму что я не могу иметь таблицу правил в драйвере...

А можно из драйвера обращатся к базе данных?

Спасибо!
Записан
Ochkarik
Модератор

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

« Ответ #5 : 03-09-2007 07:09 » 

все это - не очень хорошая идея.
события от драйвера к приложению приходят достаточно медленно. время ожидания оцень сильно зависит от... короче от многоих параметров.
могу порекомендовать использовать APC. подробнее на примере: посмотрите тему про подключение нескольких мышей к ПК (недавно была). там ссылка на проект CPNMouse. в нем используются APC CallBack-и. он достаточно простенький для понимания. только внимательно!!! посмотрите на то как реализован прием этих калбеков (hapi.c).

PS но в любом случае это будет медленнее чем если обработку сделать в драйвере. короче даже APC - это крайний вариант. IRP - НЕ ПРЕДНАЗНАЧЕНЫ для обработки в приложениях!!!! лучше придумайте как этого избежать вообще.
« Последнее редактирование: 03-09-2007 07:12 от Ochkarik » Записан

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

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

« Ответ #6 : 03-09-2007 13:26 » 

ОК, большое спасибо!
Записан
Novi4ek
Гость
« Ответ #7 : 21-09-2007 13:28 » 

Можно зарегистрировать прерывание, обработчиком которого будет драйвер
Записан
Ochkarik
Модератор

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

« Ответ #8 : 21-09-2007 15:07 » 

Novi4ek,
а при чем тут прерывание?))))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vlaor
Гость
« Ответ #9 : 21-09-2007 18:54 » 

По-моему драйвер должен вызывать KeSetEvent(...).
Пользовательское приложение тарам-пам-пам что-то делает и затем отвечает драйверу через управляющие коды.
Записан
Novi4ek
Гость
« Ответ #10 : 22-09-2007 10:45 » 

Ochkarik да ты прав, я не досмотрел. Просто от приложения драйверу какое-то извещение послать можно с помощью прерывания
Записан
Ochkarik
Модератор

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

« Ответ #11 : 22-09-2007 11:01 » 

Novi4ek, если вы имеете в виду программное прерывание - то подчти все API Windows - это программное прерывание) 0x2E помоему)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Novi4ek
Гость
« Ответ #12 : 22-09-2007 11:12 » 

>>то подчти все API Windows - это программное прерывание) 0x2E помоему)

Или сисентер или сискалл...

Но я имел ввиду что можно о чем-то информировать драйвер быстро через регистрацию им прерывания
« Последнее редактирование: 22-09-2007 14:00 от Novi4ek » Записан
Ochkarik
Модератор

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

« Ответ #13 : 22-09-2007 14:02 » 

драйвер проще IOCTL инофрмировать. без лишнего гемороя)
смысл изобретать велосипед?
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines