Re: Перевести драйвер на WDM с IoRegisterDeviceInterface
От: straightener Россия  
Дата: 16.08.05 09:52
Оценка:
Здравствуйте, Alexiski, Вы писали:

A>Есть legacy драйвер, ни к какому железу не привязанный. Соответственно, устанавливается и стартует через SCManager, после чего прямо в DriverEntry создается FDO и SymbolicLink к нему. Все работает.


A>Возникла необходимость перехода на WDM с использованием интерфейса. Выползли проблемы:


A>1) При попытке выполнить IoRegisterDeviceInterface прямо на FDO — недопустимая операция с устройством (правильно, так и должно быть, судя по раскопкам этот путь в корне неверный, привожу только для полноты картины)

При регистрации интерфейса в девноде проверяется флаг DNF_LEGACY_RESOURCE_DEVICENODE (или DNF_LEGACY_DRIVER, точно не помню, но это не важно), следовательно для legacy-драйвера интерфейс зарегистрировать нельзя.
A>2) При попытке найти какой-нибудь левый PDO и подключиться к нему — та же картина. Вопрос: Можно ли найти и использовать левый PDO ?
Этот как же Вы ищете "левый" PDO, расскажите пожалуйста? Но даже если на секунду предположить, что использовался чужой PDO, то следует учесть, что "имя" интерфейса и симлинк содержат компоненты InstancePath (лежит в девноде, указатель на которую есть в PDO) и результат может Вас сильно озадачить Следовательно, забыть эту ересь! (Хотя в системе иногда существуют неиспользуемые более PDO, но это скорее баг, а не фича и использование ее — это путь самурая Неуловимого Джо (т.е. сложно и совершенно не нужно)
A>3) При попытке сделать как положено, т. е. вынести создание устройства в AddDevice — AddDevice не вызывается, драйвер не запускается с сообщением "все устройства, связанные с данной службой остановлены". Вопрос: Как заставить вызываться AddDevice ?
Вам нужно превратить свой legacy драйвер в root-enumerated, тогда pnp менеджер "примет его за своего" и любезно создаст PDO, который будет только Ваш и больше ничей, и AddDevice начнет вызываться со страшной силой Пример такого драйвера — busenum от тостера, он root-enumerated, правда сам является енумератором, т.е. содержит много лишнего для Вас кода, но я думаю Вы справитесь с его анализом. Особое внимание уделите его установке и структуре инфа, я уверен на 90%, что Ваши сложности из-за неправильной установки.
Последнее дополнение: поскольку ваш девайс становится плагнплэйным не забудьте реализовать поддержку хотя-бы IRP_MJ_PNP.

A>PS. Можно ли обойти указанные проблемы, если устанавливать драйвер через inf ?

Да, но не в том смысле, который Вы подразумеваете.
A> Там, вроде, можно прописать интерфейсы сразу. Но избавит ли это от вызова IoRegisterDeviceInterface ?
Видимо избавит (ни разу не регистрировал интерфейсы из инфа), но IoSetDeviceInterfaceState (симлинк создается в результате этого вызова) за вас никто делать не будет.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.