首页 > PHP资讯 > 工具库 > 一个删除进程的小程序详细介绍

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

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

看windows api的时候,作为练习,编写了个删除进程的程序。觉得里面知识点挺多的,所以贴上来当个笔记用。当然难免有错误,欢迎指教 ^^    其中也用到了上篇文章里面说到的调整权限的函数,于是就直接从关机程序里面copy过来了。下面是程序,关键地方给了注释。#include#include#includevoid ListProcess()                        //列出进程名称及ID{    HANDLE hProcessSnap=NULL;    PROCESSENTRY32 pe32={0};            //存放进程信息的结构体    hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);        //创建系统所有进程的快照    if(hProcessSnap==INVALID_HANDLE_VALUE)    {        printf("CreateToolhelp32Snapshot failed: %dn",GetLastError());        return;    }    pe32.dwSize=sizeof(PROCESSENTRY32);    printf("ProcessName            ProcessIDn");    if(Process32First(hProcessSnap,&pe32))                //指向第一个进程,并将其放入PROCESSENTRY32结构体中    {        char c[5];        do        {            itoa(pe32.th32ProcessID,c,10);            printf("%-30s%dn",pe32.szExeFile,pe32.th32ProcessID);        //szExeFile为进程的可执行文件名称        }        while(Process32Next(hProcessSnap,&pe32));    }    else    {        printf("Process32First() failed:%dn",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: %dn",id,GetLastError());        return false;    }    if(!TerminateProcess(hProcess,1))                                //终结进程    {        printf("TerminateProcess failed: %dn",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社区 其它相关文章!

工具库

本文由欣才IT学院整理发布,未经许可,禁止转载。
支持1不支持0