Unicode与MultiByte之间的练习: Process Cleaner

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <windows.h>
  4 #include <tlhelp32.h>
  5 
  6 using namespace std;
  7 
  8 const int MAX = 15;
  9 
 10 WCHAR SysProcList[MAX][MAX_PATH] = {
 11     L"[system process]",
 12     L"system",
 13     L"smss.exe",
 14     L"csrss.exe",
 15     L"wininit.exe",
 16     L"winlogon.exe",
 17     L"services.exe",
 18     L"lsass.exe",
 19     L"lsm.exe",
 20     L"svchost.exe",
 21     L"audiodg.exe",
 22     L"explorer.exe",
 23     L"conhost.exe",
 24     L"dllhost.exe",
 25     L"ctfmon.exe"
 26 };
 27 
 28 bool CheckSysProcList(LPWSTR lpText);
 29 void PrintfNormal(LPWSTR lpText);
 30 void PrintfSucceed(LPWSTR lpText);
 31 void PrintfError(LPWSTR lpText);
 32 
 33 int main()
 34 {
 35     HANDLE hToken;
 36     OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
 37     
 38     LUID luid = {};
 39     LookupPrivilegeValue(NULL, L"SeDebugPrivilege", &luid);
 40 
 41     TOKEN_PRIVILEGES tp;
 42     tp.PrivilegeCount = 1;
 43     tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 44     tp.Privileges[0].Luid = luid;
 45     if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))
 46     {
 47         PrintfError(L"ERROR_01!\n");
 48         Sleep(2000);
 49         return 0;
 50     }
 51 
 52     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
 53     if (INVALID_HANDLE_VALUE == hSnapshot)
 54     {
 55         PrintfError(L"ERROR_02!\n");
 56         Sleep(2000);
 57         return 0;
 58     }
 59 
 60     PROCESSENTRY32 pe32 = {};
 61     pe32.dwSize = sizeof(pe32);
 62     
 63     BOOL ret = Process32First(hSnapshot, &pe32);
 64     while (ret)
 65     {
 66         Sleep(100);
 67 
 68         bool isSysProc = (pe32.th32ProcessID == GetCurrentProcessId()) || (CheckSysProcList(wcslwr(pe32.szExeFile)));
 69 
 70         WCHAR wstr[MAX_PATH];
 71         wsprintf(wstr, L"%d %s %s", pe32.th32ProcessID, wcslwr(pe32.szExeFile), isSysProc ? L"ignored\n" : L"");
 72         PrintfNormal(wstr);
 73 
 74         if (!isSysProc)
 75         {
 76             BOOL tpret = TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID), NULL);
 77             wsprintf(wstr, L"shutdown %s\n", tpret ? L"succeed" : L"faild");
 78 
 79             if (tpret)
 80                 PrintfSucceed(wstr);
 81             else
 82                 PrintfError(wstr);
 83         }
 84 
 85         ret = Process32Next(hSnapshot, &pe32);
 86     }
 87 
 88     PrintfNormal(L"\nProcess Clean Finish...\n");
 89     Sleep(2000);
 90     return 0;
 91 }
 92 
 93 
 94 bool CheckSysProcList(LPWSTR lpText)
 95 {
 96     for (int i = 0; i < MAX; i++)
 97         if (0 == wcscmp(lpText, SysProcList[i]))
 98         return true;
 99 
100     return false;
101 }
102 
103 void PrintfNormal(LPWSTR lpText)
104 {
105     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
106     printf("%S", lpText);
107 }
108 
109 void PrintfSucceed(LPWSTR lpText)
110 {
111     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
112     printf("%S", lpText);
113 }
114 
115 void PrintfError(LPWSTR lpText)
116 {
117     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
118     printf("%S", lpText);
119 }
View Code
原文地址:https://www.cnblogs.com/gwsbhqt/p/4649444.html