1 /*******************************************************************************
2 函数名称 : LookUpProcessAndKill
3 函数描述 : 遍历进程找到需要杀死的进程
4 输入参数 : N/A
5 输出参数 : N/A
6 返回值 : N/A
7 作者 : N/A
8 *******************************************************************************/
9 BOOL LookUpProcessAndKill(const vector<CString> &vecProcessName)
10 {
11 BOOL bRet = FALSE;
12 HANDLE SnapShot, ProcessHandle;
13 SHFILEINFO shSmall;
14 PROCESSENTRY32 ProcessInfo;
15
16 CString strSearchName;
17 CString strRunProcessName;
18 SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
19 if(SnapShot != NULL)
20 {
21 ProcessInfo.dwSize = sizeof(ProcessInfo); // 设置ProcessInfo的大小
22 BOOL Status = Process32First(SnapShot, &ProcessInfo);
23
24 //提升升级工具进程权限为SE_DEBUG_NAME,否则XP下无法杀掉进程
25 HANDLE hToken;
26 if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
27 {
28 LUID luid;
29 if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
30 {
31 TOKEN_PRIVILEGES TokenPrivileges;
32 TokenPrivileges.PrivilegeCount = 1;
33 TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
34 TokenPrivileges.Privileges[0].Luid = luid;
35 AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);
36 }
37 CloseHandle(hToken);
38 }
39
40 while(Status)
41 {
42 // 获取进程文件信息
43 SHGetFileInfo(ProcessInfo.szExeFile, 0, &shSmall, sizeof(shSmall), SHGFI_ICON|SHGFI_SMALLICON);
44
45 // 检测进程是否需要关闭
46 strRunProcessName = ProcessInfo.szExeFile;
47 strRunProcessName.MakeLower();
48 for (vector<CString>::size_type it = 0; it != vecProcessName.size(); ++ it)
49 {
50 strSearchName = vecProcessName[it];
51 strSearchName.MakeLower();
52 if(strSearchName == strRunProcessName)
53 {
54 // 获取进程句柄,强行关闭
55 ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.th32ProcessID);
56 if (ProcessHandle != NULL)
57 {
58 bRet = TerminateProcess(ProcessHandle, 1);
59 CloseHandle(ProcessHandle);
60 }
61
62 break;
63 }
64
65 }
66
67 // 获取下一个进程的信息
68 Status = Process32Next(SnapShot, &ProcessInfo);
69 }
70 }
71
72 return bRet;
73 }