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

USB枚举过程详解 阅读详情
#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;
}


【Linux驱动USB协议 详细介绍了USB协议中的电气信号,以及数据传输过程中电平信号的变化。还有USB协议的数据格式,传输类型,如批量传输,实时传输,中断传输,控制传输。还讲解并演示了设备枚举的过程。 阅读详情

相关推荐

从零实现:重建USB控制器驱动的方法

当电脑无法识别usb设备时,可通过手动重建USB控制器驱动来恢复功能。本文介绍从零开始的驱动重装方法,帮助用户快速定位问题并解决usb连接异常。

weixin_42509507的博客 1172

USB.rar_Delphi-USB_USB delphi_delphi usb_setupapi.pas_usb

USB设备扫描程序,使用DELPHI开发

基于CH340的USB转TTL调试板驱动部署完整示例

详解基于CH340芯片的USB转TTL调试板驱动安装过程,涵盖Windows系统usb serial controller驱动的识别、安装与故障排查,确保设备稳定通信。

weixin_35706255的博客 1289

usb驱动自动安装中遇到的问题

主要有四个步骤: 1.        根据“协作安装程序应用一例”编写dll 2.        函数实现dll的注册 3.        然后预安装 4.        插入设备测试 1.        根据“协作安装程序应用一例”编写dll Dll是基于win32的dll程序,入口函数的声明如下: extern "C"__declspec(dlle

Huaerge的专栏 2932

SetupCopyOEMInf函数 驱动开发

SetupCopyOEMInf这个函数很好,可以原装驱动,也就是在设备插入之前运行这个函数。那么当设备插入电脑的时候,系统就可以自动安装驱动。     起参数也比较简单。      BOOL WINAPI SetupCopyOEMInf( PCTSTR SourceInfFileName, PCTSTR OEMSourceMediaLocation, DWORD OEMSourceMe

QQ_976606456的博客 2247

驱动安装包制作:使用SetupCopyOEMInf函数 用installshield 即可完成安装

http://blog.csdn.net/emma_he/article/details/5858781  http://cysbox7.blog.163.com/blog/static/11587863320105975159520/   引用不知道哪位大牛的原话: 对于即插即用简单地说要对付2种情况  1。在你的设备未安装前,安装驱动程序这叫预先安装。  最简单的方

patdz的专栏 2558

小天才USB驱动下载:USB枚举过程系统学习

深入解析小天才USB驱动下载的完整流程,重点讲解USB枚举过程中设备识别与驱动匹配的关键步骤,帮助用户快速完成驱动安装并解决连接问题。

weixin_42513209的博客 1089

JLink驱动安装无反应?聚焦USB通信层操作指南

针对jlink驱动安装无法识别的常见问题,深入剖析USB通信层的关键操作步骤,帮助用户解决设备连接异常与驱动无反应故障,提升调试效率。

weixin_36427956的博客 1115

利用Zadig实现命令行安装USB驱动

USB设备在Windows中可以通过枚举时响应回复特定字符串来匹配WINUSB的兼容性ID,可以实现免驱控制USB设备。但如果USB设备没有被识别成WinUSB设备,而且USB设备的固件不能更改的情况下,还可以利用Zadig来额外安装WinUSB驱动。通过Zadig软件提取目标USB设备的WinUSB驱动文件,再通过手动安装证书后提取出来证书文件。有了驱动文件和证书文件后就可以拷贝到其他电脑上直接使用命令行运行。

weixin_56557812的博客 2847

枚举USB设备硬件ID

通过设备类GUID,枚举出通用串行总线控制器的硬件ID!

Windows驱动SetupDi系列函数之枚举USB/PCIe设备

Windows开发过程中,有时候需要进行设备信息的管理,那么SetupDi系列函数能够满足你的要求。

Zander0的博客 5552

USB枚举

一,概述 现在很多的主控上都带有USB的功能,但是对于初学者来说,这方面应用还是比较棘手,因为usb的不但固件程序需要编写,PC端的驱动也要编写,而且驱动写好了还要写个上位机才能看出效果。这样调试起来十分困难,建议从USB的键盘,鼠标开始做,了解清楚了,再做自己的协议就比较简单了。 USB的概念历史啥的这里就不说了。我们先不管具体的数据包格式,这一节先从整个包的层面上简单的说,过程是这样的,

uyiwfn的专栏 1680

USB打印机驱动安装实战案例详解

详解USB打印机驱动程序安装全过程,针对常见问题提供实用解决方案。结合实际操作场景,帮助用户快速完成驱动程序安装并恢复打印功能。

weixin_42524864的博客 1101

浅谈USB枚举过程

USB枚举

weixin_46721287的博客 3741

USB枚举过程 USB Enumeration

USB枚举过程 USB Enumeration     USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。USB总线拓扑结构见下图(最顶端为主机的Root Hub):

wu55uw的专栏 3743

USB转多路串口 - USB CDC设备枚举

先上参考资料:ST社区的: <<USB CDC类入门培训.pdf>>

gavinpeng的专栏 1697
上一篇: 调试Release发布版程序的Crash错误
下一篇: 安装驱动,支持已经成为UNKNOW设备的安装
patdz
博客等级 码龄14年 20粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值