⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setupmodem.cpp

📁 代码为windows下的无线猫的应用程序(对AT指令的操作)。
💻 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 + -