📄 processprobe.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 + -