#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;
}相关推荐
从零实现:重建USB控制器驱动的方法
当电脑无法识别usb设备时,可通过手动重建USB控制器驱动来恢复功能。本文介绍从零开始的驱动重装方法,帮助用户快速定位问题并解决usb连接异常。
USB.rar_Delphi-USB_USB delphi_delphi usb_setupapi.pas_usb
USB设备扫描程序,使用DELPHI开发
基于CH340的USB转TTL调试板驱动部署完整示例
详解基于CH340芯片的USB转TTL调试板驱动安装过程,涵盖Windows系统下usb serial controller驱动的识别、安装与故障排查,确保设备稳定通信。
usb驱动自动安装中遇到的问题
主要有四个步骤: 1. 根据“协作安装程序应用一例”编写dll 2. 函数实现dll的注册 3. 然后预安装 4. 插入设备测试 1. 根据“协作安装程序应用一例”编写dll Dll是基于win32的dll程序,入口函数的声明如下: extern "C"__declspec(dlle
SetupCopyOEMInf函数 驱动开发
SetupCopyOEMInf这个函数很好,可以原装驱动,也就是在设备插入之前运行这个函数。那么当设备插入电脑的时候,系统就可以自动安装驱动。 起参数也比较简单。 BOOL WINAPI SetupCopyOEMInf( PCTSTR SourceInfFileName, PCTSTR OEMSourceMediaLocation, DWORD OEMSourceMe
驱动安装包制作:使用SetupCopyOEMInf函数 用installshield 即可完成安装
http://blog.csdn.net/emma_he/article/details/5858781 http://cysbox7.blog.163.com/blog/static/11587863320105975159520/ 引用不知道哪位大牛的原话: 对于即插即用简单地说要对付2种情况 1。在你的设备未安装前,安装驱动程序这叫预先安装。 最简单的方
小天才USB驱动下载:USB枚举过程系统学习
深入解析小天才USB驱动下载的完整流程,重点讲解USB枚举过程中设备识别与驱动匹配的关键步骤,帮助用户快速完成驱动安装并解决连接问题。
JLink驱动安装无反应?聚焦USB通信层操作指南
针对jlink驱动安装无法识别的常见问题,深入剖析USB通信层的关键操作步骤,帮助用户解决设备连接异常与驱动无反应故障,提升调试效率。
利用Zadig实现命令行安装USB驱动
USB设备在Windows中可以通过枚举时响应回复特定字符串来匹配WINUSB的兼容性ID,可以实现免驱控制USB设备。但如果USB设备没有被识别成WinUSB设备,而且USB设备的固件不能更改的情况下,还可以利用Zadig来额外安装WinUSB驱动。通过Zadig软件提取目标USB设备的WinUSB驱动文件,再通过手动安装证书后提取出来证书文件。有了驱动文件和证书文件后就可以拷贝到其他电脑上直接使用命令行运行。
枚举USB设备硬件ID
通过设备类GUID,枚举出通用串行总线控制器的硬件ID!
Windows驱动SetupDi系列函数之枚举USB/PCIe设备
Windows开发过程中,有时候需要进行设备信息的管理,那么SetupDi系列函数能够满足你的要求。
USB之枚举
一,概述 现在很多的主控上都带有USB的功能,但是对于初学者来说,这方面应用还是比较棘手,因为usb的不但固件程序需要编写,PC端的驱动也要编写,而且驱动写好了还要写个上位机才能看出效果。这样调试起来十分困难,建议从USB的键盘,鼠标开始做,了解清楚了,再做自己的协议就比较简单了。 USB的概念历史啥的这里就不说了。我们先不管具体的数据包格式,这一节先从整个包的层面上简单的说,过程是这样的,
USB打印机驱动安装实战案例详解
详解USB打印机驱动程序安装全过程,针对常见问题提供实用解决方案。结合实际操作场景,帮助用户快速完成驱动程序安装并恢复打印功能。
浅谈USB的枚举过程
USB枚举
USB枚举过程 USB Enumeration
USB枚举过程 USB Enumeration USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。USB总线拓扑结构见下图(最顶端为主机的Root Hub):
USB转多路串口 - USB CDC设备枚举
先上参考资料:ST社区的: <<USB CDC类入门培训.pdf>>
1172




被折叠的 条评论
为什么被折叠?



