⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 procguard.cpp.bak

📁 能查看系统进程
💻 BAK
字号:

#include "ProcGuard.h"

/*
#include <sys/socket.h>	
#include <sys/select.h>	
#include <sys/ioctl.h>	
#include <arpa/inet.h>	
#include <netdb.h>	
#include <netinet/in.h>	
#include <sys/time.h>	
#include <sys/types.h>	
#include <unistd.h>	
#include <sys/types.h>
#include <linux/fs.h>
#include <sys/stat.h>

typedef struct _ihdr
{ 
    unsigned short int i_type, i_code; 
    unsigned short int i_cksum,i_id, i_seq;  
}IcmpHeader;  
struct sockaddr_in saDestAddr;  
string Messtr,Tmpstr; 

unsigned short int checksum(unsigned short int *buffer, int size)
{
    unsigned long cksum=0;
    while(size >1)
    {
        cksum+=*buffer++;
        size -=sizeof(unsigned short int);
    }
    if(size )
    {
        cksum += *(unsigned char*)buffer;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);
    return (unsigned short int)(cksum);
}


bool Autotest(unsigned char * szDestHost,int Ktest)  
{ 
//    WSADATA wsaData; 
    int sockRaw; 
    struct sockaddr_in dest,from; 
    char icmp_data[10], recvbuf[100];  
    unsigned int addr=0; 
    int fromlen = sizeof(from);  
    int timeout = 1000; //ms 

//    WSAStartup(MAKEWORD(2,1),&wsaData) ; 
    sockRaw = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP);  
    setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO, 
    (char*)&timeout,sizeof(timeout) ); 
    memset(&dest,0,sizeof(dest));  
    dest.sin_family = AF_INET; 
    dest.sin_addr.s_addr= inet_addr(szDestHost);  
    memset(icmp_data,0,sizeof(icmp_data)); //clear icmp_data. 
    ((IcmpHeader*)icmp_data)->i_type = 8; //ICMP_ECHO 
    ((IcmpHeader*)icmp_data)->i_code = 0; 
    ((IcmpHeader*)icmp_data)->i_id = (unsigned short int)GetCurrentProcessId(); 
    ((IcmpHeader*)icmp_data)->i_seq = 0; 
 
    for(int k=0; k 
    {  
        ((IcmpHeader*)icmp_data)->i_cksum = 0;  
        ((IcmpHeader*)icmp_data)->i_seq ++; 
        ((IcmpHeader*)icmp_data)->i_cksum=checksum((unsigned short int*)icmp_data,8);  
        sendto(sockRaw,icmp_data,8,0,(struct sockaddr*)&dest,sizeof(dest));  
        int bread=recvfrom(sockRaw,recvbuf,1024,0,(struct sockaddr*)&from, 
&fromlen); 
        if (bread == SOCKET_ERROR)
        { 
            if(k==Ktest-1) goto ERR1 ;  
            else continue; //try again(3 times) 
        }  
    }  
    return TRUE; //no erros. 
ERR1: 
    closesocket (sockRaw);  
    sockRaw= INVALID_SOCKET;  
//    WSACleanup(); 
    return FALSE;  
} 
*/
//---------------------------------------------------------------------------
int LinkTest(char *szLinkString,int iCount)
{
    char szCmd[256];
    FILE *fp;
    char acTemp[1024];
    int i,iPingSuccess=0;
    if(iCount<1 || iCount > 10)
    {
        return -1;
    }  
    sprintf(szCmd,"ping -c ");
    sprintf(szCmd+8,"%d ",iCount);
    strcat(szCmd,szLinkString);
    strcat(szCmd," >/tmp/.ping.txt");
    printf("szCmd=%s,Count=%d\n",szCmd,iCount);
    system(szCmd); 
    usleep(iCount*1000);//waiting for ping exec
    fp=fopen("/tmp/.ping.txt","rt");
    if(fp==NULL)
    {
        return -1;
    }
    fgets(acTemp,1024,fp);
    for(i=0;i<iCount;i++);
    {

        fgets(acTemp,1024,fp);
        
        printf("acTemp=%s\n",acTemp);
        if(strstr(acTemp,"time="))
        {
            iPingSuccess++;
        }
      
    }
    fclose(fp);
    return iPingSuccess;

}



string getFileName(string str)
{
        int len = str.length();
        int pos = str.rfind('/',len -1);

        string tstr;
        if( pos >= 0 )
        {
                pos ++;
                while( str[pos] != '\0' )
                        tstr+=str[pos++];
        }
        else
        	tstr = str;
        
        return tstr;
}

string getFilePath(string str)
{
        int len = str.length();
        int pos = str.rfind('/',len -1);

        string tstr;
        if( pos >= 0 )
        {
        	str[pos] = '\0';
            tstr = str;
        }
        else
        	tstr = "./";
        
        return tstr;
}

CProcGuard::CProcGuard()
{
  printf("CProcGuard:begin load cfg file\n");
        m_strTmpfName = "./tmp.tmp";
        if( loadConfig() == false )
        	exit(0);        	
}

bool CProcGuard::loadConfig()
{
    printf("Load procGuard configre file\n");
    CIniFile cfgFile;
	if( cfgFile.Open(CFGFILE) )
	{
		cfgFile.LocateHeading("TOTAL");
		cfgFile.LocateKey("DELAY");
		cfgFile.ReadInt(m_nDelaytm);
		
		cfgFile.LocateHeading("TOTAL");
		cfgFile.LocateKey("PROCNUM");
		cfgFile.ReadInt(m_nProcess);
	
	
	        cfgFile.LocateHeading("TOTAL");
		cfgFile.LocateKey("LINKTYPE");
		cfgFile.ReadString(m_strLinkType);
	

	        cfgFile.LocateHeading("TOTAL");
		cfgFile.LocateKey("LINKTEST1");
		cfgFile.ReadString(m_strLinkTest1);
	
	        cfgFile.LocateHeading("TOTAL");
		cfgFile.LocateKey("LINKTEST2");
		cfgFile.ReadString(m_strLinkTest2);
	
//printf("m_strLinkTest1 = %s\n",m_strLinkTest1);
//printf("m_strLinkTest2 = %s\n",m_strLinkTest2);
		for(int i=0;i<m_nProcess;i++)
		{
			string strProc;
			
			cfgFile.LocateHeading("PROCESS");
				char szKey[8]={0};
				sprintf(szKey,"PROC%d",i+1);
			cfgFile.LocateKey(szKey);
			cfgFile.ReadString(strProc);
			
//.			this->AddProc(strProc);
		}
		
		cfgFile.Close();
	}
	else
	{
		printf("Configure file loaded failed!\n");
		return false;
	}
	return true;
}

bool CProcGuard::AddProc(string str)
{
        tagProcInfo *pProc = new tagProcInfo;
        if( pProc == NULL )
                return false;
        pProc->strNam = getFileName(str);
        pProc->strPath = getFilePath(str);
        pProc->bRuning = false;

//        m_lstProc.push_back(pProc);
        m_arrProc.push_back(pProc);
        return true;
}

bool CProcGuard::IsProcRuning(tagProcInfo *pProc)
{
#ifdef _WIN32
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  //获得某一时刻系统的进程的快照信息

	PROCESSENTRY32 procInfo;
	procInfo.dwSize=sizeof(PROCESSENTRY32);
	BOOL bMore = Process32First(hSnapshot,&procInfo); //获得系统进程链表中第一个进程的信息
	for(int i=0;bMore;i++)
	{
                char procNam[128];
                memcpy(procNam,procInfo.szExeFile,sizeof(procInfo.szExeFile));
                if( strcmp(procNam,pProc->strNam) == 0 )
                        return true;
                //获得下一进程
		bMore=Process32Next(hSnapshot,&procInfo);
	}
    return false;
#else
    char szCmd[128];
    memset(szCmd,0,sizeof(szCmd));
    sprintf(szCmd,"ps -ef | grep ");
    sprintf(szCmd+14,"%s | awk '{print $8}' > ",pProc->strNam.c_str());
    sprintf(szCmd+14+pProc->strNam.length()+22,"%s ",m_strTmpfName.c_str());
    system(szCmd);
    
	FILE *fp = fopen(m_strTmpfName.c_str(),"rt");
	if( fp == NULL )
	{
	        cout<<"."<<endl;
	        return true;    // 算本次运行失败,运行下次运行.
	}
	
	char par[128] ={0};
	while ( fgets(par,128,fp) )
	{
		string tstr = par;
		tstr = getFileName(tstr);
		if( tstr == pProc->strNam )
		{
			fclose(fp);
			return true;
		}
	}
	fclose(fp);
	return false;
#endif
/*        // 生产 系统调用命令字符串
        char szCmd[128];
        memset(szCmd,0,sizeof(szCmd));
        sprintf(szCmd+0,"C:/tlist -p ");
                getFileName(str);
        sprintf(szCmd+12,"%s",str.c_str(),str.length());
        sprintf(szCmd+12+str.length()," > %s ",m_strTmpfName.c_str());
                //如: "C:/tlist -p E:/telnet/QQ.exe > C:/tmp.tmp"

        // 检查 进程是否运行,并写文件
        if( system(szCmd) != 0 )
        {
                cout<<"system call failed! Anykey exit."<<endl;
                getchar();
                exit(-1);
        }

        // 读取 生成的文件,查看进程状态
        Sleep(1000);
        FILE *fp = fopen(m_strTmpfName.c_str(),"rt");
        if( fp == NULL )
        {
                cout<<"."<<endl;
                return true;    // 算本次运行失败,运行下次运行.
        }

        char par[8] ={0};
        fgets(par,8,fp);
        fclose(fp);
        if(par[0] == '-')
                return false;
        else
                return true;
*/
}

bool CProcGuard::StartupProc(tagProcInfo *pProc)
{
	// 形成命令
	char szCmd[128];
    memset(szCmd,0,sizeof(szCmd));
    sprintf(szCmd,"%s/%s ",pProc->strPath.c_str(),pProc->strNam.c_str());

    #ifdef _WIN32
	    int ret = WinExec(szCmd,SW_SHOW);
	    if( ret < 31 )
	    {
	            cout<<str<<" startup failed"<<endl;
	            return false;
	    }
	    return true;
	#else
	    	// 执行命令
	    int ret = system(szCmd);
	    
    	if( ret >= 0 )
    		return true;
    	else
    		return false;
    #endif
}

void CProcGuard::Run()
{
printf("begin run...\n");
    int x=0;
    x=LinkTest(m_strLinkTest1,4);
printf("linktest %d\n",x);
    x=LinkTest(m_strLinkTest2,4);
printf("linktest %d\n",x);
    while( 1 )
	{
        #ifdef _WIN32
       		Sleep(m_nDelaytm*1000);
       	#else
       		sleep(m_nDelaytm);
       	#endif
//printf("run....\n");



	for(int i=0;i<m_arrProc.size();i++)
    	{
			tagProcInfo *pProc = (tagProcInfo *)m_arrProc[i];

    		if( IsProcRuning(pProc) == false )
    		{
    			if( StartupProc(pProc) == true )
    				pProc->bRuning = true;
    		}
    	}
    }
}

CProcGuard::~CProcGuard()
{
    char szCmd[128];       
    memset(szCmd,0,sizeof(szCmd));
    sprintf(szCmd+0,"del ");
    sprintf(szCmd+4,"%s",m_strTmpfName.c_str());
    
	if( system(szCmd) != 0 )
		cout<<"tmp file delete failed"<<endl;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -