#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驱动,采用让系统枚举的办法
最新推荐文章于 2018-11-02 10:01:20 发布