![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }