стоп)
то что у них ID одинаковый- совершенно без разницы. платы различаются драйвером шины PCI по их месторасположению.
еще раз:
драйвер шины создает экземпляр DriverObject1 для вашего зарегестрированного драйвера и, вызывает DriverEntry для первой платы. где вы регистрите свой AddDevice.
Потом драйвер создает PhysicalDeviceObject1 (для первой платы) и вызывает ваш AddDevice.
в AddDevice вы при помощи IoCreateDevice создаете Объект-устройство N1(DeviceObject1) c симолическим именем ntName1.
и т.д.
потом драйвер шины создает второй объект PhysicalDeviceObject2 (для второй платы)
и опять вызывает AddDevice (уже для PhysicalDeviceObject2)
а вы по прежнему пытаетесь IoCreateDevice создать Объект N2(DeviceObject2) с ТЕМ же именем ntName1.
это неправильно. два различных объекта не могут иметь одно имя.
это вопервых.
во вторых RTL_CONSTANT_STRING - макрос.
функции будут такими:
#define PCI_DEVICE_NAME L"\\Device\\MyDev_01" //имя физического устройства (device)
...
UNICODE_STRING uniNtDeviceName;
RtlInitUnicodeString(&uniNtDeviceName,PCI_DEVICE_NAME);
итого: для первого устройства вы должны задать имя например "\\Device\\MyDev_01".
для второго - уже MyDev_02 и т.д. для 3,4,5 и сколько плат воткнете.
так же необходимо поступать в случае если вы используете символические ссылки на объекты (IoCreateSymbolicLink) из ветки "\\DosDevices\\имя символической ссылки"
и наконец меня то интересовал как раз подход - которым вы формируете различные имена (как показывал выше) с добавлением номера платы.
а именно - преобразования из InstanceCount счетчика в строковую переменную.
типа
wsprintf(TextBuff, "\\Device\\MyDev_%.2lu", InstanceCount ) -
??
потом наверное RtlInitAnsiString
потом возможно RtlAnsiStringToUnicodeString....
вот это меня и интересовало)