【问题标题】:Install winusb driver from user application从用户应用程序安装 winusb 驱动程序
【发布时间】:2015-09-16 10:07:23
【问题描述】:

请任何人都可以直接给我实现 Windows 的下一个功能。

我有连接到 PC 的 USB 设备(它是 JTAG 编程器。)我知道这个硬件的 VID 和 PID。我需要:

1 检查此硬件使用什么类型的驱动程序(检测winusb驱动程序就足够了。也许我需要读取注册表?)

2 如果驱动程序不是 winusb,我需要从我的应用程序中为此 USB 设备安装 winusb 驱动程序。

【问题讨论】:

    标签: windows usb driver winusb


    【解决方案1】:
    1. 分配给设备的当前驱动程序存储在注册表中,因此您可以直接从那里读取它。但是,最好使用 Microsoft 提供的 API SetupAPI。要调用的函数是SetupDiGetDeviceRegistryProperty,第三个参数应该是SPDRP_SERVICE。这会将驱动程序的名称作为字符串返回。请注意,在获得调用 SetupDiGetDeviceRegistryProperty 所需的所有信息之前,您需要调用其他几个 SetupAPI 函数。

    2. 我没有尝试过,但是libwdi 具有将 WinUSB 安装到设备节点上的功能。它可能还具有获取当前驱动程序的功能,因此您应该在花太多时间学习 SetupAPI 之前尝试使用它。 Microsoft 的 devcon 实用程序(现已开源)可能是另一种选择。

    3. 在不知道你在做什么的细节的情况下,我怀疑你是否真的需要这样做。向用户提供签名的驱动程序包并指示他们使用设备管理器中的“更新驱动程序软件...”选项将其应用到特定设备可能更简单。

    【讨论】:

    • 谢谢你的回答。我做了第一部分并添加了代码示例“不知道你在做什么的细节,我怀疑你是否真的需要这样做”现在我知道具有所需 VID PID 的设备连接到系统并且不使用 winusb.sys 我需要为此设备安装winusb.sys
    【解决方案2】:

    我完成了任务的第一部分。

    #ifdef Q_OS_WIN
    DEFINE_GUID(GUID_DEVCLASS_WINUSB,0x88BAE032,0x5A81,0x49f0,
            0xBC,0x3D,0xA4,0xFF,0x13,0x82,0x16,0xD6);
    #endif
    
    bool WinUSB::isWinUsbDriver(quint16 vid, quint16 pid)
    {
    #ifndef Q_OS_WIN
    Q_UNUSED(vid);
    Q_UNUSED(pid);
    return true;
    #else
    HDEVINFO deviceInfoSet;
    GUID *guidDev = (GUID*) &GUID_DEVCLASS_WINUSB;
    deviceInfoSet = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT |    DIGCF_PROFILE);
    DWORD buffersize =4000;
    TCHAR buffer [buffersize];
    int memberIndex = 0;
    bool retval = false;
    QString vidPid;
    
    vidPid =  "VID_" + QString("%1").arg(vid,4,16,QChar('0')) + "&";
    vidPid += "PID_" + QString("%1").arg(pid,4,16,QChar('0'));
    
    while (true)
    {
        SP_DEVINFO_DATA deviceInfoData;
        ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA));
        deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        if (SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex, &deviceInfoData) == FALSE) {
            if (GetLastError() == ERROR_NO_MORE_ITEMS) {
                break;
            }
        }
    
        DWORD nSize=0 ;
        SetupDiGetDeviceInstanceId (deviceInfoSet, &deviceInfoData, buffer, sizeof(buffer), &nSize);
        buffer [nSize] ='\0';
    
        QString str = QString::fromWCharArray(buffer);
    
        if (str.indexOf(vidPid) >= 0) {
            retval = true;
            break;
        }
    
            memberIndex++;
    }
    
    if (deviceInfoSet) {
        SetupDiDestroyDeviceInfoList(deviceInfoSet);
    }
    
    return retval;
    #endif
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多