签到

05月06日
尚未签到

共有回帖数 0

    李小主任

    等级:
    本来不想发这个帖子的,因为这个程序主要是WindowsAPI的应用,不是你们熟悉的DOS编程,不是TurboC的函数不是什么很精辟的算法更不是什么什么的。
    但是自己急于想的到大家的评价和认同,就发了这个帖子,希望不浪费大家的时间。再说了,这是用C写的。

    说明:
    (1)程序的名字叫PK.exe,英文名就是Process Killer,中文叫进程杀手小王子,花名叫进程杀手,小名叫杀手。
    (2)用法:PK.exe [-p/-n] str_1 [str_2] [str_3]....[str_n]
    参数-p:按进程ID杀进程。
    参数-n:按进程名字杀进程,是默认的。
    参数str_n:你要杀的进程(不分大小写的)。
    例如:PK qq.exe Iexplore maxthon 这个命令将把QQ,你的IE浏览器和你的maxthon浏览器这3进程杀死(请试试看)。
    参数-h:帮助命令。
    参数-r:刷新进程列表。
    参数-a:关于这个程序。
    (3)没什么很重要的了。
    (4)这个在TC下是通不过的,我在xp下用dev-c++编译通过。
    (5)大家看不懂完全没有关系,这不能说明什么,(但是如果你是学Windows编程的就很有关系了)我只是想让大家用一用评价一下。
    (6)程序有1个主文件和2个头文件。
    (7)实在没什么很重要的了,那我就发了��
    /*下面的保存为PK.c*/  
    #includestdio.h
    #includeconio.h
    #include "Kill_in_DOS.h"

    /*函数声明*/
    /*扫描系统进程返回句柄*/
    ERRORCODE Krefresh(HANDLE *hProcessSnap);
    /*处理 main(int argc,char *argv[])的参数
    nLong 就是参数的长度,argv是字符数组首地址,从第nBegin个字符开始,hProcessSnap是句柄*/  
    ERRORCODE KDoWithParameterInDOS(int nLong, char **argv, int nBegin, HANDLE hProcessSnap);
    /*处理错误*/  
    void KDoWithError(ERRORCODE errorCode);
    /*通过进程名字杀进程*/  
    ERRORCODE KKillByName(HANDLE hProcessSnap, PROCESSENTRY32 pe32, char *szStr);
    /*通过进程ID杀进程*/  
    ERRORCODE KKillByPID(HANDLE hProcessSnap, PROCESSENTRY32 pe32, DWORD dwProcessID);



    /*0===]============主函数只有这么一点 */
    int main(int argc,char *argv[])
    {
    ERRORCODE errorCode;
    HANDLE hProcessSnap;

    KDoWithError(Krefresh(&hProcessSnap));

    KDoWithError(KDoWithParameterInDOS(argc,argv,1,hProcessSnap));

    CloseHandle(hProcessSnap);
    return 0;
    }

    /*0===]============处理 main(int argc, char *argv[])的参数 */
    ERRORCODE KDoWithParameterInDOS(int nLong, char **argv, int nBegin, HANDLE hProcessSnap)
    {
    int i;
    int nRank = nBegin; /*把开始的位置赋值给nRank*/  
    int nModeOfKill = K_NAME;/*杀进程的方式,默认是以进程名字杀进程*/  
    DWORD dwPID;
    ERRORCODE errorCode = TRUE;
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);

    errorCode = KDoWithaheadParameter(nLong, argv, &nRank, &nModeOfKill);
    if (errorCode==IMMEDIATELY_RETURN) return TRUE;

    if (errorCode==TRUE)
    {
    if (nModeOfKill==K_NAME)
    for (i=nRank, nRank=1; i=nLong-1;i++)
    {
    printf(""%s"n",argv);
    errorCode = KKillByName(hProcessSnap, pe32, argv);
    if (errorCode!=TRUE) errorCode=(++nRank);
    }
    if (nModeOfKill==K_PID)
    for (i=nRank,nRank=1; i=nLong-1;i++)
    {
    errorCode = KCharToNum(argv, &dwPID);
    if (errorCode!=TRUE) errorCode=(++nRank);
    else
    {
    errorCode = KKillByPID(hProcessSnap, pe32, dwPID);
    if (errorCode!=TRUE) errorCode=(++nRank);
    }
    }
    return errorCode;

    }
    else return errorCode;
    }


    /*把这个保存为Kill_in_DOS.h*/
    #includewindows.h
    #includestdio.h
    #includeconio.h
    #include "KFunction.h"

    /*接口函数  
    void KDoWithError(ERRORCODE errorCode);
    ERRORCODE KDoWithaheadParameter(int nLong,char **argv,int *nRank,int *nModeOfKill);*/

    /*辅助函数 */
    ERRORCODE KPrintProcess();
    ERRORCODE KPrintHelp();
    ERRORCODE KPrintInfo();


    ERRORCODE KDoWithaheadParameter(int nLong,
    char **argv,
    int *nRank,
    int *nModeOfKill)
    {
    while(*nRank=nLong)
    {

    if (argv[*nRank]==NULL && (*nRank)==1) {KPrintHelp();return IMMEDIATELY_RETURN;}
     
    else if (KIfEqualStr(argv[(*nRank)],"-a")==TRUE && (*nRank)==1)
    {KPrintInfo();return IMMEDIATELY_RETURN;}
     
    else if (KIfEqualStr(argv[(*nRank)],"-h")==TRUE && (*nRank)==1)
    {KPrintHelp();return IMMEDIATELY_RETURN;}
    else if (KIfEqualStr(argv[(*nRank)],"-r")==TRUE && (*nRank)==1)
    {if (KPrintProcess()!=TRUE)return PROCESS_SNAP_FAILED;
    else return IMMEDIATELY_RETURN;}
     
    else if (KIfEqualStr(argv[(*nRank)],"-p")==TRUE && (*nRank)==1)
    {
    if ((*nRank)+2nLong) return SHORT_OF_PARAMETER;
    *nModeOfKill=K_PID;
    (*nRank)++;
    continue;
    }
     
    else if (KIfEqualStr(argv[(*nRank)],"-n")==TRUE && (*nRank)==1)
    {
    if ((*nRank)+2nLong) return SHORT_OF_PARAMETER;
    *nModeOfKill=K_NAME;
    (*nRank)++;
    continue;
    }
    else return TRUE;
    }
     
    return TRUE;
    }



    ERRORCODE KPrintProcess()
    {
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     
     
    if (hProcessSnap==INVALID_HANDLE_VALUE)
    {

    return PROCESS_SNAP_FAILED;
    }
     
    BOOL bMore = Process32First(hProcessSnap,&pe32);
    while (bMore)
    {
    printf("Process Name: %sn", pe32.szExeFile);
    printf("Process ID : %unn", pe32.th32ProcessID);
    bMore = Process32Next(hProcessSnap, &pe32);
    }
     
    CloseHandle(hProcessSnap);
     
    getch();
    return TRUE;
    }

    ERRORCODE KPrintHelp()
    {
    printf("nPK.exe [-n/-p] [-f] [file path] [-t] [time] str_1 [str_2] [str_3] ... [str_n]nn");
    printf(" -n : Kill processes by name,it's default.n" );
    printf(" -p : Kill processes by PID.n" );
    printf(" str_n : they are the processes which you want to KILL! You must set one at least.n");
    printf("nHere are other parameters :n");
    printf(" -h : To have a Help.n");
    printf(" -a : About this software.n");
    printf(" -r : Refresh system process.n");
    getch();
    return IMMEDIATELY_RETURN;
    }

    ERRORCODE KPrintInfo()
    {
    printf("nProcess Killernn" );
    printf("Version : 1.0n" );
    printf("Made by : PTSoft PTn" );
    printf("History : v1.0 2005-07-15 12:15n" );
    printf("Statement:n" );
    printf(" This is a free software which I had spent 2 days and nightes,n" );
    printf("very painstaking but worthy. Thank you!n" );

    getch();
    return IMMEDIATELY_RETURN;
    }

    void KDoWithError(ERRORCODE errorCode)
    {
    switch (errorCode)
    {
    case NOT_NUMBER:
    printf("time is not right.n");
    case SHORT_OF_PARAMETER:
    printf("No enough parameter.n");
    break;
    case PROCESS_SNAP_FAILED:
    printf("System Process snapshot is unsuccessfuln");
    getch();exit(0);
    break;
    case TRUE:
    break;
    default:
    printf("%d processes could not been killedn",errorCode-1);
    break;
    }
    }

    /*把这个保存为 KFunction.h */
    #includewindows.h
    #includetlhelp32.h

    #define ERRORCODE int
    #define UNABLE_TO_KILL -1
    #define NOT_NUMBER -2
    #define UNKNOWN_PROCESS -3
    #define UNKNOWN_FILE -4
    #define SHORT_OF_PARAMETER -5
    #define PROCESS_SNAP_FAILED -6
    #define IMMEDIATELY_RETURN -7

    #define K_NAME 2
    #define K_PID 3
    /* 接口函数
    ERRORCODE Krefresh(HANDLE *hProcessSnap);
    ERRORCODE KKillByName(HANDLE hProcessSnap, PROCESSENTRY32 pe32, char *szStr);
    ERRORCODE KKillByPID(HANDLE hProcessSnap, PROCESSENTRY32 pe32, DWORD dwProcessID);*/


    /* 辅助函数*/
    BOOL KTerminateProcessID(DWORD dwID);
    BOOL KIfequalStrAndProcess(char *szStr ,char *szProcess);
    BOOL KIfEqualStr(char *szStr1, char *szStr2);
    ERRORCODE KCharToNum(char * szStr,DWORD *dwPID);


    ERRORCODE KKillByName(HANDLE hProcessSnap, PROCESSENTRY32 pe32, char *szStr)
    {
    BOOL bMore = Process32First(hProcessSnap,&pe32);
    while (bMore)
    {
    if (KIfequalStrAndProcess(szStr, pe32.szExeFile)==TRUE)
    {
    if(KTerminateProcessID(pe32.th32ProcessID)==FALSE) return UNABLE_TO_KILL;
    else return TRUE;
    }
    bMore = Process32Next(hProcessSnap, &pe32);
    }

    return UNKNOWN_PROCESS;
    }


    ERRORCODE KKillByPID(HANDLE hProcessSnap, PROCESSENTRY32 pe32, DWORD dwProcessID)
    {
    BOOL bMore = Process32First(hProcessSnap,&pe32);
    while (bMore)
    {
    if (dwProcessID==pe32.th32ProcessID)
    {
    if(KTerminateProcessID(pe32.th32ProcessID)==FALSE) return UNABLE_TO_KILL;  
    else return TRUE;
    }
    bMore = Process32Next(hProcessSnap, &pe32);
    }
     
    return UNKNOWN_PROCESS;
    }

    BOOL KTerminateProcessID(DWORD dwID)
    {
    BOOL bRet = FALSE;
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
    if (hProcess!=NULL)
    {
    bRet = TerminateProcess(hProcess, 0);
    }
    CloseHandle(hProcess);
    return bRet;
    }
    ERRORCODE Krefresh(HANDLE *hProcessSnap)
    {
    *hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (*hProcessSnap==INVALID_HANDLE_VALUE)
    {
    return PROCESS_SNAP_FAILED;
    }
    else return TRUE;
    }

    ERRORCODE KCharToNum(char * szStr,DWORD *dwPID)
    {
    int i = 0;
    DWORD dwSuccReturn = 0;
    DWORD dwFailRegPID = *dwPID;
     
    while( (szStr=48 && szStr=57) )
    { if (i=15) dwSuccReturn = dwSuccReturn*10+(szStr[i++]-48); }
     
    if ( szStr=='' || szStr=='n' )
    {*dwPID=dwSuccReturn;return TRUE;}
    else
    {*dwPID = dwFailRegPID;return FALSE;}
    }

    BOOL KIfequalStrAndProcess(char *szStr ,char *szProcess)
    {
    int i;
    if (szStr==NULL && szProcess==NULL) return FALSE;
    for (i=0; ;i++)
    {
    if (szStr=='' && (szProcess=='.' || szProcess=='')) return TRUE;
    if (szStr==szProcess) continue;
    if (((szStr=65 && szStr=90) || (szStr=97 && szStr=122)) &&
    ((szProcess=65 && szProcess=90) || (szProcess=97 && szProcess=122)))
    {if (szStr-32==szProcess || szStr==szProcess-32) continue;
    else return FALSE;}
    else return FALSE;
    }
    }
    BOOL KIfEqualStr(char *szStr1, char *szStr2)
    {
    int i;
    if (szStr1==NULL && szStr2==NULL) return FALSE;
    for (i=0; ;i++)
    {
     
    if (szStr1=='' && szStr2=='') return TRUE;
    if (szStr1==szStr2) continue;
    if (((szStr1=65 && szStr1=90) || (szStr1=97 && szStr1=122)) &&
    ((szStr2=65 && szStr2=90) || (szStr2=97 && szStr2=122)))
    {if (szStr1-32==szStr2 || szStr1==szStr2-32) continue;
    else return FALSE;}
    else return FALSE;
    }
    }


    完毕,收工!
    等着大家的回复…��

    楼主 2016-03-16 12:37 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知