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

    //Policy.cpp

#include "stdafx.h"
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>

#include "AccessDB.h"
#include "general.h"
#include "INV_struct.h"
#include "Encry.h"
#include "PublicKey.h"

#include "SQLSERVICE_i.c"
#include "am_lv1.h"

char CNF[260];
char IP_str[16];
int RecordNum[10];


//*************************************************************************
void Transform_IP(char *IP)
{
	char newIP[16];
	int i,j=15,k=0;
	i=strlen(IP);
	while(i>=0)
	{
		if(IP[i]=='.')
		{
			while(k<4)
			{
				newIP[j]='0';
				j--;
				k++;
			}
			k=0;
		}
		newIP[j]=IP[i];
		k++;
		i--;
		j--;
	}
	if(j>=0)
	{
		while(k<4)
		{
			newIP[j]='0';
			j--;
			k++;
		}
	}
	strcpy(IP,newIP);
}


//***************************************************************************
void Tranvers_IP(char *IP)
{
	char newIP[16];
	int i,j=0,head=0;
	for(i=0;i<(int)strlen(IP);i++)
	{
		if(IP[i]=='.')
		{
			if(head==0)
			{
				newIP[j]='0';
				j++;
			}
			else
				head=0;
			newIP[j]='.';
			j++;
		}
		else
			if(head!=0 || IP[i]!='0')
			{
				newIP[j]=IP[i];
				j++;
				head=1;
			}
	}
	if(head==0)
	{
		newIP[j]='0';
		j++;
	}
	newIP[j]=0;
	strcpy(IP,newIP);
}



//***********************************************************************
HRESULT Connect_To_DB(dbptr *pDBobj)
{
	CoInitialize(NULL);

	dbptr pIobject_mm=NULL; 

	const char subkey[]="SOFTWARE\\ARKO\\ARKOMASTER\\CONSOLE";
	const char valuename[]="Confpath";
	unsigned int cbsize=260;
	if(am_LocaConfFile(subkey, valuename, CNF, &cbsize))	//get the path of ARKODB.INI
		return S_FALSE;
	strcat(CNF, "\\ARKODB.INI");

	unsigned int size=IP_LEN;
	am_GetConfIp(CNF, IP_str, &size);	//get the sqlservice's ipaddress from ARKODB.INI

	COSERVERINFO ServerInfo;
	memset(&ServerInfo, 0, sizeof(ServerInfo));
	char temp[20];
	strcpy(temp,IP_str);
	ServerInfo.pwszName=new wchar_t[IP_LEN];
	mbstowcs(ServerInfo.pwszName, temp, IP_LEN);

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

	HRESULT hRes=CoCreateInstanceEx(CLSID_DBObject,
										NULL,
										CLSCTX_ALL,
										&ServerInfo,
										sizeof(mqi)/sizeof(mqi[0]),
										mqi);
	
	if(hRes!=S_OK )
		return S_FALSE;

	if(hRes==0 && SUCCEEDED(mqi[0].hr))
		pIobject_mm=(IDBObject*)mqi[0].pItf;

	*pDBobj = pIobject_mm;

	return S_OK;
}


//***************************************************************************
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;
}


//******************************************************************************
HRESULT WINAPI SendPol(char *name,long andor1,long andor2,long andor3,long andor4,long andor5,long andor6,long andor7,char *CPUMin,char *CPUMax,char *MemMin,char *MemMax,char *DskMin,char *DskMax,long OSIndex, char *Equ,char *IPMin,char *IPMax,char *Mac)
{
	dbptr m_pIobject_mm=NULL;
	char pKey[8];		//the public key

	MAPdb			*SendMap;
	CPUdb			*SendCpu;
	MEMORYdb		*SendMem;
	FILESYSTEMdb	*SendFs;
	OSdb			*SendOs;
	DEVICEdb		*SendDevice;
	NETWORKdb		*SendNetwork;
	STATISTICSdb	*SendStat;
	NETSTATdb		*SendNetstat;

	//the firth step: delete all records in Access
	dele(TABLE_INV_MAP);
	dele(TABLE_INV_CPU);
	dele(TABLE_INV_MEM);
	dele(TABLE_INV_FS);
	dele(TABLE_INV_OS);
	dele(TABLE_INV_DEV);
	dele(TABLE_INV_NET);
	dele(TABLE_INV_STAT);
	dele(TABLE_INV_NETSTAT);

	int i;
    HRESULT hRes=Connect_To_DB(&m_pIobject_mm);		//connect to sqlservice
	if(hRes!=S_OK)
	{
		for(i=0;i<8;i++)
			RecordNum[i]=0;
		return 501;
	}

	int pk = GetPublicKey(pKey);	//get public key
	if(pk!=0)
		return 999;

    int				rec_number=-1;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start = 0;
	int				offset=0;

	in_table.db_table_id = DB_INV | VIEW_INV_ENDSYSTEM;
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;
	char temp[10],temp2[10];
	char sel_str[4096],sql_str[800];
	char IPMinstr[16];
	int first=1;
	strcpy((char *)sql_str,"");

	//if the pointer of name is null, query all records.
	//the pointer of name isn't null, so build the policy.
	if (strcmp(name, "")!=0) 
	{
		if(strcmp((char *)IPMin,"")!=0)
			Transform_IP(IPMin);
		if(strcmp((char *)IPMax,"")!=0)
			Transform_IP(IPMax);

		strcpy((char *)sel_str,"select * from EndSystemView");
		//build SQL sentence
		strcpy((char *)sql_str,"");

		//CPU speed: "or"
		if(andor1==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			//have both max and min value
			if(strcmp((char *)CPUMin,"")!=0 && strcmp((char *)CPUMax,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMin);
				strcat((char *)sql_str," and CPUSpeed <=");
				strcat((char *)sql_str,CPUMax);
			}
			//only have min value
			else if(strcmp((char *)CPUMin,"")!=0)
			{
		
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMin);
			}
			//only have max value
			else if(strcmp((char *)CPUMax,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed <=");
				strcat((char *)sql_str,CPUMax);
			}
		}

		//memory size: "or"
		if(andor2==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			if(strcmp((char *)MemMin,"")!=0 && strcmp((char *)MemMax,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMin);
				strcat((char *)sql_str," and MemorySize <=");
				strcat((char *)sql_str,MemMax);
			}
			else if(strcmp((char *)MemMin,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMin);
			}
			else if(strcmp((char *)MemMax,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize <=");
				strcat((char *)sql_str,MemMax);
			}
		}

		//harddisk size: "or"
		if(andor3==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			if(strcmp((char *)DskMin,"")!=0 && strcmp((char *)DskMax,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMin);
				strcat((char *)sql_str," and HardDiskSize <=");
				strcat((char *)sql_str,DskMax);
			}
			else if(strcmp((char *)DskMin,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMin);
			}
			else if(strcmp((char *)DskMax,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize <=");
				strcat((char *)sql_str,DskMax);
			}
		}

		//os type: "or"
		if(andor4==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			switch (OSIndex)
			{
			case 0:
				strcat((char *)sql_str,"OSType = \"Windows 95\"");
				break;
			case 1:
				strcat((char *)sql_str,"OSType = \"Windows 98\"");
				break;
			case 2:
				strcat((char *)sql_str,"OSType = \"Windows NT\"");
				break;
			case 3:
				strcat((char *)sql_str,"OSType = \"Solaris\"");
				break;
			}
		}

		//equipment: "or"
		if(andor5==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			strcat((char *)sql_str,"DeviceName = \"");
			strcat((char *)sql_str,Equ);
			strcat((char *)sql_str,"\"");
		}

		//ipaddress: "or"
		if(andor6==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			if(strcmp((char *)IPMin,"")!=0 && strcmp((char *)IPMax,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMin);
				strcat((char *)sql_str,"\" and IPAddress <= \"");
				strcat((char *)sql_str,IPMax);
				strcat((char *)sql_str,"\"");
			}
			else if(strcmp((char *)IPMin,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMin);
				strcat((char *)sql_str,"\"");
			}
			else if(strcmp((char *)IPMax,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress <= \"");
				strcat((char *)sql_str,IPMax);
				strcat((char *)sql_str,"\"");
			}
		}

		//MAC address: "or"
		if(andor7==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			strcat((char *)sql_str,"MACAddress = \"");
			strcat((char *)sql_str,Mac);
			strcat((char *)sql_str,"\"");
		}
		if(first==0) 
			strcat((char *)sql_str," ) ");

		//CPU speed: "and"
		if(andor1==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			if(strcmp((char *)CPUMin,"")!=0 && strcmp((char *)CPUMax,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMin);
				strcat((char *)sql_str," and CPUSpeed <=");
				strcat((char *)sql_str,CPUMax);
			}
			else if(strcmp((char *)CPUMin,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMin);
			}
			else if(strcmp((char *)CPUMax,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed <=");
				strcat((char *)sql_str,CPUMax);
			}
		}

		//memory size: "and"
		if(andor2==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			if(strcmp((char *)MemMin,"")!=0 && strcmp((char *)MemMax,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMin);
				strcat((char *)sql_str," and MemorySize <=");
				strcat((char *)sql_str,MemMax);
			}
			else if(strcmp((char *)MemMin,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMin);
			}
			else if(strcmp((char *)MemMax,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize <=");
				strcat((char *)sql_str,MemMax);
			}
		}

		//harddisk: "and"
		if(andor3==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			if(strcmp((char *)DskMin,"")!=0 && strcmp((char *)DskMax,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMin);
				strcat((char *)sql_str," and HardDiskSize <=");
				strcat((char *)sql_str,DskMax);
			}
			else if(strcmp((char *)DskMin,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMin);
			}
			else if(strcmp((char *)DskMax,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize <=");
				strcat((char *)sql_str,DskMax);
			}
		}

		//os type: "and"
		if(andor4==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			switch (OSIndex)
			{
			case 0: 
				strcat((char *)sql_str,"OSType = \"Windows 95\"");
				break;
			case 1:
				strcat((char *)sql_str,"OSType = \"Windows 98\"");
				break;
			case 2:
				strcat((char *)sql_str,"OSType = \"Windows NT\"");
				break;
			case 3:
				strcat((char *)sql_str,"OSType = \"Solaris\"");
				break;
			}
		}

		//equipment name: "and"
		if(andor5==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			strcat((char *)sql_str,"DeviceName = \"");
			strcat((char *)sql_str,Equ);
			strcat((char *)sql_str,"\"");
		}

		//IP address: "and"
		if(andor6==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			if(strcmp((char *)IPMin,"")!=0 && strcmp((char *)IPMax,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMin);
				strcat((char *)sql_str,"\" and IPAddress <= \"");
				strcat((char *)sql_str,IPMax);
				strcat((char *)sql_str,"\"");
			}
			else if(strcmp((char *)IPMin,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMin);
				strcat((char *)sql_str,"\"");
			}
			else if(strcmp((char *)IPMax,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress <= \"");
				strcat((char *)sql_str,IPMax);
				strcat((char *)sql_str,"\"");
			}
		}

		//MAC address: "and"
		if(andor7==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			strcat((char *)sql_str,"MACAddress = \"");
			strcat((char *)sql_str,Mac);
			strcat((char *)sql_str,"\"");
		}

		if(strcmp((char *)sql_str,"")!=0)
		{
			strcat((char *)sel_str," where ");
			strcat((char *)sel_str,sql_str);
		}

		//encrypt SQL sentence
		DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		//set mask in sql sentence
		int index=0;
		if(andor6==1)
		{
			if(andor4==1) index++;
			else if(andor5==1) index++;
				 else if(strcmp((char *)IPMin,"")!=0 && strcmp((char *)IPMax,"")!=0) index=index+2;
					  else if(strcmp((char *)IPMin,"")!=0) index++;
					       else if(strcmp((char *)IPMax,"")!=0) index++;
		}
		else if(andor6==2)
		{
			if(andor7==1) index++;
			else if(andor4==1 || andor4==2) index++;
				else if(andor5==1 || andor5==2) index++;
					 else if(strcmp((char *)IPMin,"")!=0 && strcmp((char *)IPMax,"")!=0) index=index+2;
					      else if(strcmp((char *)IPMin,"")!=0) index++;
					           else if(strcmp((char *)IPMax,"")!=0) index++;
		}

		if( index>0 )
		{
			if(strcmp((char *)IPMin,"")!=0 && strcmp((char *)IPMax,"")!=0)
				in_table.encrypt_id=SetMask(index-1, index,0,0);
			else if(strcmp((char *)IPMin,"")!=0 || strcmp((char *)IPMax,"")!=0)
				in_table.encrypt_id=SetMask(index,0,0,0);
		}


		first=0;
		//build "where" sentence basis on endsystem id 
		strcpy((char *)sel_str,"");

		do
		{
			start+=offset;
		    hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
			ret_records = (tables_union *)records.records_buf;

			if (hRes != S_OK || rec_number==0){
				for(i=0;i<7;i++)
					RecordNum[i]=0;
				m_pIobject_mm->Release();
				return 2005;
			}

			if(offset > 0){
				for(i=0;i<offset;i++)
				{
					 if(first!=0)
					 {
						  _ltoa((ret_records+i)->view_inv_endsystem.endsystem_id,temp2,10);
						  int n=strcmp(temp, temp2);
						  if(n==0)
						  {
							   continue;
						  }
						  else 
						  {
							   strcpy(temp, temp2);
							   strcat((char *)sel_str," or ");
							   strcat((char *)sel_str, "EndSystemID=");
							   strcat((char *)sel_str, temp2);
						  }
					 }
					 else
					 {
						  first=1;
						  _ltoa((ret_records+i)->view_inv_endsystem.endsystem_id,temp,10);
						  strcat(sel_str,"EndSystemID=");
						  strcat(sel_str,temp);
					 }
				}
			}
		}
		while(start+offset<rec_number);
		if(first>0)
		{
			strcpy((char *)sql_str, " where ( ");
			strcat((char *)sql_str,sel_str);
			strcat((char *)sql_str, " ) ");

		}
		else
			strcpy((char *)sql_str,"");
	}

	//build SQL sentence(add "where" condition), select each table
	//encrypt/decrypt each records
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;

    char tempstr[STR256];

	start = 0;
	offset = 0;
	rec_number = -1;
 	in_table.db_table_id = DB_INV | TABLE_INV_MAP;

	strcpy((char *)sel_str,"Select * from INV_MAPTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;

	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[0]=0;
			m_pIobject_mm->Release();
			if(hRes==1001)
				return S_OK;
			return 2005;
		}
		ret_records = (tables_union *)records.records_buf;

		if(first==0)
		{
			RecordNum[0] = rec_number;
			first = 1;
		}
		//insert the queried MAP records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendMap = new MAPdb;
				SendMap->ID = (ret_records+i)->table_inv_map.endsystem_id;
				SendMap->AvailableTag = (ret_records+i)->table_inv_map.map_available_flag;
				strcpy((char *)IPMinstr, (char *)(ret_records+i)->table_inv_map.map_ip_addr);
				Tranvers_IP(IPMinstr);
				strcpy((char *)SendMap->IPAddress, (char *)IPMinstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_map.map_hostname, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendMap->HostName, (char *)tempstr);

				insert(TABLE_INV_MAP, SendMap);
				delete SendMap;
			}
		}
	}
	while(start+offset<RecordNum[0]);
	
	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_CPU;

	strcpy((char *)sel_str,"Select * from INV_CPUTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[1]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		if(first==0)
		{
			RecordNum[1] = rec_number;
			first = 1;
		}

		//insert the queried CPU records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendCpu = new CPUdb;
				SendCpu->ID = (ret_records+i)->table_inv_cpu.endsystem_id;
				SendCpu->CPUSpeed = (ret_records+i)->table_inv_cpu.cpu_speed;
				SendCpu->CPUMMXFlag = (ret_records+i)->table_inv_cpu.cpu_mmx_flag;

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_cpu.cpu_manufacture, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendCpu->CPUManufacture, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_cpu.cpu_type, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendCpu->CPUType, (char *)tempstr);

				insert(TABLE_INV_CPU, SendCpu);
				delete SendCpu;
			}
		}
	}
	while(start+offset<RecordNum[1]);

	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_MEM;

	strcpy((char *)sel_str,"Select * from INV_MEMORYTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[2]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;

		if(first==0)
		{
			RecordNum[2] = rec_number;
			first = 1;
		}

		//insert the queried MEMORY records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendMem = new MEMORYdb;
				SendMem->ID = (ret_records+i)->table_inv_mem.endsystem_id;
				SendMem->PageSize = (ret_records+i)->table_inv_mem.mem_page_size;
				SendMem->PhysicalSize = (ret_records+i)->table_inv_mem.mem_physical_size;
				SendMem->VirtualSize = (ret_records+i)->table_inv_mem.mem_virtual_size;

				insert(TABLE_INV_MEM, SendMem);
				delete SendMem;
			}
		}
	}
	while(start+offset<RecordNum[2]);

	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_FS;

	strcpy((char *)sel_str,"Select * from INV_FILETAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[3]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;

		if(first==0)
		{
			RecordNum[3] = rec_number;
			first = 1;
		}

		//insert the queried FILE records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendFs = new FILESYSTEMdb;
				SendFs->ID = (ret_records+i)->table_inv_fs.endsystem_id;
				SendFs->FileSystemSize = (ret_records+i)->table_inv_fs.fs_size;
				SendFs->FileSystemSurplus = (ret_records+i)->table_inv_fs.fs_surplus;

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_fs.fs_type, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendFs->FileSystemType, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_fs.fs_dev_name, (unsigned char*)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendFs->FileSystemDeviceName, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_fs.fs_desc, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendFs->FileSystemDescription, (char *)tempstr);

				insert(TABLE_INV_FS, SendFs);
				delete SendFs;
			}
		}
	}
	while(start+offset<RecordNum[3]);

	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_OS;

	strcpy((char *)sel_str,"Select * from INV_OSTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[4]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;

		if(first==0)
		{
			RecordNum[4] = rec_number;
			first = 1;
		}

		//insert the queried OS records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendOs = new OSdb;
				SendOs->ID = (ret_records+i)->table_inv_os.endsystem_id;

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_type, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendOs->OSType, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_ver, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendOs->OSVersion, (char *)tempstr);

				strcpy((char *)SendOs->OSInstallTime, (char *)(ret_records+i)->table_inv_os.os_install_time);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_desc, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendOs->OSDescription, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_install_path, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendOs->OSInstallPath, (char *)tempstr);

				insert(TABLE_INV_OS, SendOs);
				delete SendOs;
			}
		}
	}
	while(start+offset<RecordNum[4]);

	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_DEV;


	strcpy((char *)sel_str,"Select * from INV_DEVICETAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[5]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
	
		if(first==0)
		{
			RecordNum[5] = rec_number;
			first = 1;
		}

		//insert the queried DEVICE records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendDevice = new DEVICEdb;
				SendDevice->ID = (ret_records+i)->table_inv_dev.endsystem_id;
				SendDevice->DeviceWorkStatus = (ret_records+i)->table_inv_dev.dev_status;
				SendDevice->DevicePNPFlag = (ret_records+i)->table_inv_dev.dev_pnp_flag;
				SendDevice->DeviceIRQNO = (ret_records+i)->table_inv_dev.dev_irq_no;

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_dev.dev_name, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendDevice->DeviceName, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_dev.dev_manufacture, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendDevice->DeviceManufacture, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_dev.dev_model, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendDevice->DeviceModel, (char *)tempstr);

				strcpy((char *)SendDevice->DeviceInstallTime, (char *)(ret_records+i)->table_inv_dev.dev_install_time);

				insert(TABLE_INV_DEV, SendDevice);
				delete SendDevice;
			}
		}
	}
	while(start+offset<RecordNum[5]);

	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_NET;

	strcpy((char *)sel_str,"Select * from INV_NETWORKTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED)
		{
			RecordNum[6]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;

		if(first==0)
		{
			RecordNum[6] = rec_number;
			first = 1;
		}

		//insert the queried NETWORK records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendNetwork = new NETWORKdb;
				SendNetwork->ID = (ret_records+i)->table_inv_dev.endsystem_id;

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_hostname, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendNetwork->HostName, (char *)tempstr);

				strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_net.net_ip_addr);
				Tranvers_IP(IPMinstr);
				strcpy((char *)SendNetwork->IPAddress, (char *)IPMinstr);

				strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_net.net_mask);
				Tranvers_IP(IPMinstr);				
				strcpy((char *)SendNetwork->NetMask, (char *)IPMinstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_cur_user, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendNetwork->Currentuser, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_work_grp, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendNetwork->WorkGroup, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_domain, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendNetwork->LoginDomain, (char *)tempstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_mac_addr, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendNetwork->AdapterMAC, (char *)tempstr);

				insert(TABLE_INV_NET, SendNetwork);
				delete SendNetwork;
			}
		}
	}while(start+offset<RecordNum[6]);

	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_STAT;

	strcpy((char *)sel_str, "Select * from INV_STATISTICSTAB");
	if(strcmp((char *)sql_str, "")!=0)
	{
		strcat((char *)sel_str, (char *)sql_str);
		strcat((char *)sel_str, " and newtag=1 ");
	}
	else
		strcat((char *)sel_str, " where newtag=1 ");

	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);

	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[7]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
	
		if(first==0)
		{
			RecordNum[7] = rec_number;
			first = 1;
		}
		
		//insert the queried STATISTICS records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendStat = new STATISTICSdb;
				SendStat->ID = (ret_records+i)->table_inv_stat.endsystem_id;
				SendStat->ProcessNum = (ret_records+i)->table_inv_stat.stat_proc_num;
				SendStat->CPUUseRate = (ret_records+i)->table_inv_stat.stat_cpu_rate;
				SendStat->FileSystemUseRate = (ret_records+i)->table_inv_stat.stat_fs_rate;
				SendStat->MemoryUseRate = (ret_records+i)->table_inv_stat.stat_mem_rate;
				strcpy((char *)SendStat->StatisticsTime, (char *)(ret_records+i)->table_inv_stat.stat_time);

				insert(TABLE_INV_STAT, SendStat);
				delete SendStat;
			}
		}
	}
	while(start+offset<RecordNum[7]);


	rec_number = -1;
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_NETSTAT;

	strcpy((char *)sel_str, "Select * from INV_NETSTATAB");
	if(strcmp((char *)sql_str, "")!=0)
	{
		strcat((char *)sel_str, (char *)sql_str);
		strcat((char *)sel_str, " and newtag=1 ");
	}
	else
		strcat((char *)sel_str, " where newtag=1 ");

	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);

	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[8]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;

		if(first==0)
		{
			RecordNum[8] = rec_number;
			first = 1;
		}

		//insert the queried NETSTA records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendNetstat = new NETSTATdb;
				SendNetstat->ID = (ret_records+i)->table_inv_netstat.endsystem_id;
				SendNetstat->ReceiveByte = (ret_records+i)->table_inv_netstat.netstat_rcv_byte;
				SendNetstat->ReceivePacket = (ret_records+i)->table_inv_netstat.netstat_rcv_packet;
				SendNetstat->SendByte = (ret_records+i)->table_inv_netstat.netstat_send_byte;
				SendNetstat->SendPacket = (ret_records+i)->table_inv_netstat.netstat_send_packet;
				SendNetstat->DiscardPacket = (ret_records+i)->table_inv_netstat.netstat_discard_packet;
				SendNetstat->UnknownProtocols = (ret_records+i)->table_inv_netstat.netstat_unknown_protocol;
				SendNetstat->ErrorPacket = (ret_records+i)->table_inv_netstat.netstat_error_packet;

				strcpy((char *)SendNetstat->StatisticsTime, (char *)(ret_records+i)->table_inv_netstat.netstat_time);

				strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_ip_addr);
				Tranvers_IP(IPMinstr);
				strcpy((char *)SendNetstat->IPAddress, IPMinstr);

				strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_mask);
				Tranvers_IP(IPMinstr);
				strcpy((char *)SendNetstat->NetMask, IPMinstr);
				
				DesStrDe((unsigned char *)(ret_records+i)->table_inv_netstat.netstat_mac_addr, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendNetstat->AdapterMAC, (char *)tempstr);

				insert(TABLE_INV_NETSTAT, SendNetstat);
				delete SendNetstat;
			}
		}
	}
	while(start+offset<RecordNum[8]);

	m_pIobject_mm->Release();	
	return S_OK;
}



//*******************************************************************************
HRESULT WINAPI Sel_StaChart(char *EndSystemID, char *FromTime,char *ToTime)
{
	dbptr m_pIobject_mm=NULL;
	char pKey[8];		//the public key

	STATISTICSdb	*SendStat;

	//first: delete pristine records in Access
	dele(TABLE_INV_STAT);

	int				i;
    HRESULT hRes=Connect_To_DB(&m_pIobject_mm);		//connect to sqlservice
	if(hRes!=S_OK)
	{
		RecordNum[7]=0;
		m_pIobject_mm->Release();	
		return 501;
	}
	int pk=GetPublicKey(pKey);		//get the public key
	if(pk!=0)
		return 999;

	int				rec_number = -1;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start,offset,first;

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_STAT;

	//encrypt SQL sentence
	char sql_str[128];
	sprintf((char *)sql_str,"Select * from INV_STATISTICSTAB where EndSystemID=%s and StatisticsTime > '%s' and StatisticsTime<='%s'",EndSystemID,FromTime,ToTime);
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	in_table.encrypt_id=SetMask(2,3,0,0);

	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[7]=0;
			m_pIobject_mm->Release();
			return 2012;
		}
		ret_records = (tables_union *)records.records_buf;
	
		if(first==0)
		{
			RecordNum[7] = rec_number;
			first = 1;
		}

		//insert the queried STATISTICS records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendStat = new STATISTICSdb;
				SendStat->ID = (ret_records+i)->table_inv_stat.endsystem_id;
				SendStat->ProcessNum = (ret_records+i)->table_inv_stat.stat_proc_num;
				SendStat->CPUUseRate = (float)(ret_records+i)->table_inv_stat.stat_cpu_rate;
				SendStat->FileSystemUseRate = (float)(ret_records+i)->table_inv_stat.stat_fs_rate;
				SendStat->MemoryUseRate = (float)(ret_records+i)->table_inv_stat.stat_mem_rate;
				strcpy((char *)SendStat->StatisticsTime, (char *)(ret_records+i)->table_inv_stat.stat_time);

				insert(TABLE_INV_STAT, SendStat);
				delete SendStat;
			}
		}
	}
	while(start+offset<RecordNum[7]);

	m_pIobject_mm->Release();

	return S_OK;
}



//******************************************************************************
HRESULT WINAPI Sel_NetChart(char *EndSystemID, char *FromTime,char *ToTime)
{
	dbptr m_pIobject_mm=NULL;
	char pKey[8];		//the public key

	NETSTATdb		*SendNetstat;

	//first: delete the pristine records in Access
	dele(TABLE_INV_NETSTAT);

	int				i;
    HRESULT hRes=Connect_To_DB(&m_pIobject_mm);		//connect to sqlservice
	if(hRes!=S_OK)
	{
		RecordNum[8]=0;
		m_pIobject_mm->Release();	
		return 501;
	}
	int pk=GetPublicKey(pKey);		//get public key
	if(pk!=0)
		return 999;

	int				rec_number=-1;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start,offset,first;
	char IPMinstr[16];

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_NETSTAT;

	//encrypt SQL sentence
	char sql_str[128];
	sprintf((char *)in_table.sql_statement,"Select * from INV_NETSTATAB where EndSystemID=%s and StatisticsTime > '%s' and StatisticsTime<='%s'",EndSystemID,FromTime,ToTime);
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	in_table.encrypt_id=SetMask(2,3,0,0);

	first=0;
	char tempstr[STR256];
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[8]=0;
			m_pIobject_mm->Release();
			return 2013;
		}
		ret_records = (tables_union *)records.records_buf;

		if(first==0)
		{
			RecordNum[8] = rec_number;
			first = 1;
		}

		//insert the queried NETSTA records to Access
		if(offset > 0)
		{
			for(i=0; i<offset; i++)
			{
				SendNetstat = new NETSTATdb;
				SendNetstat->ID = (ret_records+i)->table_inv_netstat.endsystem_id;
				SendNetstat->ReceiveByte = (ret_records+i)->table_inv_netstat.netstat_rcv_byte;
				SendNetstat->ReceivePacket = (ret_records+i)->table_inv_netstat.netstat_rcv_packet;
				SendNetstat->SendByte = (ret_records+i)->table_inv_netstat.netstat_send_packet;
				SendNetstat->SendPacket = (ret_records+i)->table_inv_netstat.netstat_send_packet;
				SendNetstat->DiscardPacket = (ret_records+i)->table_inv_netstat.netstat_discard_packet;
				SendNetstat->UnknownProtocols = (ret_records+i)->table_inv_netstat.netstat_unknown_protocol;
				SendNetstat->ErrorPacket = (ret_records+i)->table_inv_netstat.netstat_error_packet;
				strcpy((char *)SendNetstat->StatisticsTime, (char *)(ret_records+i)->table_inv_netstat.netstat_time);
				strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_ip_addr);
				Tranvers_IP(IPMinstr);
				strcpy((char *)SendNetstat->IPAddress, IPMinstr);
				strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_mask);
				Tranvers_IP(IPMinstr);
				strcpy((char *)SendNetstat->NetMask, IPMinstr);

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_netstat.netstat_mac_addr, (unsigned char *)tempstr, (unsigned char *)pKey);
				strcpy((char *)SendNetstat->AdapterMAC, (char *)tempstr);

				insert(TABLE_INV_NETSTAT, SendNetstat);
				delete SendNetstat;
			}
		}
	}
	while(start+offset<RecordNum[8]);

	m_pIobject_mm->Release();	

	return S_OK;
}