#include "StdAfx.h" #include "my32.h" #pragma comment(lib,"my32.lib") #include "MultiBranchInfo.h" extern BYTE byShotVersion[6][10] = { { 6, 0, 148, 11, 205, 50, 4, 171, 32, 39 }, // 儿童座席版; { 6, 0, 4, 29, 24, 247, 189, 95, 83, 76 }, // 婚纱座席版; { 6, 0, 4, 187, 103, 10, 59, 169, 240, 220 }, // 儿童企业版; { 6, 0, 137, 160, 230, 173, 202, 2, 117, 142 }, // 婚纱企业版; { 6, 0, 194, 199, 210, 67, 185, 1, 138, 195 }, // 儿童全能版; { 6, 0, 188, 145, 100, 47, 154, 177, 34, 205 }, // 婚纱全能版; }; // endof------------6版本加密狗信息----------------; // start---------------加密表达式加密后的数组----------------------; extern BYTE byCalExVersion[7][114] = { // 儿童座席版; { 109, 0, 90, 15, 108, 138, 37, 190, 82, 8, 20, 252, 32, 162, 7, 8, 254, 255, 56, 245, 194, 4, 46, 120, 49, 120, 156, 27, 17, 164, 217, 79, 167, 146, 197, 69, 55, 117, 197, 149, 42, 217, 151, 195, 254, 145, 187, 197, 232, 188, 114, 223, 40, 229, 151, 245, 116, 177, 141, 94, 134, 14, 13, 169, 165, 94, 5, 216, 235, 60, 176, 38, 174, 121, 187, 174, 16, 30, 17, 20, 246, 34, 20, 252, 32, 162, 7, 8, 254, 255, 56, 245, 194, 4, 46, 120, 49, 120, 156, 27, 17, 164, 217, 79, 167, 146, 143, 132, 219, 173, 211, 2, 99, 180 }, // 婚纱座席版; { 109, 0, 128, 13, 164, 143, 252, 87, 30, 48, 20, 21, 145, 114, 160, 96, 49, 127, 181, 32, 144, 213, 109, 99, 142, 219, 71, 26, 22, 220, 177, 179, 191, 82, 138, 45, 173, 160, 9, 83, 162, 106, 182, 175, 47, 92, 214, 78, 93, 21, 202, 165, 167, 200, 198, 172, 218, 74, 236, 194, 194, 228, 40, 27, 95, 60, 160, 173, 66, 185, 178, 7, 159, 220, 58, 71, 140, 19, 20, 37, 66, 84, 20, 21, 145, 114, 160, 96, 49, 127, 181, 32, 144, 213, 109, 99, 142, 219, 71, 26, 22, 220, 177, 179, 191, 82, 232, 182, 45, 27, 13, 195, 225, 204 }, // 儿童企业版; { 109, 0, 229, 36, 223, 222, 213, 46, 70, 55, 240, 207, 237, 75, 226, 68, 133, 100, 42, 119, 89, 131, 79, 104, 158, 17, 172, 239, 4, 158, 201, 51, 62, 51, 94, 232, 14, 124, 81, 64, 100, 141, 187, 85, 156, 59, 205, 116, 200, 24, 108, 218, 145, 22, 7, 36, 45, 7, 156, 255, 170, 130, 165, 140, 99, 216, 120, 72, 171, 196, 27, 49, 138, 199, 137, 246, 214, 247, 121, 114, 215, 199, 240, 207, 237, 75, 226, 68, 133, 100, 42, 119, 89, 131, 79, 104, 158, 17, 172, 239, 4, 158, 201, 51, 62, 51, 248, 214, 27, 254, 221, 208, 181, 209 }, // 婚纱企业版; { 109, 0, 94, 220, 40, 182, 30, 120, 56, 193, 78, 101, 1, 144, 68, 206, 192, 52, 67, 9, 243, 20, 9, 195, 153, 15, 22, 217, 243, 79, 177, 22, 24, 171, 185, 157, 172, 67, 117, 124, 153, 165, 3, 41, 218, 47, 149, 150, 48, 152, 75, 250, 204, 253, 92, 53, 121, 147, 242, 140, 80, 66, 34, 194, 16, 109, 237, 17, 222, 161, 96, 8, 11, 194, 58, 45, 86, 15, 207, 121, 247, 104, 78, 101, 1, 144, 68, 206, 192, 52, 67, 9, 243, 20, 9, 195, 153, 15, 22, 217, 243, 79, 177, 22, 24, 171, 122, 243, 190, 146, 77, 222, 208, 129 }, // 儿童全能版; { 109, 0, 26, 222, 0, 239, 199, 199, 188, 225, 180, 168, 178, 208, 21, 79, 62, 90, 51, 31, 88, 128, 180, 105, 53, 137, 230, 254, 244, 50, 195, 49, 167, 143, 168, 125, 130, 125, 8, 73, 224, 120, 80, 95, 178, 49, 44, 158, 38, 38, 247, 169, 62, 187, 119, 192, 77, 194, 118, 246, 133, 241, 157, 62, 144, 24, 94, 173, 49, 192, 46, 250, 249, 239, 82, 78, 135, 3, 86, 154, 8, 135, 180, 168, 178, 208, 21, 79, 62, 90, 51, 31, 88, 128, 180, 105, 53, 137, 230, 254, 244, 50, 195, 49, 167, 143, 241, 214, 38, 180, 198, 3, 158, 165 }, // 婚纱全能版; { 109, 0, 139, 145, 163, 176, 66, 18, 207, 79, 172, 200, 12, 124, 89, 151, 248, 238, 26, 85, 137, 146, 119, 58, 76, 194, 151, 239, 204, 104, 18, 166, 208, 54, 37, 85, 3, 174, 28, 74, 154, 156, 120, 194, 8, 112, 79, 42, 27, 89, 81, 95, 238, 74, 59, 199, 160, 101, 117, 179, 51, 138, 70, 176, 239, 182, 160, 212, 11, 33, 224, 74, 155, 143, 216, 10, 220, 71, 8, 168, 18, 175, 172, 200, 12, 124, 89, 151, 248, 238, 26, 85, 137, 146, 119, 58, 76, 194, 151, 239, 204, 104, 18, 166, 208, 54, 114, 118, 181, 24, 252, 41, 246, 88 }, }; // endof---------------加密表达式加密后的数组----------------------; TCHAR CMultiBranchInfo::m_szOurBranchId[MAX_PATH] = {0}; CMultiBranchInfo::CMultiBranchInfo(void) { m_pOurBranchInfo = NULL; //memset(m_szOurBranchId,0,sizeof(TCHAR)*MAX_PATH); } CMultiBranchInfo::~CMultiBranchInfo(void) { RemoveAllBranchInf(); CBranchInfo::RemoveNetShareInfo(); CBranchInfo::RemvoeCatalogInfo(); } /************************************************************************/ /* 函数:AddBranchInfo 描述:添加新的分店的数据库实例,并启动分店的工作者线程; 参数: IN: dwCatalogPort 数据库实例映射端口; IN: lpCatalogSource 数据库实例地址; IN: lpCatalogAccount 数据库实例登陆账号; IN: lpCatalogPsw 数据库实例登陆密码; IN: lpCatalogName 数据库名称; 返回:添加成功返回TRUE; 要求: 注意:若是本店,需要读取本店记录的Version表和NetShareInfo表记录的公共信息; 示例: */ /************************************************************************/ BOOL CMultiBranchInfo::AddBranchInfo( IN CONST DWORD &dwCatalogPort, IN LPCTSTR lpCatalogSource, IN LPCTSTR lpCatalogAccount, IN LPCTSTR lpCatalogPsw, IN LPCTSTR lpCatalogName) { TCHAR szConnectString[MAX_PATH] = _T(""); if (dwCatalogPort) { _stprintf_s(szConnectString, _T("driver={SQL Server};Server=%s,%d;database=%s;uid=%s;pwd=%s"), lpCatalogSource, dwCatalogPort, lpCatalogName, lpCatalogAccount, lpCatalogPsw); } else { _stprintf_s(szConnectString, _T("driver={SQL Server};Server=%s;database=%s;uid=%s;pwd=%s"), lpCatalogSource, lpCatalogName, lpCatalogAccount, lpCatalogPsw); } if ( IsCatalogExists(szConnectString) ) { OutputDebugString(_T("数据库实例已存在\n")); return FALSE; } CBranchInfo *pBranchInfo = new CBranchInfo; if ( pBranchInfo == NULL ) { OutputDebugString(_T("内存不足创建对象\n")); return FALSE; } pBranchInfo->SetConn(szConnectString); if( !pBranchInfo->OpenCatalog() ) { delete pBranchInfo; pBranchInfo = NULL; OutputDebugString(_T("打开数据库实例失败\n")); return FALSE; } pBranchInfo->GetTblBranchId(); m_vtMultiBranchInfo.push_back(pBranchInfo); #if TEST_CREATE_DIRECTORY // 无加密狗时测试; if ( _tcscmp(m_szOurBranchId,_T("")) == 0 ) { _stprintf_s(m_szOurBranchId,pBranchInfo->GetDoMain()); } #endif if ( _tcscmp(pBranchInfo->GetDoMain(), m_szOurBranchId) == 0 ) { // 本店,标识为本店; OutputDebugString(_T("该域名为本店域名\n")); pBranchInfo->SetOurFlag(); pBranchInfo->GetTblVersion(); pBranchInfo->GetTblCatalogInfo(); pBranchInfo->GetTblNetShareInfo(); m_pOurBranchInfo = pBranchInfo; // 本店对象开始工作; pBranchInfo->StartThread(); } return TRUE; } /************************************************************************/ /* 函数:IsBranchInfoExists 描述:判断分店数据库实例是否存在; 参数: IN: pBranchInfo 分店实例对象指针; 返回:存在返回TRUE,否则返回FALSE; 要求: 注意: 示例: */ /************************************************************************/ BOOL CMultiBranchInfo::IsBranchInfoExists(IN CONST CBranchInfo* pBranchInfo) { if ( pBranchInfo == NULL ) return FALSE; BOOL bExist = FALSE; for ( MULTBRANCH::const_iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end(); it++) { if ( _tcscmp(pBranchInfo->GetDoMain(),(*it)->GetDoMain()) == 0 ) { //return TRUE; bExist = TRUE; break; } } return bExist; } /************************************************************************/ /* 函数:IsCatalogExists 描述:判断数据库实例连接是否存在; 参数: IN: lpConnectString 连接数据库实例的连接串; 返回:若该数据库实例连接存在返回TRUE,否则返回FALSE; 要求: 注意: */ /************************************************************************/ BOOL CMultiBranchInfo::IsCatalogExists(IN LPCTSTR lpConnectString) { BOOL bExists = FALSE; CBranchInfo *pBranchObj = NULL; for ( MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end();it++) { pBranchObj = *it; if ( _tcscmp(pBranchObj->GetConnectString(), lpConnectString) == 0 ) { bExists = TRUE; break; } } return bExists; } /************************************************************************/ /* 函数:FindPortEx 描述:查找域天加密狗中指定的信息; 参数: IN: start 查找的起始端口号; IN: InByte 加密的算法内容; IN: InLen InByte的长度; OUT: OutPath 返回域天加密狗所在的端口号; 返回:成功返回0; 要求: 注意: 示例: */ /************************************************************************/ INT CMultiBranchInfo::FindPortEx(IN int start, IN BYTE *InByte, IN int InLen, OUT char *OutPath) { int n; int ret; int D[8]; double F[8]; char s0[50] = "", s1[50] = "", s2[50] = "", s3[50] = "", s4[50] = "", s5[50] = "", s6[50] = "", s7[50] = ""; //查找系统上所有的锁; for (n = 0; n < 256; n++) { ZeroMemory(OutPath, sizeof(MAX_PATH)); ret = FindPort(n, OutPath); if (ret != 0 && n == 0)return -1053;//表示系统上没有任何智能锁; if (ret != 0)return ret; //使用该设备路径锁进行运算; ret = CalEx(InByte, InLen, &D[0], &D[1], &D[2], &D[3], &D[4], &D[5], &D[6], &D[7], &F[0], &F[1], &F[2], &F[3], &F[4], &F[5], &F[6], &F[7], s0, s1, s2, s3, s4, s5, s6, s7, OutPath, 20000); //如果正确,则返回该设备路径供以后使用; if (ret == -63)return ret; if ((ret == 0) && (D[0] == 123))return 0; } return -53; } /************************************************************************/ /* 函数:GetOurBranchId 描述:获取域天加密狗内保存的分店域名值; 参数: 返回: 要求: 注意: 示例: */ /************************************************************************/ BOOL CMultiBranchInfo::GetOurBranchId() { int nIndex = 0; CHAR szUSBKeyPath[MAX_PATH] = ""; for (; nIndex < 6; nIndex++) { if ( 0 == FindPortEx(0, byShotVersion[nIndex], 10, szUSBKeyPath) ) break; } if (nIndex > 5) { OutputDebugString(_T("未找到加密狗!\n")); return FALSE; } // 再获取本机加密狗的s1位置字符串; INT nUnit[8] = {0}; double fUnit[8] = {0.0}; char cUnit[8][50] = {""}; int nRet = CalEx(byCalExVersion[nIndex],114, &nUnit[0],&nUnit[1],&nUnit[2],&nUnit[3],&nUnit[4],&nUnit[5],&nUnit[6],&nUnit[7], &fUnit[0],&fUnit[1],&fUnit[2],&fUnit[3],&fUnit[4],&fUnit[5],&fUnit[6],&fUnit[7], cUnit[0],cUnit[1],cUnit[2],cUnit[3],cUnit[4],cUnit[5],cUnit[6],cUnit[7], szUSBKeyPath,200); if ( nRet != 0 && nRet != -43) { OutputDebugString(_T("加密狗信息无效!\n")); return FALSE; } USES_CONVERSION; _stprintf_s(m_szOurBranchId,_T("%s"),A2W(cUnit[1])); OutputDebugString(m_szOurBranchId); return TRUE; } /************************************************************************/ /* 函数:RemoveAllBranchInf 描述:移除所有分店实例对象; 参数: 返回: 要求: 注意: 示例: */ /************************************************************************/ void CMultiBranchInfo::RemoveAllBranchInf() { CBranchInfo *pBranchInfo = NULL; for ( MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end();) { pBranchInfo = *it; it = m_vtMultiBranchInfo.erase(it); delete pBranchInfo; pBranchInfo = NULL; } } /************************************************************************/ /* 函数:GetOurBranchObj 描述:获取本店的数据实例对象; 参数: 返回:返回本店实例对象; 要求: 注意: */ /************************************************************************/ CBranchInfo* CMultiBranchInfo::GetOurBranchObj() { if(m_pOurBranchInfo) return m_pOurBranchInfo; for(MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end(); it++) { if ( (*it)->GetOurFlag() ) { m_pOurBranchInfo = *it; break; } } return m_pOurBranchInfo; } /************************************************************************/ /* 函数:GetTbl_Version 描述:获取表Version的信息; 参数: OUT: AryOfValues 返回的数据集; 返回:成功获取且记录大于0返回TRUE; 要求: 注意: */ /************************************************************************/ BOOL CMultiBranchInfo::GetTblVersion(IN LPCTSTR lpBranchId, OUT CArray &AryOfValues) { // 当参数为空或NULL时,返回本店域名; CBranchInfo *pBranchInfo = NULL; if (lpBranchId == NULL || _tcscmp(lpBranchId,_T("")) == 0 ) { pBranchInfo = GetOurBranchObj(); } else { pBranchInfo = GetBranchObj(lpBranchId); } if ( pBranchInfo == NULL ) return FALSE; pBranchInfo->GetTblVersion(); return TRUE; } /************************************************************************/ /* 函数:GetBranchObj 描述:获取指定域名的分店数据库实例对象; 参数: OUT: lpBranchId 分店域名; 返回:返回分店实例对象; 要求: 注意: */ /************************************************************************/ CBranchInfo* CMultiBranchInfo::GetBranchObj(IN LPCTSTR lpBranchId) { // 当参数为空或NULL时,返回本店域名; if (lpBranchId == NULL || _tcscmp(lpBranchId,_T("")) == 0 ) { return GetOurBranchObj(); } CBranchInfo *pBranchObj = NULL; for(MULTBRANCH::iterator it = m_vtMultiBranchInfo.begin(); it != m_vtMultiBranchInfo.end(); it++) { if (_tcscmp((*it)->GetBranchId(),lpBranchId) == 0 ) { pBranchObj = *it; break; } } return pBranchObj; }