// GUCodeCreator.cpp: implementation of the CGUCodeCreator class. // ////////////////////////////////////////////////////////////////////// #include "geomative.h" #include "GUCodeCreator.h" #include "Constant.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGUCodeCreator::CGUCodeCreator() { int iIndex = (int)VAL_ZERO; char cChar = '0'; /* while (iIndex < 6) { m_aMacAddress[iIndex++] = (int)VAL_ZERO; } */ memset(m_aMacAddress, 0, sizeof(m_aMacAddress)); iIndex = (int)VAL_ZERO; while (iIndex < 10) { m_aMappingTable[iIndex++] = cChar++; } cChar = 'A'; while (iIndex < 32) { m_aMappingTable[iIndex++] = cChar++; } } CGUCodeCreator::~CGUCodeCreator() { } bool CGUCodeCreator::GetMacAddress(BYTE *pMacAddress) { PIP_ADAPTER_INFO pAdapterInfo; DWORD dwAdapterInfoSize; DWORD dwErr; int iIndex = 0; dwAdapterInfoSize = 0; dwErr = GetAdaptersInfo(NULL, &dwAdapterInfoSize); if ((dwErr != (int)VAL_ZERO) && (dwErr != ERROR_BUFFER_OVERFLOW)) { return false; } pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, dwAdapterInfoSize); if (pAdapterInfo == NULL) { return false; } PIP_ADAPTER_INFO pTemp = pAdapterInfo; if (GetAdaptersInfo(pAdapterInfo, &dwAdapterInfoSize) != (int)VAL_ZERO) { GlobalFree(pAdapterInfo); return false; } while (pAdapterInfo) { if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) { for (iIndex = (int)VAL_ZERO; iIndex < 6; iIndex++) { *pMacAddress++ = pAdapterInfo->Address[iIndex]; } break; } pAdapterInfo = pAdapterInfo->Next; } if (pTemp) { GlobalFree(pTemp); } return true; } DWORD CGUCodeCreator::GetTotalSecond() { int iYear = (int)YEAR_BASE; int iCurYear = (int)VAL_ZERO; int iCurDay = (int)VAL_ZERO; int iCurHour = (int)VAL_ZERO; int iCurMin = (int)VAL_ZERO; int iCurSec = (int)VAL_ZERO; DWORD dwSecond = (DWORD)VAL_ZERO; time_t lTime = (time_t)VAL_ZERO; struct tm *pTM = NULL; Sleep(1000); time(&lTime); pTM = localtime(&lTime); iCurYear = 1900 + pTM->tm_year; iCurDay = pTM->tm_yday; iCurHour = pTM->tm_hour; iCurMin = pTM->tm_min; iCurSec = pTM->tm_sec; dwSecond = iCurDay*86400+((iCurHour*60+iCurMin)*60+iCurSec+1); while (iYear < iCurYear) { if (((iYear % 4 == (int)VAL_ZERO) && (iYear % 100 != (int)VAL_ZERO)) || (iYear % 400 == (int)VAL_ZERO)) { dwSecond += 31622400; } else { dwSecond += 31536000; } iYear++; } return dwSecond; } bool CGUCodeCreator::ChangeMacAddressToCode(char *pCode) { BYTE bTempVal = (BYTE)VAL_ZERO; BYTE bHTempVal = (BYTE)VAL_ZERO, bMTempVal = (BYTE)VAL_ZERO, bLTempVal = (BYTE)VAL_ZERO; int aTempVal[10] = {(int)VAL_ZERO}; int iIndex = (int)VAL_ZERO; bLTempVal = this->m_aMacAddress[5]; bLTempVal &= 0x1F; aTempVal[9] = (int)bLTempVal; bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[5]; bLTempVal >>= 5; bHTempVal = m_aMacAddress[4]; bHTempVal <<= 3; bHTempVal &= 0x18; aTempVal[8] = (int)(bHTempVal | bLTempVal); bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[4]; bLTempVal >>= 2; bLTempVal &= 0x1F; aTempVal[7] = (int)bLTempVal; bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[4]; bLTempVal >>= 7; bHTempVal = m_aMacAddress[3]; bHTempVal <<= 1; bHTempVal &= 0x1E; aTempVal[6] = (int)(bHTempVal | bLTempVal); bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[3]; bLTempVal >>= 4; bHTempVal = m_aMacAddress[2]; bHTempVal <<= 4; bHTempVal &= 0x10; aTempVal[5] = (int)(bHTempVal | bLTempVal); bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[2]; bLTempVal >>= 1; bLTempVal &= 0x1F; aTempVal[4] = (int)bLTempVal; bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[2]; bLTempVal >>= 6; bHTempVal = m_aMacAddress[1]; bHTempVal <<= 2; bHTempVal &= 0x1C; aTempVal[3] = (int)(bHTempVal | bLTempVal); bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[1]; bLTempVal >>= 3; aTempVal[2] = (int)bLTempVal; bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = m_aMacAddress[0]; bLTempVal &= 0x1F; aTempVal[1] = (int)bLTempVal; bLTempVal = (BYTE)VAL_ZERO; bHTempVal = (BYTE)VAL_ZERO; bLTempVal = this->m_aMacAddress[0]; bLTempVal >>= 5; aTempVal[0] = (int)bLTempVal; iIndex = 9; while (iIndex >= (int)VAL_ZERO) { *(pCode+iIndex) = m_aMappingTable[(int)aTempVal[iIndex]]; iIndex--; } return true; } bool CGUCodeCreator::ChangeTotalSecToCode(char *pCode) { int aTempVal[GUC_LENGTH-11] = {(int)VAL_ZERO}; int iIndex = (int)VAL_ZERO; DWORD dwSec = (DWORD)VAL_ZERO; dwSec = m_dwCurTotalSec; for (iIndex = (GUC_LENGTH-12); iIndex >= (int)VAL_ZERO; iIndex--) { aTempVal[iIndex] = dwSec & 0x0000001F; dwSec >>= 5; } for (iIndex = (GUC_LENGTH-12); iIndex >= (int)VAL_ZERO; iIndex--) { *(pCode+iIndex) = m_aMappingTable[(int)aTempVal[iIndex]]; } return true; } CString CGUCodeCreator::GenerateGUCode() { int iIndex = (int)VAL_ZERO; char aGUCode[GUC_LENGTH] = {0}; CString szGUCode; while (iIndex < GUC_LENGTH) { aGUCode[iIndex++] = (int)VAL_ZERO; } memset(m_aMacAddress, 0, sizeof(m_aMacAddress)); GetMacAddress((BYTE*)m_aMacAddress); m_dwCurTotalSec = GetTotalSecond(); ChangeMacAddressToCode((char*)aGUCode); ChangeTotalSecToCode((char*)(aGUCode+10)); szGUCode.Empty(); szGUCode = (LPCTSTR)aGUCode; return szGUCode; } CString CGUCodeCreator::GenerateGUIDCode() { CString szGUID = _T(""); GUID guid; ::CoInitialize(NULL); if(S_OK == ::CoCreateGuid(&guid)) { szGUID.Empty(); szGUID.Format("%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X", guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); } ::CoUninitialize(); return szGUID; } CString CGUCodeCreator::GenerateMacAddress(void) { CString szMacAddress = _T(""); memset(m_aMacAddress, 0, sizeof(m_aMacAddress)); GetMacAddress((BYTE*)m_aMacAddress); //////////////////////////////add by lsq 20160402//////////////////////////////////////////// //在这里由于去除注册功能的需要,因此将所有机器的MAC地址用 //统一的一个MAC地址来代替 memset(m_aMacAddress, 0, sizeof(m_aMacAddress)); m_aMacAddress[0] = 0x00; m_aMacAddress[1] = 0x00; m_aMacAddress[2] = 0x00; m_aMacAddress[3] = 0xFF; m_aMacAddress[4] = 0xFF; m_aMacAddress[5] = 0xFF; /////////////////////////////////end///////////////////////////////////////// szMacAddress.Empty(); szMacAddress.Format(_T("%02X%02X%02X%02X%02X%02X"), m_aMacAddress[0], m_aMacAddress[1], m_aMacAddress[2], m_aMacAddress[3], m_aMacAddress[4], m_aMacAddress[5]); return szMacAddress; } void CGUCodeCreator::GetMacList(CStringArray *f_macArray) { //added by lsq 20160406 //由于上下微机统一使用一个MAC地址,所以这里直接用这个MAC地址返回,之前的代码就不用了 f_macArray->Add(_T("000000FFFFFF")); return; /////////////////////////////end///////////////////////////////////////////// PIP_ADAPTER_INFO pAdapterInfo; DWORD dwAdapterInfoSize; DWORD dwErr; int iIndex = 0; BYTE bMac[16]; memset(bMac, 0, 16); CString szTmp = _T(""); dwAdapterInfoSize = 0; dwErr = GetAdaptersInfo(NULL, &dwAdapterInfoSize); if ((dwErr != (int)VAL_ZERO) && (dwErr != ERROR_BUFFER_OVERFLOW)) { f_macArray->Add("000000000000"); return; } pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, dwAdapterInfoSize); if (pAdapterInfo == NULL) { f_macArray->Add("000000000000"); return; } if (GetAdaptersInfo(pAdapterInfo, &dwAdapterInfoSize) != (int)VAL_ZERO) { GlobalFree(pAdapterInfo); return; } while (pAdapterInfo) { if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) { for (iIndex = (int)VAL_ZERO; iIndex < 6; iIndex++) { bMac[iIndex] = pAdapterInfo->Address[iIndex]; } szTmp.Format(_T("%02X%02X%02X%02X%02X%02X"), bMac[0], bMac[1], bMac[2], bMac[3], bMac[4], bMac[5]); f_macArray->Add(szTmp); } pAdapterInfo = pAdapterInfo->Next; } if (f_macArray->GetSize() == 0) { f_macArray->Add("000000000000"); } GlobalFree(pAdapterInfo); }