Getting Volume Name from Device Path in USB devices

Deadly 提交于 2021-02-07 10:47:13

问题


I've built a program using the Windows API that detects the insertion of some media (cd, usb...). The program returns the device path:

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

I am using the function GetVolumeNameForVolumeMountPoint to obtain the volume name by parsing the device interface path as reported here, but it seems that this feature is not working for USB devices.

Any idea of how to get the volume name from the device path in case of working with usb devices?


回答1:


//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
}


来源:https://stackoverflow.com/questions/32716081/getting-volume-name-from-device-path-in-usb-devices

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!