Добрый день!
Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером).
Знает ли кто-нибудь как это сделать?
Заранее всем спасибо
Здравствуйте, IZer,
IZ>Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером).
--
Вы хотите заменить драйвер любого устройства некоего класса или заменить драйвер устройства какого-то одного конкретного, заранее определенного производителя?
C уважением,
Геннадий Майко.
Re[2]: Как загрузить свой драйвер для USB устройства
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Здравствуйте, IZer,
IZ>>Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером). ГМ>-- ГМ>Вы хотите заменить драйвер любого устройства некоего класса или заменить драйвер устройства какого-то одного конкретного, заранее определенного производителя?
Вообще любого устройства — любой флешки, любой клавиатуры, мышки, iPod-а и т.п.
ГМ>C уважением, ГМ>Геннадий Майко.
Re[3]: Как загрузить свой драйвер для USB устройства
Здравствуйте, IZer,
IZ>>>Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером). ГМ>>Вы хотите заменить драйвер любого устройства некоего класса или заменить драйвер устройства какого-то одного конкретного, заранее определенного производителя?
IZ>Вообще любого устройства — любой флешки, любой клавиатуры, мышки, iPod-а и т.п.
--
В принципе можно програмно заменить один драйвер на другой.
Например, для этого надо системе сообщить, что Ваш драйвер способен работать с конкретными классами устройств, прописав их в своем *.inf файле. Затем установить class-coinstaller для всех классов устройств, для которых будет сделана замена, и в нем обрабатывать DIF_SELECTBESTCOMPATDRV и DIF_SELECTDEVICE requests, помечая все остальные драйвера как DNF_BAD_DRIVER (см. http://msdn.microsoft.com/en-us/library/ff544861(VS.85).aspx). Затем нужно инициировать перестройку стека устройств.
Но Вы уверены, что именно это Вам нужно? Если Вы хотите действительно заменить все FDO драйвера на свои, то Вы должны написать что-то вроде универсального дайвера, умеюшего работать со всеми существующими устройствами USB, нет?
C уважением,
Геннадий Майко.
Re[4]: Как загрузить свой драйвер для USB устройства
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Здравствуйте, IZer,
IZ>>>>Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером). ГМ>>>Вы хотите заменить драйвер любого устройства некоего класса или заменить драйвер устройства какого-то одного конкретного, заранее определенного производителя?
IZ>>Вообще любого устройства — любой флешки, любой клавиатуры, мышки, iPod-а и т.п. ГМ>-- ГМ>В принципе можно програмно заменить один драйвер на другой.
ГМ>Например, для этого надо системе сообщить, что Ваш драйвер способен работать с конкретными классами устройств, прописав их в своем *.inf файле. Затем установить class-coinstaller для всех классов устройств, для которых будет сделана замена, и в нем обрабатывать DIF_SELECTBESTCOMPATDRV и DIF_SELECTDEVICE requests, помечая все остальные драйвера как DNF_BAD_DRIVER (см. http://msdn.microsoft.com/en-us/library/ff544861(VS.85).aspx). Затем нужно инициировать перестройку стека устройств.
ГМ>Но Вы уверены, что именно это Вам нужно? Если Вы хотите действительно заменить все FDO драйвера на свои, то Вы должны написать что-то вроде универсального дайвера, умеюшего работать со всеми существующими устройствами USB, нет?
ГМ>C уважением, ГМ>Геннадий Майко.
Большое спасибо за помощь
Действительно, это будет нечто вроде "универсального драйвера", задача которого — получать данные о URB запросах от удалённого компьютера и переадресовывать их реальному устройству. По поводу предложенного Вами решения — скажите, на сколько я понял, co-installer работает во время установки драйвера в систему, правильно? То есть если есть необходимость периодически переключаться между оригинальным драйвером и нашим "универсальным" драйвером, то это можно сделать только путём удаления драйвера из системы и установки заново? Если да, то это не совсем подходит т.к. необходима возможность независимо включать/отключать расшаривание отдельных устройств....
Если я ошибаюсь и имеется возможность переключаться между драйверами без переустановки драйвера, скажите пожалуйста — мне, увы, не приходилось много работать с class-coinstaller-ами
Спасибо за помощь!
Re[5]: Как загрузить свой драйвер для USB устройства
Здравствуйте, IZer,
ГМ>>Но Вы уверены, что именно это Вам нужно? Если Вы хотите действительно заменить все FDO драйвера на свои, то Вы должны написать что-то вроде универсального дайвера, умеюшего работать со всеми существующими устройствами USB, нет?
IZ>Действительно, это будет нечто вроде "универсального драйвера", задача которого — получать данные о URB запросах от удалённого компьютера и переадресовывать их реальному устройству. По поводу предложенного Вами решения — скажите, на сколько я понял, co-installer работает во время установки драйвера в систему, правильно? То есть если есть необходимость периодически переключаться между оригинальным драйвером и нашим "универсальным" драйвером, то это можно сделать только путём удаления драйвера из системы и установки заново? Если да, то это не совсем подходит т.к. необходима возможность независимо включать/отключать расшаривание отдельных устройств.... IZ>Если я ошибаюсь и имеется возможность переключаться между драйверами без переустановки драйвера, скажите пожалуйста — мне, увы, не приходилось много работать с class-coinstaller-ами
--
1. Да, co-installer работают в процессе установки драйвера в систему.
2. Для замены драйверов (переключения на оригинальный) можно как-то настроить co-installer, чтобы он не заменял оригинальные драйвера на Ваш универсальный и затем попросить систему перестроить стек устройств. Драйвера в этом случае деинсталлировать не нужно. Co-installer — это user mode DLL, так что возможностей настройки его много.
3. Возможно, подойдет такой подход к решению вашей задачи: вместо универсального FDO попробовать написать low-level class filter драйвер. Его задача будет не пропускать URB запросы от локального драйвера и формировать URB запросы от удаленного компбютера.
C уважением,
Геннажий Майко.
Re[6]: Как загрузить свой драйвер для USB устройства
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>3. Возможно, подойдет такой подход к решению вашей задачи: вместо универсального FDO попробовать написать low-level class filter драйвер. Его задача будет не пропускать URB запросы от локального драйвера и формировать URB запросы от удаленного компбютера.
Тогда вышележащий функциональный драйвер обломится послав очередной запрос вниз и не получив ответ от девайса через какое то время сделает какую либо гадость (вплане остановится или еще что то — в зависимости от того что предусмотрели разработчики) ну а дальше как карта ляжет.
Re[7]: Как загрузить свой драйвер для USB устройства
Здравствуйте, _f_b_i_,
ГМ>>3. Возможно, подойдет такой подход к решению вашей задачи: вместо универсального FDO попробовать написать low-level class filter драйвер. Его задача будет не пропускать URB запросы от локального драйвера и формировать URB запросы от удаленного компбютера.
___>Тогда вышележащий функциональный драйвер обломится послав очередной запрос вниз и не получив ответ от девайса через какое то время сделает какую либо гадость (вплане остановится или еще что то — в зависимости от того что предусмотрели разработчики) ну а дальше как карта ляжет.
--
Да, это возможно.
Имелось в виду только способ доставки URB для железки. Вполне возможно, потребуется еще upper-level class driver, который "отрежет" функциональный драйвер от user mode.