не совсем понял вам надо в API получить или все таки в ядре?
Всё это нужно для однозначной идентификации среди одинаковых PCIe плат (т. е. получить нужно и там и там).
Проблема в том, что в user mode возвращается длинная строка, что-то вроде:
PCI\VEN_xxxx&DEV_xxxx&SUBSYS_0000xxxx&REV_00\4&25438C51&0&0008
, т. е. в точности то же, что и в диспетчере устройств.
В драйвере в ответ на запрос IRP_MN_QUERY_ID с:
stack->Parameters.QueryId.IdType = BusQueryInstanceID;
мне возвращается только хвост: "0008".
А хотелось бы целиком всю строку: "4&25438C51&0&0008", которая судя по документации Microsoft однозначно идентифицирует одну плату (из всех одинаковых).
Или хотя бы уверенность, что возвращаемого хвоста достаточно для такой идентификации.
Из документаций Microsoft
https://docs.microsoft.com/en-us/windows-hardware/drivers/install/device-instance-idshttps://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/irp-mn-query-idи т. п. не совсем понятно, что в моём примере является "instance ID".
вот тут человек втыкал две клавиатуры, и вроде как пишет что в одном порту их винда ID не различала, а в разных - давала разный ID.
Целиком вся эта строка (с VEN ID и DEV ID), насколько я понял, называется "Device Instance ID" и однозначно определяет устройство в системе.
Первая её половина называется "device-ID".
Вторая (после последнего слеша) называется то ли "instance ID" то ли хрен знает как, нося при этом гордый статус "opaque", т. е. её нельзя пытаться парсить.
а этот ID не сам драйвер устройства формирует в ответ на IRP_MN_QUERY_ID?
Судя по второй ссылке этот запрос должен обрабатывать драйвер шины.
----------
Замечено, что подобные строки ("4&25438C51&0&0008") располагаются в реестре в разделе оборудования (экземпляра)
(HKLM\SYSTEM\CurrentControlSet\Enum)
, и похоже что являются названиями подразделов конкретных устройств.
Но, драйверу чуть ли не запрещено рыскать по реестру в поисках подобных имён.
----------
Моя же конкретная задача (раз уж речь пошла про реестр), возможно, решается проще без всяких ID.
Драйвер сам формирует уникальный номер платы и записывает его в разделе оборудования (экземпляра) реестра.
Приложение при перечислении устройств (функционал SetupApi) будет читать этот раздел и сравнивать считанный номер с нужным.
Возможно придётся так делать, если с этими ID всё так запутано...