www.gusucode.com > 一些VC++加密算法+实例源码源码程序 > 一些VC++加密算法+实例源码/优化后的加密注册模块/优化后的加密注册模块/inventory(syn_thread)/ErrorReport.cpp

    //****************************************************
//*        Arko Information Technology Co.,Ltd.      *
//****************************************************
//*Errorreport.cpp           Version: 1.0            *
//*Copyright: This is a part of the Arko Source Code *
//****************************************************
//*Programmmer: YL                                   *
//*Date: 2000-07-31                                  *
//****************************************************
#include "stdafx.h"

#include <winsock2.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "ErrorReport.h"
#include "Encry.h"
#include "module.h"
#include "am_lv1.h"

#include "EventLogService_i.c"


Eventinfo eventinfo;

long	LogCount=0;
BOOL	bRegService;
BOOL	bExit;
char *  dbip;
char *  sqldecry ;
char *  sqlencry ;
extern unsigned char pKey[8];

extern HRESULT SetEndSecurity (	long serviceID );



///////////////////////////////////////Functions/////////////////////////////////////////////////////////
HRESULT ConnectDb (dbptr *db_ptr)
{
	dbptr m_SQLObject = NULL;

	if(!dbip) return 502;
/*	COSERVERINFO ServerInfo;
	memset(&ServerInfo, 0, sizeof(ServerInfo));
	ServerInfo.pwszName=new wchar_t[16];
	mbstowcs(ServerInfo.pwszName, dbip, 16);


	HRESULT hRes=CoCreateInstanceEx(CLSID_DBObject,
										NULL,
										CLSCTX_ALL,
										&ServerInfo,
										sizeof(mqi)/sizeof(mqi[0]),
										mqi);
*/
	MULTI_QI mqi[]={ {&IID_IDBObject, NULL , 0}}; 
	
	COSERVERINFO srvinfo = {0, L"192.100.1.1", NULL, 0};

	BSTR bstr = (BSTR)MakeWideStrFromAnsi((LPSTR)dbip); 
	srvinfo.pwszName=(LPWSTR)bstr;

//    free (RemoteService);
// Create the object and query for two interfaces
	HRESULT hRes=CoCreateInstanceEx(
		CLSID_DBObject,				// Request an instance of class CLSID_MyBackupService
		NULL,							// No aggregation
		CLSCTX_SERVER,					// Any server is fine
		&srvinfo,						// Contains remote server name
		sizeof(mqi)/sizeof(mqi[0]),		// number of interfaces we are requesting (2)
		mqi);

	if(hRes==S_OK)//successfully conncected;
	{
		if (SUCCEEDED(mqi[0].hr))
		{
			m_SQLObject=(IDBObject*)mqi[0].pItf;
			_ASSERTE(m_SQLObject!=NULL);
		}
		*db_ptr = m_SQLObject;
		return S_OK;
	}
	else return 501;
		
}


HRESULT ServiceRegSelf()
{
	dbptr m_SQLObject = NULL;

	HRESULT hrtmp = ConnectDb(&m_SQLObject);
		if ( hrtmp != S_OK ) return hrtmp;

	char lpBuf[MAX_COMPUTERNAME_LENGTH + 1];
	DWORD pdwCount = MAX_COMPUTERNAME_LENGTH;
	if(!GetComputerName(lpBuf,&pdwCount ))	
		return FatalError;
	 
	char *ipaddr = new char [IP_LEN];
	unsigned int ipsize= IP_LEN;
	if ( c_GetIpAddr(ipaddr,&ipsize)) 
		return FatalError;
	

//call the remote method to write db.
//find if there already exists one  
	db_table		in_table;
 	in_table.db_table_id = DB_SERVICE | TABLE_SERVICE_REG;
	in_table.db_operation = SELECT;
//	in_table.encrypt_id = 0;

	int				rec_number;
	tab_record		records;
	int				begin=0;
	int				out_number;

	sprintf(sqlencry,"select * from SERVICEREGTAB where ServiceID=%d",ServiceSourceID);
	DesStrEn ((unsigned char *)sqlencry,(unsigned char *)sqldecry,pKey) ;
	strcpy((char *)in_table.sql_statement,sqldecry);
	in_table.encrypt_id = SetMask (0,0,0,0) ;
	HRESULT hRes = m_SQLObject->av_dbsql(&in_table,&records,&rec_number,&out_number,begin);

	if (hRes != S_OK && hRes != 1001) 
		return 503;
	

	if (out_number == 1 ) 
	{
		in_table.db_operation = UPDATE;

		sprintf(sqlencry,"update SERVICEREGTAB set IPAddress='%s' , HostName='%s' where ServiceID=%d",ipaddr,lpBuf,ServiceSourceID);
		DesStrEn ((unsigned char *)sqlencry,(unsigned char *)sqldecry,pKey) ;
		strcpy((char *)in_table.sql_statement,sqldecry);
		in_table.encrypt_id = SetMask (1,0,0,0) ;
		hRes= m_SQLObject->av_dbsql2(&in_table);
	} else
	{
		in_table.db_operation = INSERT;
		sprintf(sqlencry,"insert into SERVICEREGTAB values(%d,'%s','%s')",ServiceSourceID,ipaddr,lpBuf);
		DesStrEn ((unsigned char *)sqlencry,(unsigned char *)sqldecry,pKey) ;
		strcpy((char *)in_table.sql_statement,sqldecry);
		in_table.encrypt_id = SetMask (1,0,0,0) ;
		hRes= m_SQLObject->av_dbsql2(&in_table);

	}
	free ( ipaddr ) ;
	m_SQLObject->Release();

	return 0;
		
}

HRESULT ServiceUnRegSelf()
{
	dbptr m_SQLObject = NULL;

	HRESULT hrtmp = ConnectDb(&m_SQLObject);
		if ( hrtmp != S_OK ) return hrtmp;

	db_table		in_table;
 	in_table.db_table_id = DB_SERVICE | TABLE_SERVICE_REG;
	in_table.db_operation = SELECT;
//	in_table.encrypt_id = 0;

	int				rec_number;
	tab_record		records;
	int				begin=0;
	int				out_number;

	unsigned int ipsize= IP_LEN;
	char *ipaddr = new char [IP_LEN];
	if ( c_GetIpAddr(ipaddr,&ipsize)) 
	{
		m_SQLObject->Release();
		return FatalError;
	}

	sprintf(sqlencry,"select * from SERVICEREGTAB where ServiceID=%d and IPAddress='%s'",ServiceSourceID,ipaddr);
	DesStrEn ((unsigned char *)sqlencry,(unsigned char *)sqldecry,pKey) ;
	strcpy((char *)in_table.sql_statement,sqldecry);
	in_table.encrypt_id = SetMask (1,0,0,0) ;	    
	HRESULT hRes = m_SQLObject->av_dbsql(&in_table,&records,&rec_number,&out_number,begin);

	if (hRes != S_OK && hRes != 1001) 
	{
		free ( ipaddr ) ;
        m_SQLObject->Release() ;
		return 503 ;
	}
	
	if (out_number > 0 )  //exists one 
	{
		in_table.db_operation = DELET;
		sprintf(sqlencry,"delete from SERVICEREGTAB where ServiceID=%d and IPAddress='%s'",ServiceSourceID,ipaddr);
		DesStrEn ((unsigned char *)sqlencry,(unsigned char *)sqldecry,pKey) ;
		strcpy((char *)in_table.sql_statement,sqldecry);
		in_table.encrypt_id = SetMask (1,0,0,0) ;	    
		hRes= m_SQLObject->av_dbsql2(&in_table);
	}

	m_SQLObject->Release();
	return hRes;
}

void ServiceInit (void) 
{
	sqldecry = new char [EN_SQL_LEN] ;  //use for sqlstatement encryption
	sqlencry = new char [SQL_LEN] ;		//use for sqlstatement encryption
	dbip = new char [IP_LEN] ;

	EventInit (&eventinfo);

	bRegService=false;
	bExit=false;

	char CNF[260];
	unsigned int cbsize=260;
	if(am_LocaConfFile(ArkoMasterDbReg,ArkoDBValue,CNF,&cbsize))
	{
		eventinfo.flag=2;
   		eventinfo.EventID=510;
		ErrorProc(&eventinfo);
		bExit=true;	//更新
		return;
	}
	strcat(CNF,"\\ARKODB.INI");

	unsigned int ipsize = IP_LEN ;
	if (am_GetConfIp (CNF,dbip,&ipsize)) 
	{
		eventinfo.flag=2;
   		eventinfo.EventID=502;
		ErrorProc(&eventinfo);
		bExit=true;	//更新
		return ;
	}
}

void ServiceShutDown (void) 
{
	if(bRegService)
	{
		HRESULT hRes=ServiceUnRegSelf();
		if ( hRes != S_OK ) 
		{
			eventinfo.flag=2;
			eventinfo.EventID=hRes;
			ErrorProc(&eventinfo);
			eventinfo.flag=3;
			eventinfo.EventID=E_UnRegistry;
			ErrorProc(&eventinfo);
		}
	}
	free ( sqlencry ) ;
	free ( sqldecry ) ;
	free ( dbip ) ;
}

DWORD RegThreadProc(void *p)
{
	if(bExit)		//error occurs when service initialization
	{
		Sleep(RUNTIME);		//wait for the main thread
		PostThreadMessage(_Module.dwThreadID, WM_QUIT, 0, 0);
		return S_FALSE;       
	}

    HRESULT hRes=CoInitialize(NULL);          //initialization for DCOM      

	do
	{
		int ifkey = GetPublicKey (pKey);  //得到通信密钥
		if (ifkey) 
		{
			if (ifkey > 1003) ifkey = 511 ;
				else ifkey = ifkey - 500;
			eventinfo.flag=2;
			eventinfo.EventID=ifkey;
			ErrorProc(&eventinfo);
		} else
		{
			hRes = ServiceRegSelf();		//do registry
			if ( hRes == S_OK) break;
			   else
			{
				eventinfo.flag=2;
				eventinfo.EventID=hRes;
				ErrorProc(&eventinfo);
				eventinfo.EventID=E_Registry;
				ErrorProc(&eventinfo);
				if (hRes == 502) 
				{
					Sleep(RUNTIME);		//wait for the main thread
					PostThreadMessage(_Module.dwThreadID, WM_QUIT, 0, 0);
					return S_FALSE;       
				}
			}
		}
		Sleep (RUNTIME*3);
	} while (true);		//wait for database start

	bRegService=true;		//successfully start

	SetEndSecurity(ServiceSourceID);		//set flag for end auth service

	CoUninitialize();             //uninitialize DCOM

	return hRes;
}

////////////////////////////////////////////////////////////////////////////////////////////////

HRESULT EventInit(Eventinfo *peventinfo)
{
	peventinfo->EventID=0;

	peventinfo->flag=0;

	strcpy (peventinfo->OperUserName,ServiceName);

	char *ipaddr = new char [IP_LEN];
	unsigned int ipsize= IP_LEN;
	c_GetIpAddr(ipaddr,&ipsize);
	strcpy(peventinfo->SourceIPAddress,ipaddr);
	free ( ipaddr ) ;

	DWORD nSize=sizeof(peventinfo->EventHostName);
    GetComputerName(peventinfo->EventHostName,&nSize);

	peventinfo->EventSourceID=ServiceSourceID;

	return S_OK;
}

void copyfd(fstream &infile,fstream &outfile)
{
	char ch;
	while(infile.get(ch))
		outfile.put(ch);
	return;
}


int adjustfp()
{
	fstream infp,outfp;
	infp.open(ErrorLog,ios::in);
	if(!infp) return -1;
	outfp.open(TMP001,ios::out);
	if(!outfp) return -1;

	while(infp.get()!='\n');
	copyfd(infp,outfp);

	infp.close();
	outfp.close();
	DeleteFile(ErrorLog);
	rename(TMP001,ErrorLog);

	return 0;
}


