热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个删除进程的小程序详细介绍

看windowsapi的时候,作为练习,编写了个删除进程的程序。觉得里面知识点挺多的,所以贴上来当个笔记用。当然难免有错误,欢迎指教^^其中也用到了篇文章里面说到的调整权限的函数,于是就直接从关机程序里面copy过来了。下面是程序,关键地方给了注释。
看windows api的时候,作为练习,编写了个删除进程的程序。觉得里面知识点挺多的,所以贴上来当个笔记用。当然难免有错误,欢迎指教 ^^
其中也用到了篇文章里面说到的调整权限的函数,于是就直接从关机程序里面copy过来了。下面是程序,关键地方给了注释。

看windows api的时候,作为练习,编写了个删除进程的程序。觉得里面知识点挺多的,所以贴上来当个笔记用。当然难免有错误,欢迎指教 ^^    
其中也用到了上篇文章里面说到的调整权限的函数,于是就直接从关机程序里面copy过来了。下面是程序,关键地方给了注释。
#include
#include
#include

void ListProcess()                        //列出进程名称及ID
{
    HANDLE hProcessSnap=NULL;
    PROCESSENTRY32 pe32={0};            //存放进程信息的结构体
    hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);        //创建系统所有进程的快照
    if(hProcessSnap==INVALID_HANDLE_VALUE)
    {
        printf("CreateToolhelp32Snapshot failed: %d\n",GetLastError());
        return;
    }
    pe32.dwSize=sizeof(PROCESSENTRY32);
    printf("ProcessName            ProcessID\n");
    if(Process32First(hProcessSnap,&pe32))                //指向第一个进程,并将其放入PROCESSENTRY32结构体中
    {
        char c[5];
        do
        {
            itoa(pe32.th32ProcessID,c,10);
            printf("%-30s%d\n",pe32.szExeFile,pe32.th32ProcessID);        //szExeFile为进程的可执行文件名称
        }
        while(Process32Next(hProcessSnap,&pe32));
    }
    else
    {
        printf("Process32First() failed:%d\n",GetLastError());
    }
    CloseHandle(hProcessSnap);
    return;
}

BOOL EnablePrivilege()                //获取系统权限
{
    HANDLE hProcess = NULL;
    HANDLE hToken = NULL;
    LUID uID = {0};
    TOKEN_PRIVILEGES stToken_Privileges = {0};
    hProcess = GetCurrentProcess();                                    //获取当前应用程序进程句柄
    if(!OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken))    //打开当前进程的访问令牌句柄
                                                                    //(OpenProcessToken函数调用失败返回值为零)
        return FALSE;
    if(!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID))        //获取权限名称为"SeShutdownPrivilege"的LUID
                                                                //LookupPrivilegeValue函数调用失败返回值为零
        return FALSE;
    stToken_Privileges.PrivilegeCount = 1;                            //欲调整的权限个数
    stToken_Privileges.Privileges[0].Luid = uID;                    //权限的LUID
    stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;        //权限的属性,
                                                                            //SE_PRIVILEGE_ENABLED为使能该权限
    //调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)
    if(!AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL))
        return FALSE;
    if(GetLastError() != ERROR_SUCCESS)                                //查看权限是否调整成功
        return FALSE;
    CloseHandle(hToken);
    return TRUE;
}

bool KillProcess(DWORD id)
{
    HANDLE hProcess=NULL,hProcessToken=NULL;
    bool isKilled=false,bRet=false;

    EnablePrivilege();                    //调整权限
    printf("Enable Privilege OK!\n");
    if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL)    //打开进程获得句柄
    {
        printf("Open process %d failed: %d\n",id,GetLastError());
        return false;
    }
    if(!TerminateProcess(hProcess,1))                                //终结进程
    {
        printf("TerminateProcess failed: %d\n",GetLastError());
        return false;
    }
    isKilled=true;
    if(hProcessToken!=NULL)
        CloseHandle(hProcessToken);
    if(hProcess!=NULL)
        CloseHandle(hProcess);
    return isKilled;
}

void main()
{
    int id=0;
    ListProcess();
    while(1)
    {
        printf("选择要删除的进程ID:");
        scanf("%d",&id);
        if(KillProcess(id)==true)
        {
            system("cls");
            ListProcess();
        }
        else
            printf("Failed!!");
    }
}

以上就是一个删除进程的小程序详细介绍的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 本文探讨了线性表中元素的删除方法,包括顺序表和链表的不同实现策略,以及这些策略在实际应用中的性能分析。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • JavaScript 中引号的多层嵌套使用技巧
    本文详细介绍了在 JavaScript 编程中如何处理引号的多级嵌套问题,包括双引号、单引号以及转义字符的正确使用方法。 ... [详细]
  • 解决UIScrollView自动偏移问题的方法
    本文介绍了一种有效的方法来解决在使用UIScrollView时出现的自动向下偏移的问题,通过调整特定的属性设置,可以确保滚动视图正常显示。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • 最适合初学者的编程语言
    本文探讨了适合编程新手的最佳语言选择,包括Python、JavaScript等易于上手且功能强大的语言,以及如何通过有效的学习方法提高编程技能。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
author-avatar
ss29566982
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有