Альтернативы идентификаторам устройств Windows 7 - PullRequest
0 голосов
/ 13 октября 2011

Как я могу определить, какие устройства принадлежат одному физическому устройству в более ранней версии 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.Критика приветствуется, так как я не уверен, насколько она действительно надежна, как мне кажется.

1 Ответ

1 голос
/ 14 октября 2011

Вы можете обнаружить эту связь, используя функцию CM_Get_Parent.

...