#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winbase.h>
#include <tlhelp32.h>
#include <PSAPI.h>
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "PSAPI.lib")
// 終止處理程序
BOOL KillProcess (int);
// 取得偵錯權限
BOOL GetDebugPrivilege (void);
// 列舉所有程序
void ErumProcesses (void);
int main(void) {
ErumProcesses();
if(!GetDebugPrivilege()) {
printf("/n無法取得偵錯權限 (%d)/n", GetLastError());
return EXIT_SUCCESS;
}
int pid = 0;
while(true) {
printf("/n若要停止程序, 請輸入一個程序識別碼 (0離開, 1重新整理): ");
scanf("%d", &pid);
switch(pid){
case 0:
return EXIT_SUCCESS;
break;
case 1:
system("CLS");
ErumProcesses();
break;
default:
if(KillProcess(pid)) {
printf("/n已結束該處理程序./n");
system("PAUSE");
system("CLS");
ErumProcesses();
}else {
LPTSTR lpMsg;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsg, 0, NULL
);
printf("/n%s", lpMsg);
}
}
}
}
BOOL KillProcess(int pid) {
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
if(!hProcess) return FALSE;
DWORD dwSuccess = TerminateProcess(hProcess, 0);
if(!dwSuccess) return FALSE;
return TRUE;
}
BOOL GetDebugPrivilege(void) {
BOOL bSuccess;
HANDLE hToken;
TOKEN_PRIVILEGES tokenPrivileges;
bSuccess = OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if(!bSuccess) return FALSE;
bSuccess = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tokenPrivileges.Privileges[0].Luid);
if(!bSuccess) return FALSE;
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bSuccess = AdjustTokenPrivileges(hToken, FALSE,
&tokenPrivileges, 0, NULL, 0);
if(!bSuccess) return FALSE;
return CloseHandle(hToken);
}
void ErumProcesses(void) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSnapshot != INVALID_HANDLE_VALUE) {
HANDLE hProcess;
TCHAR szPath[260];
PROCESSENTRY32 procSentry;
procSentry.dwSize = sizeof(procSentry);
BOOL Proc = Process32First(hSnapshot, &procSentry);
for(; Proc; Proc = Process32Next(hSnapshot, &procSentry)) {
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, NULL,
procSentry.th32ProcessID
);
if(hProcess != INVALID_HANDLE_VALUE) {
GetModuleFileNameEx(hProcess, NULL, szPath, sizeof(szPath));
}; CloseHandle(hProcess);
printf("PID %5d [%s]/n",
procSentry.th32ProcessID, procSentry.szExeFile);
if(strlen(szPath) != 2) printf("/"%s/"/n/n", szPath);
}
}; CloseHandle(hSnapshot);
}
#include <stdlib.h>
#include <windows.h>
#include <winbase.h>
#include <tlhelp32.h>
#include <PSAPI.h>
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "PSAPI.lib")
// 終止處理程序
BOOL KillProcess (int);
// 取得偵錯權限
BOOL GetDebugPrivilege (void);
// 列舉所有程序
void ErumProcesses (void);
int main(void) {
ErumProcesses();
if(!GetDebugPrivilege()) {
printf("/n無法取得偵錯權限 (%d)/n", GetLastError());
return EXIT_SUCCESS;
}
int pid = 0;
while(true) {
printf("/n若要停止程序, 請輸入一個程序識別碼 (0離開, 1重新整理): ");
scanf("%d", &pid);
switch(pid){
case 0:
return EXIT_SUCCESS;
break;
case 1:
system("CLS");
ErumProcesses();
break;
default:
if(KillProcess(pid)) {
printf("/n已結束該處理程序./n");
system("PAUSE");
system("CLS");
ErumProcesses();
}else {
LPTSTR lpMsg;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsg, 0, NULL
);
printf("/n%s", lpMsg);
}
}
}
}
BOOL KillProcess(int pid) {
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
if(!hProcess) return FALSE;
DWORD dwSuccess = TerminateProcess(hProcess, 0);
if(!dwSuccess) return FALSE;
return TRUE;
}
BOOL GetDebugPrivilege(void) {
BOOL bSuccess;
HANDLE hToken;
TOKEN_PRIVILEGES tokenPrivileges;
bSuccess = OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if(!bSuccess) return FALSE;
bSuccess = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tokenPrivileges.Privileges[0].Luid);
if(!bSuccess) return FALSE;
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bSuccess = AdjustTokenPrivileges(hToken, FALSE,
&tokenPrivileges, 0, NULL, 0);
if(!bSuccess) return FALSE;
return CloseHandle(hToken);
}
void ErumProcesses(void) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSnapshot != INVALID_HANDLE_VALUE) {
HANDLE hProcess;
TCHAR szPath[260];
PROCESSENTRY32 procSentry;
procSentry.dwSize = sizeof(procSentry);
BOOL Proc = Process32First(hSnapshot, &procSentry);
for(; Proc; Proc = Process32Next(hSnapshot, &procSentry)) {
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, NULL,
procSentry.th32ProcessID
);
if(hProcess != INVALID_HANDLE_VALUE) {
GetModuleFileNameEx(hProcess, NULL, szPath, sizeof(szPath));
}; CloseHandle(hProcess);
printf("PID %5d [%s]/n",
procSentry.th32ProcessID, procSentry.szExeFile);
if(strlen(szPath) != 2) printf("/"%s/"/n/n", szPath);
}
}; CloseHandle(hSnapshot);
}