c/c++编写window服务的授权服务(三)

 c/c++编写window服务的授权服务(三)

//实现授权服务的函数体LicenseService.cpp

#pragma once
#include "LicenseService.h"
#include "hex_md5.h"

//安装入口点
void main(int argc, char* argv[])
{
	//初始化全局变量
	//获取exe所在目录
     CurExeDir=GetCurDir();
     //printf("\n当前exe所在目录为:%s\n",CurExeDir);
	 //获取ServerConfig.ini配置参数并初始化全局变量
	 GetServerConfig_ini();

	//开始初始化服务
	WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName);
	//方法一	
     SERVICE_TABLE_ENTRY ServiceTable[2];
	 //设置服务名称和服务入口函数	 
     ServiceTable[0].lpServiceName=TServiceName;
	 ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
	 ServiceTable[1].lpServiceName=NULL;
	 ServiceTable[1].lpServiceProc=NULL;
     
	 //方法二     
	 /*SERVICE_TABLE_ENTRY  ServiceTable[]=  
	 {
		  {TEXT(ServiceName),(LPSERVICE_MAIN_FUNCTION)ServiceMain},  
		  { NULL,NULL}
	 };*/
	 //注册为服务和反注册
	 //-------------------------------------------------
     //引数 
	 if(argc<=1)
	 {
		  //usage(使用方法)表示   
		  cout<<"使用方法:"<<endl;
		  //cout<<"zxz\"zxz"<<ENDL;
		  //"install"
		  cout<<"\"install\""; 
		  //"or"
		  cout<<"or";
		  //"uninstall"
		  cout<<"\"uninstall\"";
		  //"exec"
		  cout<<"\"exec \""; 
		  cout<<" parameter required in the command line"<<endl;	  
	 } 
	 if(argc>1)
	 {
		  if(_stricmp("install",argv[1])==0)
		  {   //install(InstallService)
			  InstallService(); 
			  cout<<"installService Succed!"<<endl;
		  }		    
		  else if(_stricmp("uninstall",argv[1])==0)
		  {   //uninstall(UninstallService) 
			  UninstallService(); 
			  cout<<"UninstallService Succed!"<<endl;
		  }		  
		  else if(_stricmp("exec",argv[1])==0)
		  {   //exec(ServiceMain)
			  RunService(TServiceName);		   
		  } 
		  else
		  {    //usage(使用方法)表示
			   cout<<"使用方法 :"<<endl;
			   //"install"
			   cout<<"\"install\""; 
			   //"or"
			   cout<<"or";
			   //"uninstall"
			   cout<<"\"uninstall\"";
			   //"exec"
			   cout<<"\"exec \""; 
			   //"or"
			   cout<<"or";
			   cout<<" parameter required in the command line"<<endl;
		  }
	 }
	 //-------------------------------------------------
	 //启动服务的控制分派机线程(启动并执行一个新线程)
	 StartServiceCtrlDispatcher(ServiceTable);
}
//服务入口点(主线程)
void ServiceMain(int argc,char** argv)
{
	WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName);
    int success;
	//success=InitService();
	//if(!success)
	//{
    //       //初始化失败,终止服务
	//	WriteToLog("ServiceMain::InitService初始化失败,终止服务");
	//	ServiceStatus.dwCurrentState=SERVICE_STOPPED;
	//	ServiceStatus.dwWin32ExitCode=-1;
	//	SetServiceStatus(hStatus,&ServiceStatus);
	//	//退出ServiceMain
	//	return;
	//}
	//开始服务
	RunService(TServiceName);

	//注册服务控制处理函数
   hStatus = RegisterServiceCtrlHandler(TServiceName,(LPHANDLER_FUNCTION)ControlHandler);   
   if(!hStatus)
   {	
	   WriteToLog("ServiceMain函数中注册服务控制处理函数失败!\n");
	   return;
   }
	//向SCM报告工作状态
	RunState=EnumRunState::Running;
    ServiceStatus.dwCurrentState=SERVICE_RUNNING;
	ServiceStatus.dwServiceType=SERVICE_WIN32;
    ServiceStatus.dwControlsAccepted = 
			SERVICE_ACCEPT_STOP |
			SERVICE_ACCEPT_PAUSE_CONTINUE |
			SERVICE_ACCEPT_SHUTDOWN;
	/*SetServiceStatus(hStatus,&ServiceStatus);*/
	
   启动工作循环(这个模块在另外一个线程中执行)
   //while(RunState==EnumRunState::Running)
   //{
	  //  WriteToLog("ServiceMain函数写日志\n");
   //     Sleep(500);
   //}
   //创建一个终结事件
   terminateEvent = CreateEvent (0,TRUE,FALSE,0);
   if (!terminateEvent)
   {
       terminate(GetLastError());
       return;
   }   
   //
   success =  SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR,0,2,1000);
   if (!success)
   {
		terminate(GetLastError()); 
		return;
   }   
   //初始化
   success =  InitService();
   if (!success)
   {
		terminate(GetLastError());
		return;
   }      
   success = SendStatusToSCM(SERVICE_RUNNING,NO_ERROR,0,0,0);
   if (!success)
   {
		terminate(GetLastError()); 
		return;
   }   
   //等待停止
   WaitForSingleObject ( terminateEvent, INFINITE);
      
   terminate(0);
   WriteToLog("ServiceMain函数执行完毕!");
}
//服务控制台命令处理函数
void ControlHandler(DWORD request)
{
   DWORD  currentState = 0;
   BOOL success;    
   switch(request)
   { 
	   case SERVICE_CONTROL_STOP:
		    RunState=EnumRunState::Stoped;
			currentState = SERVICE_STOP_PENDING;
			ServiceStatus.dwCurrentState=currentState;
			SetServiceStatus(hStatus,&ServiceStatus);		    
			StopService();
			return;
	   case SERVICE_CONTROL_PAUSE:	
		     RunState=EnumRunState::Pause;
			 currentState = SERVICE_PAUSED;
			 ServiceStatus.dwCurrentState=currentState;
			 SetServiceStatus(hStatus,&ServiceStatus);
			 PauseService();
			break;
	   case SERVICE_CONTROL_CONTINUE:	
		   RunState=EnumRunState::Running;
			 currentState = SERVICE_RUNNING;
			 ServiceStatus.dwCurrentState=currentState;
			 SetServiceStatus(hStatus,&ServiceStatus);
			 ResumeService();
			break;
	   case SERVICE_CONTROL_INTERROGATE:
			// it will fall to bottom and send status
			break;
	    
		// Do nothing in a shutdown. Could do cleanup
		// here but it must be very quick.
	   case SERVICE_CONTROL_SHUTDOWN:
			// Do nothing on shutdown		   
			return;
	   default:
			break;
   }   
   //ServiceStatus.dwCurrentState=currentState;
   //SetServiceStatus(hStatus,&ServiceStatus);
}
//初始化服务(开始服务时执行)
int InitService()
{
	//重新获取ServerConfig.ini配置参数
	GetServerConfig_ini();
   int result;
   WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName); 
   //写日志信息
   result=WriteToLog("Monitoring started."); 

   //start listening...   
   //开始一个线程 Start the service's thread
   DWORD id;   
   threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE)ServiceThread,0, 0, &id);   
   if (threadHandle==0)
   {
       result=0;
   }
   else
   {		
	   result=1;
   }   
   WriteToLog("InitService一个线程开始了!");
   return result;
}
DWORD WINAPI ServiceThread(LPDWORD param)
{ 
   //线程操作
   WriteToLog("线程操作ServiceThread开始!");
   StartHostPortListen(host,atoi(port));	
   WriteToLog("线程操作ServiceThread完成!");
   return 0;
}

//实现 开始主机+端口监听函数
void StartHostPortListen(char* ipaddr,int port)
{
	 //port=9998;
     WORD wVersionRequested;
	 WSADATA wsaData;
	 int err;
	 
	 //版本请求
	 wVersionRequested = MAKEWORD(2, 2);
	 //初始化WinSock(WSAStartup函数)
	 err = WSAStartup( wVersionRequested, &wsaData);
	 if ( err != 0 ) 
	 {  //初始化出错了退出函数
		return;
	 }
	 //初始化成功!但版本不一致! 退出函数
	 if ( LOBYTE( wsaData.wVersion ) != 2 ||
			HIBYTE( wsaData.wVersion ) != 2 ) {
		  WSACleanup( ); //清除Socket
		  return;        //退出函数
	 }
     //生成一个socket(sockSrv变量)
	 //SOCK_STREAM  用于TCP协议
	 //SOCK_DGRAM   用于UDP协议
	 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);  //使用TCP协议
	 //设置一个地址Socket(addrSrv变量)
	 SOCKADDR_IN addrSrv;
	 addrSrv.sin_addr.S_un.S_addr=inet_addr(ipaddr); //本机IP地址
	 addrSrv.sin_family=AF_INET;
	 addrSrv.sin_port=htons(port);                 //端口9998
     //绑定函数(指定本地IP地址所使用的端口号时候使用)
	 //(把sockSrv变量与addrSrv变量绑定在一起)
	 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	 //监听端口开始
	 if(listen(sockSrv,MAX_PENDING_CONNECTS)!=0) 
	 { 
		printf("监听socket失败:%d\n ",::WSAGetLastError()); 
		return;//ExitProcess(STATUS_FAILED); 
	 } 
	 printf("开始监听...");

	 //接收来自客户端的请求连接
	 SOCKET sockClient;
	 SOCKADDR_IN addrClient;//定义一个客户端Socket地址	 
	 int len=sizeof(SOCKADDR);
	 char recvBuf[100];
	 int recv_len=-1;
	 //
	 sockaddr_in	 acc_sin; 
	 int	 acc_sin_len; 
	 acc_sin_len=sizeof(acc_sin);
	 //
	 while(true)
	 {
		 //接收Socket请求   来自客户端的Connect
		 sockClient=accept(sockSrv,(struct sockaddr*)&acc_sin, &acc_sin_len); 
		 if(sockClient>=0)   
	     { 
			 //创建一个线程来处理socket请求threadHandle
			 DWORD id;
			 HANDLE  threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE)HandleSocket,(LPVOID)sockClient, 0, &id); 
		     //
		 }
		 else
		 { //没有客户端接入
			 printf("没有客户端接入2\n");
		 }
		 Sleep(200);
	 }
	 //关闭Socket变量sockSrv
	 closesocket(sockSrv);
	 //清除Socket
	 WSACleanup();
}
//实现 处理Socket请求函数
DWORD WINAPI HandleSocket(LPVOID lpParam)
{
	SOCKET sockClient=(SOCKET)lpParam;
   //接收数据并保存到recvBuf变量中
	char recvBuf[100];
	int recv_len=-1;
	bool Exits=false;
	while(Exits==false)
	{
		 recv_len=recv(sockClient,recvBuf,100,0); 
		 //recv_len=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
		 if(recv_len>0)
		 {	 
			 //输出数据
			 recvBuf[recv_len]='\0'; //在末尾加入字符串结束符号 '\0 '
			 printf("%s\n",recvBuf);
			 printf("本次数据接收结束。\n "); 
			 //处理(传入请求类型)			 
			 char* ret;
			 ret=new char[recv_len];
			 strcpy(ret,recvBuf);
			 bool rlcmd=false,stop=false;
			 rlcmd=EqStr(ret,"RequestLicenseCommand");
			 stop=EqStr(ret,"stop");
			 if(rlcmd==true)
			 {  //请求类型为:RequestLicenseCommand
				bool LicenseAbled=false;
				//计算License是否可用
				LicenseAbled=false;//true;   
				//需进一步判断
				LicenseAbled=IsLencense();
				//-----
				char* retmsg="stop";
				if(LicenseAbled==true )//&& recvBuf==reqCmd
				{   //可用
					retmsg="start";
				}
				else
				{   //不可用
					retmsg="stop";
				}
				WriteToLog(retmsg);
				if(send(sockClient,retmsg,strlen(retmsg),0)==SOCKET_ERROR) 
				{ 
					printf("回发信息报错了: %d\n ",WSAGetLastError()); 
				} 
				printf("本次数据处理结束。\n ");
			 }
			 if(stop==true)
			 {   //请求类型为:stop
                 Exits=true;  //退出(结束本线程)
			 }
		 }
	}
	printf("退出(结束本线程)\n ");
	return 0;
}

//运行服务函数
BOOL RunService(WCHAR* sSvcName)
{   
   SC_HANDLE schSCManager;
   SC_HANDLE scHandle;
   BOOL boolRet;

   // open to SCM   
   schSCManager = OpenSCManager(
		0,  
		0,  
		SC_MANAGER_ALL_ACCESS 
	);

   //Open
   scHandle = OpenService(
		schSCManager,              
		sSvcName, 
		SERVICE_ALL_ACCESS  
		);
   
   //start 
   boolRet = StartService(
		scHandle,          
		0,        
		NULL);  
   
   return boolRet;
}
VOID ResumeService()
{
   //pauseService=FALSE;
   //ResumeThread(threadHandle);
   return;
}
VOID PauseService()
{
   //pauseService = TRUE;
   //SuspendThread(threadHandle);
   return;
}
VOID StopService() 
{
	RunState=EnumRunState::Stoped;//=FALSE;
   // Set the event that is holding ServiceMain
   // so that ServiceMain can return
   SetEvent(terminateEvent);
}
//安装函数
void InstallService()
{ 
	 SC_HANDLE schService; 
	 SC_HANDLE schSCManager; 
	 TCHAR szPath[512];

	 WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName);
	 
	 //Install Starting... 
	 //获取模块文件路径名称
	 if(!GetModuleFileName(NULL,szPath,512)) 
	 {  
		 return;  
	 }
	 
	 // open to SCM 
	 schSCManager = OpenSCManager( 
								0,  // pointer to machine name string
								0,  // pointer to database name string
								SC_MANAGER_CREATE_SERVICE // type of access
								);
	 if (!schSCManager)
	 {
		 //WriteToLog("OpenScManagerErrorID:"+GetLastError());  
		 return;
	 }
	 // Install 新服务
	 schService = CreateService(
			schSCManager, // handle to service control manager database
			TServiceName, // pointer to name of service to start
			TServiceName, // pointer to display name     
			SERVICE_ALL_ACCESS,// type of access to service
			SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,// type of service
			SERVICE_DEMAND_START,// when to start service
			SERVICE_ERROR_NORMAL,// severity if service fails to start
			szPath,       // pointer to name of binary file
			NULL,         // pointer to name of load ordering group
			NULL,         // pointer to variable to get tag identifier
			NULL,         // pointer to array of dependency names
			NULL,         // pointer to account name of service
			NULL          // pointer to password for service account
			);
	 if (!schService)
	 {  
		 WriteToLog("服务安装出错了");
		 //WriteToLog("CreateServiceErrorID:"+GetLastError()); 
		 return;
	 }
	 else
	 {
		 WriteToLog("服务已安装Service installed\n"); 
	 }	 
	 // clean up
	 CloseServiceHandle(schService);
	 CloseServiceHandle(schSCManager);	 
	 WriteToLog("安装服务已结束Install Ended...\n"); 
}
//反安装函数
void UninstallService()
{ 
	 SC_HANDLE schService;
	 SC_HANDLE schSCManager; 
	 BOOL success;
	 SERVICE_STATUS svcStatus;

	 WCHAR* TServiceName=CharPtr2ACharPtr(ServiceName);
	 
	 WriteToLog("反安装开始Uninstall Starting...");
	 
	 // open to SCM 
	 schSCManager = OpenSCManager(
			0,// pointer to machine name string 
			0,// pointer to database name string
			SC_MANAGER_CREATE_SERVICE // type of access
			);
	 if (!schSCManager)
	 {
		 //WriteToLog("OpenScManagerErrorID:"+GetLastError());
	     return;
	 }
	 
	 //打开一个服务
	 schService = OpenService(
				  schSCManager,              // handle to service control manager database
				  TServiceName,              // pointer to name of service to start
				  SERVICE_ALL_ACCESS | DELETE// type of access to service
				  );
	 if (!schService)
	 {
		  WriteToLog("OpenServiceErrorID:"+GetLastError());
		  return;
	 }
	 //(if necessary)
	 success = QueryServiceStatus(schService, &svcStatus);
	 if (!success)
	 {
		 WriteToLog("In QueryServiceStatus ErrorID:"+GetLastError());
		  return;
	 }
	 if (svcStatus.dwCurrentState != SERVICE_STOPPED)
	 {
		   WriteToLog("Stopping service...");
		   success = ControlService(
			   schService,           // handle to service
			   SERVICE_CONTROL_STOP, // control code
			   &svcStatus            // pointer to service status structure
		   );
		   if (!success)
		   {
			   WriteToLog("In ControlServiceErrorID:"+GetLastError());
			   return;
		   }
	 }
	 //等待
	 do
	 {
		  QueryServiceStatus(schService,&svcStatus);      
		  Sleep(500);    
	  
	 }while(SERVICE_STOP_PENDING==svcStatus.dwCurrentState);        
	 
	 if(SERVICE_STOPPED!=svcStatus.dwCurrentState)
	 {
		 WriteToLog("Failed to Stop Service ErrorID:"+GetLastError());  
	     return;
	 }
	 
	 //删除服务 
	 success = DeleteService(schService);
	 if (success)
	 {
	     WriteToLog("Service removed\n");
	 }
	 else
	 {
		 WriteToLog("In DeleteService ErrorID:"+GetLastError());
	     return;
	 }	 
	 //Clean up
	 CloseServiceHandle(schService);
	 CloseServiceHandle(schSCManager);	 
	 WriteToLog("反安装结束Uninstal Ended...");
}

//实现 发送状态到SCM服务控制管理器
BOOL SendStatusToSCM (DWORD dwCurrentState,
   DWORD dwWin32ExitCode, 
   DWORD dwServiceSpecificExitCode,
   DWORD dwCheckPoint,
   DWORD dwWaitHint)
  {
	   BOOL success;
	   SERVICE_STATUS serviceStatus;
	   
	   // Fill in all of the SERVICE_STATUS fields
	   serviceStatus.dwServiceType =SERVICE_WIN32_OWN_PROCESS;
	   serviceStatus.dwCurrentState = dwCurrentState;
	   
	   // If in the process of something, then accept
	   // no control events, else accept anything
	   if (dwCurrentState == SERVICE_START_PENDING)
		    serviceStatus.dwControlsAccepted = 0;
	   else
			serviceStatus.dwControlsAccepted = 
			SERVICE_ACCEPT_STOP |
			SERVICE_ACCEPT_PAUSE_CONTINUE |
			SERVICE_ACCEPT_SHUTDOWN;
	   
	   // if a specific exit code is defines, set up
	   // the win32 exit code properly
	   if (dwServiceSpecificExitCode == 0)
			serviceStatus.dwWin32ExitCode =dwWin32ExitCode;
	   else
		    serviceStatus.dwWin32ExitCode =	ERROR_SERVICE_SPECIFIC_ERROR;
	   serviceStatus.dwServiceSpecificExitCode =dwServiceSpecificExitCode;
	   
	   serviceStatus.dwCheckPoint = dwCheckPoint;
	   serviceStatus.dwWaitHint = dwWaitHint;
	   
	   // Pass the status record to the SCM
	   //SERVICE_STATUS_HANDLE serviceStatusHandle;
	   success = SetServiceStatus (hStatus,&serviceStatus);
	   if (!success)
	   {
		  StopService();	 
	   }
	   return success;
  }
//实现 服务终结函数
VOID terminate(DWORD error)
{
   // if terminateEvent has been created, close it.
   if (terminateEvent)
   {
		CloseHandle(terminateEvent);
   }
   
   // Send a message to the scm to tell about
   // stop age
   if (hStatus)
   {
		SendStatusToSCM(SERVICE_STOPPED, error,0, 0, 0);
   }
   
   // If the thread has started kill it off
   if (threadHandle)
   {
		CloseHandle(threadHandle);
   }
   
   // Do not need to close serviceStatusHandle
}
//----------------------------------------------------
//通用函数的实现
//实现 字符串格式转换 char*转为WCHAR*
WCHAR* CharPtr2ACharPtr(const char* src)
{
	// Convert to a wchar_t*
    size_t srcsize = strlen(src) + 1;
    size_t newsize = srcsize;	
    size_t convertedChars = 0;
    wchar_t *wcstring;
	wcstring=new wchar_t[newsize];
    mbstowcs_s(&convertedChars, wcstring, srcsize, src, _TRUNCATE);
    //wcscat_s(wcstring, L" (wchar_t *)");
    //wcout << wcstring << endl;
	return wcstring;
}

//实现 写日志
int WriteToLog(char* str)
{
    FILE* log;
	char* curdir;
	if(CurExeDir==NULL)
	{
        CurExeDir=GetCurDir();
	}
	curdir=CurExeDir;
	char* Logfile=UnionStr(curdir,LogFileName);
	log=fopen(Logfile,"a+");
	if(log==NULL)  return 0;
	fprintf(log,"%s\n",str);
	fclose(log);
	return 1;
}

//实现 获取当前可执行文件所在目录
char* GetCurDir(void)
{
	//推荐用如下方法来得到当前程序所在目录比较安全:
    //void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );
    //函数来分解开始提到的_pgmptr,然后再用
    //void _makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext );
    //函数来对分解后的路径进行组合。这两个函数结合起来功能强大,使用灵活,
	//基本上所有的有关目录和路径方面的操作都可以搞定.
    //(1)	
	char* szFilePath=new char[MAX_PATH];
	memset(szFilePath,0,MAX_PATH); 
	
	GetModuleFileNameA(NULL,szFilePath,MAX_PATH);
	//GetModuleFileNameW(NULL,szFilePath,MAX_PATH);

	char* szfp=new char[strlen(szFilePath)+1];
	strcpy(szfp,szFilePath);
	
	int srcLen=strlen(szfp)+1;
	char* Driver=new char[srcLen];
	char* dir=new char[srcLen];
	char* fn=new char[srcLen];
	char* ext=new char[srcLen];
	//
    memset(Driver,0,srcLen); 
	memset(dir,0,srcLen); 
	memset(fn,0,srcLen); 
	memset(ext,0,srcLen); 
	//分解路径
	_splitpath(szfp,Driver,dir,fn,ext);

	char* dri=new char[strlen(Driver)+1];
	strcpy(dri,Driver);

    char* dir_t=new char[strlen(dir)+1];
	strcpy(dir_t,dir);
	//组合目录
	int len=strlen(dri)+strlen(dir_t);
	char* result=new char[len];
	memset(result,0,len); 
	sprintf(result, "%s\\%s",dri,dir_t);

	char* r=new char[strlen(result)+1];
	strcpy(r,result);
	return r;
}

//实现 替换字符串中特征字符串为指定字符串
int ReplaceStr(char *sSrc, char *sMatchStr, char *sReplaceStr)
{
        int  StringLen;
		int MAX_MSG_LENGTH=strlen(sSrc)+1;
        char* caNewString=new char[MAX_MSG_LENGTH];

        char *FindPos = strstr(sSrc, sMatchStr);
        if( (!FindPos) || (!sMatchStr) )
                return -1;

        while( FindPos )
        {
                memset(caNewString, 0, sizeof(caNewString));
                StringLen = FindPos - sSrc;
                strncpy(caNewString, sSrc, StringLen);
                strcat(caNewString, sReplaceStr);
                strcat(caNewString, FindPos + strlen(sMatchStr));
                strcpy(sSrc, caNewString);

                FindPos = strstr(sSrc, sMatchStr);
        }
        return 0;
}

//实现 合并字符串函数
char* UnionStr(const char* A,const char* B)
{
    int len=strlen(A)+strlen(B);
	char* result=new char[len];
	memset(result,0,len); 
	sprintf(result, "%s%s",A,B);

	char* r=new char[strlen(result)+1];
	strcpy(r,result);
	return r;
}

//实现 字符串是否相等函数
bool EqStr(const char* A,const char* B)
{
     bool r=true;
	 char* t_A=new char[strlen(A)+1];
	 strcpy(t_A,A);
     char* t_B=new char[strlen(B)+1];
	 strcpy(t_B,B);
     int ALen=strlen(t_A);
	 int BLen=strlen(t_B);
	 if(ALen>=BLen) ALen=BLen;	 
	 {
         for(int i=0;i<ALen;i++)
		 {
             if(t_A[i]!=t_B[i])
			 {
				 r=false;
				 break;
			 }
		 }
	 }
	 return r;
}

//实现 是数字check函数
bool IsNumber(string str)
{
   bool r=true;
   const char* t=str.c_str();
   int Len=strlen(t);
   for(int i=0;i<Len;i++)
   {
       if(!isdigit(t[i]))
	   {
           r=false;
		   break;
	   }
   }   
   return r;
}

//实现 获取当前系统的年-月-日格式的时间
char* WinApi_Year_Month_Day()
{
	 SYSTEMTIME sys;
	 GetLocalTime(&sys);	 
	 char* s=new char[10];
	 sprintf(s,"%4d-%02d-%02d",sys.wYear,sys.wMonth,sys.wDay);
     return s;
}

//实现 比较日期字符串函数
unsigned long Compare_To_Date(char* datetime1,char* datetime2)
{
    //return 3表示日期格式不正确
	//return 2表示datetime1>datetime2
	//return 1表示datetime1=datetime2
	//return 0表示datetime1<datetime2
    unsigned short year1;
    unsigned short month1;
    unsigned short day1;
    unsigned short year2;
    unsigned short month2;
    unsigned short day2;

    unsigned long bValidate;

    bValidate=Validate_Date(datetime1,&year1,&month1,&day1);
    if(bValidate==false){
        return 3;
    }

    bValidate=Validate_Date(datetime2,&year2,&month2,&day2);
    if(bValidate==false){
        return 3;
    }

    if(year1<year2) return 0;
    if(year1>year2) return 2;

    if(month1<month2) return 0;
    if(month1>month2) return 2;

    if(day1<day2) return 0;
    if(day1>day2) return 2;

    return 1;
}
//实现 比较当前日期字符串函数
unsigned long Compare_To_Current_Date(char* datetime){
    
    unsigned short year;
    unsigned short month;
    unsigned short day;
    unsigned long bValidate=Validate_Date(datetime,&year,&month,&day);
    if(bValidate==false){
        return 3;
    }
    
    SYSTEMTIME CurTime;
    GetLocalTime(&CurTime);
    

    if(CurTime.wYear>year)
        return 2;
    else if(CurTime.wYear<year)
        return 0;

    if(CurTime.wMonth>month)
        return 2;
    else if(CurTime.wMonth<month)
        return 0;

    if(CurTime.wDay>day)
        return 2;
    else if(CurTime.wDay<day)
        return 0;

    return 1;
}
//实现 验证日期字符串格式正确性函数
unsigned long Validate_Date(char* date,unsigned short * year,unsigned short * month,unsigned short * day){

    if(strlen(date)<10) return false;
    std:string s(date);
    string _1=s.substr(4,1);
	string _2=s.substr(7,1);
    if(!EqStr(_1.c_str(),"-")) return false;
    if(!EqStr(_2.c_str(),"-")) return false;

    string szyear=s.substr(0,4);//yyyy-mm-dd  
    string szmonth=s.substr(5,2);
    string szday=s.substr(8,2);

    if(IsNumber(szyear)==false) return false;
    if(IsNumber(szmonth)==false) return false;
    if(IsNumber(szday)==false) return false;

    unsigned long bResult;
    try
	{    
        *year=(unsigned short)atol(szyear.c_str());
        *month=(unsigned short)atol(szmonth.c_str());
        *day=(unsigned short)atol(szday.c_str());
        bResult= true;
    }
	catch(...)
	{
        bResult=false;
    }
    return bResult;    
}

//实现 获取机器码函数
char* GetMachineCode(void)
{
   char* cpuid=GetCpuId();
   char* ret;
   for(int i=0;i<=2;i++)
   {
	   ret=md5(cpuid); 
	   cpuid=ret;
   }
   return ret;
}
//实现 获取Cpu编号函数
char* GetCpuId(void)
{
	unsigned long s1,s2;	  
	__asm
	{   
		mov eax,01h   
			xor edx,edx   
			cpuid   
			mov s1,edx   
			mov s2,eax   
	}  
	//CString CPUID; 
	//CPUID.Format("%08X%08X",s1,s2);
	//return CPUID;
	char ret[255];
	sprintf(ret,"%08X%08X",s1,s2);
	char* lpmac=ret; 
	char* RetVal=new char[strlen(lpmac)+1];
	strcpy(RetVal,lpmac);
	return RetVal;	
}

//实现 md5加密算法函数
char* md5(char* src)
{
	char md5[64] = {0};
    hex_md5(src, md5, 32);
	char* ret;
    ret=new char[strlen(md5)+1];
    strcpy(ret,md5);
    return ret;
}
//实现 是否有使用权的函数 
bool IsLencense(void)
{
	bool r=true;
	char* cpuid=GetCpuId();	 
	 char* curdate=WinApi_Year_Month_Day();
   //char* todate="2011-12-31";
	 char* tmpmachinecode=UnionStr(cpuid,todate);
	 char* regcode=md5(tmpmachinecode);
	 //printf("%s\n",regcode);printf("%s\n",code);
	 //WriteToLog(regcode);WriteToLog(code);
     if(EqStr(regcode,code)==true)
	 {
         printf("注册码有效(%s=%s)\n",code,regcode);
		 //时间是否过期
		 //curdate<=todate
		 //printf("curdate=%s\n",curdate);printf("todate=%s\n",todate);
		 int retval=Compare_To_Date(curdate,todate);
		 //printf("retval=%d\n",retval);
		 if(retval==0 || retval==1)
		 {
			 r=true;
		 }
		 else
		 {
			 r=false;
		 }
	 }
	 else
	 {
         r=false;
         printf("注册码无效(%s=%s)\n",code,regcode);
	 }	 
	 return r;
}

//实现 获取ServerConfig.ini参数函数
bool GetServerConfig_ini(void)
{
	char* curdir;
	if(CurExeDir==NULL)
	{
        CurExeDir=GetCurDir();
	}
	curdir=CurExeDir;
	//获取ini文件中的数据
	 char* inifn="ServerConfig.ini";
	 int len=strlen(curdir)+strlen(inifn)+1;
	 char* inipath=new char[len];
	 sprintf(inipath, "%s\\%s", curdir, inifn);
	 //printf(inipath);
	 //---------	 
	 char* line;
	 filepath =inipath;
	 if(OpenFile()==true)
	 {
		char* line;
		while(!EndFile())
		{
		    line=NextLine();
			if(line!=NULL)
			{
               //printf("%s\n",line);
			   int lineLen=strlen(line);
			   if(lineLen>0)
			   {
                   if(line[0]!=';')
				   {
                      if(strstr(line,"LicenseServerHost=")!=NULL)
					  {
                          host=line;
					  }
					  if(strstr(line,"Port=")!=NULL)
					  {
                          port=line;
					  }
					  if(strstr(line,"ToDate=")!=NULL)
					  {
                          todate=line;
					  }
					  if(strstr(line,"LicenseCode=")!=NULL)
					  {
                          code=line;
					  }
				   }
			   }
			}
		}
		CloseFile();
	 }
	 ReplaceStr(host,"LicenseServerHost=","");
	 ReplaceStr(port,"Port=","");
	 ReplaceStr(todate,"ToDate=","");
	 ReplaceStr(code,"LicenseCode=","");
	 printf("host->%s\n",host);
	 printf("port->%s\n",port);
	 printf("todate->%s\n",todate);
	 printf("code->%s\n",code);
	 return true;
}

