C++结束进程 并能显示其父进程

原创 2016年08月30日 08:34:40

这个程序功能强大哦~~
本人是在Dev c++下编译的
用VC的请把第一个头文件改成你知道的所有头文件~~
代码展示:

#include <bits/stdc++.h>
#include <windows.h>
#include <winbase.h>
#include <wtypes.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <tchar.h>
#include <unistd.h>
#include <sys/types.h>
#define illegal_parameter_value 100000000
#define illegal_parameter_value2 100000001
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"advapi32.lib")
using namespace std;
bool compare(char a[],char b[])
{
    if (strlen(a)!=strlen(b)) return false;
    for (int i=0;i<strlen(a);i++)
        if (a[i]!=b[i] &&  (a[i]-'a'+'A')!=b[i] && a[i]!=(b[i]-'a'+'A')) return false;
    return true;
}
BOOL SetRealTimePriority()
{
    if(!SetPriorityClass( GetCurrentProcess(), REALTIME_PRIORITY_CLASS )) return false;
    return true;
}
BOOL EnableShutdownPriv()
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    if (!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) return false;
    if (!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &sedebugnameValue ) )
    {
        CloseHandle( hToken );
        return false;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) ) CloseHandle( hToken );
    return true;
}
BOOL EnableDebugPriv()
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    if ( ! OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) return false;
    if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
    {
        CloseHandle( hToken );
        return false;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) ) CloseHandle( hToken );
    return true;
}
BOOL EnableBackupPriv()
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    if ( ! OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) return false;
    if ( ! LookupPrivilegeValue( NULL, SE_BACKUP_NAME, &sedebugnameValue ) )
    {
        CloseHandle( hToken );
        return false;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) ) CloseHandle( hToken );
    return true;
}
BOOL EnableRestorePriv()
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    if ( ! OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) return false;
    if ( ! LookupPrivilegeValue( NULL, SE_RESTORE_NAME, &sedebugnameValue ) )
    {
        CloseHandle( hToken );
        return false;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) ) CloseHandle( hToken );
    return true;
}
//------------------------------------------------get_Privileges------------------------------------------------------
DWORD GetProcessID(char *FileName)
{
    HANDLE myhProcess;
    PROCESSENTRY32 mype;
    mype.dwSize = sizeof(PROCESSENTRY32); 
    BOOL mybRet;
    //进行进程快照
    myhProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //TH32CS_SNAPPROCESS快照所有进程
    //开始进程查找
    mybRet=Process32First(myhProcess,&mype);
    //循环比较,得出ProcessID
    while(mybRet)
    {
        if(compare(FileName,mype.szExeFile))
            return mype.th32ProcessID;
            else mybRet=Process32Next(myhProcess,&mype);
    }
    return illegal_parameter_value;
}
DWORD GetP(DWORD id )
{
    HANDLE hProcessSnap;
    HANDLE hProcess;
    PROCESSENTRY32 pe32;
    DWORD dwPriorityClass;
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    pe32.dwSize = sizeof( PROCESSENTRY32 );
    do
    {
        dwPriorityClass = 0;
        hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
        dwPriorityClass = GetPriorityClass( hProcess );
        CloseHandle( hProcess );
        if (pe32.th32ProcessID==id) return pe32.th32ParentProcessID;
    } while( Process32Next( hProcessSnap, &pe32 ) );
    CloseHandle( hProcessSnap );
    return 0;
}
int pskill(int id)   //根据进程ID杀进程
{
    HANDLE hProcess=NULL;
    //打开目标进程
    hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,id);
    if (hProcess==NULL) {
        if (GetLastError()==5) printf("错误:无法终止PID %d (属于 PID %d 子进程的进程)。\n原因:拒绝访问 :Access is denied\n",id,GetP(id));
            else if (GetLastError()==87) printf("错误:未找到进程 :Error to find process %d\n",id);
                else printf("错误:未知错误 :Unknown Error %d\n",GetLastError());
        return illegal_parameter_value;
    }
    //结束目标进程
    DWORD ret=TerminateProcess(hProcess,0);
    Sleep(100);
    if(!ret) {
        if (GetLastError()==5) printf("错误:无法终止PID %d (属于 PID %d 子进程的进程)。\n原因:拒绝访问 :Access is denied\n",id,GetP(id));
            else if (GetLastError()==87) printf("错误:未找到进程 :Error to find process %d\n",id);
                else printf("错误:未知错误 :Unknown Error %d\n",GetLastError());
        return illegal_parameter_value;
    }
    return 0;
}
bool check(char x[])
{
    for (int i=0;i<strlen(x);i++) if (x[i]<'0' || x[i]>'9') return true;
    return false;
}
int main() 
{
    system("Title ProcessKiller");
    system("Mode con cols=87");
    system("color 3F");

    next:
    printf("Loading... Please wait.....");
    system("cls");
    system("tasklist");
    //杀进程
    printf("the process's name/id which you want to kill:(直接输入,不区分大小写),键入're'来刷新进程列表:\n");
    char a[1000];
    scanf("%s",a);
    if (strlen(a)==4 && a[0]=='e' && a[1]=='x' && a[2]=='i' && a[3]=='t') exit(0);
    if (compare(a,"re")) goto next;
    bool symbol = 1;
    if (check(a)) symbol=0;
    int id = 0;
    if (symbol)
    {
        int i=0;
        while (a[i]!='\0')
        {
            id=id*10+(a[i]-'0');
            i++;
        }
        bool s1=SetRealTimePriority();
        bool s2=EnableShutdownPriv();
        bool s3=EnableDebugPriv();
        bool s4=EnableBackupPriv();
        bool s5=EnableRestorePriv();
        if (s1==0 || s2==0 || s3==0 || s4==0 || s5==0) 
        {
            printf("错误:ProcessKiller无法终止这个进程\n");
            printf("原因:权限不足 Haven't got enough privilliges\n");
            printf("请在UAC用户账户控制中更改权限,或与计算机管理员取得联系\n");
            getchar();getchar(); exit(5);
        }
        int ppid=GetP(id);
        int f=pskill(id);
        if (f==illegal_parameter_value2 || f==illegal_parameter_value) {getchar();getchar();goto next;}
            else printf("成功:已终止 PID %d (属于 PID %d 子进程)的进程;\nSuccessful to terminate PID %d(the child process of PID %d)\n",id,ppid,id,ppid);
        getchar();getchar();goto next;
    } else
    {
        id=GetProcessID(a);
        if (id==illegal_parameter_value) 
        {
            printf("错误:未找到进程 :Error to find proccess '%s'\n",a);
            getchar();getchar();goto next;
        }
        while (id!=illegal_parameter_value)
        {
            bool s1=SetRealTimePriority();
            bool s2=EnableShutdownPriv();
            bool s3=EnableDebugPriv();
            bool s4=EnableBackupPriv();
            bool s5=EnableRestorePriv();
            if (s1==0 || s2==0 || s3==0 || s4==0 || s5==0) 
            {
                printf("错误:ProcessKiller无法终止这个进程\n");
                printf("原因:权限不足 Haven't got enough privilliges\n");
                printf("请在UAC用户账户控制中更改权限,或与计算机管理员取得联系\n");
                getchar();getchar(); exit(5);
            }
            int ppid=GetP(id);
            int f=pskill(id);
            if (f==illegal_parameter_value2 || f==illegal_parameter_value) {getchar();getchar();goto next;}
                else printf("成功:已终止PID %d (属于 PID %d 子进程)的进程;\nSuccessful to terminate PID %d(the child process of PID %d)\n",id,ppid,id,ppid);
            id=GetProcessID(a);
        }
        getchar();getchar();goto next;
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

linux下c/c++实例之四父检测子进程和信号处理

一、简介       Linux下fork创建子进程执行程序,而父进程检测子进程的执行过程并处理部分信号,当出现段错误生成core文件时被重新命名,以便能随时通过时间调试core。 二、详解 1...
  • taiyang1987912
  • taiyang1987912
  • 2015年11月06日 11:35
  • 1776

父进程等待子进程结束 waitpid wait

我们一直在强调一个概念就是进程是一个程序执行的实例,是内核在虚拟概念下创建的实体,它实例化的体现在用户态就是程序代码和代码使用的变量(存储空间),在内核态就是内核为我们每个进程所保存的数据结构(状态信...
  • yangbodong22011
  • yangbodong22011
  • 2015年11月09日 17:02
  • 2761

父子进程与父子线程退出分析

Linux下编程,线程、进程退出顺序问题纷纷扰扰,如果父进程/线程先于子进程/线程终止,系统会做什么处理呢?反之,如果子进程/线程先于父进程/线程终止,系统又会做什么处理呢?下面是我个人平时在笔记上做...
  • le119126
  • le119126
  • 2015年08月01日 11:40
  • 1392

用return和exit结束fork和vfork创建的子进程的思考

fork和vfork的差别: 1、fork是创建一个子进程,并把父进程的内存数据copy到子进程中。 vfork是创建一个子进程,并和父进程的内存数据share一起。 2、vfork是这样的工作...
  • quzhilin123
  • quzhilin123
  • 2014年12月02日 11:03
  • 1596

创建进程时指定其父进程

记录一下,以免忘记。 uses Windows, PsAPI, SysUtils; const SE_SECURITY_NAME = 'SeSecuri...
  • dbyoung
  • dbyoung
  • 2011年10月21日 08:45
  • 3335

sqlserver 死锁 查看当前进程,或死锁进程,并能自动杀掉死进程

/*--处理死锁 因为是针对死的,所以如果有死锁进程,只能查看死锁进程 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程 --*/ /*--调用示例 exec p_...
  • ly1577592799
  • ly1577592799
  • 2012年02月11日 09:13
  • 1720

用C++结束进程(恶搞你的计算机!!!!)

刚才在网上搜东西,发现了一个命令——ntsd,可以结束进程。当然我们可以编写一个程序来执行这个命令:**************************************************...
  • zzzili
  • zzzili
  • 2012年12月06日 15:26
  • 1105

【vs2015】C++ 程序运行并等待进程结束

1.VS2015 新建项目->win32 控制台应用程序 2.头文件stdafx.h // stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含...
  • greless
  • greless
  • 2016年09月21日 17:45
  • 1918

C++ 完整源码 带控制台 ,socket 进程通信,lua脚本

  • 2017年11月15日 15:32
  • 2.23MB
  • 下载

菜鸟进程调度C++

  • 2014年06月27日 20:52
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++结束进程 并能显示其父进程
举报原因:
原因补充:

(最多只允许输入30个字)