www.gusucode.com > 一些VC++网络编程实例源代码-源码程序 > 一些VC++网络编程实例源代码-源码程序\code\第四章\GetNetSetting\lassNetSetting.cpp

    //Download by http://www.NewXing.com
// lassNetSetting.cpp: implementation of the ClassNetSetting class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GetNetSetting.h"
#include "lassNetSetting.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ClassNetSetting::ClassNetSetting()
{
   	m_TotalNetCards = 0;
	_tcscpy(m_szDomain,_T(""));
	_tcscpy(m_szHostName,_T(""));
	m_IPEnableRouter = 2;
	m_EnableDNS = 2;
	m_SystemType = Unknow;
}

ClassNetSetting::~ClassNetSetting()
{

}

BOOL ClassNetSetting::GetSetting()
{
    m_SystemType = GetSystemType();
	
	if (m_SystemType == Windows9X)
		return GetSettingOfWin9X();
	else if(m_SystemType == WinNT4orHigher)
		return GetSettingOfWinNT();
	else//不支持老旧的操作系统
		return FALSE;
}

Win32Type ClassNetSetting::GetSystemType()
{
    Win32Type  SystemType;
	DWORD winVer;
	OSVERSIONINFO *osvi;
	
	winVer = GetVersion();
	if(winVer < 0x80000000)
	{
		/*NT */
		SystemType = WinNT3;
		osvi = (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
		if (osvi != NULL)
		{
			memset(osvi,0,sizeof(OSVERSIONINFO));
			osvi->dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
			GetVersionEx(osvi);
			if (osvi->dwMajorVersion >= 4L)
				SystemType = WinNT4orHigher;//yup, it is NT 4 or higher!
			free(osvi);
		}
	}
	else if  (LOBYTE(LOWORD(winVer)) < 4)
		SystemType=Win32s;/*Win32s*/
	else
		SystemType=Windows9X;/*Windows9X*/
	return SystemType;
}

BOOL ClassNetSetting::GetSettingOfWin9X()
{
    LONG lRet;
	HKEY hMainKey;
	TCHAR szNameServer[256];
	
//得到域名,网关和DNS的设置
	lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("System\\CurrentControlSet\\Services\\VxD\\MSTCP"),0,KEY_READ,&hMainKey);
	if(lRet == ERROR_SUCCESS)
	{
		DWORD dwType,dwDataSize = 256;
		::RegQueryValueEx(hMainKey,_T("Domain"),NULL,&dwType,(LPBYTE)m_szDomain,&dwDataSize);
		dwDataSize = 256;
		::RegQueryValueEx(hMainKey,_T("Hostname"),NULL,&dwType,(LPBYTE)m_szHostName,&dwDataSize);
		dwDataSize = 256;
		::RegQueryValueEx(hMainKey,_T("EnableDNS"),NULL,&dwType,(LPBYTE)&m_EnableDNS,&dwDataSize);
		dwDataSize = 256;
		::RegQueryValueEx(hMainKey,_T("NameServer"),NULL,&dwType,(LPBYTE)szNameServer,&dwDataSize);
	}
	::RegCloseKey(hMainKey);

	HKEY hNetCard = NULL;
//调用CTcpCfg类的静态函数得到网卡的数目和相应的MAC地址
	m_TotalNetCards = GetMacAddress(m_MacAddr);

	lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("System\\CurrentControlSet\\Services\\Class\\Net"),0,KEY_READ,&hNetCard);
	if(lRet != ERROR_SUCCESS)//此处失败就返回
	{
		if(hNetCard != NULL)
			::RegCloseKey(hNetCard);
		return FALSE;
	}

	DWORD dwSubKeyNum = 0,dwSubKeyLen = 256;
