應一位朋友的需要貼出一份代碼
bool IsDeviceDisabled( DWORD dwDevID, HDEVINFO hDevInfo, DWORD &dwStatus )
{
SP_DEVINFO_DATA DevInfoData = { sizeof( SP_DEVINFO_DATA ) };
DWORD dwDevStatus, dwProblem;
if ( !SetupDiEnumDeviceInfo( hDevInfo, dwDevID, &DevInfoData ) )
return FALSE;
//查詢設備狀態
if ( CM_Get_DevNode_Status( &dwDevStatus, &dwProblem, DevInfoData.DevInst, 0 ) != CR_SUCCESS )
return FALSE;
dwStatus = dwProblem;
return true;
}
int checkUSBDriverExist()
{
int nRet = 0;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
bool bRet = false;
bool bOk = false;
hDevInfo = SetupDiGetClassDevs( NULL,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );
if ( hDevInfo == INVALID_HANDLE_VALUE )
return ERR_CREHDEVINFO;
DWORD dwStatuts = -1;
DeviceInfoData.cbSize = sizeof( SP_DEVINFO_DATA );
for ( i = 0; SetupDiEnumDeviceInfo( hDevInfo, i, &DeviceInfoData ); i++ )
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
while ( !SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_HARDWAREID,
&DataT,
( PBYTE )buffer,
buffersize,
&buffersize ) )
{
if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
{
// Change the buffer size.
if ( buffer ) LocalFree( buffer );
buffer = ( LPTSTR )LocalAlloc( LPTR, buffersize );
}
else
break;
}
if ( IsDeviceDisabled( i, hDevInfo, dwStatuts ) && dwStatuts == 0 )
{
if ( buffer != NULL )
{
string strDeviceInfo( buffer );
int npos = strDeviceInfo.find( "_" );
if ( strDeviceInfo.substr( npos + 1, 4 ) == "0AAA" )
{
int nValue = strDeviceInfo.rfind( "05" );
if ( nValue<strDeviceInfo.size() && nValue>0 )
{
cout << strDeviceInfo << endl;
nRet++;
}
}
}
}
if ( buffer )
LocalFree( buffer );
}
SetupDiDestroyDeviceInfoList( hDevInfo );
return nRet;
}
void main()
{
int ncheck = checkUSBDriverExist();
if ( ncheck <= 0 )
cout << "驅動不完整:" << ncheck << endl;
}
大致就是以上這些了,也沒細看有沒問題,但是在項目中使用着的