Ситуация избитая, в том числе на этом форуме. Но с необъяснимыми особенностями.
Две (или даже больше) 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)
Сломал моск. Жду совета. Кто-нибудь пользовался ведь этими функциями, натыкались на грабли?