//得到子键的个数,通常与网卡个数相等
	lRet = ::RegQueryInfoKey(hNetCard,NULL,NULL,NULL,&dwSubKeyNum,&dwSubKeyLen,
		NULL,NULL,NULL,NULL,NULL,NULL);
	if(lRet == ERROR_SUCCESS)
	{
//		m_TotalNetCards = dwSubKeyNum;//网卡个数以此为主
		LPTSTR lpszKeyName = new TCHAR[dwSubKeyLen + 1];
		DWORD dwSize;
		for(int i = 0; i < (int)m_TotalNetCards; i++)
		{
			TCHAR szNewKey[256];
			HKEY hNewKey;
			DWORD dwType = REG_SZ,dwDataSize = 256;
			dwSize = dwSubKeyLen + 1;
			lRet = ::RegEnumKeyEx(hNetCard,i,lpszKeyName,&dwSize,NULL,NULL,NULL,NULL);
			if(lRet == ERROR_SUCCESS)
			{
				lRet = ::RegOpenKeyEx(hNetCard,lpszKeyName,0,KEY_READ,&hNewKey);
				if(lRet == ERROR_SUCCESS)
					::RegQueryValueEx(hNewKey,_T("DriverDesc"),NULL,&dwType,(LPBYTE)m_Cards[i].szDescription,&dwDataSize);
				::RegCloseKey(hNewKey);
				wsprintf(szNewKey,_T("System\\CurrentControlSet\\Services\\Class\\NetTrans\\%s"),lpszKeyName);
				lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,szNewKey,0,KEY_READ,&hNewKey);
				if(lRet == ERROR_SUCCESS)
				{
					dwDataSize = 256;
					::RegQueryValueEx(hNewKey,_T("DefaultGateway"),NULL,&dwType,(LPBYTE)m_Cards[i].szGateWay,&dwDataSize);
					ProcessMultiString(m_Cards[i].szGateWay,dwDataSize);
					dwDataSize = 256;
					::RegQueryValueEx(hNewKey,_T("IPAddress"),NULL,&dwType,(LPBYTE)m_Cards[i].szIpAddress,&dwDataSize);
					ProcessMultiString(m_Cards[i].szIpAddress,dwDataSize);
					dwDataSize = 256;
					::RegQueryValueEx(hNewKey,_T("IPMask"),NULL,&dwType,(LPBYTE)m_Cards[i].szIpMask,&dwDataSize);
					ProcessMultiString(m_Cards[i].szIpMask,dwDataSize);
//拷贝前面得到的DNS主机名
					_tcscpy(m_Cards[i].szDNSNameServer,szNameServer);
				}
				::RegCloseKey(hNewKey);
			}
			m_Cards[i].szMacAddr[0] = m_MacAddr[i].b1;
			m_Cards[i].szMacAddr[1] = m_MacAddr[i].b2;
			m_Cards[i].szMacAddr[2] = m_MacAddr[i].b3;
			m_Cards[i].szMacAddr[3] = m_MacAddr[i].b4;
			m_Cards[i].szMacAddr[4] = m_MacAddr[i].b5;
			m_Cards[i].szMacAddr[5] = m_MacAddr[i].b6;
		}
	}
	::RegCloseKey(hNetCard);
	return lRet == ERROR_SUCCESS ? TRUE : FALSE;
}

int ClassNetSetting::GetMacAddress(LPMAC_ADDRESS pMacAddr)
{
    NCB ncb; 
	UCHAR uRetCode;
	int num = 0;
	LANA_ENUM lana_enum; 
	memset(&ncb, 0, sizeof(ncb) ); 
	ncb.ncb_command = NCBENUM; 
	ncb.ncb_buffer = (unsigned char *)&lana_enum; 
	ncb.ncb_length = sizeof(lana_enum); 
	//向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡
	//每张网卡的编号等 
	uRetCode = Netbios(&ncb);
	if (uRetCode == 0) 
	{
		num = lana_enum.length;
//对每一张网卡,以其网卡编号为输入编号,获取其MAC地址 
		for (int i = 0; i < num; i++)
		{
			ASTAT Adapter;
			if(GetAddressByIndex(lana_enum.lana[i],Adapter) == 0)
			{
				pMacAddr[i].b1 = Adapter.adapt.adapter_address[0];
				pMacAddr[i].b2 = Adapter.adapt.adapter_address[1];
				pMacAddr[i].b3 = Adapter.adapt.adapter_address[2];
				pMacAddr[i].b4 = Adapter.adapt.adapter_address[3];
				pMacAddr[i].b5 = Adapter.adapt.adapter_address[4];
				pMacAddr[i].b6 = Adapter.adapt.adapter_address[5];
			}
		}
	}
	return num;
}

BOOL ClassNetSetting::GetSettingOfWinNT()
{
   LONG lRtn;
	HKEY hMainKey;
	TCHAR szParameters[256];
//获得域名,主机名和是否使用IP路由
	_tcscpy(szParameters,_T("SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters"));
	lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,szParameters,0,KEY_READ,&hMainKey);
	if(lRtn == ERROR_SUCCESS)
	{
		DWORD dwType,dwDataSize = 256;
		::RegQueryValueEx(hMainKey,_T("Domain"),NULL,&dwType,(LPBYTE)m_szDomain,&dwDataSize);
		dwDataSize = 256;
		::RegQueryValueEx(hMainKey,_T("Hostname"),NULL,&dwType,(LPBYTE)m_szHostName,&dwDataSize);
		dwDataSize = 256;
//		BYTE szBuf[16];
		::RegQueryValueEx(hMainKey,_T("IPEnableRouter"),NULL,&dwType,(LPBYTE)&m_IPEnableRouter,&dwDataSize);
	}
	::RegCloseKey(hMainKey);

//获得IP地址和DNS解析等其他设置
	HKEY hNetCard = NULL;
	m_TotalNetCards = GetMacAddress(m_MacAddr);

	lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"),0,KEY_READ,&hNetCard);
	if(lRtn != ERROR_SUCCESS)//此处失败就返回
	{
		if(hNetCard != NULL)
			::RegCloseKey(hNetCard);
		return FALSE;
	}
	
	DWORD dwSubKeyNum = 0,dwSubKeyLen = 256;
