获取设备速度失败,错误码1
想写一个判断插入USB3.0接口的3.0U盘是不是正常抓取到了3.0功能的程序
请问需要怎么修改啊,还是用这个代码的逻辑是行不通的
在WINDOWS系统上运行的
#include <iostream>
#include <Windows.h>
#include <Setupapi.h>
#include <devguid.h>
#include <initguid.h>
#include <Usbiodef.h>
#include <usbspec.h>
#include <usbioctl.h>
#pragma comment(lib, "Setupapi.lib")
int main()
{
// 获取所有USB控制器的句柄
HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
std::cout << "获取USB控制器句柄失败" << std::endl;
return 1;
}
// 枚举所有USB控制器
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, i, &DeviceInterfaceData); i++)
{
// 获取设备接口的详细信息
DWORD RequiredSize = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
std::cout << "获取设备接口详细信息失败" << std::endl;
continue;
}
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(new BYTE[RequiredSize]);
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, pDeviceInterfaceDetailData, RequiredSize, NULL, NULL))
{
std::cout << "获取设备接口详细信息失败" << std::endl;
delete[] pDeviceInterfaceDetailData;
continue;
}
// 打开设备句柄
HANDLE hDevice = CreateFile(pDeviceInterfaceDetailData->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
std::cout << "打开设备句柄失败" << std::endl;
delete[] pDeviceInterfaceDetailData;
continue;
}
int ConnectionIndex = 0; // 定义ConnectionIndex变量并赋值为0
USB_NODE_CONNECTION_INFORMATION_EX NodeConnectionInfoEx = { 0 };
NodeConnectionInfoEx.ConnectionIndex = ConnectionIndex;
DWORD BytesReturned = 0;
if (!DeviceIoControl(hDevice, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &NodeConnectionInfoEx, sizeof(NodeConnectionInfoEx), &NodeConnectionInfoEx, sizeof(NodeConnectionInfoEx), &BytesReturned, NULL)) {
DWORD error = GetLastError();
if (error == ERROR_INVALID_USER_BUFFER) {
std::cout << "获取设备速度失败:缓冲区长度不足" << std::endl;
}
else {
std::cout << "获取设备速度失败:错误码 " << error << std::endl;
}
CloseHandle(hDevice);
delete[] pDeviceInterfaceDetailData;
continue;
}
// 判断设备速度是否是USB 3.0
if (NodeConnectionInfoEx.Speed == UsbSuperSpeed)
{
std::cout << "3.0 U盘插入3.0 USB接口上" << std::endl;
}
else
{
std::cout << "3.0 U盘插入2.0 USB接口上" << std::endl;
}
// 关闭设备句柄
CloseHandle(hDevice);
delete[] pDeviceInterfaceDetailData;
}
// 释放资源
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}