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

📄 processprobe.cpp

📁 一个网络监视的程序
💻 CPP
字号:
//****************************************************************
//文件名:ProcessProbe.cpp
//功  能:监视系统中新增加或刚结束的进程的各种信息
//时  间:2004.07.22
//作  者:吴海松
//*****************************************************************
#include "stdafx.h"
#include "ProcessProbe.h"
#define  MAX_PATH_LONG 256
#define MAX_NUMBER 256
//******************************************************************
//函数名称:ProcessProbe
//函数功能:构造函数
//输入参数:无
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
ProcessProbe::ProcessProbe():hModule(NULL),number_add(0),number_end(0) //构造函数
{
	processListStr.dwSize=sizeof(PROCESSENTRY32);
}


//******************************************************************
//函数名称:~ProcessProbe
//函数功能:析构函数
//输入参数:无
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
ProcessProbe::~ProcessProbe()//析构函数
{}

//******************************************************************
//函数名称:ClearInfo
//函数功能:清空Struct ProInfo中的数据
//输入参数:ProInfo 结构体变量
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************	  
void ProcessProbe::ClearInfo(ProInfo proinfo[])
{
	int i;
	for(i=0;i<MAX_NUMBER;i++)
	{
		memset(proinfo[i].time,0,10);
		memset(proinfo[i].szPrcess_Patch,0,MAX_PATH_LONG);
	}
}


//******************************************************************
//函数名称:GetProInfo
//函数功能:获取进程的信息,并存放到数组中.同时返回进程的个数
//输入参数:保存进程信息的ProInfo结构体变量
//输出参数:返回进程的个数
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
int ProcessProbe::GetProInfo(ProInfo proinfo[])  
{
	ClearInfo(proinfo);
	TCHAR szPrcessPatch[MAX_PATH_LONG];
		
	Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
		//获得某一时刻系统的进程、堆(heap)、模块(module)或线程的快照信息

	return_value=Process32First(Snapshot,&processListStr);

	int num=0;
	while(return_value)  //读取进程连表没有结束时,循环
	{
			
		//cout<<processListStr.th32ProcessID<<endl;
		//cout<<processListStr.szExeFile<<endl;
		if(processListStr.th32ProcessID!=0 &&processListStr.th32ProcessID!=4)
		{
			proinfo[num].m_ProcessIndex=processListStr.th32ProcessID;//保存进程ID
			
			HANDLE	hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ , FALSE, processListStr.th32ProcessID);
			if(hProcess!=NULL)
			{
				if( EnumProcessModules( hProcess, &hModule,	sizeof(hModule), &dwSize ) )
					GetModuleFileNameExA(hProcess,hModule, szPrcessPatch, MAX_PATH_LONG );
				///cout<<szPrcessPatch<<endl<<endl;
				strcpy(proinfo[num].szPrcess_Patch,szPrcessPatch); //保存进程路径信息
			}
			m_localtime= CTime::GetCurrentTime();
			std::string	m_StrNowtime=m_localtime.Format(_T("%H:%M:%S"));
			strcpy(proinfo[num].time,m_StrNowtime.c_str());
		
			//获得系统进程链表中下一个进程的信息
		}
		return_value=Process32Next(Snapshot,&processListStr);
		num++;
	}
		/*
		for(int i=0;i<num;i++)
		{
			cout<<"ID:"<<proinfo[i].m_ProcessIndex<<endl;
			cout<<"名称:"<<proinfo[i].pro_name<<endl;
			cout<<"路径:"<<proinfo[i].szPrcess_Patch<<endl<<endl;
		}
		*/
	return num; //返回进程个数
}

//******************************************************************
//函数名称:Compare
//函数功能:求出在pro1但不在pro2中的进程的信息,将其保存在pro3变量中
//输入参数:三个ProInfo结构体变量,三个整数
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
void ProcessProbe::Compare(ProInfo pro1[],ProInfo pro2[],ProInfo pro3[],int num_1,int num_2,int *num_3)  //比较,将结果放入pro3中
{  //将在 pro1 而不在 pro2 中的ID保存在pro3中
	int i,j,k=0;
	int flag=0;
	for(i=0;i<num_1;i++)
	{
		flag=0;
		for(j=0;j<num_2;j++)
		{
			if(pro1[i].m_ProcessIndex==pro2[j].m_ProcessIndex)
			{
				flag=1;
				break;
			}
		}
		if(flag==0)
		{
			pro3[k].m_ProcessIndex=pro1[i].m_ProcessIndex; //拷贝进程ID
			strcpy(pro3[k].szPrcess_Patch,pro1[i].szPrcess_Patch); //拷贝进程路径信息
			strcpy(pro3[k].time,pro1[i].time); //拷贝时间
			k++;
		}
	}
	*num_3=k;
}

//******************************************************************
//函数名称:GetProStarted
//函数功能:获取系统新运行的进程
//输入参数:无
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************	
void ProcessProbe::GetProStarted()  
{
	Compare(proinfo_new,proinfo_old,proinfo_start,number_new,number_old,&number_add);
}

//******************************************************************
//函数名称:GetProEnded
//函数功能:获取系统刚结束的进程
//输入参数:无
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
void ProcessProbe::GetProEnded()  
{
	Compare(proinfo_old,proinfo_new,proinfo_end,number_old,number_new,&number_end);
}


//******************************************************************
//函数名称:GetFirstProInfo
//函数功能:第一次获取系统所有进程的信息
//输入参数:无
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
void ProcessProbe::GetFirstProInfo() //
{
	number_old=GetProInfo(proinfo_old);
}

//******************************************************************
//函数名称:GetSecondProInfo
//函数功能:第二次获取系统所有进程的信息
//输入参数:无
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
void ProcessProbe::GetSecondProInfo()
{
	number_new=GetProInfo(proinfo_new);
}

//******************************************************************
//函数名称:Run
//函数功能:开始运行,完成以上函数实现的各种功能
//输入参数:无
//输出参数:无
//时    间:2004.07.21
//作    者:吴海松
//其它说明:
//*******************************************************************
void ProcessProbe::Run()
{
	while(1)
	{
		GetFirstProInfo(); //第一次获取进程信息
		Sleep(1000); 
		GetSecondProInfo();  //第二次获取进程信息

		GetProStarted(); //获取新开始的信息
		GetProEnded();//获取结束的进程信息

		std::string	l_strprocessadd;
		std::string	l_strprocessend;

		l_strprocessadd.erase();
		l_strprocessend.erase();

		if(number_add>0)
		{
			for(int i=0;i<number_add;i++)
			{

				l_strprocessadd+= proinfo_start[i].time ;
				l_strprocessadd+=" PROC  START \"" ;
				l_strprocessadd+= proinfo_start[i].szPrcess_Patch ;
				l_strprocessadd+= "\"\n";
			}
			number_add=0;
		}

		if(number_end>0)
		{
			for(int i=0;i<number_end;i++)
			{
				l_strprocessend+= proinfo_end[i].time ;
				l_strprocessend+=" PROC  END \"" ;
				l_strprocessend+= proinfo_end[i].szPrcess_Patch ;
				l_strprocessend+= "\"\n";
			}

			number_end=0;
		}
		
		
		EnterCriticalSection(&gCriticalSectionForPrtBuff);
		if (l_strprocessend.size()>0) {
			(PtrBuffWrite->str)+=l_strprocessend;
			(PtrBuffWrite->len)+=l_strprocessend.size();
		}
		if (l_strprocessadd.size()>0) {
			(PtrBuffWrite->str)+=l_strprocessadd;
			(PtrBuffWrite->len)+=l_strprocessadd.size();
		}
		LeaveCriticalSection(&gCriticalSectionForPrtBuff);

		
	}
}
































⌨️ 快捷键说明

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