获取 USB_BANDWIDTH_INFO 结构的问题

问题描述

我正在用 C++ 编写一个 Windows 应用程序,从外部 USB 摄像头读取图像并显示它们(效果很好)。我喜欢同时监控使用的 USB 带宽。我知道存在一个 USB_BANDWIDTH_INFO 结构(https://docs.microsoft.com/en-us/windows/win32/api/usbuser/ns-usbuser-usb_bandwidth_info),但我不知道如何使用它。更准确地说:结构本身很清楚,但我如何获取/阅读它(没有找到任何示例代码来解释)?

解决方法

根据MSDN

USB_BANDWIDTH_INFO 结构与 IOCTL_USB_USER_REQUEST I/O 控制请求一起使用,以检索有关分配带宽的信息。

因此您需要使用 IOCTL_USB_USER_REQUEST 调用 DeviceIoControl。

参考official example,可以发现:

GetHostControllerInfo(
    HANDLE hHCDev,PUSBHOSTCONTROLLERINFO hcInfo)
{
    USBUSER_CONTROLLER_INFO_0 UsbControllerInfo;
    DWORD                      dwError = 0;
    DWORD                      dwBytes = 0;
    BOOL                       bSuccess = FALSE;

    memset(&UsbControllerInfo,sizeof(UsbControllerInfo));

    // set the header and request sizes
    UsbControllerInfo.Header.UsbUserRequest = USBUSER_GET_CONTROLLER_INFO_0;
    UsbControllerInfo.Header.RequestBufferLength = sizeof(UsbControllerInfo);

    //
    // Query for the USB_CONTROLLER_INFO_0 structure
    //
    bSuccess = DeviceIoControl(hHCDev,IOCTL_USB_USER_REQUEST,&UsbControllerInfo,sizeof(UsbControllerInfo),&dwBytes,NULL);

    if (!bSuccess)
    {
        dwError = GetLastError();
        OOPS();
    }
    else
    {
        hcInfo->ControllerInfo = (PUSB_CONTROLLER_INFO_0) ALLOC(sizeof(USB_CONTROLLER_INFO_0));
        if(NULL == hcInfo->ControllerInfo)
        {
            dwError = GetLastError();
            OOPS();
        }
        else
        {
            // copy the data into our USB Host Controller's info structure
            memcpy(hcInfo->ControllerInfo,&UsbControllerInfo.Info0,sizeof(USB_CONTROLLER_INFO_0));
        }
    }
    return dwError;
}

您可以像这样修改它:

USBUSER_CONTROLLER_INFO_0 UsbControllerInfo;
UsbControllerInfo.Header.UsbUserRequest = USBUSER_GET_BANDWIDTH_INFORMATION;
UsbControllerInfo.Header.RequestBufferLength = sizeof(UsbControllerInfo);
USB_BANDWIDTH_INFO UsbBandInfo{};
DWORD                      dwError = 0;
DWORD                      dwBytes = 0;
BOOL                       bSuccess = FALSE;
    
bSuccess = DeviceIoControl(hHCDev,&UsbBandInfo,sizeof(USB_BANDWIDTH_INFO),NULL);