//得到子键的个数,通常与网卡个数相等
	lRtn = ::RegQueryInfoKey(hNetCard,NULL,NULL,NULL,&dwSubKeyNum,&dwSubKeyLen,
		NULL,NULL,NULL,NULL,NULL,NULL);
	if(lRtn == ERROR_SUCCESS)
	{
		m_TotalNetCards = dwSubKeyNum;//网卡个数以此为主
		LPTSTR lpszKeyName = new TCHAR[dwSubKeyLen + 1];
		DWORD dwSize;
		for(int i = 0; i < (int)dwSubKeyNum; i++)
		{
			TCHAR szServiceName[256];
			HKEY hNewKey;
			DWORD dwType = REG_SZ,dwDataSize = 256;
			dwSize = dwSubKeyLen + 1;
			::RegEnumKeyEx(hNetCard,i,lpszKeyName,&dwSize,NULL,NULL,NULL,NULL);
			lRtn = ::RegOpenKeyEx(hNetCard,lpszKeyName,0,KEY_READ,&hNewKey);
			if(lRtn == ERROR_SUCCESS)
			{
				lRtn = ::RegQueryValueEx(hNewKey,_T("Description"),NULL,&dwType,(LPBYTE)m_Cards[i].szDescription,&dwDataSize);
				dwDataSize = 256;
				lRtn = ::RegQueryValueEx(hNewKey,_T("ServiceName"),NULL,&dwType,(LPBYTE)szServiceName,&dwDataSize);
				if(lRtn == ERROR_SUCCESS)
				{
					TCHAR szNewKey[256];
					wsprintf(szNewKey,_T("%s\\Interfaces\\%s"),szParameters,szServiceName);
					HKEY hTcpKey;
					lRtn = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,szNewKey,0,KEY_READ,&hTcpKey);
					if(lRtn == ERROR_SUCCESS)
					{
						dwDataSize = 256;
						::RegQueryValueEx(hTcpKey,_T("DefaultGateway"),NULL,&dwType,(LPBYTE)m_Cards[i].szGateWay,&dwDataSize);
						ProcessMultiString(m_Cards[i].szGateWay,dwDataSize);
						dwDataSize = 256;
						::RegQueryValueEx(hTcpKey,_T("IPAddress"),NULL,&dwType,(LPBYTE)m_Cards[i].szIpAddress,&dwDataSize);
						ProcessMultiString(m_Cards[i].szIpAddress,dwDataSize);
						dwDataSize = 256;
						::RegQueryValueEx(hTcpKey,_T("SubnetMask"),NULL,&dwType,(LPBYTE)m_Cards[i].szIpMask,&dwDataSize);
						ProcessMultiString(m_Cards[i].szIpMask,dwDataSize);
						dwDataSize = 256;
						::RegQueryValueEx(hTcpKey,_T("NameServer"),NULL,&dwType,(LPBYTE)m_Cards[i].szDNSNameServer,&dwDataSize);
					}
					::RegCloseKey(hTcpKey);
				}
			}
			::RegCloseKey(hNewKey);
			m_Cards[i].szMacAddr[0] = m_MacAddr[i].b1;
			m_Cards[i].szMacAddr[1] = m_MacAddr[i].b2;
			m_Cards[i].szMacAddr[2] = m_MacAddr[i].b3;
			m_Cards[i].szMacAddr[3] = m_MacAddr[i].b4;
			m_Cards[i].szMacAddr[4] = m_MacAddr[i].b5;
			m_Cards[i].szMacAddr[5] = m_MacAddr[i].b6;
		}
		delete[] lpszKeyName;
	}
	::RegCloseKey(hNetCard);
	return lRtn == ERROR_SUCCESS ? TRUE : FALSE;
}


UCHAR ClassNetSetting::GetAddressByIndex(int lana_num, ASTAT &Adapter)
{
   NCB ncb; 
	UCHAR uRetCode; 
	memset(&ncb, 0, sizeof(ncb) ); 
	ncb.ncb_command = NCBRESET; 
	ncb.ncb_lana_num = lana_num; 
//指定网卡号,首先对选定的网卡发送一个NCBRESET命令,以便进行初始化 
	uRetCode = Netbios(&ncb ); 
	memset(&ncb, 0, sizeof(ncb) ); 
	ncb.ncb_command = NCBASTAT; 
	ncb.ncb_lana_num = lana_num;   //指定网卡号 
	strcpy((char *)ncb.ncb_callname,"*      " ); 
	ncb.ncb_buffer = (unsigned char *)&Adapter; 
//指定返回的信息存放的变量 
	ncb.ncb_length = sizeof(Adapter); 
//接着,可以发送NCBASTAT命令以获取网卡的信息 
	uRetCode = Netbios(&ncb ); 
	return uRetCode;
} 

void ClassNetSetting::ProcessMultiString(LPTSTR lpszString, DWORD dwSize)
{ 
   for(int i = 0; i < int(dwSize - 2); i++)
	{
		if(lpszString[i] == _T('\0'))
			lpszString[i] = _T(',');
	}
}