安装USB驱动,采用让系统枚举的办法

17 篇文章 0 订阅
14 篇文章 0 订阅
#include <windows.h>
#include <tchar.h>
#include <Setupapi.h>
#pragma comment(lib, "Setupapi.lib")
#include <Cfgmgr32.h>
#include <devguid.h>


BOOL RemoveUnknownDevices()
{
    HDEVINFO hInstDevInfoSet = INVALID_HANDLE_VALUE;
    LPGUID lpGuid = (LPGUID)&GUID_DEVCLASS_UNKNOWN;


    hInstDevInfoSet = ::SetupDiGetClassDevs(lpGuid, NULL, NULL, DIGCF_ALLCLASSES);
    if(hInstDevInfoSet != INVALID_HANDLE_VALUE)
    {
        int nIndex = 0;
        SP_DEVINFO_DATA oDevInfo = { sizeof(oDevInfo) };
        while(::SetupDiEnumDeviceInfo(hInstDevInfoSet, nIndex++, &oDevInfo))
        {
            DWORD dwData;
            LPTSTR buffer = NULL;
            DWORD dwBufferSize = 0;
            while(!::SetupDiGetDeviceRegistryProperty(hInstDevInfoSet, &oDevInfo, SPDRP_COMPATIBLEIDS,
                &dwData, (PBYTE)buffer, dwBufferSize, &dwBufferSize))
            {
                OutputDebugString(_T("SetupDiGetDeviceRegistryProperty Called failed!"));
                if(ERROR_INVALID_DATA == ::GetLastError())
                {
                    // May be a Legacy Device with no szHardwareID. Continue.
                    break;
                }else if(ERROR_INSUFFICIENT_BUFFER == ::GetLastError())
                {
                    if (buffer) 
                        LocalFree(buffer);
                    buffer = (LPTSTR)LocalAlloc(LPTR, dwBufferSize);
                }else
                {
                    // Unknown Failure.
                    break;
                }
            }


            LPTSTR lpPointer = buffer;
            for (; lpPointer != NULL && *lpPointer&&(lpPointer<&buffer[dwBufferSize]);lpPointer+=_tcslen(lpPointer) + 1)
            {
                OutputDebugString(lpPointer);
                if(_tcsicmp(lpPointer, _T("USB\\Class_FF&SubClass_42&Prot_01")) == 0)
                {
                    BOOL bRet = ::SetupDiRemoveDevice(hInstDevInfoSet, &oDevInfo);
                    break;
                }
            }


            LocalFree(buffer);
        }
    }else
    {
        OutputDebugString(_T("SetupDiGetClassDevs failed!"));
    }
    SetupDiDestroyDeviceInfoList(hInstDevInfoSet);
    return TRUE;
}




int _tmain(int argc, _TCHAR* argv[])
{
    LPCTSTR arrInfFile = TEXT("driver\\android_winusb.inf");
    LPTSTR pszInfDestFileName;
    TCHAR szInfDestFile[MAX_PATH];


    if ( !SetupCopyOEMInf(arrInfFile, NULL, SPOST_PATH, SP_COPY_NEWER_OR_SAME, szInfDestFile,
        _countof(szInfDestFile), NULL, &pszInfDestFileName) )
    {
        OutputDebugString(_T("SetupCopyOEMInf failed"));
    }


    RemoveUnknownDevices();


    DWORD dwStatus;
    DEVINST devInst;
    dwStatus = CM_Locate_DevNode(&devInst, NULL,
        CM_LOCATE_DEVNODE_NORMAL);
    if ( CR_SUCCESS == dwStatus )
    {
        dwStatus = CM_Reenumerate_DevNode(devInst,
            CM_REENUMERATE_SYNCHRONOUS|CM_REENUMERATE_RETRY_INSTALLATION);
        if(dwStatus != CR_SUCCESS)
        {
            OutputDebugString(_T("CM_Reenumerate_DevNode failed"));
        }
    }else
    {
        OutputDebugString(_T("CM_Locate_DevNode failed"));
    }
return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值