/*
* GetIpAddr
*  get the local IP
* return 
*  the string of IP if success.or 0;
*/
/*
char *GetIpAddr(void)
{
    struct in_addr inaddr;
    int wVerReq;
    WSAData wsaData;
    struct hostent *hptr;
    char hostname[MAX_HOSTNAME_LEN+1];

    wVerReq=0x0002;
    if(WSAStartup(wVerReq,&wsaData))
        return NULL;
    if(gethostname(hostname,MAX_HOSTNAME_LEN))
        return NULL;
    if(!(hptr=gethostbyname(hostname)))
        return NULL;
 
    memcpy((char *)&inaddr,hptr->h_addr_list[0],hptr->h_length);
    WSACleanup();
    return inet_ntoa(inaddr);

}
*/
/*
* readCnf
*  read the database config file,get db IP
* return 
*  the string of IP if success.or 0;
* note
*  config file: there is no blank among IP string.
*/ 
/*
char *readCnf(char *filename) 
{
	char *buf;
	char ch;
	 int  i=0;
	fstream fp;

	fp.open(filename,ios::in|ios::nocreate);
	if(!fp)
	return NULL;

	if((buf=(char *)malloc(IP_LEN))==NULL)
	return NULL;

	while(!isdigit(ch=fp.peek()))
	fp.get();

	fp.getline(buf,IP_LEN);
	while(i++,buf[i]!=' '&&buf[i]!=0);
	buf[i]=0;
	fp.close();
	return buf;
}
*/
/*
HRESULT ConnectDb ()
{
	if (m_hrdb == S_OK) m_DBObject->Release();

	char *RemoteService=readCnf();
	if(!RemoteService) 
	{
		m_hrdb = S_FALSE;
		return 502;
	}

	MULTI_QI mqi[]={ {&IID_IDBObject, NULL , 0}}; 
	
	COSERVERINFO srvinfo = {0, L"192.100.1.1", NULL, 0};

	BSTR bstr = (BSTR)MakeWideStrFromAnsi((LPSTR)RemoteService); 
	srvinfo.pwszName=(LPWSTR)bstr;

    free (RemoteService);
// Create the object and query for two interfaces
	HRESULT hRes=CoCreateInstanceEx(
		CLSID_DBObject,				// Request an instance of class CLSID_MyBackupService
		NULL,							// No aggregation
		CLSCTX_SERVER,					// Any server is fine
		&srvinfo,						// Contains remote server name
		sizeof(mqi)/sizeof(mqi[0]),		// number of interfaces we are requesting (2)
		mqi);

	if(hRes==S_OK)//successfully conncected;
	{
		if (SUCCEEDED(mqi[0].hr))
		{
			m_DBObject=(IDBObject*)mqi[0].pItf;
			_ASSERTE(m_DBObject!=NULL);
		}
		m_hrdb = S_OK;
		return S_OK;
	}
	else 
	{
		m_hrdb = S_FALSE;
		return 501;
	}
	
}
*/
/*
HRESULT ServiceRegSelf()
{
	char lpBuf[MAX_COMPUTERNAME_LENGTH + 1];
	DWORD pdwCount = MAX_COMPUTERNAME_LENGTH;
	if(!GetComputerName(lpBuf,&pdwCount ))	
		return FatalError;
 
	char *ipaddr=GetIpAddr();
	if ( ipaddr == NULL ) 
		return FatalError;
	

//call the remote method to write db.
//find if there already exists one  
	db_table		in_table;
 	in_table.db_table_id = DB_SERVICE | TABLE_SERVICE_REG;
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;

	int				rec_number;
	tab_record		records;
	int				begin=0;
	int				out_number;

	sprintf((char *)in_table.sql_statement,"select * from SERVICEREGTAB where ServiceID=%d",ServiceSourceID);
	    
	HRESULT hRes = m_DBObject->av_dbsql(&in_table,&records,&rec_number,&out_number,begin);

	if (hRes != S_OK && hRes != 1001) 
	{
		eventinfo.flag=2;
		eventinfo.EventID=503;
		ErrorProc(&eventinfo);
		return hRes;
	}
	

	if (out_number == 1 ) 
	{
		in_table.db_operation = UPDATE;

		sprintf((char *)in_table.sql_statement,"update SERVICEREGTAB set IPAddress='%s' , HostName='%s' where ServiceID=%d",ipaddr,lpBuf,ServiceSourceID);
		hRes= m_DBObject->av_dbsql2(&in_table);
	} else
	{
		in_table.db_operation = INSERT;
		sprintf((char *)in_table.sql_statement,"insert into SERVICEREGTAB values(%d,'%s','%s')",ServiceSourceID,ipaddr,lpBuf);

		hRes= m_DBObject->av_dbsql2(&in_table);

	}

	return hRes;
		
}


HRESULT DisConnectDb()
{
	if (_Module.m_hrev == S_OK)	m_EventService->Release();

	if (_Module.m_hrdb!=S_OK) return S_OK;

	db_table		in_table;
 	in_table.db_table_id = DB_SERVICE | TABLE_SERVICE_REG;
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;

	int				rec_number;
	tab_record		records;
	int				begin=0;
	int				out_number;

	char *ipaddr=GetIpAddr();
	if ( ipaddr == NULL ) 
	{
		eventinfo.flag=2;
		eventinfo.EventID=FatalError;
		ErrorProc(&eventinfo);
		return FatalError;
	}

	sprintf((char *)in_table.sql_statement,"select * from SERVICEREGTAB where ServiceID=%d and IPAddress='%s'",ServiceSourceID,ipaddr);
	    
	HRESULT hRes = m_DBObject->av_dbsql(&in_table,&records,&rec_number,&out_number,begin);

	if (hRes != S_OK && hRes != 1001) 
	{
		eventinfo.flag=2;
		eventinfo.EventID=503;
		ErrorProc(&eventinfo);
		return hRes;
	}
	
	if (out_number > 0 )  //exists one 
	{
		in_table.db_operation = DELET;

		sprintf((char *)in_table.sql_statement,"delete from SERVICEREGTAB where ServiceID=%d and IPAddress='%s'",ServiceSourceID,ipaddr);
		hRes= m_DBObject->av_dbsql2(&in_table);
		return hRes;
	} else  //exists none 
	    return S_OK;
 
}
*/

HRESULT ConnectEvent(evptr *ev_ptr)
{
	dbptr m_SQLObject=NULL;
	evptr m_EventService=NULL;

	HRESULT hrtmp=ConnectDb(&m_SQLObject);
		if ( hrtmp != S_OK ) return hrtmp;

//qrery database
	db_table		in_table;
 	in_table.db_table_id = DB_SERVICE | TABLE_SERVICE_REG;
	in_table.db_operation = SELECT;
//	in_table.encrypt_id = 0;

	int				rec_number;
	tab_record		records;
	tables_union	*ret_records;
	int				begin=0;
	int				out_number;

	sprintf(sqlencry,"select * from SERVICEREGTAB where ServiceID=%d",EventServiceID);        
	DesStrEn ((unsigned char *)sqlencry,(unsigned char *)sqldecry,pKey) ;
	strcpy((char *)in_table.sql_statement,sqldecry);
	in_table.encrypt_id = SetMask (0,0,0,0) ;
    HRESULT hRes = m_SQLObject->av_dbsql(&in_table,&records,&rec_number,&out_number,begin);

//	if ( hRes >= 0 ) m_SQLObject->Release();
	m_SQLObject->Release();
	if ( hRes == 1001 ) return 508;
	
	ret_records = (tables_union *)records.records_buf;

	char ipaddress[IP_LEN];
	strcpy (ipaddress,(char *)ret_records->table_svr_reg.IPAddress);
				
	BSTR ippoint = (BSTR)MakeWideStrFromAnsi((LPSTR)ipaddress); 

//connect event service

	MULTI_QI mqi[]={ {&IID_IEventService, NULL , 0}}; 
	
	COSERVERINFO srvinfo = {0, L"192.100.1.1", NULL, 0};

	srvinfo.pwszName = (LPWSTR) ippoint;


// Create the object and query for two interfaces
	hRes=CoCreateInstanceEx(
		CLSID_EventService,				// Request an instance of class CLSID_MyBackupService
		NULL,							// No aggregation
		CLSCTX_SERVER,					// Any server is fine
		&srvinfo,						// Contains remote server name
		sizeof(mqi)/sizeof(mqi[0]),		// number of interfaces we are requesting (2)
		mqi);

	if(hRes==S_OK)//successfully conncected;
	{
		if (SUCCEEDED(mqi[0].hr))
		{
			m_EventService=(IEventService*)mqi[0].pItf;
			_ASSERTE(m_EventService!=NULL);
		}
		*ev_ptr = m_EventService;
		return S_OK;
	}
	else return 504;
	
}



HRESULT ReEvent(evptr m_EventService,long Event_ID,long EventSourceID,char EventHostName[MAX_HOSTNAME_LEN+1],char SourceIPAddress[IP_LEN],char eventlevel[MAX_LEVEL_LEN],char Event_Description[MAX_DESCRIPTION_LEN],BSTR E_OU,BSTR pOperIP,BSTR pOperHost)
{

//	evptr m_EventService=ev_ptr;

    long E_type = Event_Type;
	long SourceID=ServiceSourceID;

//get system time
	char dbuffer[9],tbuffer[9];
	char E_Time[TIME_LEN];
	_strdate( dbuffer );  
    _strtime( tbuffer );
	E_Time[0]='2';E_Time[1]='0';E_Time[2]=dbuffer[6];E_Time[3]=dbuffer[7];
	E_Time[4]=dbuffer[0];E_Time[5]=dbuffer[1];E_Time[6]=dbuffer[3];E_Time[7]=dbuffer[4];
	E_Time[8]=tbuffer[0];E_Time[9]=tbuffer[1];E_Time[10]=tbuffer[3];E_Time[11]=tbuffer[4];
	E_Time[12]=tbuffer[6];E_Time[13]=tbuffer[7];E_Time[14]=tbuffer[8];
//end get


/////////////////////////////////////////////////////////
    BSTR			bstr;
	VARIANT			varWriteDB;
	SAFEARRAYBOUND	rgsabound[1];
	LPOLESTR		tmp1;
	HRESULT			hResult;
	wchar_t			buffer[256];

	VariantInit(&varWriteDB);
	varWriteDB.vt =VT_ARRAY;
	rgsabound[0].lLbound =0;
	rgsabound[0].cElements =10;

	varWriteDB.parray =SafeArrayCreate(VT_BSTR,1,rgsabound);

	int Index=0;
		
	//event ID	
    _ultow((unsigned long)Event_ID,buffer,10);          
	bstr = SysAllocString((OLECHAR *)(buffer));
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)bstr);
	SysFreeString (bstr);
	Index++;

	//Event type
    _ultow((unsigned long)E_type,buffer,10);  		
	bstr = SysAllocString((OLECHAR *)(buffer));
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)bstr);
	SysFreeString (bstr);
	Index++;

	//Service source ID
    _ultow((unsigned long)SourceID,buffer,10);  
	bstr = SysAllocString((OLECHAR *)(buffer));
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)bstr);
	SysFreeString (bstr);
	Index++;

	//Event Source ID
    _ultow((unsigned long)EventSourceID,buffer,10);  
    bstr = SysAllocString((OLECHAR *)(buffer));
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)bstr);
	SysFreeString (bstr);
	Index++;

	//Event Host Name
	AnsiToUnicode((LPCSTR)EventHostName,&tmp1);      //Event Host Name
	bstr=SysAllocString(tmp1);
	CoTaskMemFree (tmp1);
////////////////////////////////////////encrypt///////////////////////////////////////////
	BSTR EventHostName_encrypt = SysAllocStringByteLen (NULL,STR128*2);
	DesBSTREn (bstr,&EventHostName_encrypt,pKey);
////////////////////////////////////////encrypt///////////////////////////////////////////
    hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)EventHostName_encrypt);
	SysFreeString (bstr);
	Index++;

	//Source IP Address
	AnsiToUnicode((LPCSTR)SourceIPAddress,&tmp1);      //SourceIPAddress
	bstr=SysAllocString(tmp1);
	CoTaskMemFree (tmp1);
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)bstr);
	SysFreeString (bstr);
	Index++;

	//Event Description
	AnsiToUnicode((LPCSTR)Event_Description,&tmp1);      //EventDescription
	bstr=SysAllocString(tmp1);
	CoTaskMemFree (tmp1);
////////////////////////////////////////encrypt///////////////////////////////////////////
	BSTR Event_Description_encrypt = SysAllocStringByteLen (NULL,STR128*2);
	DesBSTREn (bstr,&Event_Description_encrypt,pKey);
////////////////////////////////////////encrypt///////////////////////////////////////////
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)Event_Description_encrypt);
	SysFreeString (bstr);
	Index++;

	//Event Level
	AnsiToUnicode(eventlevel,&tmp1);      //EventLevel
	bstr=SysAllocString(tmp1);
	CoTaskMemFree (tmp1);
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)bstr);
	SysFreeString (bstr);
	Index++;
 
	//Operation User Name
////////////////////////////////////////encrypt///////////////////////////////////////////
	BSTR User_encrypt = SysAllocStringByteLen (NULL,STR32*2);
	DesBSTREn (E_OU,&User_encrypt,pKey);
////////////////////////////////////////encrypt///////////////////////////////////////////
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)User_encrypt);
	Index++;

	//Record Time
	AnsiToUnicode((LPCSTR)E_Time,&tmp1);      //RecordTime
	bstr=SysAllocString(tmp1);
	CoTaskMemFree (tmp1);
	hResult = SafeArrayPutElement(varWriteDB.parray,(long*)&Index,(void *)bstr);
	SysFreeString (bstr);
	Index++;


	hResult = m_EventService->EventReport(&varWriteDB,1);


	SysFreeString (EventHostName_encrypt) ;
	SysFreeString (Event_Description_encrypt) ;
	SysFreeString (User_encrypt) ;

	SafeArrayDestroy ( varWriteDB.parray ) ;
	VariantClear ( &varWriteDB ) ;

	return hResult;
}

int InvConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
		case 2001:
        strcpy(EventDescription,"注册资产服务失败");
		strcpy(EventLevel,"1");
		break;

		case 2002:
        strcpy(EventDescription,"注销资产服务失败");
		strcpy(EventLevel,"5");
		break;

		case 2003:
        strcpy(EventDescription,"新端系统加入失败");
		strcpy(EventLevel,"6");
		break;

		case 2004:
        strcpy(EventDescription,"更新端系统失败");
		strcpy(EventLevel,"6");
		break;

		case 2005:
        strcpy(EventDescription,"查询MAP信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2006:
        strcpy(EventDescription,"查询CPU信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2007:
        strcpy(EventDescription,"查询MEM信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2008:
        strcpy(EventDescription,"查询FILE信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2009:
        strcpy(EventDescription,"查询OS信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2010:
        strcpy(EventDescription,"查询DEVICE信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2011:
        strcpy(EventDescription,"查询NETWORK信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2012:
        strcpy(EventDescription,"查询STAT信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2013:
        strcpy(EventDescription,"查询NETSTAT信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2014:
        strcpy(EventDescription,"查询CONDEV信息失败");
		strcpy(EventLevel,"6");
		break;

		case 2015:
        strcpy(EventDescription,"连接主代理失败");
		strcpy(EventLevel,"5");
		break;

		case 2251:
        strcpy(EventDescription,"端系统不在线");
		strcpy(EventLevel,"15");
		break;

		default:
			strcpy(EventDescription,"未知错误");
			strcpy(EventLevel,"16");

	}
	
	return 0;

}

int NetConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
		case 1001:
        strcpy(EventDescription,"注册拓扑服务失败");
		strcpy(EventLevel,"1");
		break;
		
		case 1002:
        strcpy(EventDescription,"注销拓扑服务失败");
		strcpy(EventLevel,"5");
		break;

		case 1003:
        strcpy(EventDescription,"UCICMP初始化失败");
		strcpy(EventLevel,"4");
		break;

		case 1004:
        strcpy(EventDescription,"Trap发生");
		strcpy(EventLevel,"4");
		break;

		case 1005:
        strcpy(EventDescription,"与资产服务连接失败");
		strcpy(EventLevel,"4");
		break;

		case 1006:
        strcpy(EventDescription,"监控变量值超过上下限");
		strcpy(EventLevel,"3");
		break;
		
		case 1007:
        strcpy(EventDescription,"网络互联设备信息报告资产服务失败");
		strcpy(EventLevel,"7");
		break;

		case 1008:
        strcpy(EventDescription,"写采样表失败");
		strcpy(EventLevel,"7");
		break;

		case 1009:
        strcpy(EventDescription,"获取MIB变量失败");
		strcpy(EventLevel,"7");
		break;

		case 1010:
        strcpy(EventDescription,"获取拓扑图失败");
		strcpy(EventLevel,"7");
		break;

		case 1011:
        strcpy(EventDescription,"Ping操作失败");
		strcpy(EventLevel,"7");
		break;
		
		case 1012:
        strcpy(EventDescription,"IP区间搜索失败");
		strcpy(EventLevel,"7");
		break;

		case 1013:
        strcpy(EventDescription,"获取MIB表变量失败");
		strcpy(EventLevel,"7");
		break;

		case 1014:
        strcpy(EventDescription,"MIB变量设置失败");
		strcpy(EventLevel,"6");
		break;

		case 1015:
        strcpy(EventDescription,"查询采样表失败");
		strcpy(EventLevel,"7");
		break;

		case 1016:
        strcpy(EventDescription,"查询监控表失败");
		strcpy(EventLevel,"7");
		break;

		case 1017:
        strcpy(EventDescription,"编辑监控表失败");
		strcpy(EventLevel,"6");
		break;

		case 1018:
        strcpy(EventDescription,"编辑采样表失败");
		strcpy(EventLevel,"6");
		break;

		case 1019:
        strcpy(EventDescription,"查询采样表失败");
		strcpy(EventLevel,"7");
		break;

		case 1020:
        strcpy(EventDescription,"监控表插入失败");
		strcpy(EventLevel,"6");
		break;

		case 1021:
        strcpy(EventDescription,"采样表插入失败");
		strcpy(EventLevel,"6");
		break;

		case 1022:
        strcpy(EventDescription,"监控表更新失败");
		strcpy(EventLevel,"6");
		break;

		case 1023:
        strcpy(EventDescription,"采样表更新失败");
		strcpy(EventLevel,"6");
		break;

		case 1024:
        strcpy(EventDescription,"监控表删除失败");
		strcpy(EventLevel,"6");
		break;

		case 1025:
        strcpy(EventDescription,"采样表删除失败");
		strcpy(EventLevel,"6");
		break;

		case 1026:
        strcpy(EventDescription,"查询监控表失败");
		strcpy(EventLevel,"7");
		break;

	default:
		strcpy(EventDescription,"未知错误");
		strcpy(EventLevel,"16");

	}
	
	return 0;
}

int AuthConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
		case 7001:
        strcpy(EventDescription,"注册授权服务失败");
		strcpy(EventLevel,"1");
		break;
		
		case 7002:
        strcpy(EventDescription,"注销授权服务失败");
		strcpy(EventLevel,"5");
		break;

		case 7003:
        strcpy(EventDescription,"查询授权信息失败");
		strcpy(EventLevel,"6");
		break;
		
		case 7004:
        strcpy(EventDescription,"插入授权信息失败");
		strcpy(EventLevel,"6");
		break;

		case 7005:
        strcpy(EventDescription,"删除授权信息失败");
		strcpy(EventLevel,"6");
		break;

		case 7007:
        strcpy(EventDescription,"连接端授权代理失败");
		strcpy(EventLevel,"4");
		break;

		case 7008:
        strcpy(EventDescription,"向端授权代理插入授权信息失败");
		strcpy(EventLevel,"5");
		break;

		case 7009:
        strcpy(EventDescription,"向端授权代理删除授权信息失败");
		strcpy(EventLevel,"5");
		break;

		case 7010:
        strcpy(EventDescription,"向端授权代理分发授权信息失败");
		strcpy(EventLevel,"5");
		break;

		case 7501:
        strcpy(EventDescription,"端授权代理注册失败");
		strcpy(EventLevel,"6");
		break;

		case 7502:
        strcpy(EventDescription,"端授权代理注销失败");
		strcpy(EventLevel,"10");
		break;

	default:
			strcpy(EventDescription,"未知错误");
			strcpy(EventLevel,"16");

	}
	return 0;
}

int UserConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
		case 6001:
        strcpy(EventDescription,"注册用户服务失败");
		strcpy(EventLevel,"1");
		break;
		
		case 6002:
        strcpy(EventDescription,"注销用户服务失败");
		strcpy(EventLevel,"5");
		break;

		case 6003:
        strcpy(EventDescription,"用户登录失败");
		strcpy(EventLevel,"12");
		break;
		
		case 6004:
        strcpy(EventDescription,"添加用户失败");
		strcpy(EventLevel,"7");
		break;

		case 6005:
        strcpy(EventDescription,"删除用户失败");
		strcpy(EventLevel,"7");
		break;
		
		case 6006:
        strcpy(EventDescription,"修改用户失败");
		strcpy(EventLevel,"7");
		break;

		case 6007:
        strcpy(EventDescription,"查询用户失败");
		strcpy(EventLevel,"7");
		break;
		
		case 6008:
        strcpy(EventDescription,"添加组失败");
		strcpy(EventLevel,"7");
		break;

		case 6009:
        strcpy(EventDescription,"删除组失败");
		strcpy(EventLevel,"7");
		break;
		
		case 6010:
        strcpy(EventDescription,"修改组失败");
		strcpy(EventLevel,"7");
		break;

		case 6011:
        strcpy(EventDescription,"查询组失败");
		strcpy(EventLevel,"7");
		break;
		
		case 6012:
        strcpy(EventDescription,"添加组员失败");
		strcpy(EventLevel,"7");
		break;

		case 6013:
        strcpy(EventDescription,"删除组员失败");
		strcpy(EventLevel,"7");
		break;
		
		case 6014:
        strcpy(EventDescription,"删除系统管理员帐号失败");
		strcpy(EventLevel,"7");
		break;

		case 6015:
        strcpy(EventDescription,"连接端系统失败");
		strcpy(EventLevel,"5");
		break;
		
		case 6016:
        strcpy(EventDescription,"删除授权失败");
		strcpy(EventLevel,"6");
		break;

		case 6017:
        strcpy(EventDescription,"连接授权服务失败");
		strcpy(EventLevel,"5");
		break;

		case 6251:
        strcpy(EventDescription,"无此帐号");
		strcpy(EventLevel,"15");
		break;

		case 6252:
        strcpy(EventDescription,"密码错误");
		strcpy(EventLevel,"15");
		break;
		
		case 6253:
        strcpy(EventDescription,"用户重名");
		strcpy(EventLevel,"15");
		break;

		case 6254:
        strcpy(EventDescription,"组已存在");
		strcpy(EventLevel,"15");
		break;
		
		case 6255:
        strcpy(EventDescription,"组不存在");
		strcpy(EventLevel,"15");
		break;

		case 6256:
        strcpy(EventDescription,"组员不存在");
		strcpy(EventLevel,"15");
		break;
		
		case 6257:
        strcpy(EventDescription,"无效用户");
		strcpy(EventLevel,"15");
		break;

		case 6258:
        strcpy(EventDescription,"用户登录成功");
		strcpy(EventLevel,"15");
		break;


	default:
		strcpy(EventDescription,"未知错误");
		strcpy(EventLevel,"16");

	}
	return 0;
}

int DSConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
		case 8501:
        strcpy(EventDescription,"注册软件分发服务失败");
		strcpy(EventLevel,"1");
		break;
		
		case 8502:
        strcpy(EventDescription,"注销软件分发服务失败");
		strcpy(EventLevel,"5");
		break;

		case 8503:
        strcpy(EventDescription,"连接源端失败");
		strcpy(EventLevel,"5");
		break;

		case 8504:
        strcpy(EventDescription,"连接目标端失败");
		strcpy(EventLevel,"5");
		break;

		case 8505:
        strcpy(EventDescription,"超时操作");
		strcpy(EventLevel,"12");
		break;

		case 8506:
        strcpy(EventDescription,"分发数据不完整");
		strcpy(EventLevel,"10");
		break;
		
		case 8507:
        strcpy(EventDescription,"数据传输错误");
		strcpy(EventLevel,"12");
		break;

		case 8508:
        strcpy(EventDescription,"删除失败");
		strcpy(EventLevel,"7");
		break;

		case 8726:
        strcpy(EventDescription,"端系统在线注册失败");
		strcpy(EventLevel,"6");
		break;

		case 8727:
        strcpy(EventDescription,"端系统在线注销失败");
		strcpy(EventLevel,"10");
		break;

		case 8728:
        strcpy(EventDescription,"更新端系统DCOMCNFG配置");
		strcpy(EventLevel,"15");
		break;

		case 8729:
        strcpy(EventDescription,"源端SNAP1失败");
		strcpy(EventLevel,"6");
		break;

		case 8730:
        strcpy(EventDescription,"源端无此路径");
		strcpy(EventLevel,"12");
		break;

		case 8731:
        strcpy(EventDescription,"源端SNAP2失败");
		strcpy(EventLevel,"6");
		break;

		case 8732:
        strcpy(EventDescription,"端系统磁盘空间不足");
		strcpy(EventLevel,"12");
		break;

		case 8733:
        strcpy(EventDescription,"端系统存在同名文件");
		strcpy(EventLevel,"12");
		break;

		case 8901:
        strcpy(EventDescription,"源端重启");
		strcpy(EventLevel,"15");
		break;

		case 8701:
        strcpy(EventDescription,"分发完成");
		strcpy(EventLevel,"15");
		break;

		case 8702:
        strcpy(EventDescription,"重发完成");
		strcpy(EventLevel,"15");
		break;

		case 8703:
        strcpy(EventDescription,"卸载完成");
		strcpy(EventLevel,"15");
		break;

	default:
			strcpy(EventDescription,"未知错误");
			strcpy(EventLevel,"16");

	}
	return 0;
}


int SVConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
		case 9001:
        strcpy(EventDescription,"注册病毒扫描服务失败");
		strcpy(EventLevel,"1");
		break;
		
		case 9002:
        strcpy(EventDescription,"注销病毒扫描服务失败");
		strcpy(EventLevel,"5");
		break;

		case 9003:
        strcpy(EventDescription,"连接主代理失败");
		strcpy(EventLevel,"5");
		break;

		case 9004:
        strcpy(EventDescription,"启动病毒扫描子代理失败");
		strcpy(EventLevel,"6");
		break;

		case 9005:
        strcpy(EventDescription,"检查子代理信息失败");
		strcpy(EventLevel,"6");
		break;

		case 9006:
        strcpy(EventDescription,"写子代理信息失败");
		strcpy(EventLevel,"6");
		break;

		case 9007:
        strcpy(EventDescription,"代理反馈数据失败");
		strcpy(EventLevel,"6");
		break;

		case 9251:
        strcpy(EventDescription,"扫描主机在扫描期间离线");
		strcpy(EventLevel,"12");
		break;

		case 9501:
        strcpy(EventDescription,"没有安装相应的McAfee软件");
		strcpy(EventLevel,"12");
		break;

		case 9502:
        strcpy(EventDescription,"操作系统类型查找失败");
		strcpy(EventLevel,"12");
		break;

		case 9503:
        strcpy(EventDescription,"扫描意外中止");
		strcpy(EventLevel,"7");
		break;
		
	default:
			strcpy(EventDescription,"未知错误");
			strcpy(EventLevel,"16");

	}
	return 0;
}

int GeConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
		case 501:
        strcpy(EventDescription,"连接数据库失败");
		strcpy(EventLevel,"1");
		break;
		
		case 502:
        strcpy(EventDescription,"INI文件丢失或错误");
		strcpy(EventLevel,"1");
		break;

		case 503:
        strcpy(EventDescription,"数据库操作失败");
		strcpy(EventLevel,"1");
		break;

		case 504:
        strcpy(EventDescription,"连接事件失败");
		strcpy(EventLevel,"2");
		break;

		case 505:
        strcpy(EventDescription,"报告事件失败");
		strcpy(EventLevel,"2");
		break;

		case 506:
        strcpy(EventDescription,"连接授权端服务失败");
		strcpy(EventLevel,"4");
		break;

		case 507:
        strcpy(EventDescription,"授权端服务操作失败");
		strcpy(EventLevel,"4");
		break;

		case 508:
        strcpy(EventDescription,"事件服务未注册");
		strcpy(EventLevel,"5");
		break;

		case 509:
        strcpy(EventDescription,"数据库数据异常");
		strcpy(EventLevel,"5");
		break;

		case 510:
        strcpy(EventDescription,"读取注册表信息失败");
		strcpy(EventLevel,"1");
		break;

		case 511:
        strcpy(EventDescription,"加密失败");
		strcpy(EventLevel,"1");
		break;

        case 800:
        strcpy(EventDescription,"没有权限进行此项操作");
		strcpy(EventLevel,"15");
		break;

		case 999:
        strcpy(EventDescription,"异常");
		strcpy(EventLevel,"1");
		break;

	default:
			strcpy(EventDescription,"致命错误");
			strcpy(EventLevel,"1");

	}
	return 0;
}

int EvConvert(long EventID,char *EventDescription,char *EventLevel)
{
	switch (EventID)
	{
	case 8001:
		break;

	default:
		strcpy(EventDescription,"未知错误");
		strcpy(EventLevel,"16");

	}
	return 0;

}

int WriteLog(long EventID,char *EventHostName,char *IPAddress,char *EventDescription,char *EventLevel,char E_Time[15],char *OperName)
{
	char LogFileName[260];

	long EventSourceID = ServiceSourceID ;
    long Eventtype=Event_Type;
	long ServiceID=ServiceSourceID;

	unsigned int cbsize=260;
	strcpy (LogFileName,"");
	am_LocaConfFile(ArkoMasterDbReg,ArkoDBValue,LogFileName,&cbsize);
	if (cbsize==-1||cbsize>260) return -1;
	strcat (LogFileName , "\\log\\");
	strcat (LogFileName , ErrorLog);

	fstream fp;
	fp.open(LogFileName,ios::app);
	if(!fp)
		return -1;
	char str[MAX_EVENT_LEN];
	sprintf(str,"%d    %d    %d    %d    %s    %s    %s    %s    %s    %s",EventID,Eventtype,ServiceID,EventSourceID,EventHostName,IPAddress,EventDescription,EventLevel,OperName,E_Time);
	fp<<str<<endl;
	fp.close();
	

	LogCount++;
	if (LogCount>=MAX_LOGLINE_LEN)
	{
		adjustfp();
	}

	return 0;
}

/*
int ReConnect()
{
	HRESULT hr=ConnectEvent();
	if ( hr != S_OK ) 
	{
		hr = ConnectDb();
	    if ( hr == S_OK ) 
		{
			hr = ConnectEvent();
			return hr;
		}
		else return hr;
	}

	return S_OK;
}
*/

HRESULT ErrorProc(Eventinfo *pEventInfo)
{
	evptr ev_ptr=NULL;

	char		EventDescription[MAX_DESCRIPTION_LEN]="",
				EventLevel[MAX_LEVEL_LEN]="",
				LocalHostName[MAX_HOSTNAME_LEN+1]="",
				LocalIPAddress[IP_LEN]="",
				result[MAX_DESCRIPTION_LEN]="";
	long		EventID,
				flag;		//event flag
    int			res=1;
	BSTR		OperUser;
	LPOLESTR	tmp1;
	HRESULT		hrtmp;
	Eventinfo	eventinfotmp;

	EventInit ( &eventinfotmp );		//initial structure

	EventID = pEventInfo->EventID;
	flag = pEventInfo->flag;

//get host name
    strcpy (LocalHostName,pEventInfo->EventHostName);

//get ip address
	strcpy(LocalIPAddress,pEventInfo->SourceIPAddress);

//get opertion user name
	if ((flag==1)||(flag==3))
	{
		AnsiToUnicode((LPCSTR)pEventInfo->OperUserName,&tmp1); 
		OperUser = SysAllocString(tmp1);
		CoTaskMemFree (tmp1);
	}

	char OperName[STR32];
	strcpy (OperName,pEventInfo->OperUserName);

//get system time
	char dbuffer[9],tbuffer[9];
	char E_Time[TIME_LEN];
	_strdate( dbuffer );  
    _strtime( tbuffer );
	E_Time[0]='2';E_Time[1]='0';E_Time[2]=dbuffer[6];E_Time[3]=dbuffer[7];
	E_Time[4]=dbuffer[0];E_Time[5]=dbuffer[1];E_Time[6]=dbuffer[3];E_Time[7]=dbuffer[4];
	E_Time[8]=tbuffer[0];E_Time[9]=tbuffer[1];E_Time[10]=tbuffer[3];E_Time[11]=tbuffer[4];
	E_Time[12]=tbuffer[6];E_Time[13]=tbuffer[7];E_Time[14]=tbuffer[8];

	div_t div_result = div( EventID, 1000 );
	long EventSourceID = ServiceSourceID ;

//get event description
	switch (div_result.quot)
	{
		case 0:
        GeConvert(EventID,EventDescription,EventLevel);
		break;
		
		case 1:
        NetConvert(EventID,EventDescription,EventLevel);
		break;

		case 2:
        InvConvert(EventID,EventDescription,EventLevel);
		break;

		case 3:
		break;

		case 4:
		break;

		case 5:
		break;

		case 6:
        UserConvert(EventID,EventDescription,EventLevel);
		break;

		case 7:
        AuthConvert(EventID,EventDescription,EventLevel);
		break;

		case 8:
			if (EventID > 8499 ) DSConvert(EventID,EventDescription,EventLevel);
				else EvConvert(EventID,EventDescription,EventLevel);
			break;

		case 9:
        SVConvert(EventID,EventDescription,EventLevel);
		break;

	}

//prepare return data
//	strcpy(result,EventDescription);
//	AnsiToUnicode((LPCSTR)result,&tmp1); 
//	bstr=SysAllocString(tmp1);
//	CoTaskMemFree (tmp1);

	if ( flag == 1 || flag == 3 )		//need connect event service
	{
		hrtmp=ConnectEvent(&ev_ptr);
		if (hrtmp != S_OK )
		{
			eventinfotmp.flag=2;
			eventinfotmp.EventID=hrtmp;
			ErrorProc(&eventinfotmp);

			WriteLog (EventID,LocalHostName,LocalIPAddress,EventDescription,EventLevel,E_Time,OperName);

			return S_OK;
		}
	}
	
	switch ( flag )			// case flag do report event and write log if event report fail automatically write log file
	{
	case 1:
		res=ReEvent(ev_ptr,EventID,EventSourceID,LocalHostName,LocalIPAddress,EventLevel,EventDescription,OperUser,NULL,NULL);
		if ( res != S_OK )
		{
			WriteLog (EventID,LocalHostName,LocalIPAddress,EventDescription,EventLevel,E_Time,OperName);
			eventinfotmp.flag=2;
			eventinfotmp.EventID=505;
			ErrorProc(&eventinfotmp);
		};
		break;

	case 2:
		WriteLog (EventID,LocalHostName,LocalIPAddress,EventDescription,EventLevel,E_Time,OperName);
		break;

	case 3:
		res=ReEvent(ev_ptr,EventID,EventSourceID,LocalHostName,LocalIPAddress,EventLevel,EventDescription,OperUser,NULL,NULL);
		WriteLog (EventID,LocalHostName,LocalIPAddress,EventDescription,EventLevel,E_Time,OperName);
		if ( res != S_OK )
		{
			eventinfotmp.flag=2;
			eventinfotmp.EventID=505;
			ErrorProc(&eventinfotmp);
		};
		break;

	default:
		GeConvert(FatalError,EventDescription,EventLevel);
		WriteLog (FatalError,LocalHostName,LocalIPAddress,EventDescription,EventLevel,E_Time,OperName);
		break;
	};

	if (ev_ptr) ev_ptr->Release();		//if has connect event service release it

	if((flag==1) || (flag==3))
		SysFreeString (OperUser);
	return S_OK;
}
/*
char *getErrorMessage(HRESULT hr)
{
	LPVOID lpMsgBuf;

	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,hr,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL);
 
	return LPTSTR(lpMsgBuf);
}
*/
//*******************************************************
//GetPublicKey                                          *
//		Get the public key for commumication            *
//return                                                *
//		if succeed, return 0                            *              
//pkey length = 8                                       *
//*******************************************************
/*获得通讯时使用的密钥*/

int GetPublicKey(unsigned char *pKey)
{
	CoInitialize(NULL);	//初始化COM

	unsigned int i=0;

	if(!dbip)
		return ERROR_DBIP;

//用MD5加密数据库服务IP地址
	char md5_dbip[MD5KLEN];
	i = md5hash((unsigned char *)dbip, strlen(dbip), (unsigned char *)md5_dbip);
	if(i!=0)
		return ERROR_MD5_DBIP;

//获得本机IP地址并用DES加密
	char localip[IP_LEN], md5_localip[MD5KLEN];
	BSTR wdes_localip=BSTRAS, wlocalip=BSTRAS;

//	strcpy((char *)localip, GetIpAddr());
//	char *ipaddr;
	unsigned int ipsize= IP_LEN;
	if ( c_GetIpAddr(localip,&ipsize)) 
		return FatalError ;
	wlocalip = MakeWideStrFromAnsi(localip);

	i = DesBSTREn(wlocalip, &wdes_localip, (unsigned char *)md5_dbip);
	if(i!=0)
		return ERROR_DES_LOCALIP;


//连接数据库服务
	IDBObject *m_SQLObject=NULL;		//代理端:此处的接口名不同!!!
	COSERVERINFO ServerInfo;
	memset(&ServerInfo, 0, sizeof(ServerInfo));
	ServerInfo.pwszName=new wchar_t[16];
	mbstowcs(ServerInfo.pwszName, dbip, 16);

	MULTI_QI mqi[]={{&IID_IDBObject,NULL,0}};

	HRESULT hRes=CoCreateInstanceEx(CLSID_DBObject,
										NULL,
										CLSCTX_ALL,
										&ServerInfo,
										sizeof(mqi)/sizeof(mqi[0]),
										mqi);
	
	if(hRes==0 && SUCCEEDED(mqi[0].hr))
		m_SQLObject=(IDBObject*)mqi[0].pItf;
	if(hRes!=S_OK || m_SQLObject==NULL)
	{
//		MessageBox(NULL, getErrorMessage(hRes), NULL, NULL);
		return ERROR_CONDB;
	}

//调用数据库服务的接口,获得密钥
	BSTR wencrypt_pkey=BSTRAS;

	hRes = m_SQLObject->GetCryptKey(wdes_localip, &wencrypt_pkey);
	if(hRes!=0)
	{
//		MessageBox(NULL, getErrorMessage(hRes), NULL, NULL);
		return ERROR_ENCRYPT_PKEY;
	}

//用MD5加密本机IP地址
	i = md5hash((unsigned char *)localip, strlen(localip), (unsigned char *)md5_localip);
	if(i!=0)
		return ERROR_MD5_LOCALIP;

//用MD5加密的本地IP,解密,得到公共密钥
	BSTR wdecrypt_pkey=BSTRAS;
	i = DesBSTRDe(wencrypt_pkey, &wdecrypt_pkey, (unsigned char *)md5_localip);
	if(i!=0)
		return ERROR_PKEY;

//返回公共密钥
	char tkey[9];
	WideCharToMultiByte(CP_ACP, 0, wdecrypt_pkey, -1, tkey , 9 ,NULL, NULL);
	memcpy(pKey,tkey,8);

	m_SQLObject->Release();

	CoUninitialize();

	return S_OK;
}


/////////////////////////////////////////////////////////////////////////////////////
//	置位IP字段及TIME字段。
//	字段记数是已""或‘’为单位

//	USAGE:
//	example:
//	insert into tabname values ("data1",23,"data2","data3",43,"data4","data5")
//									1          2       3          4       5
//								   DES		IPADDR    DES		 DES	 TIME
//
//	source code:
//	
//	db_table dbtable;
//	dbtable.encrypt_id = SetMask(2,5);


int SetMask(int index1 = 0,int index2 = 0,int index3 = 0,int index4 = 0)
{
	int mask=0;
	int e[16] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
//				 1 2 3 4  5  6  7   8   9  10   11   12   13   14    15    16

	if(index1)
	{
		mask = mask | e[index1-1];
	}

	if(index2)
	{
		mask = mask|e[index2-1];
	}

	if(index3)
	{
		mask = mask|e[index3-1];
	}

	if(index4)
	{
		mask = mask|e[index4-1];
	}

	return mask;
}