📄 setupmodem.cpp
字号:
// SetUpModem.cpp: implementation of the CSetUpModem class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SetUpModem.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "INITGUID.H"
DEFINE_GUID(GUID_MODEM , 0x4D36E96D, 0xE325, 0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSetUpModem::CSetUpModem()
{
}
CSetUpModem::~CSetUpModem()
{
}
BOOL CSetUpModem::FindExistingDevice(IN LPGUID lpGUID,
IN LPCTSTR lpszHardwareID,
OUT LPTSTR lpszInstanceID OPTIONAL)
{
HDEVINFO hdi = NULL;
SP_DEVINFO_DATA hDev = { 0 } ;
hDev.cbSize = sizeof(SP_DEVINFO_DATA);
DWORD dwEnumIndex;
char buffer[1024];
DWORD cbData;
BOOL fFound = FALSE;
if((hdi = SetupDiGetClassDevs(lpGUID , NULL , NULL , 0))==NULL)
return FALSE;
dwEnumIndex = 0;
while(SetupDiEnumDeviceInfo(hdi , dwEnumIndex++ , &hDev))
{
if(SetupDiGetDeviceRegistryProperty(hdi , &hDev ,
SPDRP_HARDWAREID ,
NULL , (PBYTE)buffer ,
1024 , &cbData))
{
char *p;
for (p=buffer;*p&&(p<&buffer[cbData]);p+=strlen(p)+sizeof(char))
{
if (stricmp(lpszHardwareID,p)==0)
{
printf("Found! [%s]\n",p);
if(!SetupDiGetDeviceInstanceId(hdi , &hDev , buffer , 1024 , NULL))
return FALSE;
if(lpszInstanceID!=NULL)
strcpy(lpszInstanceID , buffer);
fFound = TRUE;
break;
}
}
if(fFound)
break;
}
}
if(hdi != NULL)
SetupDiDestroyDeviceInfoList(hdi);
return fFound;
}
int CSetUpModem::InstallRootEnumeratedDriver(IN LPGUID lpGUID,
IN LPCTSTR lpszHardwareID,
IN LPCTSTR lpszDescription,
IN LPCTSTR lpszInfName OPTIONAL,
OUT LPTSTR lpszInstanceID OPTIONAL,
OUT LPBOOL pfNeedReboot OPTIONAL,
IN LPCTSTR pszPort)
{
int ret = ERROR_SUCCESS;
DWORD dwEnumIndex, dwRet;
char szClassName[100];
HKEY hKeyDev;
BOOL bRet;
bRet = FALSE;
HDEVINFO hdi = NULL;
SP_DEVINFO_DATA hDev = { 0 } ;
SP_DEVINSTALL_PARAMS hInstParam = { 0 } ;
SP_DRVINFO_DATA hDrv = { 0 } ;
hDev.cbSize = sizeof(SP_DEVINFO_DATA);
hInstParam.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
hDrv.cbSize = sizeof(SP_DRVINFO_DATA);
//检测设备是否已经安装
if(FindExistingDevice(lpGUID , lpszHardwareID , lpszInstanceID))
return ERROR_SUCCESS;
if(!SetupDiClassNameFromGuid(lpGUID , szClassName , sizeof(szClassName) ,NULL))
return -1;
if((hdi = SetupDiCreateDeviceInfoList(lpGUID , NULL))==NULL)
return -1;
//创建新设备信息。如果设备已经存在,有异常产生
if(!SetupDiCreateDeviceInfo(hdi , szClassName, lpGUID , lpszDescription, NULL , DICD_GENERATE_ID , &hDev))
return -1;
if(!SetupDiGetDeviceInstanceId(hdi , &hDev ,lpszInstanceID , MAX_PATH , NULL))
return -1;
//获得设备安装参数
if(!SetupDiGetDeviceInstallParams(hdi , &hDev , &hInstParam))
return -1;
//修改参数
if(lpszInfName!=NULL && strlen(lpszInfName)!=0)
{
DWORD fattr = GetFileAttributes(lpszInfName);
if(fattr == -1)
return -1;
if(!(fattr & FILE_ATTRIBUTE_DIRECTORY))
hInstParam.Flags = hInstParam.Flags | DI_ENUMSINGLEINF;
strcpy(hInstParam.DriverPath , lpszInfName);
}
hInstParam.FlagsEx = hInstParam.FlagsEx | DI_FLAGSEX_ALLOWEXCLUDEDDRVS;
//设置设备安装参数
if(!SetupDiSetDeviceInstallParams(hdi, &hDev , &hInstParam))
return -1;
//获得设备驱动信息列表
if(!SetupDiBuildDriverInfoList(hdi, &hDev , SPDIT_CLASSDRIVER))
return -1;
//获得设备的驱动程序
dwEnumIndex = 0;
while(SetupDiEnumDriverInfo(hdi , &hDev , SPDIT_CLASSDRIVER ,
dwEnumIndex++ , &hDrv))
{
if(stricmp(hDrv.Description , lpszDescription)==0)
break;
}
//选定这个驱动程序
if(!SetupDiSetSelectedDriver(hdi , &hDev , &hDrv))
return -1;
//注册设备
if(!SetupDiRegisterDeviceInfo(hdi , &hDev , 0 , NULL , NULL , NULL))
return -1;
hKeyDev = SetupDiOpenDevRegKey(hdi, &hDev, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_ALL_ACCESS); //// This call fails....
if( (INVALID_HANDLE_VALUE == hKeyDev) && ( ERROR_KEY_DOES_NOT_EXIST == GetLastError()) )
{
hKeyDev = SetupDiCreateDevRegKey(hdi, &hDev, DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL);
if( INVALID_HANDLE_VALUE == hKeyDev )
{
// DisplayError(_T("SetupDi Open+Create DevRegKey failed: "));
return FALSE;
}
}
else
{
// DisplayError(_T("Can not open DriverKey: "));
return FALSE;
}
if (ERROR_SUCCESS != (dwRet = RegSetValueEx (hKeyDev, "AttachedTo", 0, REG_SZ,
(PBYTE)pszPort, (lstrlen(pszPort)+1)*sizeof(TCHAR))))
{
// DisplayError(_T("RegSetValueEx :"));
SetLastError (dwRet);
bRet = FALSE;
}
RegCloseKey (hKeyDev);
//注册Co-Installer
if(!SetupDiRegisterCoDeviceInstallers(hdi , &hDev))
return -1;
//安装设备
if(!SetupDiCallClassInstaller(DIF_INSTALLDEVICE , hdi , &hDev))
return -1;
if(pfNeedReboot!=NULL)
{
if(SetupDiGetDeviceInstallParams(hdi , &hDev , &hInstParam))
*pfNeedReboot = ((hInstParam.Flags & DI_NEEDRESTART)
|| (hInstParam.Flags & DI_NEEDREBOOT));
else
pfNeedReboot = FALSE;
}
if(hdi!=NULL)
SetupDiDestroyDeviceInfoList(hdi);
return ret;
}
int CSetUpModem::InstallSuntekModem(LPCTSTR lpszComName, LPCTSTR lpszINFPath)
{
int ret = ERROR_SUCCESS;
char szInfPath[ MAX_PATH ] = { 0 };
char szInstanceID[ MAX_PATH ] = { 0 };
char szHardwareID[ MAX_PATH ] = { 0 };
char szDeviceDesc[ MAX_PATH ] = { 0 };
char buffer[1024];
char regbuf[1024];
OSVERSIONINFO osvi;
BOOL bOsVersionInfoEx;
memset(buffer, 0, 1024);
memset(regbuf, 0, 1024);
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
bOsVersionInfoEx =GetVersionEx(&osvi);
HKEY hKey = NULL;
HINF hInf = NULL;
INFCONTEXT hContext;
//GetWindowsDirectory(szInfPath , MAX_PATH);
//strcat(szInfPath , lpszINFPath);
sprintf(szInfPath ,"%s" , lpszINFPath);
hInf = SetupOpenInfFile(szInfPath , NULL , INF_STYLE_WIN4 , NULL);
if(hInf != INVALID_HANDLE_VALUE)
{
if(SetupFindFirstLine(hInf , "Manufacturer" , NULL , &hContext))
{
if(SetupGetStringField(&hContext , 1 , buffer , sizeof(buffer) , NULL))
{
if(SetupFindFirstLine(hInf , buffer , NULL , &hContext))
{
//获得设备描述
SetupGetStringField(&hContext , 0 , szDeviceDesc , sizeof(szDeviceDesc) , NULL);
//获得HardwareID
SetupGetStringField(&hContext , 2, szHardwareID , sizeof(szHardwareID) , NULL);
}
}
}
SetupCloseInfFile(hInf);
if((ret = InstallRootEnumeratedDriver((LPGUID)&GUID_MODEM ,
szHardwareID ,
szDeviceDesc,
szInfPath ,
szInstanceID,
NULL,
lpszComName))!=ERROR_SUCCESS)
return ret;
}
return ret;
}
/*
DWORD CALLBACK ModemCoInstallProc (DI_FUNCTION InstallFunction,
HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
PCOINSTALLER_CONTEXT_DATA Context)
{
if(InstallFunction == DIF_INSTALLDEVICE)
{
char szInstanceID[255];
char buffer[1024];
DWORD cbData;
HKEY hKey;
char szComPort[10] = { 0 };
if(RegOpenKey(HKEY_CURRENT_USER , "Environment" , &hKey)==ERROR_SUCCESS)
{
cbData = sizeof(szComPort);
if(RegQueryValueEx(hKey , "MDMCOM" , NULL , NULL , (LPBYTE)szComPort , &cbData)==ERROR_SUCCESS)
{
if(SetupDiGetDeviceInstanceId(DeviceInfoSet , DeviceInfoData ,
szInstanceID , 1024 , NULL))
{
if(GetOsType() < OS_NT4)
strcpy(buffer , "System\\CurrentControlSet\\Services\\Class\\");
else
strcpy(buffer , "SYSTEM\\CurrentControlSet\\Control\\Class\\");
cbData = 1024 - strlen(buffer);
if(RegQueryDeviceProperty(szInstanceID , NULL , "Driver" ,
NULL , (PBYTE)(buffer + strlen(buffer)), &cbData)==ERROR_SUCCESS)
{
if(RegOpenKey(HKEY_LOCAL_MACHINE, buffer,&hKey)==ERROR_SUCCESS)
{
RegSetValueEx(hKey , "AttachedTo", 0 , REG_SZ , (LPBYTE)szComPort ,
strlen(szComPort));
RegCloseKey(hKey);
}
}
}
}
RegCloseKey(hKey);
}
}
return NO_ERROR;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -