#include "stdafx.h" #include "CheckDog.h" #include //头文件 #include "resource.h" HANDLE g_hReadDogThread = NULL; #if IS_RAND_WRITE_DOG HANDLE g_hWriteDogThread = NULL; #endif DOGWRITE DogWrite = NULL; DOGREAD DogRead = NULL; HINSTANCE g_hDogLib; VOID TerminateLastProcess(); //初始化软件狗 int InitDog( void ) { CHAR strFile[MAX_LIST_LENGTH + 1] = ""; g_hDogLib = NULL; wsprintf(strFile, "%s\\Dll\\Win32dll.dll", g_strDirectory); g_hDogLib = AfxLoadLibrary(strFile); if (g_hDogLib < (HINSTANCE)HINSTANCE_ERROR) { LOG4C((LOG_NOTICE, "Load Dog Dll failed!")); return ERR_CODE_DOG_INIT_FAULT; } DogRead = (DOGREAD)GetProcAddress(g_hDogLib, _T("DogRead")); DogWrite = (DOGWRITE)GetProcAddress(g_hDogLib, _T("DogWrite")); if (DogRead == NULL || DogWrite == NULL) { LOG4C((LOG_NOTICE, "Get interface failed!")); AfxFreeLibrary(g_hDogLib); return ERR_CODE_DOG_INIT_FAULT; } CheckDogThreadStart(); return 0; } int UnInitDog(void) { CheckDogThreadEnd(); if( g_hDogLib != NULL ) { AfxFreeLibrary(g_hDogLib); } return 0; } BOOL CheckDogThreadStart() { DWORD dwThreadId = 0; MTVERIFY( g_hReadDogThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadDogThreadProc, NULL, 0, &dwThreadId) ); #if IS_RAND_WRITE_DOG MTVERIFY( g_hWriteDogThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WriteDogThreadProc, NULL, 0, &dwThreadId) ); #endif return TRUE; } BOOL CheckDogThreadEnd() { // 关闭线程 if (NULL != g_hReadDogThread) { MTVERIFY( WaitForSingleObject( g_hReadDogThread, INFINITE ) != WAIT_FAILED ); MTVERIFY( CloseHandle( g_hReadDogThread ) ); g_hReadDogThread = NULL; } #if IS_RAND_WRITE_DOG if (NULL != g_hWriteDogThread) { MTVERIFY( WaitForSingleObject( g_hWriteDogThread, INFINITE ) != WAIT_FAILED ); MTVERIFY( CloseHandle( g_hWriteDogThread ) ); g_hWriteDogThread = NULL; } #endif return TRUE; } DWORD WINAPI ReadDogThreadProc(LPVOID lpParameter) { do { DWORD dwStatus; // 读狗或写狗返回状态 DWORD dwAddr; // 读狗或写狗的起始地址 DWORD dwBytes; // 读狗或写狗的操作字节数据 DWORD dwData = 0; // 写狗的数据内容 char szData[10]; // 读狗的数据内容存放在这里,暂定为最多读10个字节 memset(szData, 0, sizeof(szData)); dwAddr = 6; dwBytes = 1; dwStatus = DogRead( dwBytes, dwAddr, szData ); szData[1] = 0; if( szData[0] == (char)0xFA ) //250为正式版本,只检测公司信息 { dwAddr = 0; dwBytes = 6; dwStatus = DogRead( dwBytes, dwAddr, szData ); int nTmp = strcmp((char *)szData, "SToneU"); if( (dwStatus != 0) || ( nTmp != 0 ) ) // 读公司信息错误,则退出 { LOG4C((LOG_NOTICE, "read company information lost!")); TerminateLastProcess(); return 0; } } else // 试用版本 { dwAddr = 0; dwBytes = 6; dwStatus = DogRead( dwBytes, dwAddr, szData ); int nTmp = strcmp((char *)szData, "SToneU"); if( (dwStatus != 0) || ( nTmp != 0 ) ) // 读公司信息错误,则退出 { LOG4C((LOG_NOTICE, "read company information lost!")); TerminateLastProcess(); return 0; } // 是否已过使用期限 dwAddr = 13; dwBytes = 1; memset(szData, 0, sizeof(szData)); dwStatus = DogRead( dwBytes, dwAddr, szData ); g_nUseTimeLimit = szData[0]; #if 0 if( 1 == g_nUseTimeLimit ) { TerminateLastProcess(); return 0; } #endif // 读取年 dwAddr = 8; dwBytes = 2; memset(szData, 0, sizeof(szData)); dwStatus = DogRead( dwBytes, dwAddr, szData ); short nDogYear = *(short*)szData; // 读取月 dwAddr = 10; dwBytes = 1; memset(szData, 0, sizeof(szData)); dwStatus = DogRead( dwBytes, dwAddr, szData ); int nDogMonth = szData[0]; // 读取日 dwAddr = 11; dwBytes = 1; memset(szData, 0, sizeof(szData)); dwStatus = DogRead( dwBytes, dwAddr, szData ); int nDogDay = szData[0]; // 读取试用月数 dwAddr = 7; dwBytes = 1; memset(szData, 0, sizeof(szData)); dwStatus = DogRead( dwBytes, dwAddr, szData ); int nUseDay = szData[0]; CTime ctNow = CTime::GetCurrentTime(); int nYear, nMonth, nDay; nYear = ctNow.GetYear(); nMonth = ctNow.GetMonth(); nDay = ctNow.GetDay(); // 判断系统时间是否被修改 if( nDogYear > nYear ) { LOG4C((LOG_NOTICE, "system time edited!")); TerminateLastProcess(); return 0; } else if( nDogYear == nYear ) { if( nDogMonth > nMonth ) { LOG4C((LOG_NOTICE, "system time edited!")); TerminateLastProcess(); return 0; } else if( nDogMonth == nMonth ) { if( nDogDay > nDay ) { LOG4C((LOG_NOTICE, "system time edited!")); TerminateLastProcess(); return 0; } } } //LOG4C((LOG_NOTICE, "nYear = %d, nMonth = %d, nDay = %d, nDogYear = %d, nDogMonth = %d, nDogDay = %d", // nYear, nMonth, nDay, nDogYear, nDogMonth, nDogDay)); int nUsed = 0; if( nMonth > nDogMonth ) { nUsed = ( nYear - nDogYear ) * 12 + ( nMonth - nDogMonth ); } else { nUsed = ( nYear - nDogYear ) * 12 - nDogMonth + nMonth; } //LOG4C((LOG_NOTICE, "nUsed = %d, nUseDay = %d", nUsed, nUseDay)); if( nUsed > nUseDay && 0 == g_nUseTimeLimit ) { dwAddr = 13; dwBytes = 1; memset(szData, 0, sizeof(szData)); szData[0] = 1; DogWrite( dwBytes, dwAddr, szData ); g_nUseTimeLimit = 1; #if 0 TerminateLastProcess(); return 0; #endif } } }while( WaitForSingleObject(g_hRunObject, 5000L) == WAIT_TIMEOUT ); return 0; } #if IS_RAND_WRITE_DOG DWORD WINAPI WriteDogThreadProc(LPVOID lpParameter) { INT iIvrIndex = 0; CString strError; for (; ;) { Sleep(10000); if (m_bWriteDogTerminate) break; char szData[10] ; DWORD dwAddr, dwBytes, dwData; DWORD dwStatus; srand((int)time(0)); int nRand = random(8); dwAddr = 90 + nRand + 1; nRand = 99 - dwAddr; nRand = random( nRand ); dwBytes = nRand + 1; szData[0] = dwAddr; szData[1] = dwBytes; szData[2] = 0; dwStatus = DogWrite( dwBytes, dwAddr, szData ); if( dwStatus != 0 ) { strError.LoadString(IDS_PROMPT_DOG_ERROR ); strError.Format( strError, dwStatus ); //AddToPrintQueue( MSG_WARNING, MSG_DOG_MD, (char*)(LPCTSTR)strError, strError.GetLength() ); Sleep( 2000 ); TerminateLastProcess(); } } m_hWriteDogThread = NULL; m_dwWriteDogThreadId = 0; return 0; } #endif