Как загрузить свой драйвер для USB устройства
От: IZer Украина  
Дата: 23.06.10 08:22
Оценка:
Добрый день!
Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером).
Знает ли кто-нибудь как это сделать?
Заранее всем спасибо
Re: Как загрузить свой драйвер для USB устройства
От: Геннадий Майко США  
Дата: 23.06.10 09:38
Оценка:
Здравствуйте, IZer,

IZ>Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером).

--
Вы хотите заменить драйвер любого устройства некоего класса или заменить драйвер устройства какого-то одного конкретного, заранее определенного производителя?

C уважением,
Геннадий Майко.
Re[2]: Как загрузить свой драйвер для USB устройства
От: IZer Украина  
Дата: 23.06.10 10:33
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, IZer,


IZ>>Есть такая задача: разрабатывается приложение для "расшаривания" USB устройств по сети. При расшаривании устройство должно "исчезать" из системы, к котоой подключено реальное устройство и появляться на удалённой системе. Возникла проблема с тем, как сделать, чтобы устройство "исчезло" из реальной системы. Похоже, надо как-то сказать системе перестроить стек устройств таким образом, чтобы вместо FDO драйвера конкретного устройства (напр., флешки), она загрузила наш драйвер и создала его FDO. (Это предположение появилось в ходе просмотра программой devicetree стека устройств для флешки, расшаренной при помощи программы VMWare с виртуальным компьютером).

ГМ>--
ГМ>Вы хотите заменить драйвер любого устройства некоего класса или заменить драйвер устройства какого-то одного конкретного, заранее определенного производителя?


Вообще любого устройства — любой флешки, любой клавиатуры, мышки, iPod-а и т.п.

ГМ>C уважением,

ГМ>Геннадий Майко.
Re[3]: Как загрузить свой драйвер для USB устройства
От: Геннадий Майко США  
Дата: 23.06.10 11:52
Оценка:
Здравствуйте, 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 Украина  
Дата: 23.06.10 12:33
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, 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 устройства
От: Геннадий Майко США  
Дата: 23.06.10 13:29
Оценка:
Здравствуйте, 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 устройства
От: _f_b_i_  
Дата: 23.06.10 13:47
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>3. Возможно, подойдет такой подход к решению вашей задачи: вместо универсального FDO попробовать написать low-level class filter драйвер. Его задача будет не пропускать URB запросы от локального драйвера и формировать URB запросы от удаленного компбютера.


Тогда вышележащий функциональный драйвер обломится послав очередной запрос вниз и не получив ответ от девайса через какое то время сделает какую либо гадость (вплане остановится или еще что то — в зависимости от того что предусмотрели разработчики) ну а дальше как карта ляжет.
Re[7]: Как загрузить свой драйвер для USB устройства
От: Геннадий Майко США  
Дата: 23.06.10 14:17
Оценка:
Здравствуйте, _f_b_i_,

ГМ>>3. Возможно, подойдет такой подход к решению вашей задачи: вместо универсального FDO попробовать написать low-level class filter драйвер. Его задача будет не пропускать URB запросы от локального драйвера и формировать URB запросы от удаленного компбютера.


___>Тогда вышележащий функциональный драйвер обломится послав очередной запрос вниз и не получив ответ от девайса через какое то время сделает какую либо гадость (вплане остановится или еще что то — в зависимости от того что предусмотрели разработчики) ну а дальше как карта ляжет.

--
Да, это возможно.
Имелось в виду только способ доставки URB для железки. Вполне возможно, потребуется еще upper-level class driver, который "отрежет" функциональный драйвер от user mode.

C уважением,
Геннадий Майко.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.