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

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

Сделал драйвер для PCI карты. Для простоты работы использовал символическую ссылку, типа xxx. Так как использовал Numega Driver Studio, то он в тестовую программу сам добавил имя устройства как \\\\.\\xxx0.
Я по наивности своей обрадовался и решил, что следующая карта встанет как xxx1 и так далее. А на деле фиг.Драйвер устанавливается нормально, видит оба устройства, но открыть можеть только "нулевое". Собственно вопрос: а как теперь до второго то добраться?
Записан
maaaaaad
Гость
« Ответ #1 : 30-12-2003 12:34 » 

Хм....вы же сами создаете сим-линки к драйву. Хм...врорая копия как работала??? Посмотрите код эраунд IoCreateDevice. Сделайте луп на IoCreateSymbolicLink - если указанная xxxZ сим-линка уже есть (!NT_SUCCES).
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 30-12-2003 14:53 » 

Цитата

Сделал драйвер для PCI карты.


Если это система старше Win2k то надо сделать нормальный WDM драйвер, для каждого твоего устройства будет вызвана ф-ция AddDevice в которую передадут PDO от шинного драйвера, а ты к нему прицепишь свой FDO и обзовешь его как хочешь. По логике NuMega именно такой скелет должна собрать, но я не знаю точно- я ее не использую. Проверяй свою функцияю AddDevice, находящуюся в PDRIVER_OBJECT->DriverExtension->AddDevice.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 30-12-2003 14:59 » 

Вот еще, уже четвертый раз это постю-

Последовательность загрузки всех драйверов(начиная с Win2k) такая:
1) Загружают драйвер системной шины. Например PCI.
2) Вызывают DriverEntry а затем AddDevice для драйвера системной шины. В AddDevice создается FDO для драйвера системной шины. Потом посылают IRP_MN_START_DEVICE на созданный FDO.
3) Драйвер шины нумерует устройства на шине. Создает для них PDO.
4) Драйверу системной шины посылают IRP_MN_QUERY_DEVICE_RELATIONS, в ответ на который он возвращает массив созданных им PDO для устройств на шине.
5) На эти PDO посылают запрос IRP_MN_QUERY_ID, в ответ на которые драйвер системной шины сообщает ID этих устройств.
6) Получив эти ID система пытается найти и загрузить драйвера устройств.
7) Найдя драйвер для устройства, система отображает его в память вызывает его DriverEntry, потом AddDevice, в этом AddDevice создается FDO для устройства. Если устройств управляемых этим драйвером несколько то AddDevice будет вызвана для каждого устройства. Также смотрят реестр на предмет наличия фильтров для девайса. Device Manager посылает на FDO запрос IRP_MN_START_DEVICE.
8 ) Потом посылают на FDO запрос IRP_MN_QUERY_DEVICE_RELATIONS. Если устройство само является шиной или держит на себе другие устройства, которыми само не управляет, то для устройств на нем повторяется вся последовательность действий, начиная с пункта 5.
Записан
Anonymous
Гость
« Ответ #4 : 05-01-2004 08:33 » 

SlavaI,
Все так и происходит, проблема на самом деле заключается в том, что AddDevice использует имя и счетчик устройств, который сбрасывается только в DriverEntry. И в случае если драйвер был просто обновлен (без перезагрузки) этот счетчик так и будет расти. Это как-то можно обойти? Ну там запростить действительные имена устройства или опеределить момент когда можно сбосить счетчик, кроме как в DriverEntry?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 12-01-2004 05:59 » 

Цитата

 в случае если драйвер был просто обновлен (без перезагрузки)


Что значить обновить? Выгрузить драйвер и снова загрузить-при этом должны быть выгружены все страницы драйвера из памяти, счетчик должен сбросится, так как повторная загрузка отобразит по новой все страницы. Может ты как-то по другому понимаешь слово обновить?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines