Search code examples
javawindowspowershellusb-driveusb4java

Get drive letters of USB 3.0 devices (Java under Windows)


My Java program needs to get a list of the drive letters of connected USB devices, but only those that support USB 3.0 (both the device and the USB port it is plugged into, so that it works with high speed).

Currently I try to use WMI through a PowerShell command my Java programm executes.

I already found this: Powershell: Grab USB Drive letter. But it would also list USB 2.0 devices.

Regarding version detection I found this: How to check the version of the available USB ports? - The PowerShell command I tried is Get-WmiObject Win32_USBHub. This brings up several problems. First: It lists far more stuff than only USB drives (I think also all the USB hubs of my PC). Second: Even though there is a field USBVersion for all items in the list it is always empty.

Update

The essence of my research over the last days is, that there are 2 realms of information I need to connect.

  • Drives / Logical Drives
    • Drive Letter
    • BusType (is equal to "USB" for my matter)
  • USB devices
    • Vendor ID and Product ID (VID&PID)
    • bcdUSB (value within the usb device descriptor, indicating USB Version)

For a given drive letter I need to find the bcdUSB value. But I haven't found a way to get the drive corresponding to a USB device.

What I tried so far

WMI over PowerShell

Relevant commands I found are

Get-Disk               // Get BusType
gwmi Win32_LogicalDisk // Get drive letter
// Those make the connection between disk and logical disk
gwmi Win32_LogicalDiskToPartition
gwmi Win32_LogicalDiskToPartition

Even though I get the BusType I couldn't make a connection to bcdUSB

usb4java (Link)

I only get information from the USB device realm here. I can load devices and see ther VID&PID and the bcdUSB value, but no way to map this to drives and drive letters.

lsusb via Cygwin

According to this post the linux command is easier to handle than WMI. So I tried to use it under Windows. But I like usb4java I only got VID&PID + bcdUSB, not the mount point (drive letter).

Searching the Windows Registry

I did a few string searchs in the Windows registry. No success.

Reading Windows Event log

I thought about ovserving Windows events to detect what Drive and what USB device connect at the same time. I didn't even find events when plugging in a USB stick.


Solution

  • Maybe this is what you are looking for: Find Windows Drive Letter of a removable disk from USB VID/PID At least someone marked the answer as working... :-)