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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно обработать SRB_SURPRISE_REMOVAL в драйвере вебкамеры?  (Прочитано 5569 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PVV
Гость
« : 14-04-2009 11:22 » 

Добрый день!

Имеется драйвер основанный на USBCAMD, при включенном Preview в приложении и выдергивании устройства приложение виснет, что неудобно. Насколько я понял нужно как-то отреагировать на SRB_SURPRISE_REMOVAL  сообщив приложению, что устройство недоступно. Но как это сделать?   Здесь была моя ладья...
Записан
Ochkarik
Модератор

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

« Ответ #1 : 15-04-2009 06:14 » 

поищите по форуму SURPRISE_REMOVAL, я как-то задавался таким вопросом)
правда так толком и не реализовал...
вроде нашел два варианта - через собственный Event и кажется через оконное сообщение, если не путаю.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
PVV
Гость
« Ответ #2 : 18-04-2009 08:10 » 

поищите по форуму SURPRISE_REMOVAL, я как-то задавался таким вопросом)
правда так толком и не реализовал...
вроде нашел два варианта - через собственный Event и кажется через оконное сообщение, если не путаю.

Спасибо посмотрел, но к сожалению все это мало мне помогло. Проблем несколько, во первых я не могу вмешиваться в код приложений (это все приложения DirectShow, от AMCap до Adobe Premiere), во вторых все процедуры обработки IRP и многое другое скрыто в недрах USBCAMD.

В WDK об этом всего несколько строк:
Цитата
Minidriver’s SRB_SURPRISE_REMOVAL handler
Component                       Action
Camera minidriver             Call USBCAMD_AdapterReceivePacket.
USBCAMD2                        Cancel pending data SRBs and return the SRBs with STATUS_CANCELLED.
USBCAMD2                        Call the minidriver's CamStopCaptureEx and CamFreeBandwidthEx callback functions on all opened streams.
USBCAMD2                        Return STATUS_CANCELLED on any read/write SRBs that come down after SRB_SURPRISE_REMOVAL.

Реально работает все не так, вернее так работает только если в приложении, например AMCap не включен Preview, в противном случае мне приходит SRB_SURPRISE_REMOVAL, а дальше если вызвать  USBCAMD_AdapterReceivePacket тишина, CamStopCaptureEx и CamFreeBandwidthEx не приходят, приложение виснет, если его закрыть аварийно то дальше все штатно, драйвер завершается освобождая ресурсы.

Смотрел "фирменные" устройства и драйвера, половина также виснет, но есть и правильные. Боюсь, как бы это не была фича USBCAMD.

Пробовал менять SRB (HW_STREAM_REQUEST_BLOCK) вызывать StreamClassDeviceNotification и т.п, частично это помогает, приложение реагирует на это выдачей сообщения об ошибке, но не виснет, меня бы такое поведение устроило бы, но это не работает если устройство подключено к USB-хабу и выдергивать не устройство, а хаб.  Здесь была моя ладья... Жаль
 
Записан
Ochkarik
Модератор

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

« Ответ #3 : 19-04-2009 10:44 » 

насколько я помню SURPRISE_REMOVAL передается сначала верхнему драйверу стека. не знаю как в USB...
попробуйте после получения SURPRISE_REMOVAL не возвращать управление какое то время. пока к вам не придут запросы от приложения на которые вы вернете STATUS_CANCELLED.
если это возможно конечно...
короче не реагируйте на SURPRISE_REMOVAL немедленной выгрузкой драйвера. оставьте его в памяти - пусть поживет немного, несмотря на то что физически устройства уже нет.
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines