diff --git a/src/lib.rs b/src/lib.rs index 881c4d0..a4ab9cf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -142,9 +142,6 @@ pub type Error = io::Error; /// .find(|dev| dev.vendor_id() == 0xAAAA && dev.product_id() == 0xBBBB) /// .expect("device not connected"); /// ``` -/// -/// ### Platform-specific notes -/// * On Windows, hubs are not included in the list pub fn list_devices() -> Result, Error> { platform::list_devices() } diff --git a/src/platform/windows_winusb/enumeration.rs b/src/platform/windows_winusb/enumeration.rs index 0dfe6b8..e45b9f6 100644 --- a/src/platform/windows_winusb/enumeration.rs +++ b/src/platform/windows_winusb/enumeration.rs @@ -29,7 +29,9 @@ use super::{ pub fn list_devices() -> Result, Error> { let devs: Vec = cfgmgr32::list_interfaces(GUID_DEVINTERFACE_USB_DEVICE, None) + // get USB_HUB devices as well, like other platforms. ROOT_HUBs will be dropped by probe_device .iter() + .chain(cfgmgr32::list_interfaces(GUID_DEVINTERFACE_USB_HUB, None).iter()) .flat_map(|i| get_device_interface_property::(i, DEVPKEY_Device_InstanceId)) .flat_map(|d| DevInst::from_instance_id(&d)) .flat_map(probe_device) @@ -49,6 +51,10 @@ pub fn list_buses() -> Result, Error> { pub fn probe_device(devinst: DevInst) -> Option { let instance_id = devinst.get_property::(DEVPKEY_Device_InstanceId)?; + if instance_id.to_string_lossy().starts_with("USB\\ROOT_HUB") { + return None; + } + debug!("Probing device {instance_id:?}"); let parent_instance_id = devinst.get_property::(DEVPKEY_Device_Parent)?;