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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить номер слота PCI?  (Прочитано 9791 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ra_
Гость
« : 07-05-2008 04:54 » 

Ситуация избитая, в том числе на этом форуме. Но с необъяснимыми особенностями.
Две (или даже больше) PCI-карты на одном драйвере. Нужно создавать симлинки с разными именами.
Имена я решил давать как \\.\somename_SlotNum, где SlotNum - номер слота PCI.

Предваряя отсылки к этому форуму:
Сначала я сделал \\.\somename_Num, где Num - увеличивающееся число (вроде InstanceCount), которое обнуляется в DriverEntry и инкрементируется в AddDevice. Оно работает, но есть две недопустимые особенности:
  • с первого взгляда нельзя определить, который из симлинков соответствует какому девайсу. Кто раньше встал - того тапки. Видимо, нельзя полагаться на то, что раньше вставать будет одно и то же.
  • (главное) драйвер выгружается только после останова всех устройств. Таким образом, когда я делаю в "диспетчере устройств" остановку/запуск, остановку/запуск ... одного из девайсов, драйвер живёт, InstanceCount растёт, и одному Богу известно, какие у устройств симлинки. Например, somename10 и somename25...

Поэтому хочу сделать чёткую привязку симлинка к номеру слота.
Да, я читал http://support.microsoft.com/kb/253232, я даже читал http://www.techtalkz.com/microsoft-device-drivers/269080-xp-pci-slot-number-identification.html. Даже научился вычитывать регистры PCI configuration, но в них номера слота не оказалось.

Фишка в том, что подход, описанный по первым двум ссылкам - IoGetDeviceProperty(dev, DevicePropertyLocationInformation/DevicePropertyUINumber/DevicePropertyAddress) не даёт мне ожидаемого. Возвращаемое значение, во-первых, смотрится бессмысленным (0x80D0F810, 0x1800003, 0xA80004), во-вторых, ОДИНАКОВО для обеих карточек.

В "диспетчере устройств", само собой, карточки имеют разные положения:
  • PCI гнездо 3 (PCI шина 0, устройство 16, функция 0)
  • PCI гнездо 5 (PCI шина 0, устройство 18, функция 0)

Сломал моск. Жду совета. Кто-нибудь пользовался ведь этими функциями, натыкались на грабли?
Записан
ra_
Гость
« Ответ #1 : 07-05-2008 06:13 » 

Цитата
IoGetDeviceProperty ... Возвращаемое значение, во-первых, смотрится бессмысленным (0x80D0F810, 0x1800003, 0xA80004), во-вторых, ОДИНАКОВО для обеих карточек.

Докопался чуть поглубже. Значение мне не возвращается, функция возвращает нулевой ResultLength и ошибку STATUS_INVALID_DEVICE_REQUEST.

Но это тоже странно. Сую ему первым аргументом deviceObject, успешно полученный от IoCreateDevice. Пытался даже указывать полученный из него через IoGetAttachedDeviceReference, но это не изменило ситуации.
Записан
ra_
Гость
« Ответ #2 : 07-05-2008 07:25 » 

Насчёт вызова функции разобрался - сам дурак.
Надо было первым параметром в функцию IoGetDeviceProperty давать PDO, которое вторым параметром в AddDevice передаётся.

Получил Bus Number, Device Number, Function Number.

Но вопрос остался открытым: полученное - это ведь не номер слота, а device number (16 и 18 в нашем случае). А виндовый "диспетчер устройств" номер слота показывает.
Пусть, возможно, он показывает, зная конкретную материнку, чипсет и то, как физические слоты в нём подключены. Но я тоже хочу это знать! Как теперь спросить его собственно слот по номеру функции?
Записан
ra_
Гость
« Ответ #3 : 08-05-2008 06:28 » 

Вопрос решён!
Несмотря на многие пессимистические утверждения по многим форумам.

status= IoGetDeviceProperty(PDO,
   DevicePropertyUINumber,   // даёт номер слота PCI!!!!      
...);

Конечно, насколько я понимаю, возвращаемое значение опирается на знание виндой конкретного чипсета и сопоставление номера слота номеру девайса PCI (которые в нашем примере 16 и 18).

Спасибо всем за...
За чтение топика.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 08-05-2008 06:30 » 

ra_, заходи еще Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-05-2008 06:53 » 

ra_, ты супер!
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 08-05-2008 07:40 » 

О! молодца!
так держать!
у меня те же грабли были, но у меня драйвера не выгружаются, а винда при каждом старте драйвера последовательно инициализирует... а поскольку PCI не PNP - особых проблем не было. правда все равно сопоставить с номером слота не очень получалось - кто его знает кто первый кто второй стоит...
но на будущее - буду иметь в виду)

PS полез в свой драйвер добавлять))))
PPS так я узнал что у меня в машине есть 6-й и 7-й слоты PCI....
правда видимы только четыре. пользователь будет рад когда попытается сосчитать до семи...)
« Последнее редактирование: 08-05-2008 09:15 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines