?? 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[])
{
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.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 + -