从用户应用程序安装winusb驱动程序

时间:2015-09-16 10:07:23

标签: windows usb driver winusb

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我完成了第一部分任务。

#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
}