1. 获取系统所有进程快照信息:
1)使用CreateToolhelp32Snapshot给系统内执行的进程拍快照;里面有进程名称,ID,和父进程ID等信息;
2)使用Process32Firest和Process32Next函数遍历快照记录的列表。
dwFlags的取值有:
TH32CS_SNAPHEAPLIST 枚举th32ProcessID参数指定进程中的堆;
TH32CS_SNAMODULE 枚举th32ProcessID参数指定进程中的模块;
TH32CS_SNAPPROCESS 枚举系统范围内的进程;此时th32ProcessID参数被忽略;
TH32CS_SNAPTHREAD 枚举系统范围内的线程;此时th32ProcessID参数被忽略;
遍历过程:
bmore = ::Process32First(han,&pe);
while(bmore)
{ bmore = ::Process32Next(han,&pe);
}
PROCESSENTRY32的结构:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32,
*PPROCESSENTRY32;
实例:
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>//声明快照函数头文件
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
PROCESSENTRY32 pe;//存储进程信息的结构,使用之前,先设置大小
pe.dwSize = sizeof(pe);
//给系统内所有进程拍一个快照,返回一个快照的句柄;
HANDLE han = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(!han)
return -1;
//遍历快照
BOOL bmore;
bmore = ::Process32First(han,&pe);
while(bmore)
{
cout << pe.szExeFile;
cout << pe.th32ProcessID << endl;
bmore = ::Process32Next(han,&pe);
}
//句柄释放
::CloseHandle(han);
return 0;
}
2终止当前进程
进程终止的原因可能有四个:
1) 主线程的入口函数返回;
2) 此进程中所有的线程都结束了;
3) 进程中的一个线程调用了ExitProcess函数;
4) 其他进程中的一个线程调用了TerminateProcess;
第一二种情况:函数返回的时候,启动函数会调用C/C++运行期退出函数exit,销毁所有的全局或静态c++对象,然后调用系统函数ExitProcess函数是OS终止应用程序;
不赞成第三种:因为C/C++运行库得不到通知,没有机会释放全局的或静态的C++对象的析构函数。
Void ExitProcess(UINT uExitCode);//终止当前进程的运行
3终止其他进程
第四种:终止其他进程
BOOL TerminateProcess(HANDLEhProcess,UINT uExitCode);
1. 要结束其他进程,必须首先取得该进程的句柄。CreateProcess函数创建进程后会返回一个进程句柄,而对于一个已经存在的进程,只能使用OpenProcess取得这个进程的访问权限。
HANDLE OpenProcess(DWORD dwDesiredAccess,BOOLbInheritHandle,DWORD dwProcessId);
程序实例:
BOOL TerminateProcessFromId(DWORD dwId)
{
BOOL bRet = FALSE;
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS_FALSE,FALSE,dwId);
if(!hProcess)
{
bRet = ::TerminateProcess(hProcess,0);
}
CloseHandle(hProcess);
return bRet;
}
4 保护进程
保护自己的进程不被其他进程关闭,可以从两个方面入手:一是防止进程被其他进程检测到,就是HOOK掉其他进程对ToolHelp类型函数的调用;二是HOOK掉其他进程对TerminateProcess的调用;