Search code examples
c++usblibusb

How to get information on the drive where the executable is located in c++


My app will be running from a USB key which have specific information like vendor-id, device-id, ... which I need.

I tried using libusb, but despite the fact that I still can't make it work properly, how could I find the right usb drive to get information from?

Note that I would like the code to be cross-platform, that's why I firstly choose libusb.

Edit :

I have found a program (usbviewer) that enumerates all usb ports and the specific informations on the drive when it's connected.

I have read the sources for linux, infos are directly extracted from /proc/bus/usb/devices, it's quite straightforward.

But on windows, to get usb node connection information, it takes about 1000 lines before you get the actual information in a data structure (enumerate hub controllers, root hubs, ports...).

libusb on the otherside force me to generate an INF file and install a driver via inf-wizard.exe for each device before I can reach the information (didn't try on linux though).

Edit 2 :

I have found a way to get the device serial number with Windows, Linux and Mac OS X (didn't try MAC OS X but it should work just as Linux). For Windows, I use the function GetVolumeInformation(), on Linux, to read the serial number of drives with a FAT filesystem, I read 4 bytes in the corresponding /dev/* file starting from 0x27 or 0x43 depending on the FAT version.

But this reading requieres a root access which the program won't have, and it seems to me a little bit unreliable.

Any ideas ?


Solution

  • I have found the solution that fits me, for thoses who are insterested.

    For Windows :

    I extract the serial number of the device from the registry knowing the drive letter : HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevices\X:

    For Unix :

    I get the /dev file with the df command, then I read the link in /sys/block corresponding to the /dev file (e.g : The drive is /dev/sdb, I read link of /sys/block/sdb. Then I read the file serial which is located in the directory pointed by the link, 6x directory backwards.

    Hope it helps.