请任何人都可以直接为我实现Windows的下一个功能 .
我有USB设备连接到PC(它是JTAG程序员 . )我知道这个硬件的VID和PID . 我需要:
1检查此硬件使用的驱动程序类型(检测winusb驱动程序是否足够 . 也许我需要读取注册表?)
2如果驱动程序不是winusb,我需要从我的应用程序为此USB设备安装winusb驱动程序 .
分配给设备的当前驱动程序存储在注册表中,因此您可以直接从那里读取它 . 但是,使用由Microsoft提供的API SetupAPI可能更好 . 要调用的函数是SetupDiGetDeviceRegistryProperty,第三个参数应该是 SPDRP_SERVICE . 这将以字符串形式返回驱动程序的名称 . 请注意,在获得调用SetupDiGetDeviceRegistryProperty所需的所有信息之前,您需要调用其他几个SetupAPI函数 .
SPDRP_SERVICE
我没有尝试过,但libwdi具有将WinUSB安装到设备节点上的功能 . 它也可能具有获取当前驱动程序的功能,因此您应该在花费太多时间学习SetupAPI之前尝试使用它 . Microsoft的devcon实用程序(现在是开源的)可能是另一种选择 .
在不知道你在做什么的细节的情况下,我怀疑你是否真的需要这样做 . 向用户提供已签名的驱动程序包并指示他们使用“设备管理器”中的“更新驱动程序软件...”选项将其应用于特定设备可能更为简单 .
我做了第一部分任务 .
#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 }
2 回答
分配给设备的当前驱动程序存储在注册表中,因此您可以直接从那里读取它 . 但是,使用由Microsoft提供的API SetupAPI可能更好 . 要调用的函数是SetupDiGetDeviceRegistryProperty,第三个参数应该是
SPDRP_SERVICE
. 这将以字符串形式返回驱动程序的名称 . 请注意,在获得调用SetupDiGetDeviceRegistryProperty所需的所有信息之前,您需要调用其他几个SetupAPI函数 .我没有尝试过,但libwdi具有将WinUSB安装到设备节点上的功能 . 它也可能具有获取当前驱动程序的功能,因此您应该在花费太多时间学习SetupAPI之前尝试使用它 . Microsoft的devcon实用程序(现在是开源的)可能是另一种选择 .
在不知道你在做什么的细节的情况下,我怀疑你是否真的需要这样做 . 向用户提供已签名的驱动程序包并指示他们使用“设备管理器”中的“更新驱动程序软件...”选项将其应用于特定设备可能更为简单 .
我做了第一部分任务 .