鱼C论坛

 找回密码
 立即注册
查看: 2538|回复: 3

[技术交流] 简易进程管理C语言版

[复制链接]
发表于 2015-9-11 12:05:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
PS:不要在意函数名啊变量名这些细节,←_←英语高考只有37的人体谅下
#include<stdio.h>
#include<windows.h>
#include<tlhelp32.h>
#include<string.h>

void csh_all();//初始化所有
void csh_tq(int * i);//提权相关过程
void print_star();//输出最开始显示的内
void print_jclb();//输出当前进程列表
void zx_zzjc_jcm();//执行终止进程_进程名过程
void zx_zzjc_jcid();//执行终止进程_进程ID过程
void cls();//情况缓冲区
int tq_debug();//提权到debug
int qjcID(char*jcm);//取进程ID(英文很烂见谅)
int KillProcess_jcid(int jcid);//终止进程_进程ID
int KillProcess_jcm(char*jcm);//终止进程_进程名
HANDLE dkjc(char*jcm);//打开进程

char ch;

int main()
{
        csh_all();
        return 0;
}

void csh_all()
{
        int t = 0;
        csh_tq(&t);
        if (t)
        {
                while (1)
                {
                        print_star();
                        ch = getchar();
                        switch (ch)
                        {
                        case '0':
                                if ((ch = getchar()) != '\n')//解决01退出BUG
                                {
                                        goto cs;
                                }
                                return 0;
                        case '1':
                                if ((ch = getchar()) != '\n')
                                {
                                        goto cs;
                                }
                                print_jclb();
                                break;
                        case'2':
                                if ((ch = getchar()) != '\n')
                                {
                                        goto cs;
                                }
                                printf("请选择方式(1:进程名 其他:进程ID):");
                                ch = getchar();
                                if (ch != '1')
                                {
                                        zx_zzjc_jcid();
                                }
                                else
                                {
                                        if ((ch = getchar()) != '\n')
                                        {
                                                cls();
                                                zx_zzjc_jcid();
                                        }
                                        else
                                        {
                                                zx_zzjc_jcm();
                                        }
                                }
                                break;
                        default:
cs:                                printf("你的输入有误!\n");
                                cls();
                                break;
                        }
                }
        }
}

void csh_tq(int * i)
{
        if (tq_debug())
        {
                *i = 1;
        }
        else
        {
                printf("提权失败!是否继续?(1:继续,其他:退出):");
                ch = getchar();
                if (49 != ch)
                {
                        return 0;
                }
                else
                {
                        cls();
                        *i = 1;
                }
        }
}

void print_star()
{
        printf("------------------------------------------------------\n");
        printf("1:打印进程列表           2:终止进程                   \n");
        printf("0:退出                                                \n");
        printf("------------------------------------------------------\n");
}

void print_jclb()
{
        HANDLE jckz;
        int jcjb;
        PROCESSENTRY32 jcxx;
        jckz = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//先取得进程快照
        if (0 == jckz)//判断是否成功
        {
                return;
        }
        jcxx.dwSize = sizeof(PROCESSENTRY32);//设置 PROCESSENTRY32 变量的大小
        jcjb = Process32First(jckz, &jcxx);//获取第一个进程句柄
        printf("进程名                        进程ID   父进程ID  优先级\n");
        while (jcjb != 0)//只要获取到的句柄不为零即成功获取就进入循环
        {
                printf("%-32s", jcxx.szExeFile);
                printf("%-8d", jcxx.th32ProcessID);
                printf("%-10d", jcxx.th32ParentProcessID);
                printf("%d\n", jcxx.pcPriClassBase);
                jcjb = Process32Next(jckz, &jcxx);//如果不是我们要的进程就获取下一个进程句柄
        }
        CloseHandle(jckz);
        return;
}

void zx_zzjc_jcid()
{
        int jcid;
        printf("请输入你要终止的进程ID:");
        scanf("%d", &jcid);
        cls();
        if (jcid < 0 || jcid>10000)
        {
                printf("你输入有误!\n");
                return;
        }
        if (KillProcess_jcid(jcid))
        {
                printf("以成功终止进程!\n");
        }
        else
        {
                printf("终止进程失败!\n");
        }
}

int KillProcess_jcid(int jcid)
{
        HANDLE jb;
        jb = OpenProcess(PROCESS_ALL_ACCESS, FALSE, jcid);//打开进程
        if (TerminateProcess(jb, 0))//终止进程
        {
                return 1;
        }
        else
        {
                return 0;
        }
}

void zx_zzjc_jcm()
{
        WCHAR jcm[100];
        printf("请输入你要终止的进程名:");
        scanf("%s", jcm);
        cls();
        if (KillProcess_jcm(jcm))
        {
                printf("以成功终止进程!\n");
        }
        else
        {
                printf("终止进程失败!\n");
        }
}

int KillProcess_jcm(char*jcm)
{
        int jcjb, jcID;
        HANDLE jb;
        jcID = qjcID(jcm);//先获取进程ID
        jb = OpenProcess(PROCESS_ALL_ACCESS, FALSE, jcID);//打开进程
        if (TerminateProcess(jb, 0))//终止进程
        {
                return 1;
        }
        else
        {
                return 0;
        }

}

int qjcID(char*jcm)
{
        HANDLE jckz;
        int jcjb;
        PROCESSENTRY32 jcxx;
        jckz = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//先取得进程快照
        if (0 == jckz)//判断是否成功
        {
                return 0;
        }
        jcxx.dwSize = sizeof(PROCESSENTRY32);//设置 PROCESSENTRY32 变量的大小
        jcjb = Process32First(jckz, &jcxx);//获取第一个进程句柄
        while (jcjb != 0)//只要获取到的句柄不为零即成功获取就进入循环
        {
                if (strcmp(jcm, jcxx.szExeFile) == 0)//判断进程名是否和我们要结束的一样
                {
                        CloseHandle(jckz);
                        return jcxx.th32ProcessID;//如果是就返回进程PID
                }
                jcjb = Process32Next(jckz, &jcxx);//如果不是我们要的进程就获取下一个进程句柄
        }
        CloseHandle(jckz);
        return 0;//如果没有我们要的就返回0
}

int tq_debug()
{
        int retn;
        TOKEN_PRIVILEGES qxlx;
        HANDLE  lpjb,jcjb;
        jcjb = GetCurrentProcess();
        OpenProcessToken(jcjb, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&lpjb);
        LookupPrivilegeValueA(NULL,"SeDebugPrivilege",&qxlx.Privileges->Luid);
        qxlx.PrivilegeCount = 1;
        qxlx.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
        retn = AdjustTokenPrivileges(lpjb, 0, &qxlx, NULL, NULL, NULL);
        CloseHandle(jcjb);
        return retn;
}

void cls()
{
        while ((ch = getchar()) != '\n');
}

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
康小泡 + 5 + 5 + 5 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-11 13:39:13 | 显示全部楼层
管理系统这个大一期末都要做。不过我大一上还不知道怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-7 15:46:36 | 显示全部楼层
上了大学是不是觉得专业课都轻松到爆呀~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-9 15:12:56 | 显示全部楼层
小甲鱼 发表于 2015-10-7 15:46
上了大学是不是觉得专业课都轻松到爆呀~~~

专业课真的很轻松,英语........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 11:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表