从USB设备的设备路径获取卷名

时间:2015-09-22 11:49:03

标签: c++ windows usb media insertion

我使用Windows API构建了一个程序,可以检测某些媒体的插入(cd,usb ...)。程序返回设备路径:

\\\\?\\usb#vid_vvvv&pid_pppp#aaaaaaaaaaaaaaaa#{gggggggg-gggg-gggg-gggg-gggggggggggg}

我使用函数GetVolumeNameForVolumeMountPoint通过解析设备接口路径here来获取卷名,但似乎此功能对USB设备不起作用。

如果使用USB设备,如何从设备路径获取卷名?

1 个答案:

答案 0 :(得分:3)

//First get GUID
`guid = GUID_DEVINTERFACE_VOLUME`
//and get handle for Device information.

`hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL,DIGCF_DEVICEINTERFACE|DIGCF_PRESENT); // Get device Information handle for Volume interface `

//After that loop through SetupDiEnumDeviceInterfaces() and you will get the usb drive storage volume path

    for(dwIndex = 0; ;dwIndex ++) // Loop until device interfaces are found.
    { 
        ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
        devInterfaceData.cbSize = sizeof(devInterfaceData);

        if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid,dwIndex,&devInterfaceData))// Get device Interface data.
        {
            break;
        }
        ZeroMemory(&devInfoData, sizeof(devInfoData));
        devInfoData.cbSize = sizeof(devInfoData);

        pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
        pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);



        SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,pDevDetail,BUFFER_SIZE,&dwRequiredSize,&devInfoData); // SP_DEVINFO_DATA

        CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0); // Get the device instance of parent. This points to USBSTOR.
        CM_Get_Device_ID(devInstParent, buf, BUFFER_SIZE,0);

nLength = strlen(pDevDetail->DevicePath);
            pDevDetail->DevicePath[nLength] = '\\';
            pDevDetail->DevicePath[nLength+1] = 0;  

if(GetVolumeNameForVolumeMountPoint(pDevDetail->DevicePath, volume,BUFFER_SIZE))
            {   
//Here you will get the volume corresponding to the usb
}