views:

187

answers:

2

Dear all,

I am using win32 api with C++.

I would like to know how I can get the volume GUID using a "device path".

My device looks like this:

\\?\usb#vid_04f2&pid_0111#5&39fe81e&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

Thanks.

A: 

Have you considered querying the WMI for it? Let me know if you need details on how to do that.

utnapistim
Thanks for the reply.i do with win32api way
barbgal
+2  A: 

This will be the device with device instance ID usb\VID_04f2&PID_0111\5&39fe81e&0&2. That's probably a mass storage device aka disk. Now, the problem you have is that a mass storage device doesn't actually have a drive letter; it's the volume on that disk which has a drive letter. If there are two partitions, a single USB mass storage device may have two drive letters. So, there's no direct function to get the volume.

It looks like you need to enumerate the device tree rooted at usb\VID_04f2&PID_0111\5&39fe81e&0&2 to find children with device type "volume". The DEV_BROADCAST_DEVICEINTERFACE you get will have a dbcc_name field that you can pass to GetVolumeNameForVolumeMountPoint().

MSalters
@MSalters Is there a way to use `GetVolumeNameForVolumeMountPoint` if the device is not mounted (e.g. if Windows runs out of drive letters)?
Judge Maygarden
@ Judge Maygarden: I think you've got a mistaken asumption here. "Mounting" on Windows does not require a drive letter. The "Mount Point" used here (`dbcc_name`) certainly isn't a drive letter.
MSalters