//实现 打开文件操作
bool OpenFile(void)
{    
    char* path=filepath;    
    if((fp=fopen(path,"r"))==NULL)
    {
	    printf("file cannot be opened\n");
		return false;
    }
	return true;
}
//实现 检查文件是否结束函数
int EndFile(void)
{
	return feof(fp);
}
//实现 读取下一行函数
char* NextLine()
{
	char line[4000];
	if(fgets(line,4000,fp)!=NULL)
	{
		char* ret=new char[strlen(line)+1];
		strcpy(ret,line);
        return ret;
	}
	return NULL;
}
//实现 关闭文件函数
int CloseFile(void)
{
	if(fp!=NULL)
	{
	   return fclose(fp);
	}
	return -1;
}
//---the---end---


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你的程序加密过OD MD5值支持二次开发使用 防破解验证也可实现一机一码 VC++ 开发 STARTUPINFO startup; PROCESS_INFORMATION process; CString g_strCompanyName1 = ""; CString g_strCompanyName2 = ""; CString g_strCompanyName3 = ""; CString g_strCompanyName = "**"; BOOL CTaiShanApp::InitInstance() { AfxEnableControlContainer(); //#ifdef ZJH m_gMessageID = ::RegisterWindowMessage("WsSendMessageHqData"); CFileFind fnd; if(S_OK != ::CoInitialize (NULL)) return FALSE; // ReadDiskIDPartCwd(); // if(!FyRegister::IsValidUser()) // return FALSE; memset( &startup, 0, sizeof( startup ) ); startup.cb = sizeof( startup ); memset( &process, 0, sizeof( process ) ); if(fnd.FindFile ("WsSendMessageShare.exe")) { m_gbUseExe = true; } hAppMutex=::CreateMutex(NULL,TRUE,m_pszExeName); if(GetLastError() == ERROR_ALREADY_EXISTS) { CWnd *pPrevWnd = CWnd::GetDesktopWindow()->GetWindow(GW_CHILD); while(pPrevWnd) { if(::GetProp(pPrevWnd->GetSafeHwnd(),m_pszExeName)) { if(pPrevWnd->IsIconic()) pPrevWnd->ShowWindow(SW_RESTORE); pPrevWnd->SetForegroundWindow(); pPrevWnd->GetLastActivePopup()->SetForegroundWindow(); return false; } pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT); } return false; } //#endif #ifndef _NET_AUTHEN HMODULE hModule; hModule = LoadLibrary("ide21201.dll"); if (hModule==NULL) { AfxMessageBox("Can't find ide21201.dll"); return FALSE; } char *(WINAPI * GetIdeSerial)(); GetIdeSerial = (char *(WINAPI *)())GetProcAddress(hModule, "GetIdeSerial"); if (GetIdeSerial==NULL) { AfxMessageBox("Can't find GetIdeSerial in ide21201.dll"); return FALSE; } CString strSerialNumber;// = SERIAL_NUMBER; strSerialNumber = GetIdeSerial(); strSerialNumber.TrimLeft(" "); if (strSerialNumber.Compare(SERIAL_NUMBER)!=0) { AfxMessageBox("序列号错误"); return FALSE; } #else CDlgLogin dlgLogin; int nResponse = dlgLogin.DoModal(); if (nResponse!=1) return FALSE; #endif /* CDialogShowInformation dlg; dlg.DoModal();*/ int nResult; m_bAppAuthorized=TRUE; // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. CTaiTestSplash *m_splash; BOOL SplashOpen=FALSE; m_splash = new CTaiTestSplash; SplashOpen=m_splash->Create(); if( SplashOpen ) m_splash->ShowWindow(SW_SHOW); DWORD Currenttime=GetTickCount(); BeginWaitCursor(); #ifdef TEST_USER1 t = CTime::GetCurrentTime(); CTime t2 = g_timeUseEnd; if(t >= t2) { // AfxMessageBox("试用期已过,若想继续使用,请购买正式版!",MB_OK | MB_ICONSTOP); return false; } else 以上为部分代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值