Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Здравствуйте, 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-ами
Спасибо за помощь!