終止處理程序 (W32 Console)

本文介绍了一个使用C语言实现的Windows环境下程序,该程序能够枚举当前系统中的所有进程,并允许用户通过输入进程ID来终止指定进程。此外,程序还包括了获取系统调试权限的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值