2011-10-13 52 views
0

如何確定哪些devnodes屬於早期版本的Windows中的單個物理設備?替代Windows 7設備ContainterIDs

編輯:

我想這樣做是因爲實現事件系統,廣播,當設備被移除,否則可能需要該系統產生超過必要的事件類似的Xbox控制器取出事件的原因(它有3個接口和2個devnode)。除了可用於建立構成單個實體的部分之間的對應關係的ContainerID之外,我找不到任何其他內容。

我正在尋找一種替代方案,它可以讓我確定這種對應關係,並允許我的程序在老版本的Windows上運行。

ANOTHER編輯:

ContainerID屬性是不可靠的。我已經找到2個具有相同ContainerID的xbox 360控制器條目,但它們對應於不同的物理控制器。

我已經解決了這個問題,下面,這與提供的序列號設備(例如Xbox 360個的控制器)的作品,以及與那些不這樣做(如價格便宜,仿製PS3有線USB控制器):

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來獲取該屬性。產生的設備ID可以傳遞給CM_Locate_DevNode。批評是受歡迎的,因爲我不確定這是否像我認爲的那樣穩健。

回答

1

您可以使用CM_Get_Parent函數發現這種關係。

+0

適用於我測試過的大多數遊戲手柄和鍵盤。不幸的是,它只在插入時纔有效,而在xbox 360控制器等設備上失敗,因爲它們在註冊表中的排列方式不同。我注意到,對於提供序列號的設備也是如此,這些序列號似乎具有相同的密鑰組織。 – defube