簡體   English   中英

從用戶應用程序安裝winusb驅動程序

[英]Install winusb driver from user application

請任何人直接給我實現Windows的下一個功能。

我有連接到PC的USB設備(它是JTAG編程器。)我知道此硬件的VID和PID。 我需要:

1檢查此硬件使用哪種類型的驅動程序(檢測winusb驅動程序就足夠了。也許我需要閱讀注冊表?)

2如果驅動程序不是winusb,則需要從我的應用程序為此USB設備安裝winusb驅動程序。

  1. 分配給設備的當前驅動程序存儲在注冊表中,因此您可以從那里直接讀取它。 但是,最好使用Microsoft提供的API SetupAPI。 調用的函數是SetupDiGetDeviceRegistryProperty ,第三個參數應該是SPDRP_SERVICE 這將以字符串形式返回驅動程序的名稱。 請注意,在獲得所有需要調用SetupDiGetDeviceRegistryProperty的信息之前,您將需要調用其他幾個SetupAPI函數。

  2. 我沒有嘗試過,但是libwdi具有將WinUSB安裝到設備節點上的功能。 它還可能具有獲取當前驅動程序的功能,因此在花太多時間學習SetupAPI之前,應嘗試使用它。 微軟的devcon實用程序(現在是開源的)可能是另一個選擇。

  3. 不知道正在做什么的細節,我質疑您是否真的需要這樣做。 向用戶提供簽名的驅動程序包,並指示他們使用設備管理器中的“更新驅動程序軟件...”選項將其應用於特定設備,可能會更簡單。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM