这里我们实现一个用来结束进程的小工具,先来大致了解下所用到的函数。
【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 }