从 USB 设备中的设备路径获取卷名
Getting Volume Name from Device Path in USB devices
我已经使用 Windows API 构建了一个程序来检测某些媒体(cd、usb...)的插入。程序returns设备路径:
\\?\usb#vid_vvvv&pid_pppp#aaaaaaaaaaaaaaaa#{gggggggg-gggg-gggg-gggg-gggggggggggg}
我正在使用函数 GetVolumeNameForVolumeMountPoint
通过解析报告的设备接口路径来获取卷名称 here,但似乎此功能不适用于 USB 设备。
知道在使用 USB 设备时如何从设备路径获取卷名吗?
//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
}
我已经使用 Windows API 构建了一个程序来检测某些媒体(cd、usb...)的插入。程序returns设备路径:
\\?\usb#vid_vvvv&pid_pppp#aaaaaaaaaaaaaaaa#{gggggggg-gggg-gggg-gggg-gggggggggggg}
我正在使用函数 GetVolumeNameForVolumeMountPoint
通过解析报告的设备接口路径来获取卷名称 here,但似乎此功能不适用于 USB 设备。
知道在使用 USB 设备时如何从设备路径获取卷名吗?
//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
}