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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сспособы взаимодействия нескольких приложений с драйвером  (Прочитано 12384 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Yarilo
Гость
« : 18-08-2003 07:22 » 

Возникла задача в реализации взаимодействия драйвера и нескольких приложений. А именно:
Драйвер-фильтр обрабатывает поступающую информацию, после чего несколько приложений (их количество может быть изменено) должны получить эту информацию из драйвера. Вопрос: Какие существуют способы взаимодейтвия приложений пользовательского режима с драйвером в этом случае. Все что я нашел сводится к APC и событиям. Но здесь это врядли применимо (Не понял).
PS: Да и еще желательно, чтобы это работало начиная с семейсива 9-х и до XP. И насколько я понимаю информацию в драйвере лучше не хранить, а передавть сразу. Так ли это?

Интересуют любые предложения.
С уважением Ярослав.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 18-08-2003 07:45 » 

Одинаково хорошо работает система IOCTL кодов для обращения к драйверу.
Возможно прямое обращение через CreateFile("./../drvname.sys".....)  с дальнейшим обращением к драйверу функциями ReadFile WriteFile

Информацию в драйвере действительно лучше не держать. И тут возникает вопрос, как часто возникает необходимость в информации.
Если с частотой 1 раз в секунду - одно - если раз в сутки - то совсем другое.
Записан

А птичку нашу прошу не обижать!!!
Yarilo
Гость
« Ответ #2 : 18-08-2003 08:25 » 

Проблема в том, что когда пришла информация, т.е. очередной пакет, об этом знает только драйвер и он передает эту информацию приложениям (желательно синхронно). А как это реализовать? Я это сделал через событие, т.е. регистрирую событие в приложении, передаю описатель в драйвер, и в драйвере переключаю его в сигнальное состояние. Приложение ждет наступления этого события и после чего отправляет через IOCTL запрос на получение данных. Но при этом данные храняться в драйвере - это не хорошо. А остальные приложения тоже должны как-то получить эти данные. в общем здесь очень большие проблемы с синхронизацией. А иметь отдельный сервис, который принимает эти данные нельзя.
Предлагали использовать в этом случае Event Trace из WMI, но этот интерфейс насколько я знаю не поддреживается в 9х.
Может существует более интересный механизм?

С уважением Ярослав.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 18-08-2003 09:02 » 

Можно сделать блокирующий ReadFile и висеть на нем в аппликации в отдельном треде, тогда будешь выгребать данные сразу же.
Кстати насчет события - так это работает очень быстро , и ничего особо в драйвере не хранится - выкачивается все сразу.

Насчет отдельного сервиса, почему же нельзя - можно, можно напиать и отдельную аппликацию, которая будет это делать, а остальные грести все будут из нее.

Вообще идей как это сделать может быть много.
Вопрос стоит, как сделать данные доступными из многих программ одовременно, тогда видимо стоит все же сделать буферную программку или буферный сервис, который будет заниматься сортировкой данных..
Честно говоря слишком мало вводных данных, да и решений много.
Записан

А птичку нашу прошу не обижать!!!
Yarilo
Гость
« Ответ #4 : 18-08-2003 11:08 » 

Но всеравно мне пришлось использовать внутренний список(first-in-first-out) в драйвере. Потому что это драйвер-фильтр и нужно как-то сохранить то что было ему передано до обработки запроса и то что получилось после обработки низлежащим драйвером. Я всю эту информацию храню в списке а затем по запросу от приложения(событие в сигнальном состянии) передаю в пользовательский режим. Может это все можно было реализовать проще? надежней?? Используя внутренние очереди драйвера?
Кстати Рихтер пишет, что все механизмы по межпотоковому взаимодействию так или иначе используют filemapping и что это самый быстрый метод. Возникает вопрос как этот метод реализовать при взаимодествии приложений с драйвером? Если можно поподробней.
С уважением Ярослав.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 18-08-2003 11:36 » 

Цитата

Может это все можно было реализовать проще? надежней?? Используя внутренние очереди драйвера?


А почему ты думаешь, что это ненадежно?

Цитата

Кстати Рихтер пишет, что все механизмы по межпотоковому взаимодействию так или иначе используют filemapping и что это самый быстрый метод


Уж не помню что там Рихтер пишет(не очень люлю я этого товарища, особенно после того как он .NET стал пропагандировать), но мысль его вероятно такая- filemapping это память разделяемая между несколькими процессами.

Я бы так сказал- общение между процессами и общение между драйвером и пользовательским приложением не всегда одно и то же.

В старом форуме мы обсуждали проблему того как создав в юзерском приложении буфер, передать указатель и его размер в драйвер, и в драйвере сразу в этот буфер писать, то есть тем самым исключив операцию выделения памяти в ядре и копирования между двумя буферами. Проблему решили при помощи MDL, там даже код был. Ограничения у того решения такие- так как память отображалась на системное адресное пространство и не выгружается в страничный файл, размер буфера должен быть в разумных переделах, преимущества- буфер видени из любого контекста и на любом IRQL. Вот только Grom никак не выложит старый форум.

 Если же ты хочешь filemapping то тебе надо использовать ф-ции
ZwCreateSection
ZwMapViewOfSection
ZwUnmapViewOfSection
тебе нужно отображение, поддерживаемое страничным файлом, если только ты не хочешь сразу в файл на диске писать.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 18-08-2003 12:11 » new

Почитай еще вот тут
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q191/8/40.ASP&NoWebContent=1

и тут

http://www.ntfsd.org/archive/ntfsd0207/msg0126.html
Записан
dorador
Гость
« Ответ #7 : 18-08-2003 12:46 » 

может пригодится ?
http://www.osr.com/ntinsider/2000/sharing_memory.htm
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines