系统进程信息的获取和当前进程的终止

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的调用;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值