Как я могу определить, какие устройства принадлежат одному физическому устройству в более ранней версии Windows?
РЕДАКТИРОВАТЬ:
Причина, по которой я хотел бы сделать это, заключается в том, что реализация системы событий, котораяшироковещательные события удаления при удалении устройства в противном случае потребовали бы, чтобы указанная система генерировала больше событий, чем необходимо для чего-то вроде контроллера xbox (который имеет 3 интерфейса и 2 узла).Я не могу найти ничего, кроме ContainerID, который я мог бы использовать для установления соответствия между частями того, что составляет единую сущность.
Я ищу альтернативу, которая позволила бы мне определить такую корреспонденцию и позволить моемупрограмма для запуска и на старых версиях Windows.
ДРУГОЕ РЕДАКТИРОВАНИЕ:
Свойство ContainerID ненадежно.Я нашел 2 записи для контроллеров xbox 360 с одинаковым ContainerID, но они соответствуют разным физическим контроллерам.
Я решил эту проблему с помощью следующего, который работает с устройствами, которые предоставляют серийный номер (например, xbox).Контроллеры 360), а также с теми, которые не (например, дешевые, поддельные контроллеры USB для PS3):
Algorithm:
Find a matching HID device ID for a given USB device ID
input: usb_device_id as a string (e.g. "USB\VID_045E&PID_028E\00E102A")
output: The corresponding HID device ID string
HKEY usb_keys <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB")
HKEY hid_keys <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID")
HKEY device_key <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\"+usb_device_id)
string prefix <- device_key.ParentIdPrefix
retry
for each key in usb_keys
for each subkey in key
if prefix occurrs in subkey.name
prefix <- subkey.ParentIdPrefix
goto retry
endif
endfor
endfor
for each key in hid_keys
for each subkey in key
if prefix occurrs in subkey.name
return "HID\"+key.name+"\"+subkey.name
endif
endfor
endfor
return null
Я написал это в псевдокоде для краткости, потому что версия C ++ довольно длинная (хотя этоиспользует только один цикл вместо двух и не требует перехода).Обратите внимание, что key.name
относится к имени ключа, а subkey.ParentIdPrefix
означает использование RegGetValue
для получения этого свойства.Полученный идентификатор устройства можно передать на CM_Locate_DevNode
.Критика приветствуется, так как я не уверен, насколько она действительно надежна, как мне кажется.