共有回帖数 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 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知