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

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

ru
Offline Offline

« : 16-11-2006 09:14 » 

Доброе время суток.

Тут такая задача имеется:

Драйвер сидит в режиме ядра и ничего не делает. Наступает момент когда приходят куча запросов от устройства. Драйвер должен решить, принимать запрос или отвергнуть. Причем в течении 1 сек. может прийти около 1000 запросов.

Как я пердпологаю, запросы надо передать аплиухе из User мода и она ответит принимать запрос или нет.
Соответственно задача, как приложение должно ожидать ответа от драйвера?
Записан
Greysfi
Гость
« Ответ #1 : 16-11-2006 11:22 » 

Просто реализуй в драйвере поддержку блокируемых или ассинхронных запросов. И тогда можно будет поставить запрос, а ответ от драйвера получить только когда произойдет реальное событие.
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #2 : 16-11-2006 11:39 » 

Как я понимаю инициатором обмена между драйвером и приложением, может быть только приложени. Вот как бы послать приложению, что у драйвера, что  то есть. Не хотелось бы усыплять слушающий поток. Что то типа асинхронного обмена, как по ком-портам с использованием структуры OVERLAPPED. И посмотреть как это делать правильно.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #3 : 16-11-2006 12:30 » 

Rulik, асинхронная работа происходит именно так: приложение инициирует операцию, но не блокируется.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Greysfi
Гость
« Ответ #4 : 16-11-2006 12:47 » 

Для того чтобы реализовать ассинхронный обмен нужно в обработчике IRP пометить IRP как pending (по моему). И сохранить его где нибудь например в очереде драйвера или создать user-driven очередь а потом когда получишь нужную информацию внути драйвера от тебя потребуется пометить это IRP как обработанное.
Записан
Ochkarik
Модератор

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

« Ответ #5 : 16-11-2006 17:38 » 

Greysfi, истинно так!)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Rulik
Помогающий

ru
Offline Offline

« Ответ #6 : 17-11-2006 03:28 » 

Ок. Тогда как передаеться Event, указанный в структуре OVERLAPPED в поле hEvent? И кто его взводит при завершении операции? Сам драйвер или винда сама и управляет?
Записан
Greysfi
Гость
« Ответ #7 : 17-11-2006 08:02 » 

этот ивент не передается драйверу не посредственно. Ты делаешь свое дело а диспечер ввода/вывода сделает свое в том числе и ивент поднимет Улыбаюсь
Записан
Ochkarik
Модератор

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

« Ответ #8 : 17-11-2006 08:16 » 

помоему винда. примеры DDK посмотрите, не надо ленится там все есть)

IRP_MJ_READ:
...ля-ля-ля. помещаем запрос в очередь
IoMarkIrpPending(Irp);  - пометили что отложили
возможно еще IoStartNextPacket? не помню точно... см примеры.
return STATUS_PENDING; - вернули статус (вышли из IRP_MJ_READ)


когда нибудь потом: обрабатываем отложенный запрос (например где нибудь в другой нити)
...ля-ля-ля. обработали.
Irp->IoStatus.Status = STATUS_SUCCESS; - выставили свой статус
Irp->IoStatus.Information = 0;- все как обычно.
CompleteRequest(Fdo, Irp, IO_NO_INCREMENT); //ЗАВЕРШИЛИ. в этот момент выставляется событие из OVERLAPPED структуры запроса.


помоему так) впрочем честно говоря ни разу этим не пользовался) - СМОТРИТЕ ПРИМЕРЫ DDK!!!!
там же немерянно всего есть!
PS лентяи;)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Greysfi
Гость
« Ответ #9 : 17-11-2006 08:25 » 

Об этом то я и говорю Улыбаюсь.
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #10 : 17-11-2006 10:18 » 

Я хотелбы пояснить, что я только проектирую драйвер и хотелось бы на этой стадии обойти возможные грабли, потому и спросил. А как делать отложенную обработку пакет я знаю, меня интересовал момент об вариантах реализации обмена с драйвером. Стандартный обмен я знаю, просто думал, что я только знаю шаблоны, и есть возможность сделать инициатором драйвер. А когда сказали, что не возможно, пришлось использовать не блокирующий ввод/вывод. А поэтому отсюда и вопрос кто правит этим Эвентом. В ДДК я по этому поводу не нашел ответа (может плохо искал). Вот теперь я точно знаю, кто его взводит. Теперь допишу ТЗ. Спасибо за уделенное время.
Записан
Ochkarik
Модератор

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

« Ответ #11 : 17-11-2006 12:27 » 

впринципе возможен вариант выставления события без использования read/write/OVERLAPPED...
Через DeviceIOControl передаете handle события... суть от этого не меняется, но мне удобнее. разница только в том что в этом случае вы будете его выставлять явным образом. (например так реализовано у меня для синхронизации и нити приложения и DPC обработки потока данных). в DPC - ставит событие, нить апликухи его постоянно ждет.

других вариантов по большому счету нет)))
PS
....в связи с тем, что приложение и драйвер работают в различных контекстах. таким образом, для того, чтобы вызвать из драйвера какую либо функцию приложения - необходимо переключить контекст, а это слишком большое вмешательство в работу планировщика задач.
для уменьшения времени реакции приложения на выставленный в драйвере Event возможно завершение пакета CompleteRequest(Fdo, Irp, IO_NO_INCREMENT); со значением выше IO_NO_INCREMENT(от 0 до 8=IO_SOUND_INCREMENT, см дефенишены). в этом случае, если не ошибаюсь - планировщик более быстро переключит контекст, если нет более приоритетных потоков, правда и квант времени выделится меньший если не путаю. книга "внутреннее устройство W2000" раздел посвященный планировщику - там хорошо описано.
« Последнее редактирование: 17-11-2006 13:00 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Greysfi
Гость
« Ответ #12 : 17-11-2006 21:40 » 

Вообще при особом желании можно создать и именованный ивент в драйвере а в приложении его проверять.
Записан
Ochkarik
Модератор

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

« Ответ #13 : 20-11-2006 09:06 » 

об этом и говорю...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Karloson
Гость
« Ответ #14 : 12-12-2006 07:11 » new

Прочитал ветку и возник косвенный вопрос по этой теме:
Как все-таки драйверу узнать как была вызвана ф-ция ReadFile() - синхронно и асинхронно с OVERLAPPED?
Ведь в первом случае драйвер не должен возвращать управление пока не считает данные или не сработает какой нибуть KeWaitForSingleObject(&event, ...., &waitDelay) == STATUS_TIMEOUT, а во втором - вызвать IoMarkIrpPending и вернуть управление. И как, в последнем случае, отразиться на драйвере вызов GetOverlappedResult()?
Записан
Ochkarik
Модератор

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

« Ответ #15 : 12-12-2006 08:38 » 

не совсем. действия драйвера от наличия/отсутствия OVERLAPPED не зависят.
драйвер всегда может вернуть статус выполнения сразу, а может отложить и вернуть pending.
а вот операционная система в зависимости от того был вызов ReadFile - c OVERLAPPED или без - либо вернет управление вызывающему процессу с соответствующим статусом (error pending - например если требуется ожидание), либо, в противном случае, подождет события завершения IRP сама, и только после этого вернет управление вызывающему процессу.
короче - если вы не ставите при вызове ReadFile поле OVERLAPPED, - тогда ожидание выполнется операционкой (ядровой функцией, которая ReadFile переводит в запрос IRP для конкретного девайса) в противном случае вы сами его обрабатываете.
« Последнее редактирование: 12-12-2006 08:41 от Ochkarik » Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines