#ifdef Q_OS_WIN #include <windows.h> #include <setupapi.h> #include <cfgmgr32.h> #include <devguid.h> #pragma comment(lib, "setupapi.lib") QStringList getUsbPhysicalPaths() { QStringList usbPaths; HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE) return usbPaths; SP_DEVICE_INTERFACE_DATA devInterfaceData = {0}; devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); for (DWORD i = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_DISK, i, &devInterfaceData); i++) { DWORD requiredSize = 0; SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInterfaceData, NULL, 0, &requiredSize, NULL); PSP_DEVICE_INTERFACE_DETAIL_DATA_W pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA_W)malloc(requiredSize); pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W); SP_DEVINFO_DATA devInfoData = {0}; devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInterfaceData, pDetail, requiredSize, NULL, &devInfoData)) { // 获取设备实例路径 wchar_t instanceId[MAX_DEVICE_ID_LEN]; CM_Get_Device_IDW(devInfoData.DevInst, instanceId, MAX_DEVICE_ID_LEN, 0); QString path = QString::fromWCharArray(instanceId); if (path.contains("USBSTOR", Qt::CaseInsensitive)) { usbPaths.append(QString::fromWCharArray(pDetail->DevicePath)); } } free(pDetail); } SetupDiDestroyDeviceInfoList(hDevInfo); return usbPaths; } #endif