进程结束工具

这里我们实现一个用来结束进程的小工具,先来大致了解下所用到的函数。

【CreateToolhelp32Snapshot】:该函数通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD]建立一个快照[snapshot]。

函数原型:

HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定快照中需要返回的对象,如TH32CS_SNAPPROCESS为在快照中包含系统所有的进程
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0
);

【Process32First、Process32Next】:为进程获取函数,通过CreateToolhelp32Snapshot()函数获取当前运行进程的快照后,用Process32First()函数来获得第一个进程的句柄,用Process32Next()函数来获得下一个进程的句柄。

函数原型(Process32Next原型同Process32First):

BOOL WINAPI Process32First(
HANDLE hSnapshot, //CreateToolhelp32Snapshot()函数返回的句柄
LPPROCESSENTRY lppe //指向PROCESSENTRY32结构
);

PROCESSENTRY32结构如下(使用该结构前,得先设置它的大小):

typedef struct tagPROCESSENTRY32 {
DWORD dwSize; //结构大小
DWORD cntUsage; //此进程的引用计数
DWORD th32ProcessID; //进程ID
DWORD th32DefaultHeapID; //进程默认堆ID
DWORD th32ModuleID; //进程模块ID
DWORD cntThreads; //此进程开启的线程计数
DWORD th32ParentProcessID; //父进程ID
LONG pcPriClassBase; //线程优先权
DWORD dwFlags; //保留
TCHAR szExeFile[MAX_PATH]; //进程全名
DWORD th32MemoryBase; //
DWORD th32AccessKey; //
} PROCESSENTRY32; 
typedef PROCESSENTRY32 * PPROCESSENTRY32;
typedef PROCESSENTRY32 * LPPROCESSENTRY32;

【OpenProcess】:该函数用来打开一个已存在的进程对象,并返回进程的句柄。

函数原型

HANDLE OpenProcess(
DWORD dwDesiredAccess,  //希望得到的访问权限
BOOL bInheritHandle,  //是否继承句柄
DWORD dwProcessId //进程标识符
);

返回值:

如果成功,返回值为指定进程的句柄;

如果失败,返回值为空,可以通过调用GetLastError获得错误代码。

【TerminateProcess】:该函数用来终止指定进程及其所有线程。

函数原型

BOOL TerminateProcess(
HANDLE hProcess, //进程句柄
DWORD uExitCode //进程的一个退出代码
);

 最后的结束指定进程的代码如下:

 1 #include <stdio.h>
 2 #include <windows.h>
 3 #include <tlhelp32.h> //CreateToolhelp32Snapshot
 4 #include <string.h> //strstr
 5 #include <stdlib.h> //system()
 6 
 7 #define MAX 128
 8 
 9 void killprocess(char processname[]);
10 
11 int main(void)
12 {
13     char processname[MAX];
14 
15     printf("please enter the name of the process:");
16     scanf("%s", processname);
17     killprocess(processname);
18     system("pause");
19     return 0;
20 }
21 
22 void killprocess(char processname[])
23 {
24     HANDLE hProcessSnap = NULL;
25     HANDLE hProcess;
26     PROCESSENTRY32 lppe;
27 
28     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建进程快照
29 
30     lppe.dwSize = sizeof(PROCESSENTRY32); //使用该结构前,得先设置它的大小
31     if (Process32First(hProcessSnap, &lppe)) //获得第一个进程的句柄
32     {
33         do
34         {
35             if (strstr(lppe.szExeFile, processname))
36             {
37                 hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, lppe.th32ProcessID);
38                 TerminateProcess(hProcess, 0);
39                 CloseHandle(hProcess);
40             }
41         }while (Process32Next(hProcessSnap, &lppe)); //获得下一个进程的句柄
42     }
43     CloseHandle(hProcessSnap);
44 }

 

posted @ 2013-09-28 13:07  unfickleness  阅读(630)  评论(1编辑  收藏  举报