[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] qga:windows os lost ip when network nic change pic
From: |
indiffPig |
Subject: |
[Qemu-devel] [PATCH] qga:windows os lost ip when network nic change pic order |
Date: |
Sat, 24 Jun 2017 01:39:14 -0400 |
From: "yin.zuowei" <address@hidden>
Signed-off-by: yin.zuowei <address@hidden>
bug description: In the windows virtual machine, if there are multiple network
cards, the hypothesis is that A/B/C is equipped with a different IP address.
Once you delete a B card in the middle and restart the virtual machine, you
will find that the A/C of the network card IP has been confused, and the IP of
the C network card has become the address of B, and the service has been
interrupted. So we did a IP recovery function in qga.This is a serious problem
that can lead to business disruption. If you have a better plan, we would like
to offer it to you.
---
qga/restoreIp.cpp | 1848 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1848 insertions(+)
create mode 100755 qga/restoreIp.cpp
diff --git a/qga/restoreIp.cpp b/qga/restoreIp.cpp
new file mode 100755
index 0000000..2382136
--- /dev/null
+++ b/qga/restoreIp.cpp
@@ -0,0 +1,1848 @@
+// restoreIp.cpp : ????????????????????????????
+//#include "stdafx.h"
+#include <tchar.h>
+#include <io.h>
+#include <stdio.h>
+#include <winsock2.h>
+#include <windows.h>
+#include <stdlib.h>
+#include <shellapi.h>
+#include <iphlpapi.h>
+#include <winioctl.h>
+#include <vector>
+#include <map>
+#include <set>
+
+//#pragma comment(lib,"iphlpapi.lib")
+
+CONST DWORD SUCCESS_CODE = 0;
+CONST DWORD ERROR_CODE = 1;
+CONST DWORD CONFLICT_CODE = 2;
+CONST DWORD NO_IP_CODE = 3;
+CONST DWORD NO_FILE_CODE = 4;
+
+CONST INT RETRY_TIMES = 3;
+CONST INT SLEEP_TIMES = 2000;
+CONST INT LOG_LEN = 512;
+CONST INT MAX_INI_RECORD = 512;
+
+
+/*????????????unicode?? memcpy????????????????XXX_LEN * sizeof(TCHAR)*/
+CONST INT MAC_LEN = 20;
+CONST INT DHCP_LEN = 4;
+CONST INT IP_STR_LEN = 128;
+CONST INT MASK_STR_LEN = 128;
+CONST INT GATE_STR_LEN = 128;
+CONST INT IP_ADDRESS_LEN = 16;
+CONST INT DNS_COUNT = 2; //??????????2??DNS????
+CONST INT DNS_STR_LEN = IP_ADDRESS_LEN * DNS_COUNT;
+CONST INT ADA_NAME_LEN = 40;
+CONST INT MAX_IP_COUNT = IP_STR_LEN/IP_ADDRESS_LEN;
+
+CONST INT DEL_NIC = -1;
+CONST INT ADD_NIC = 1;
+
+
+/*?????????????? g_????*/
+TCHAR g_configPath[MAX_PATH];
+BOOL g_VistaOrLater;
+
+CONST INT MAX_PREBUFF_LEN = MAC_LEN*MAX_INI_RECORD;
+TCHAR * g_preMem;
+
+
+/*??????????????????????????????????????????????????????????????????????????????????????????????IP????????????????????????????????????????????*/
+LPCTSTR NIC_CHANGE =
_T("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}");
+
+/*ip????????????????????????????*/
+LPCTSTR IP_CHANGE =
_T("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
+
+/*????????????????????????????????????????????IP????????????????????????*/
+
+LPCTSTR DHCP_KEY = _T("dhcp");
+LPCTSTR DHCP_ON = _T("yes");
+LPCTSTR DHCP_OFF = _T("no");
+LPCTSTR IP_KEY = _T("ip");
+LPCTSTR MASK_KEY = _T("mask");
+LPCTSTR GATEWAY_KEY = _T("gateWay");
+LPCTSTR DNS_KEY = _T("dns");
+LPCTSTR DHCP_IP = _T("169.254");
+
+
+VOID LogEvent(LPCTSTR pFormat, ...)
+{
+ TCHAR chMsg[LOG_LEN] = {0};
+ HANDLE hEventSource;
+ LPTSTR lpszStrings[1];
+ va_list pArg;
+
+ va_start(pArg, pFormat);
+ _vsntprintf(chMsg,LOG_LEN -1 ,pFormat,pArg);
+ va_end(pArg);
+
+ lpszStrings[0] = chMsg;
+
+ hEventSource = RegisterEventSource(NULL, TEXT("QGA"));
+ if (hEventSource != NULL)
+ {
+ ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE,
+ 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
+ DeregisterEventSource(hEventSource);
+ }
+}
+
+
+
+BOOL FileExist(LPCTSTR pszFileName)
+{
+ BOOL bExist = FALSE;
+ HANDLE hFile;
+
+ if (NULL != pszFileName)
+ {
+ // Use the preferred Win32 API call and not the older OpenFile.
+ hFile = CreateFile(
+ pszFileName,
+ GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ 0,
+ 0);
+
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ // If the handle is valid then the file exists.
+ CloseHandle(hFile);
+ bExist = TRUE;
+ }
+ }
+
+ return bExist;
+}
+
+//????????????????????????
+typedef struct _IP_MASK_INFO
+{
+ TCHAR ip[IP_ADDRESS_LEN];
+ TCHAR mask[IP_ADDRESS_LEN];
+}IP_MASK_INFO;
+
+typedef struct _GATEWAY_INFO
+{
+ TCHAR gateWay[IP_ADDRESS_LEN];
+}GATEWAY_INFO;
+
+
+typedef struct _ADAPTER_INFO
+{
+ TCHAR mac[MAC_LEN];
+ UINT index;
+ TCHAR name[ADA_NAME_LEN];
+ TCHAR dhcpStatus[DHCP_LEN];
+ TCHAR dns[DNS_COUNT][IP_ADDRESS_LEN];
+ std::vector<IP_MASK_INFO>ipMaskVec;
+ std::vector<GATEWAY_INFO>gateWayVec;
+}ADAPTER_INFO, *PADAPTER_INFO;
+
+typedef struct _ADA_DIFF_INFO
+{
+ INT addOrDel;
+ PADAPTER_INFO adaInfo;
+}ADA_DIFF_INFO, *PADA_DIFF_INFO;
+
+VOID charToTchar (const char * _char, TCHAR * tchar)
+{
+#ifdef UNICODE
+ INT iLength ;
+ iLength = MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, NULL,
0) ;
+ MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, tchar, iLength)
;
+#else
+ //??????????????????
+ strcpy(tchar, _char);
+#endif
+}
+
+TCHAR* ByteToStr(BYTE *pData, INT nCount, TCHAR* pMac)
+{
+ int i = 0;
+
+ for (i = 0; i < nCount; i++){
+ wsprintf(pMac + _tcslen(pMac), _T("%02X-"),pData[i]);
+ }
+
+ pMac[_tcslen(pMac) - 1] = '\0';
+ return pMac;
+}
+
+
+/*ip
????????????????????????IP????????????????????????cmpAdaIpIsEqualWithFile*/
+BOOL cmpStrIsEqual(LPCTSTR srcStr, LPCTSTR dstStr)
+{
+ BOOL ret = TRUE;
+ if (0 != _tcscmp(srcStr, dstStr))
+ {
+ ret = FALSE;
+ }
+ return ret;
+}
+
+/*????:str:str????????????????????*/
+UINT getVauleCountInStr(TCHAR * str)
+{
+ TCHAR *index = NULL;
+ UINT count = 0;
+ index = _tcschr(str, _T(':'));
+
+ //????str????????????
+ while ((index != NULL))
+ {
+ count++;
+ index = _tcschr(&index[1], _T(':'));
+ }
+ return count;
+}
+
+/*??????:192.168.25.111??????192.168.25.11????????????????????????????????????????????????????
+????????????????????????*/
+BOOL checkIpInStr(TCHAR *ipStr, TCHAR *ip)
+{
+ if(0 == _tcslen(ip))
+ return FALSE;
+
+ TCHAR *index = _tcsstr(ipStr, ip);
+ if(NULL == index)
+ return FALSE;
+
+ if(index[_tcslen(ip)] != _T('\0') && index[_tcslen(ip)] != _T(':'))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+
+}
+
+
+/*??????????????IP????????????????????????????????????ipStrFile??????:ip1:ip2????????????
+??????????????????????????????????????????*/
+BOOL cmpAdaIpIsEqualIpStr(ADAPTER_INFO *pAda, TCHAR * ipStr)
+{
+
+ //????ip??????????????????????????
+ if (pAda->ipMaskVec.size() != getVauleCountInStr(ipStr))
+ {
+ return FALSE;
+ }
+
+ //??????????????????????????????????????????????????????????????
+ if(!pAda->ipMaskVec.empty())
+ {
+ for(std::vector<IP_MASK_INFO>::iterator
iter=pAda->ipMaskVec.begin(); iter!=pAda->ipMaskVec.end(); iter++)
+ {
+ if(!checkIpInStr(ipStr, (*iter).ip))
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+BOOL cmpAdaMaskIsEqualMaskStr(ADAPTER_INFO *pAda, TCHAR * maskStr)
+{
+ //????mask??????????????????????????
+ if (pAda->ipMaskVec.size() != getVauleCountInStr(maskStr))
+ {
+ return FALSE;
+ }
+
+ //??????????????????????????????????????????????????????????????
+ if(!pAda->ipMaskVec.empty())
+ {
+ for(std::vector<IP_MASK_INFO>::iterator
iter=pAda->ipMaskVec.begin(); iter!=pAda->ipMaskVec.end(); iter++)
+ {
+ if(!checkIpInStr(maskStr, (*iter).mask))
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+BOOL cmpAdaDnsEqualDnsStr(ADAPTER_INFO *pAda, TCHAR * dnsStr)
+{
+ //????mask??????????????????????????
+ UINT count = 0;
+ for(UINT i = 0; i < DNS_COUNT; i++)
+ {
+ if(_tcslen(pAda->dns[i]) != 0)
+ {
+ count++;
+ }
+
+ }
+
+ if (count != getVauleCountInStr(dnsStr))
+ {
+ return FALSE;
+ }
+
+ //??????????????????????????????????????????????????????????????
+ if(count != 0)
+ {
+ for(UINT i = 0; i < count; i++)
+ {
+ if(_tcslen(pAda->dns[i]) != 0)
+ {
+ if(!checkIpInStr(dnsStr, pAda->dns[i]))
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+inline BOOL cmpAdaGateWayIsEqualMaskStr(ADAPTER_INFO *pAda, TCHAR * gateWayStr)
+{
+ //????mask??????????????????????????
+ if (pAda->gateWayVec.size() != getVauleCountInStr(gateWayStr))
+ {
+ return FALSE;
+ }
+
+ //??????????????????????????????????????????????????????????????
+ if(!pAda->gateWayVec.empty())
+ {
+ for(std::vector<GATEWAY_INFO>::iterator
iter=pAda->gateWayVec.begin(); iter!=pAda->gateWayVec.end(); iter++)
+ {
+ if(!checkIpInStr(gateWayStr, (*iter).gateWay))
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+BOOL isNullIp(TCHAR * ip)
+{
+ if ((_tcslen(ip) == 0) || cmpStrIsEqual(ip, _T("0.0.0.0")) || (0 ==
_tcsncmp(ip, DHCP_IP, _tcslen(DHCP_IP))))
+ return TRUE;
+
+ return FALSE;
+}
+
+TCHAR *getMacStrFromAda(PIP_ADAPTER_INFO pAda, TCHAR *macBuff)
+{
+ return ByteToStr(pAda->Address, pAda->AddressLength, &macBuff[0]);
+}
+
+//0 ??????
+UINT getDhcpStatusFromAda(PIP_ADAPTER_INFO pAda, TCHAR *dhcpBuff)
+{
+ if(dhcpBuff != NULL)
+ {
+ if(0 == pAda->DhcpEnabled)
+ {
+ _tcsncpy(dhcpBuff, DHCP_OFF, DHCP_LEN);
+ }
+ else
+ {
+ _tcsncpy(dhcpBuff, DHCP_ON, DHCP_LEN);
+ }
+
+ }
+ return pAda->DhcpEnabled;
+}
+
+DWORD readDhcpStatusFromFileByMac(LPCTSTR lpMac, LPCTSTR lpFileName, TCHAR*
lpDhcpStatus)
+{
+ return GetPrivateProfileString(lpMac, DHCP_KEY, _T(""), lpDhcpStatus,
DHCP_LEN, lpFileName);
+}
+
+VOID writeDhcpStatusToFileByMac(LPCTSTR dpchStatus, LPCTSTR lpMac, LPCTSTR
lpFileName, TCHAR *logBuff)
+{
+ WritePrivateProfileString(lpMac, DHCP_KEY, dpchStatus, lpFileName);
+ if(logBuff != NULL)
+ {
+ _tcsncpy(logBuff, dpchStatus, DHCP_LEN);
+ }
+}
+/*
+TCHAR *getIpStrFromAda(PIP_ADAPTER_INFO pAda, TCHAR *ipBuff)
+{
+ IP_ADDR_STRING *pIpAddr = &pAda->IpAddressList;
+ TCHAR tmpStr[IP_ADDRESS_LEN] = {0};
+ INT count = 0;
+ while(NULL != pIpAddr)
+ {
+ charToTchar(pIpAddr->IpAddress.String, tmpStr);
+ if(!isNullIp(tmpStr))
+ {
+ if (++count > MAX_IP_COUNT)
+ break;
+ wsprintf(ipBuff + _tcslen(ipBuff), _T(":%s"),tmpStr);
+ }
+ pIpAddr = pIpAddr->Next;
+ }
+ return ipBuff;
+}
+*/
+DWORD readIpStrFromFileByMac(LPCTSTR lpMac, LPCTSTR lpFileName, TCHAR* lpIpStr)
+{
+ return GetPrivateProfileString(lpMac, IP_KEY, _T(""), lpIpStr, IP_STR_LEN,
lpFileName);
+}
+
+
+VOID writeIpStrToFileByMac(std::vector<IP_MASK_INFO> &ipMaskVec, LPCTSTR
lpMac, LPCTSTR lpFileName, TCHAR *logBuff)
+{
+ TCHAR ipBuff[IP_STR_LEN] = {0};
+ if(ipMaskVec.size() != 0)
+ {
+ for(std::vector<IP_MASK_INFO>::iterator iter=ipMaskVec.begin();
iter!=ipMaskVec.end(); iter++)
+ {
+ wsprintf(ipBuff + _tcslen(ipBuff), _T(":%s"),
(*iter).ip);
+ }
+ WritePrivateProfileString(lpMac, IP_KEY, ipBuff, lpFileName);
+ if(logBuff != NULL)
+ {
+ _tcsncpy(logBuff, ipBuff, IP_STR_LEN);
+ }
+ }
+}
+
+/*
+TCHAR *getMaskStrFromAda(PIP_ADAPTER_INFO pAda, TCHAR *maskBuff)
+{
+ IP_ADDR_STRING *pMaskAddr = &pAda->IpAddressList;
+ TCHAR tmpStr[IP_ADDRESS_LEN] = {0};
+ INT count = 0;
+ while(NULL != pMaskAddr)
+ {
+ charToTchar(pMaskAddr->IpMask.String, tmpStr);
+ if(!isNullIp(tmpStr))
+ {
+ if (++count > MAX_IP_COUNT)
+ break;
+ wsprintf(maskBuff + _tcslen(maskBuff), _T(":%s"),
tmpStr);
+ }
+ pMaskAddr = pMaskAddr->Next;
+ }
+ return maskBuff;
+}
+*/
+
+DWORD readMaskStrFromFileByMac(LPCTSTR lpMac, LPCTSTR lpFileName, TCHAR*
lpMaskStr)
+{
+ return GetPrivateProfileString(lpMac, MASK_KEY, _T(""), lpMaskStr,
MASK_STR_LEN, lpFileName);
+}
+
+VOID writeMaskStrToFileByMac(std::vector<IP_MASK_INFO> &ipMaskVec, LPCTSTR
lpMac, LPCTSTR lpFileName, TCHAR *logBuff)
+{
+ TCHAR maskBuff[MASK_STR_LEN]={0};
+ if(ipMaskVec.size() != 0)
+ {
+ for(std::vector<IP_MASK_INFO>::iterator iter=ipMaskVec.begin();
iter!=ipMaskVec.end(); iter++)
+ {
+ wsprintf(maskBuff + _tcslen(maskBuff), _T(":%s"),
(*iter).mask);
+ }
+ WritePrivateProfileString(lpMac, MASK_KEY, maskBuff,
lpFileName);
+ if(logBuff != NULL)
+ {
+ _tcsncpy(logBuff,maskBuff, MASK_STR_LEN);
+ }
+ }
+}
+/*
+TCHAR *getGateWayStrFromAda(PIP_ADAPTER_INFO pAda, TCHAR *gateWayBuff)
+{
+ IP_ADDR_STRING *pGateWayAddr = &pAda->GatewayList;
+ TCHAR tmpStr[IP_ADDRESS_LEN] = {0};
+ INT count = 0;
+ while(NULL != pGateWayAddr)
+ {
+ charToTchar(pGateWayAddr->IpAddress.String, tmpStr);
+ if(!isNullIp(tmpStr))
+ {
+ if (++count > MAX_IP_COUNT)
+ break;
+ wsprintf(gateWayBuff + _tcslen(gateWayBuff), _T(":%s"),
tmpStr);
+ }
+ pGateWayAddr = pGateWayAddr->Next;
+ }
+ return gateWayBuff;
+}
+*/
+DWORD readGateWayStrFromFileByMac(LPCTSTR lpMac, LPCTSTR lpFileName, TCHAR*
lpGateWayStr)
+{
+ return GetPrivateProfileString(lpMac, GATEWAY_KEY, _T(""), lpGateWayStr,
GATE_STR_LEN, lpFileName);
+}
+
+VOID writeGateWayStrToFileByMac(std::vector<GATEWAY_INFO> &gateWayVec, LPCTSTR
lpMac, LPCTSTR lpFileName, TCHAR *logBuff)
+{
+ TCHAR gateWayBuff[GATE_STR_LEN] = {0};
+ if(gateWayVec.size() != 0 )
+ {
+ for(std::vector<GATEWAY_INFO>::iterator
iter=gateWayVec.begin(); iter!=gateWayVec.end(); iter++)
+ {
+ wsprintf(gateWayBuff + _tcslen(gateWayBuff), _T(":%s"),
(*iter).gateWay);
+ }
+ WritePrivateProfileString(lpMac, GATEWAY_KEY, gateWayBuff,
lpFileName);
+ if(logBuff != NULL)
+ {
+ _tcsncpy(logBuff,gateWayBuff, GATE_STR_LEN);
+ }
+ }else{
+ /*????????????GATEWAY??????????????????GATEWAY????*/
+ WritePrivateProfileString(lpMac, GATEWAY_KEY, NULL, lpFileName);
+ }
+}
+
+DWORD readDnsStrFromFileByMac(LPCTSTR lpMac, LPCTSTR lpFileName, TCHAR* lpDns)
+{
+ return GetPrivateProfileString(lpMac, DNS_KEY, _T(""), lpDns,
DNS_STR_LEN, lpFileName);
+}
+
+/*??????????????????????DSN????????????;??IP????????????????????????????????????*/
+VOID writeDnsStrToFileByMac(TCHAR dns[][IP_ADDRESS_LEN], LPCTSTR lpMac,
LPCTSTR lpFileName, TCHAR *logBuff)
+{
+ TCHAR dnsBuff[DNS_STR_LEN] = {0};
+
+ if (_tcslen(dns[0]) != 0)
+ {
+ for(int i = 0; i < DNS_COUNT; i++)
+ {
+ if (_tcslen(dns[i]) != 0)
+ {
+ wsprintf(dnsBuff + _tcslen(dnsBuff), _T(":%s"),
dns[i]);
+ }
+ }
+ WritePrivateProfileString(lpMac, DNS_KEY, dnsBuff, lpFileName);
+ if(logBuff != NULL)
+ {
+ _tcsncpy(logBuff, dnsBuff, DNS_STR_LEN);
+ }
+ }else{
+ /*????????????DNS??????????????????DNS????*/
+ WritePrivateProfileString(lpMac, DNS_KEY, NULL, lpFileName);
+ }
+
+}
+/*ADAPTER_INFO??????IP??????????????????????????????????????????????*/
+DWORD getIpFromAdaInfo(ADAPTER_INFO * pAdaInfo, TCHAR *ipBuff)
+{
+ INT count = 0;
+ if(pAdaInfo->ipMaskVec.size() != 0)
+ {
+ for(std::vector<IP_MASK_INFO>::iterator
iter=pAdaInfo->ipMaskVec.begin(); iter!=pAdaInfo->ipMaskVec.end(); iter++)
+ {
+ if (++count > MAX_IP_COUNT)
+ break;
+ wsprintf(ipBuff + _tcslen(ipBuff), _T(":%s"),
(*iter).ip);
+ }
+ return SUCCESS_CODE;
+ }
+
+ return NO_IP_CODE;
+}
+
+VOID getMaskFromAdaInfo(ADAPTER_INFO * pAdaInfo, TCHAR *maskBuff)
+{
+ INT count = 0;
+ if(pAdaInfo->ipMaskVec.size() != 0)
+ {
+ for(std::vector<IP_MASK_INFO>::iterator
iter=pAdaInfo->ipMaskVec.begin(); iter!=pAdaInfo->ipMaskVec.end(); iter++)
+ {
+ if (++count > MAX_IP_COUNT)
+ break;
+ wsprintf(maskBuff + _tcslen(maskBuff), _T(":%s"),
(*iter).mask);
+ }
+ }
+}
+VOID getGateWayFromAdaInfo(ADAPTER_INFO * pAdaInfo, TCHAR *gateWayBuff)
+{
+ INT count = 0;
+ if(pAdaInfo->gateWayVec.size() != 0)
+ {
+ for(std::vector<GATEWAY_INFO>::iterator
iter=pAdaInfo->gateWayVec.begin(); iter!=pAdaInfo->gateWayVec.end(); iter++)
+ {
+ if (++count > MAX_IP_COUNT)
+ break;
+ wsprintf(gateWayBuff + _tcslen(gateWayBuff), _T(":%s"),
(*iter).gateWay);
+ }
+ }
+}
+
+VOID getDnsFromAdaInfo(ADAPTER_INFO * pAdaInfo, TCHAR *dnsBuff)
+{
+ if(_tcslen(pAdaInfo->dns[0]) != 0)
+ {
+ for(int i = 0; i < DNS_COUNT; i++)
+ {
+ if (_tcslen(pAdaInfo->dns[i]) != 0)
+ {
+ wsprintf(dnsBuff + _tcslen(dnsBuff), _T(":%s"),
pAdaInfo->dns[i]);
+ }
+ }
+
+ }
+}
+
+/*??????????????????*/
+BOOL isMacExistInFile(LPCTSTR lpMac, LPCTSTR lpFileName)
+{
+ TCHAR *chSectionNames = g_preMem;
+ TCHAR *pSectionName;
+ int i, j = 0;
+ BOOL ret = FALSE;
+
+ memset(g_preMem, 0, MAX_PREBUFF_LEN*sizeof(TCHAR));
+ GetPrivateProfileSectionNames(chSectionNames, MAX_PREBUFF_LEN,
lpFileName);
+ for(i=0 ;i<MAX_PREBUFF_LEN ;i++,j++)
+ {
+ if(chSectionNames[0]=='\0')
+ break;
+
+ if(chSectionNames[i]=='\0')
+ {
+ pSectionName=&chSectionNames[i-j];
+ j = -1;
+
+ if(cmpStrIsEqual(pSectionName, lpMac))
+ {
+ ret = TRUE;
+ break;
+ }
+
+ if(chSectionNames[i+1]==0)
+ {
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
+VOID freeAdaInfoVec(std::vector<ADAPTER_INFO *> & pAdaInfoVec)
+{
+ if(pAdaInfoVec.size() != 0)
+ {
+ for(std::vector<ADAPTER_INFO *>::iterator
iter=pAdaInfoVec.begin(); iter!=pAdaInfoVec.end(); iter++)
+ {
+ delete((*iter));
+ }
+ }
+}
+
+VOID getAdaDnsInfo (ADAPTER_INFO & pAdapter)
+{
+ IP_PER_ADAPTER_INFO* pPerAdapt = NULL;
+ ULONG ulLen = 0;
+ int err = GetPerAdapterInfo( pAdapter.index, pPerAdapt, &ulLen);
+ if( err == ERROR_BUFFER_OVERFLOW )
+ {
+ pPerAdapt = (IP_PER_ADAPTER_INFO*) malloc(ulLen);
+ err = GetPerAdapterInfo( pAdapter.index, pPerAdapt, &ulLen );
+ if( err == ERROR_SUCCESS )
+ {
+ IP_ADDR_STRING* pNext = &( pPerAdapt->DnsServerList );
+ TCHAR tmpIp[IP_ADDRESS_LEN] = {0};
+
+ if (NULL != pNext)//??????????false
+ {
+ charToTchar(pNext->IpAddress.String, tmpIp);
+
+ if(!isNullIp(tmpIp))
+ {
+ memcpy(pAdapter.dns[0], tmpIp,
sizeof(tmpIp));
+ pNext=pNext->Next;
+ if (NULL != pNext)
+ {
+ memset(tmpIp, 0, sizeof(tmpIp));
+
charToTchar(pNext->IpAddress.String, tmpIp);
+ if(!isNullIp(tmpIp))
+ memcpy(pAdapter.dns[1],
tmpIp, sizeof(tmpIp));
+ }
+ }
+ }
+ }
+ }
+
+ if(pPerAdapt)
+ free(pPerAdapt);
+}
+
+DWORD GetNicInfo(std::vector<ADAPTER_INFO *> & ppAdaInfo)
+{
+ PIP_ADAPTER_INFO pAdapterInfo;
+ PIP_ADAPTER_INFO pAdapter = NULL;
+ DWORD dwRetVal = 0;
+ ADAPTER_INFO *tmpAdaInfo = NULL;
+
+ ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
+ pAdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof (IP_ADAPTER_INFO));
+ if (pAdapterInfo == NULL) {
+ LogEvent(_T("[QGA]Error allocating memory needed to call
GetAdaptersinfo"));
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
+ free(pAdapterInfo);
+ pAdapterInfo = (IP_ADAPTER_INFO *) malloc(ulOutBufLen);
+ if (pAdapterInfo == NULL) {
+ LogEvent(_T("[QGA]Error allocating pAdapterInfo needed
to call GetAdaptersinfo"));
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+ }
+
+ if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
+ pAdapter = pAdapterInfo;
+ while (pAdapter) {
+
+ if (pAdapter->Type != MIB_IF_TYPE_ETHERNET) {
+ pAdapter = pAdapter->Next;
+ continue;
+ }
+
+ tmpAdaInfo = new ADAPTER_INFO();
+ if (tmpAdaInfo == NULL) {
+ LogEvent(_T("[QGA]Error allocating tmpAdaInfo needed to
call GetAdaptersinfo"));
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ }
+
+ memset(tmpAdaInfo->mac, 0, sizeof(tmpAdaInfo->mac));
+ tmpAdaInfo->index = 0;
+ memset(tmpAdaInfo->dhcpStatus, 0,
sizeof(tmpAdaInfo->dhcpStatus));
+ getMacStrFromAda(pAdapter, tmpAdaInfo->mac);
+ getDhcpStatusFromAda(pAdapter, tmpAdaInfo->dhcpStatus);
+ tmpAdaInfo->index = pAdapter->Index;
+ charToTchar(pAdapter->AdapterName, tmpAdaInfo->name);
+
+ memset(tmpAdaInfo->dns[0], 0,
sizeof(tmpAdaInfo->dns[0]));
+ memset(tmpAdaInfo->dns[1], 0,
sizeof(tmpAdaInfo->dns[1]));
+
+ //????IP MASK GATEWAY
+ IP_ADDR_STRING *pIpAddr = &pAdapter->IpAddressList;
+ IP_MASK_INFO tmpIpMask;
+ while(NULL != pIpAddr)
+ {
+ memset(tmpIpMask.ip, 0, sizeof(tmpIpMask.ip));
+ memset(tmpIpMask.mask, 0,
sizeof(tmpIpMask.mask));
+ charToTchar(pIpAddr->IpAddress.String,
tmpIpMask.ip);
+ charToTchar(pIpAddr->IpMask.String,
tmpIpMask.mask);
+ if(!isNullIp(tmpIpMask.ip) &&
!isNullIp(tmpIpMask.mask))
+ {
+
(tmpAdaInfo->ipMaskVec).push_back(tmpIpMask);
+ }
+ pIpAddr = pIpAddr->Next;
+ }
+
+ IP_ADDR_STRING *pGateWayAddr = &pAdapter->GatewayList;
+ GATEWAY_INFO tmpGateWay;
+ while(NULL != pGateWayAddr)
+ {
+ memset(tmpGateWay.gateWay, 0,
sizeof(tmpGateWay.gateWay));
+ charToTchar(pGateWayAddr->IpAddress.String,
tmpGateWay.gateWay);
+ if(!isNullIp(tmpGateWay.gateWay))
+ {
+
(*tmpAdaInfo).gateWayVec.push_back(tmpGateWay);
+ }
+ pGateWayAddr = pGateWayAddr->Next;
+ }
+
+ //dns
+ getAdaDnsInfo((*tmpAdaInfo));
+
+ ppAdaInfo.push_back(tmpAdaInfo);
+ pAdapter = pAdapter->Next;
+ }
+ } else {
+ if(ERROR_NO_DATA != dwRetVal)
+ LogEvent(_T("GetAdaptersInfo failed with error: %d\n"),
dwRetVal);
+ }
+ if (pAdapterInfo)
+ free(pAdapterInfo);
+
+ return ERROR_SUCCESS;
+}
+
+BOOL cmpDnsInfoIsEqualWithFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ TCHAR dnsFileBuff[DNS_STR_LEN] = {0};
+
+ readDnsStrFromFileByMac(pAdaInfo->mac, pIniPath, dnsFileBuff);
+ if(!cmpAdaDnsEqualDnsStr(pAdaInfo, dnsFileBuff))
+ return FALSE;
+
+ return TRUE;
+
+}
+BOOL cmpIpInfoIsEqualWithFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ TCHAR ipFileBuff[IP_STR_LEN] = {0};
+ TCHAR maskFileBuff[MASK_STR_LEN] = {0};
+ TCHAR gateWayFileBuff[GATE_STR_LEN] = {0};
+
+
+ readIpStrFromFileByMac(pAdaInfo->mac, pIniPath, ipFileBuff);
+ if(!cmpAdaIpIsEqualIpStr(pAdaInfo, ipFileBuff))
+ return FALSE;
+
+ readMaskStrFromFileByMac(pAdaInfo->mac, pIniPath, maskFileBuff);
+ if(!cmpAdaMaskIsEqualMaskStr(pAdaInfo, maskFileBuff))
+ return FALSE;
+
+ readGateWayStrFromFileByMac(pAdaInfo->mac, pIniPath, gateWayFileBuff);
+ if(!cmpAdaGateWayIsEqualMaskStr(pAdaInfo, gateWayFileBuff))
+ return FALSE;
+
+ return TRUE;
+
+}
+//??????????????????????
+VOID saveAdaIpToFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ TCHAR logDhcpBuff[DHCP_LEN] = {0};
+ TCHAR logIpBuff[IP_STR_LEN] = {0};
+ TCHAR logMaskBuff[MASK_STR_LEN] = {0};
+ TCHAR logGateWayBuff[GATE_STR_LEN] = {0};
+
+ writeDhcpStatusToFileByMac(pAdaInfo->dhcpStatus, pAdaInfo->mac, pIniPath,
logDhcpBuff);
+
+ //??????????DHCP????????????IP??????????DHCP??????ini????
+ if(cmpStrIsEqual(pAdaInfo->dhcpStatus, DHCP_ON))
+ {
+ LogEvent(_T("[QGA]save mac:%s dhcp:%s to file"),
pAdaInfo->mac, logDhcpBuff);
+ return;
+ }
+ writeIpStrToFileByMac(pAdaInfo->ipMaskVec, pAdaInfo->mac, pIniPath,
logIpBuff);
+ writeMaskStrToFileByMac(pAdaInfo->ipMaskVec, pAdaInfo->mac, pIniPath,
logMaskBuff);
+ writeGateWayStrToFileByMac(pAdaInfo->gateWayVec, pAdaInfo->mac, pIniPath,
logGateWayBuff);
+
+ LogEvent(_T("[QGA]save mac:%s dhcp:%s ip:%s mask %s gateway %s to file"),
pAdaInfo->mac, logDhcpBuff, logIpBuff, logMaskBuff, logGateWayBuff);
+
+}
+
+//????????????DNS??????????
+VOID saveAdaDnsToFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+
+ TCHAR logDnsBuff[DNS_STR_LEN] = {0};
+
+ if(!cmpDnsInfoIsEqualWithFile(pAdaInfo, pIniPath))
+ writeDnsStrToFileByMac(pAdaInfo->dns, pAdaInfo->mac, pIniPath,
logDnsBuff);
+
+ LogEvent(_T("[QGA]save mac:%s dns:%s to file"), pAdaInfo->mac,
logDnsBuff);
+
+}
+VOID saveAdaIpDnsToFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ saveAdaIpToFile(pAdaInfo, pIniPath);
+ saveAdaDnsToFile(pAdaInfo, pIniPath);
+}
+//????????MAC??IP DNS??????config.ini
+VOID saveNicInfo(std::vector<ADAPTER_INFO *> &pNicInfoVec, TCHAR *pIniPath)
+{
+ LogEvent(_T("[QGA]save nic config info start."));
+ if(pNicInfoVec.size() != 0)
+ {
+ for(std::vector<ADAPTER_INFO *>::iterator
iter=pNicInfoVec.begin(); iter!=pNicInfoVec.end(); iter++)
+ {
+ saveAdaIpDnsToFile((*iter), pIniPath);
+ }
+ }
+ LogEvent(_T("[QGA]save nic config info end."));
+}
+
+VOID setAdaIpFromDhcp(ADAPTER_INFO * pAdaInfo)
+{
+ TCHAR cmd[MAX_PATH] = {0};
+
+ if(g_VistaOrLater)
+ {
+ wsprintf(cmd, _T("netsh interface ip set address name=\"%d\"
source=dhcp"), pAdaInfo->index);
+ }
+ else
+ {
+ wsprintf(cmd, _T("netsh interface ip set address name=\"%s\"
source=dhcp"), pAdaInfo->name);
+ }
+ _tsystem(cmd);
+ LogEvent(_T("[QGA] exec mac %s cmd %s"), pAdaInfo->mac, cmd);
+}
+
+VOID setAdaDnsFromDhcp(ADAPTER_INFO * pAdaInfo)
+{
+ TCHAR cmd[MAX_PATH] = {0};
+
+ if(g_VistaOrLater)
+ {
+ wsprintf(cmd, _T("netsh interface ip set dns name=\"%d\"
source=dhcp"), pAdaInfo->index);
+ }
+ else
+ {
+ wsprintf(cmd, _T("netsh interface ip set dns name=\"%s\"
source=dhcp"), pAdaInfo->name);
+ }
+ _tsystem(cmd);
+ LogEvent(_T("[QGA] exec mac %s cmd %s"), pAdaInfo->mac, cmd);
+}
+
+VOID setAdaIpDnsFromDhcpSyncFile(ADAPTER_INFO * pAdaInfo)
+{
+ setAdaIpFromDhcp(pAdaInfo);
+ //????????????????DHCP????????????
+ writeDhcpStatusToFileByMac(DHCP_ON, pAdaInfo->mac, g_configPath, NULL);
+
+ setAdaDnsFromDhcp(pAdaInfo);
+ writeDnsStrToFileByMac(pAdaInfo->dns, pAdaInfo->mac, g_configPath,
NULL);
+
+
+}
+VOID createDnsCmd(ADAPTER_INFO * pAdaInfo, LPCTSTR dns, BOOL first, TCHAR *cmd)
+{
+ if(g_VistaOrLater)
+ {
+ wsprintf(cmd,
+ _T("netsh interface ip %s dns name=\"%d\" %s %s=%s %s"),
+ first ? _T("set") : _T("add"),
+ pAdaInfo->index,
+ first ? _T("source=static") : _T(""),
+ g_VistaOrLater ? _T("address") : _T("addr"),
+ dns,
+ g_VistaOrLater ? _T("validate = no") : _T(""));
+ }
+ else //only for xp
+ {
+ wsprintf(cmd,
+ _T("netsh interface ip %s dns name=\"%s\" %s %s=%s %s"),
+ first ? _T("set") : _T("add"),
+ pAdaInfo->name,
+ first ? _T("source=static") : _T(""),
+ g_VistaOrLater ? _T("address") : _T("addr"),
+ dns,
+ g_VistaOrLater ? _T("validate = no") : _T(""));
+ }
+ LogEvent(_T("[QGA] exec mac %s cmd %s"), pAdaInfo->mac, cmd);
+}
+VOID setAdaDnsFromStr(ADAPTER_INFO * pAdaInfo, TCHAR *dnsBuff)
+{
+ TCHAR *dns = NULL;
+ TCHAR *dnsNext = NULL;
+ BOOL first = TRUE;
+ TCHAR cmd[MAX_PATH];
+
+
+ dns = _tcschr(dnsBuff, _T(':'));
+
+ while ((dns != NULL))
+ {
+ dnsNext = _tcschr(&dns[1], _T(':'));
+ if(dnsNext)
+ *dnsNext = 0;
+ createDnsCmd(pAdaInfo, &dns[1], first, cmd);
+ _tsystem(cmd);
+ first = FALSE;
+ dns = dnsNext;
+ }
+}
+/*??????????DNS*/
+VOID setAdaDnsFromFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ TCHAR dnsFileBuff[DNS_STR_LEN] = {0};
+
+ readDnsStrFromFileByMac(pAdaInfo->mac, pIniPath, dnsFileBuff);
+
+ //????????????????dns????????dhcp????dns??????
+ if(isNullIp(dnsFileBuff))
+ {
+ LogEvent(_T("[QGA]restore dns in file is null, set MAC %s dns
form dhcp."), pAdaInfo->mac);
+ setAdaDnsFromDhcp(pAdaInfo);
+ return;
+ }
+ else
+ {
+ //??????DNS????????????????????????????????????????
+ LogEvent(_T("[QGA]set MAC %s dns %s ."), pAdaInfo->mac,
dnsFileBuff);
+ setAdaDnsFromStr(pAdaInfo, dnsFileBuff);
+ }
+}
+
+VOID setOSversion(VOID)
+{
+ OSVERSIONINFO osvi;
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&osvi);
+ g_VistaOrLater = (osvi.dwMajorVersion >= 6);
+}
+
+//??????XP??????????XP
+VOID createIpCmd(ADAPTER_INFO * pAdaInfo, LPCTSTR ip, LPCTSTR mask, BOOL
first, TCHAR *cmd)
+{
+ if(g_VistaOrLater)
+ {
+ wsprintf(cmd,
+ _T("netsh interface ip %s address name=\"%d\" %s %s=%s
mask=%s"),
+ first ? _T("set") : _T("add"),
+ pAdaInfo->index,
+ first ? _T("source=static") : _T(""),
+ g_VistaOrLater ? _T("address") : _T("addr"),
+ ip,
+ mask);
+ }
+ else //only for xp
+ {
+ wsprintf(cmd,
+ _T("netsh interface ip %s address name=\"%s\" %s %s=%s
mask=%s"),
+ first ? _T("set") : _T("add"),
+ pAdaInfo->name,
+ first ? _T("source=static") : _T(""),
+ g_VistaOrLater ? _T("address") : _T("addr"),
+ ip,
+ mask);
+ }
+ LogEvent(_T("[QGA] exec mac %s cmd %s"), pAdaInfo->mac, cmd);
+}
+//gwmetric==0????????????????????????????????????????
+VOID createGateWayCmd(ADAPTER_INFO * pAdaInfo, LPCTSTR gateWay, TCHAR *cmd)
+{
+ if(g_VistaOrLater)
+ {
+ wsprintf(cmd,
+ _T("netsh interface ip add address name=\"%d\"
gateway=%s gwmetric=0"),
+ pAdaInfo->index,
+ gateWay);
+ }
+ else
+ {
+ wsprintf(cmd,
+ _T("netsh interface ip add address name=\"%s\"
gateway=%s gwmetric=0"),
+ pAdaInfo->name,
+ gateWay);
+ }
+}
+
+//??????????????????:??????????????????
+VOID setAdaIpFromStr(ADAPTER_INFO * pAdaInfo, TCHAR * ipBuff, TCHAR *
maskBuff, TCHAR * gateWay)
+{
+ TCHAR *ip = NULL;
+ TCHAR *mask = NULL;
+ TCHAR *gate = NULL;
+
+ TCHAR *ipNext = NULL;
+ TCHAR *maskNext = NULL;
+ TCHAR *gateNext = NULL;
+
+ BOOL first = TRUE;
+ TCHAR cmd[MAX_PATH];
+
+ ip = _tcschr(ipBuff, _T(':'));
+ mask = _tcschr(maskBuff, _T(':'));
+ gate = _tcschr(gateWay, _T(':'));
+
+ while ((ip != NULL) && (mask != NULL))
+ {
+ ipNext = _tcschr(&ip[1], _T(':'));
+ if(ipNext)
+ *ipNext = 0;
+ maskNext = _tcschr(&mask[1], _T(':'));
+ if(maskNext)
+ *maskNext = 0;
+
+ createIpCmd(pAdaInfo, &ip[1], &mask[1] , first, cmd);
+ _tsystem(cmd);
+ first = FALSE;
+
+ ip = ipNext;
+ mask = maskNext;
+ }
+
+
+ while ((gate != NULL))
+ {
+ gateNext = _tcschr(&gate[1], _T(':'));
+ if(gateNext)
+ *gateNext = 0;
+
+ createGateWayCmd(pAdaInfo, &gate[1], cmd);
+ _tsystem(cmd);
+
+ gate = gateNext;
+ }
+}
+
+VOID setAdaIpFromFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ TCHAR dhcpBuff[DHCP_LEN] = {0};
+ TCHAR ipBuff[IP_STR_LEN] = {0};
+ TCHAR maskBuff[MASK_STR_LEN] = {0};
+ TCHAR gateWay[GATE_STR_LEN] = {0};
+
+ readDhcpStatusFromFileByMac(pAdaInfo->mac, pIniPath, dhcpBuff);
+
+ //??????????DHCP??????????DHCP????????IP
+ if(cmpStrIsEqual(dhcpBuff, DHCP_ON))
+ {
+ LogEvent(_T("[QGA]set MAC %s ip form dhcp."), pAdaInfo->mac);
+ setAdaIpFromDhcp(pAdaInfo);
+ return;
+ }
+
+ //????????????????IP MASK GATEWAY????????????
+ readIpStrFromFileByMac(pAdaInfo->mac, pIniPath, ipBuff);
+
+ /*????????????IP????IP??????????DHCP????????169??IP??????*/
+ if(isNullIp(ipBuff))
+ {
+ LogEvent(_T("[QGA]restore ip in file is null, set MAC %s ip
form dhcp."), pAdaInfo->mac);
+ setAdaIpFromDhcp(pAdaInfo);
+ writeDhcpStatusToFileByMac(DHCP_ON, pAdaInfo->mac, pIniPath,
NULL);
+ }
+ else
+ {
+ readMaskStrFromFileByMac(pAdaInfo->mac, pIniPath, maskBuff);
+ readGateWayStrFromFileByMac(pAdaInfo->mac, pIniPath, gateWay);
+ LogEvent(_T("[QGA]set MAC %s ip %s netmask %s gateway %s."),
pAdaInfo->mac, ipBuff, maskBuff, gateWay);
+ setAdaIpFromStr(pAdaInfo, ipBuff, maskBuff, gateWay);
+ }
+
+}
+
+//??????????????????????????????IP??????????????????????????????
+BOOL checkIpConflict(ADAPTER_INFO * pAdaInfo, TCHAR *ipStr)
+{
+
+ DWORD dwRet;
+ std::vector<ADAPTER_INFO *> pAdaInfoVect;
+
+ if(isNullIp(ipStr))
+ return FALSE;
+
+ //??????????????????????IP????
+ if ((dwRet = GetNicInfo(pAdaInfoVect)) != ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA]cannot get nic info."));
+ return dwRet;
+ }
+
+ if(pAdaInfoVect.size() != 0)
+ {
+ for(std::vector<ADAPTER_INFO*>::iterator
iter=pAdaInfoVect.begin(); iter!=pAdaInfoVect.end(); iter++)
+ {
+ //????????????????????????
+ if((*iter)->index == pAdaInfo->index)
+ continue;
+
+ if((*iter)->ipMaskVec.size() != 0)
+ {
+ for(std::vector<IP_MASK_INFO>::iterator
iter1=(*iter)->ipMaskVec.begin(); iter1!=(*iter)->ipMaskVec.end(); iter1++)
+ {
+ if(checkIpInStr(ipStr, (*iter1).ip))
+ {
+ LogEvent(_T("[QGA] mac %s want
restore or inherit ip %s , but conflict with mac %s "), pAdaInfo->mac, ipStr,
(*iter)->mac);
+ freeAdaInfoVec(pAdaInfoVect);
+ return TRUE;
+ }
+ }
+ }
+ }
+ }
+ freeAdaInfoVec(pAdaInfoVect);
+ return FALSE;
+}
+DWORD updateAdaFromFile(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ TCHAR ipFileBuff[IP_STR_LEN] = {0};
+ TCHAR dhcpFileBuff[DHCP_LEN] = {0};
+ DWORD ret = SUCCESS_CODE;
+
+ do{
+ readDhcpStatusFromFileByMac(pAdaInfo->mac, pIniPath, dhcpFileBuff);
+
+ //??????????DHCP??????IP??????????????IP
+ if(cmpStrIsEqual(pAdaInfo->dhcpStatus, DHCP_ON) &&
cmpStrIsEqual(dhcpFileBuff, DHCP_ON)){
+ //????DNS??????????????DNS??????
+ if(!cmpDnsInfoIsEqualWithFile(pAdaInfo, pIniPath))
+ setAdaDnsFromFile(pAdaInfo, pIniPath);
+ break;
+ }
+
+ readIpStrFromFileByMac(pAdaInfo->mac, pIniPath, ipFileBuff);
+
+ //ip ????????????????????
+ if(!cmpIpInfoIsEqualWithFile(pAdaInfo,pIniPath)){
+ if(!checkIpConflict(pAdaInfo, ipFileBuff)){
+ setAdaIpFromFile(pAdaInfo, pIniPath);
+ }else{
+ ret = CONFLICT_CODE;
+ break;
+ }
+ }
+
+ //dns??????????DNS????????
+ if(!cmpDnsInfoIsEqualWithFile(pAdaInfo, pIniPath))
+ setAdaDnsFromFile(pAdaInfo, pIniPath);
+ }while(0);
+
+ return ret;
+}
+
+DWORD updateNicInfo(std::vector<ADAPTER_INFO *> &pNicInfoVec, TCHAR *pIniPath)
+{
+ TCHAR ipFileBuff[IP_STR_LEN] = { 0 };
+ std::vector<ADAPTER_INFO *> infoList;
+ DWORD ret = SUCCESS_CODE;
+
+ if(pNicInfoVec.size() != 0)
+ {
+ for(std::vector<ADAPTER_INFO *>::iterator
iter=pNicInfoVec.begin(); iter!=pNicInfoVec.end(); iter++)
+ {
+ if(isMacExistInFile((*iter)->mac, pIniPath))
+ {
+ //IP????
+ if(CONFLICT_CODE == updateAdaFromFile(*iter,
pIniPath))
+ {
+ setAdaIpFromDhcp((*iter));
+ infoList.push_back(*iter);
+ LogEvent(_T("[QGA] mac %s restore ip
conflict, insert to list"),(*iter)->mac);
+ continue;
+ }
+ }
+ else
+ {
+ saveAdaIpDnsToFile(*iter, pIniPath);
+ }
+ }
+
+ if(infoList.size() != 0)
+ {
+
//??????????????????????????IP????????????????????????????????IP??????????
+ for(std::vector<ADAPTER_INFO *>::iterator
iter=infoList.begin(); iter!=infoList.end(); iter++)
+ {
+ readIpStrFromFileByMac((*iter)->mac, pIniPath,
ipFileBuff);
+ if(!checkIpConflict((*iter), ipFileBuff))
+ {
+ setAdaIpFromFile((*iter), pIniPath);
+ //dns??????????DNS????????
+ if(!cmpDnsInfoIsEqualWithFile((*iter),
pIniPath))
+ setAdaDnsFromFile((*iter),
pIniPath);
+ }
+ else
+ {
+ ret = CONFLICT_CODE;
+ LogEvent(_T("[QGA] mac %s can not
restore ip, because conflict"),(*iter)->mac);
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+
+DWORD restoreNicIp(std::vector<ADAPTER_INFO *> &pAdaInfoVect)
+{
+ DWORD ret = SUCCESS_CODE;
+
+ if (FileExist(g_configPath))
+ {
+ ret = updateNicInfo(pAdaInfoVect, g_configPath);
+ }
+ else
+ {
+ saveNicInfo(pAdaInfoVect, g_configPath);
+ ret = NO_FILE_CODE;
+ }
+
+ return ret ;
+
+}
+/*????IP????????????*/
+DWORD checkRestoreNicIpResult(VOID)
+{
+ DWORD ret = SUCCESS_CODE;
+
+ TCHAR ipFileBuff[IP_STR_LEN] = {0};
+ TCHAR ipAdaBuff[IP_STR_LEN] = {0};
+ TCHAR dhcpFileBuff[DHCP_LEN] = {0};
+ DWORD dwRet;
+
+ std::vector<ADAPTER_INFO *> pAdaInfoVect;
+
+ if ((dwRet = GetNicInfo(pAdaInfoVect)) != ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA]cannot get nic info."));
+ return dwRet;
+ }
+
+ for(std::vector<ADAPTER_INFO *>::iterator iter=pAdaInfoVect.begin();
iter!=pAdaInfoVect.end(); iter++)
+ {
+ if(isMacExistInFile((*iter)->mac, g_configPath))
+ {
+ memset(dhcpFileBuff, 0, sizeof(dhcpFileBuff));
+ readDhcpStatusFromFileByMac((*iter)->mac, g_configPath,
dhcpFileBuff);
+ //??????????????DHCP??????IP??????????????????
+ if(cmpStrIsEqual((*iter)->dhcpStatus, DHCP_ON) &&
cmpStrIsEqual(dhcpFileBuff, DHCP_ON))
+ {
+ //dns??????????DNS????????
+ if(!cmpDnsInfoIsEqualWithFile((*iter),
g_configPath))
+ setAdaDnsFromFile((*iter),
g_configPath);
+ continue;
+ }
+
+
//????????????DHCP??????????????????????DHCP,????????????????????DHCP????????IP
+ if(cmpStrIsEqual((*iter)->dhcpStatus, DHCP_OFF) &&
cmpStrIsEqual(dhcpFileBuff, DHCP_ON))
+ {
+ LogEvent(_T("[QGA] mac %s ip not from dhcp ,but
file is from dhcp, restore ip from dhcp"), (*iter)->mac);
+ setAdaIpFromDhcp(*iter);
+ //dns??????????DNS????????
+ if(!cmpDnsInfoIsEqualWithFile((*iter),
g_configPath))
+ setAdaDnsFromFile((*iter),
g_configPath);
+ ret = ERROR_CODE;
+ continue;
+ }
+
+ //????????????DHCP????????IP????DHCP,??????????????
+ if(cmpStrIsEqual((*iter)->dhcpStatus, DHCP_ON) &&
cmpStrIsEqual(dhcpFileBuff, DHCP_OFF))
+ {
+ LogEvent(_T("[QGA] mac %s ip from dhcp ,but
file is not from dhcp, restore ip from file"), (*iter)->mac);
+ setAdaIpFromFile(*iter, g_configPath);
+ //dns??????????DNS????????
+ if(!cmpDnsInfoIsEqualWithFile((*iter),
g_configPath))
+ setAdaDnsFromFile((*iter),
g_configPath);
+ ret = ERROR_CODE;
+ continue;
+ }
+
+
//????????????DHCP????????IP??????DHCP,????IP??????????????????????
+ if(cmpStrIsEqual((*iter)->dhcpStatus, DHCP_OFF) &&
cmpStrIsEqual(dhcpFileBuff, DHCP_OFF))
+ {
+ memset(ipFileBuff, 0, sizeof(ipFileBuff));
+ readIpStrFromFileByMac((*iter)->mac,
g_configPath, ipFileBuff);
+
+ if(!cmpAdaIpIsEqualIpStr((*iter), ipFileBuff))
+ {
+ memset(ipAdaBuff, 0, sizeof(ipAdaBuff));
+ getIpFromAdaInfo(*iter, ipAdaBuff);
+ LogEvent(_T("[QGA] mac %s ip %s is not
same as file %s, so restore ip from file"), (*iter)->mac, ipAdaBuff,
ipFileBuff);
+ setAdaIpFromFile(*iter, g_configPath);
+ ret = ERROR_CODE;
+ }
+
+ //dns??????????DNS????????
+ if(!cmpDnsInfoIsEqualWithFile((*iter),
g_configPath))
+ setAdaDnsFromFile((*iter),
g_configPath);
+
+ continue;
+ }
+
+ }
+ }
+ freeAdaInfoVec(pAdaInfoVect);
+ return ret ;
+}
+
+VOID delRecordByMac(LPCTSTR lpMac, TCHAR *pIniPath)
+{
+ WritePrivateProfileString(lpMac, NULL, NULL, pIniPath);
+}
+
+/*??????????????????????????????????:??????????????????
????????????????IP????????????????????????
+IP????????????????????????????????IP??????????????????????????????????????????????????????????????
+MAC????????????????????????????????????????????*/
+VOID clearConflictIpInConfig(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ /*????????????????????????????????????????g_preMem????????????????????*/
+ TCHAR *chSectionNames = g_preMem;
+ TCHAR *pSectionName;
+ TCHAR ipStr[IP_STR_LEN] = {0};
+ int i, j = 0;
+
+ memset(g_preMem, 0, MAX_PREBUFF_LEN*sizeof(TCHAR));
+ GetPrivateProfileSectionNames(chSectionNames, MAX_PREBUFF_LEN,
pIniPath);
+ for(i=0 ;i<MAX_PREBUFF_LEN ;i++,j++)
+ {
+ if(chSectionNames[0]=='\0')
+ break;
+
+ if(chSectionNames[i]=='\0')
+ {
+ pSectionName=&chSectionNames[i-j];
+ j = -1;
+
+ //????????
+ if(cmpStrIsEqual(pSectionName, pAdaInfo->mac))
+ {
+ continue;
+ }
+
+ memset(ipStr, 0, sizeof(ipStr));
+ readIpStrFromFileByMac(pSectionName, pIniPath, ipStr);
+
+ if(!isNullIp(ipStr))
+ {
+ if((pAdaInfo)->ipMaskVec.size() != 0)
+ {
+ for(std::vector<IP_MASK_INFO>::iterator
iter=pAdaInfo->ipMaskVec.begin(); iter!=pAdaInfo->ipMaskVec.end(); iter++)
+ {
+ if(!isNullIp((*iter).ip) &&
checkIpInStr(ipStr, (*iter).ip))
+ {
+ LogEvent(_T("[QGA]
clear mac %s ip %s in ini-file, ip %s already at mac %s"), pSectionName, ipStr,
(*iter).ip, pAdaInfo->mac);
+
WritePrivateProfileString(pSectionName, NULL, NULL, pIniPath);
+
/*????????????????????????????????????????????????*/
+ return;
+ }
+ }
+ }
+ }
+
+
+ if(chSectionNames[i+1]==0)
+ {
+ break;
+ }
+ }
+ }
+}
+
+/*????????saveAdaIpToFile????????????????config.ini????IP??????????????????????*/
+VOID updateFileIpFromAda(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ clearConflictIpInConfig(pAdaInfo, pIniPath);
+ saveAdaIpToFile(pAdaInfo, pIniPath);
+}
+
+VOID updataFileDnsFromAda(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+ saveAdaDnsToFile(pAdaInfo, pIniPath);
+}
+
+DWORD updateFileInfo(ADAPTER_INFO * pAdaInfo, TCHAR *pIniPath)
+{
+
+ TCHAR dhcpFileBuff[DHCP_LEN] = {0};
+ DWORD ret = SUCCESS_CODE;
+ BOOL adaDhcp = FALSE;
+ BOOL fileDhcp = FALSE;
+
+ readDhcpStatusFromFileByMac(pAdaInfo->mac, pIniPath, dhcpFileBuff);
+ fileDhcp = cmpStrIsEqual(dhcpFileBuff, DHCP_ON);
+
+ adaDhcp = cmpStrIsEqual(pAdaInfo->dhcpStatus, DHCP_ON);
+
+
+ if(adaDhcp &&
(!fileDhcp))/*????????DHCP????IP????????????????????????????*/
+ {
+ writeDhcpStatusToFileByMac(DHCP_ON, pAdaInfo->mac, pIniPath,
NULL);
+ LogEvent(_T("[QGA]change file mac %s ip from dhcp "),
pAdaInfo->mac);
+ }
+ else if((!adaDhcp) && fileDhcp)
/*????????????DHCP????????????????????DHCP????,????????*/
+ {
+ updateFileIpFromAda(pAdaInfo, pIniPath);
+ }
+ else
if((!adaDhcp)&&(!fileDhcp))/*????????????DHCP??????????????????????????IP????????????????????????*/
+ {
+
+ //ip mask gateway????????????File????
+ if(!cmpIpInfoIsEqualWithFile(pAdaInfo,pIniPath))
+ updateFileIpFromAda(pAdaInfo, pIniPath);
+ }
+ //else //????????????DHCP????IP??????????????????IP(adaDhcp && fileDhcp)
+ //{
+ //LogEvent(_T("[QGA]mac %s ip and file all from dhcp, do
nothing"), pAdaInfo->mac);
+ //}
+
+
+ //????DNS??????????????file????
+ if(!cmpDnsInfoIsEqualWithFile(pAdaInfo, pIniPath))
+ {
+ updataFileDnsFromAda(pAdaInfo, pIniPath);
+ }
+
+ return ret;
+}
+
+DWORD updateConfigFile(std::vector<ADAPTER_INFO *> &pNicInfoVec, TCHAR
*pIniPath)
+{
+ TCHAR ipBuff[IP_STR_LEN] = { 0 };
+ std::vector<ADAPTER_INFO *> infoList;
+ DWORD ret = SUCCESS_CODE;
+
+ if(pNicInfoVec.size() != 0)
+ {
+ for(std::vector<ADAPTER_INFO *>::iterator
iter=pNicInfoVec.begin(); iter!=pNicInfoVec.end(); iter++)
+ {
+ if(isMacExistInFile((*iter)->mac, pIniPath))
+ {
+ //??????????????????IP????
+ updateFileInfo((*iter), pIniPath);
+ }
+ else
+ {
+
/*??????????????????????????IP??????????????????*/
+ getIpFromAdaInfo(*iter, ipBuff);
+ if(checkIpConflict(*iter, ipBuff))
+ {
+
//??????????????????????????????????????IP??DNS
+ LogEvent(_T("[QGA]new mac %s ip %s
conflict with other nic , set ip dns from dhcp"), (*iter)->mac, ipBuff);
+ setAdaIpDnsFromDhcpSyncFile(*iter);
+ }
+ else
+ {
+
/*????????saveAdaIpDnsToFile????updateFileIpFromAda*/
+ saveAdaIpDnsToFile(*iter, pIniPath);
+ }
+ }
+
+ }
+ }
+ return ret;
+}
+
+VOID setIniFilePath()
+{
+ GetModuleFileName(NULL, g_configPath, sizeof(g_configPath));
+ (_tcsrchr(g_configPath, _T('\\')))[1] = 0;
+ _tcscat(g_configPath, _T("config.ini"));
+ LogEvent(_T("[QAG] ini file %s %d"), g_configPath, MAC_LEN);
+}
+
+DWORD dealConfigFileByAdaInfo(std::vector<ADAPTER_INFO *> & pAdaInfoVect)
+{
+ //DWORD dwRet = 0;
+ DWORD ret = SUCCESS_CODE;
+
+ if (FileExist(g_configPath))
+ {
+ ret = updateConfigFile(pAdaInfoVect, g_configPath);
+ }
+ else
+ {
+ saveNicInfo(pAdaInfoVect, g_configPath);
+ }
+
+ return ret ;
+}
+
+DWORD dealConfigFile(VOID)
+{
+ DWORD dwRet = 0;
+ DWORD ret = SUCCESS_CODE;
+
+ std::vector<ADAPTER_INFO *> pAdaInfoVect;
+
+ if ((dwRet = GetNicInfo(pAdaInfoVect)) != ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA]cannot get nic info."));
+ return dwRet;
+ }
+
+ if (FileExist(g_configPath))
+ {
+ ret = updateConfigFile(pAdaInfoVect, g_configPath);
+ }
+ else
+ {
+ saveNicInfo(pAdaInfoVect, g_configPath);
+ }
+
+ freeAdaInfoVec(pAdaInfoVect);
+
+ return ret ;
+
+}
+
+/*diff ?????? first second ????????????????????????????*/
+VOID diffAdaVect(std::vector<ADAPTER_INFO *> &first, std::vector<ADAPTER_INFO
*> &second, std::vector<ADA_DIFF_INFO> &diff)
+{
+ std::map<INT,ADAPTER_INFO *> first_index;
+ std::map<INT,ADAPTER_INFO *> second_index;
+
+ for(std::vector<ADAPTER_INFO *>::iterator iter=first.begin();
iter!=first.end(); iter++)
+ {
+ first_index[(*iter)->index] = (*iter);
+ }
+
+ for(std::vector<ADAPTER_INFO *>::iterator iter=second.begin();
iter!=second.end(); iter++)
+ {
+ second_index[(*iter)->index] = (*iter);
+ }
+
+ for(std::map<INT, ADAPTER_INFO *>::iterator iter=first_index.begin();
iter!=first_index.end(); iter++)
+ {
+ //??????????????????????????????
+ if (second_index.end() == second_index.find((*iter).first))
+ {
+ ADA_DIFF_INFO tmp ;
+ tmp.addOrDel = DEL_NIC;
+ tmp.adaInfo = (*iter).second;
+ diff.push_back(tmp);
+ }
+ }
+
+ for(std::map<INT, ADAPTER_INFO *>::iterator iter=second_index.begin();
iter!=second_index.end(); iter++)
+ {
+ //????????????????????????????
+ if (first_index.end() == first_index.find((*iter).first))
+ {
+ ADA_DIFF_INFO tmp ;
+ tmp.addOrDel = ADD_NIC;
+ tmp.adaInfo = (*iter).second;
+ diff.push_back(tmp);
+ }
+ }
+
+}
+//????????ID????????????????ip????????????????IP??????????????????????????????????DIFF????????????????????????????????????????
+VOID doIpChangeEvent(std::vector<ADAPTER_INFO *> &currAdaVect)
+{
+ dealConfigFileByAdaInfo(currAdaVect);
+}
+
+VOID doNicChangeEvnet(std::vector<ADA_DIFF_INFO> & diffAdaVect)
+{
+ //????????????????????????
+ for(std::vector<ADA_DIFF_INFO>::iterator iter=diffAdaVect.begin();
iter!=diffAdaVect.end(); iter++)
+ {
+ //????????????
+ if((*iter).addOrDel == DEL_NIC)
+ {
+ delRecordByMac((*iter).adaInfo->mac, g_configPath);
+ LogEvent(_T("[QGA]del mac %s record from config"),
(*iter).adaInfo->mac);
+ }
+ else if((*iter).addOrDel == ADD_NIC) //????????????
+ {
+ //??????????????????????????????????????
+ if(isMacExistInFile((*iter).adaInfo->mac, g_configPath))
+ {
+ //
+ if(CONFLICT_CODE ==
updateAdaFromFile((*iter).adaInfo, g_configPath))
+ {
+
/*????????????IP????????????????????????????DHCP????*/
+ LogEvent(_T("[QGA]new mac %s restore ip
but conflict with other nic , set ip dns from dhcp"), (*iter).adaInfo->mac);
+
setAdaIpDnsFromDhcpSyncFile((*iter).adaInfo);
+ }
+ }
+ else
+ {
+
//??????????????????????????????????????????????IP??????????????????????IP????????????????????????????????
+
/*??????????????????????????IP??????????????????*/
+ TCHAR ipBuff[IP_STR_LEN] = {0};
+ getIpFromAdaInfo((*iter).adaInfo, ipBuff);
+ if(checkIpConflict((*iter).adaInfo, ipBuff))
+ {
+
//??????????????IP????????????????????????IP??DNS
+ LogEvent(_T("[QGA]new mac %s ip %s
conflict with other nic , set ip dns from dhcp"), (*iter).adaInfo->mac, ipBuff);
+
setAdaIpDnsFromDhcpSyncFile((*iter).adaInfo);
+ }
+ else
+ {
+ saveAdaIpDnsToFile((*iter).adaInfo,
g_configPath);
+ }
+ }
+ }
+ }
+}
+
+DWORD WINAPI monitorThread (PVOID pParam)
+{
+ HANDLE hEvent[2];
+ INT nicCount = 0;
+ INT ipCount = 0;
+ INT timeOutCount = 0;
+ BOOL waitAlong = FALSE;
+ DWORD dwRet;
+ INT retryTimes = 0;
+
+ std::vector<ADAPTER_INFO *> * pAdaInfoLastVect = new
std::vector<ADAPTER_INFO *> ();
+
+ if ((dwRet = GetNicInfo(*pAdaInfoLastVect)) != ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA]cannot get nic info."));
+ return dwRet;
+ }
+ //??????????????????????????????????
+ dwRet = restoreNicIp(*pAdaInfoLastVect);
+
+ /*????restoreNicIp????????????????????????????????????????????????????*/
+ if(dwRet != NO_FILE_CODE)
+ {
+ while(retryTimes < RETRY_TIMES)
+ {
+ if(ERROR_SUCCESS == checkRestoreNicIpResult())
+ {
+ break;
+ }
+ Sleep(SLEEP_TIMES);
+ retryTimes++;
+ }
+ }
+
+
+ hEvent[0]= CreateEvent(NULL, FALSE, FALSE, NULL);
+ hEvent[1]= CreateEvent(NULL, FALSE, FALSE, NULL);
+
+ DWORD dwFilter0 = REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATTRIBUTES
| REG_NOTIFY_CHANGE_LAST_SET;
+ DWORD dwFilter1 = REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATTRIBUTES
| REG_NOTIFY_CHANGE_LAST_SET;
+ HKEY hKey[2] = {NULL, NULL};
+
+ LogEvent(_T("[QGA]monitorThread start.\n"));
+
+ //????????
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, NIC_CHANGE, 0, KEY_READ, &hKey[0])
!= ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA][monitorThread]:Open Register failed.\n"));
+ return ERROR_CODE;
+ }
+
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, IP_CHANGE, 0, KEY_READ, &hKey[1])
!= ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA][monitorThread]:Open Register failed.\n"));
+ return ERROR_CODE;
+ }
+
+ //??????????????
+ while (TRUE)
+ {
+
+ if (::RegNotifyChangeKeyValue(hKey[0],
+ TRUE,
+ dwFilter0,
+ hEvent[0],
+ TRUE) != ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA][monitorFileThread]:Watch NIC_CHANGE
failed.\n"));
+ return ERROR_CODE;
+ }
+
+ if (::RegNotifyChangeKeyValue(hKey[1],
+ TRUE,
+ dwFilter1,
+ hEvent[1],
+ TRUE) != ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA][monitorFileThread]:Watch IP_CHANGE
failed.\n"));
+ return ERROR_CODE;
+ }
+
+ DWORD index = WaitForMultipleObjects(2, hEvent, FALSE,
(waitAlong ? INFINITE: 1500));
+
+
/*??????????????????????????????????????????????????????????????????????????????*/
+ if(index == WAIT_OBJECT_0)
+ {
+ nicCount++;
+ waitAlong = FALSE;
+ }
+ else if(index == WAIT_OBJECT_0 + 1)
+ {
+ ipCount++;
+ waitAlong = FALSE;
+ }
+ else if (index == WAIT_TIMEOUT)
+ {
+
+ if((nicCount == 0) && (ipCount == 0))
+ {
+ timeOutCount++;
+ if(timeOutCount >= RETRY_TIMES)
+ {
+ timeOutCount = 0;
+ waitAlong = TRUE;
+ //LogEvent(_T("[QGA]:time out.\n"));
+ }
+ //????????????????,continue??????
+ continue;
+ }
+
+
//????????????????????????????????????????????????????????????????????????????
+
+ std::vector<ADAPTER_INFO *> * pAdaInfoVect = new
std::vector<ADAPTER_INFO *> ();
+
+ std::vector<ADA_DIFF_INFO> adaDiffInfoVect;
+
+ if ((dwRet = GetNicInfo((*pAdaInfoVect))) !=
ERROR_SUCCESS)
+ {
+ LogEvent(_T("[QGA]cannot get nic info."));
+ return dwRet;
+ }
+
+ diffAdaVect((*pAdaInfoLastVect), (*pAdaInfoVect),
adaDiffInfoVect);
+
+
+ /*??????????????????????????????IP????????????????
+
*????????IP??????????????????????????????????????????????IP??????????????????????????????????IP??????????????????????????IP??????????????
+ ??????????????????????*/
+ if((ipCount > 0) && adaDiffInfoVect.empty())
+ {
+ doIpChangeEvent(*pAdaInfoVect);
+ }
+ else if(!adaDiffInfoVect.empty())
+ {
+ doNicChangeEvnet(adaDiffInfoVect);
+ }
+
+
+ //??????????????????????????????????????????????????????
+ freeAdaInfoVec((*pAdaInfoLastVect));
+ free(pAdaInfoLastVect);
+
+ pAdaInfoLastVect = pAdaInfoVect;
+
+ timeOutCount = 0;
+ waitAlong = FALSE;
+ nicCount = 0;
+ ipCount = 0;
+
+ }
+ else
+ {
+ LogEvent(_T("[QGA]:default changed, change error
%d\n"), index);
+ }
+ }
+
+ LogEvent(_T("[QGA]watching monitorFileThread ...end"));
+
+ return SUCCESS_CODE;
+}
+
+extern "C" VOID ipMonitorInit(VOID);
+
+VOID allocatePreMem(VOID)
+{
+ g_preMem = new TCHAR[MAX_PREBUFF_LEN];
+ if(g_preMem == NULL)
+ {
+ LogEvent(_T("[QGA]allocatePreMem failed "));
+ _exit(ERROR_CODE);
+ }
+}
+
+VOID ipMonitorInit(VOID)
+{
+ HANDLE hThreadWatch;
+ setOSversion();
+
+ /*no suitable for xp*/
+ if(!g_VistaOrLater)
+ return;
+
+ setIniFilePath();
+ //????????????????????????????????????????????????
+ allocatePreMem();
+
+ hThreadWatch = CreateThread(NULL, 0, monitorThread, NULL, 0, NULL);
+ if (hThreadWatch == NULL)
+ {
+ LogEvent(_T("[QGA]Create monitorIpThread failed"));
+ _exit(1);
+ }
+ CloseHandle(hThreadWatch);
+
+ LogEvent(_T("[QGA]create thread to monitorIP success"));
+}
+
+/*
+int _tmain(int argc, _TCHAR* argv[])
+{
+ ipMonitorInit();
+
+ _tsystem(_T("pause"));
+ return 0;
+}*/
+
--
1.8.3.1
- [Qemu-devel] [PATCH] qga:windows os lost ip when network nic change pic order,
indiffPig <=