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

 

你可能感兴趣的:(unicode)