版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lily960427/article/details/72612342
#include <windows.h>
#include <tlhelp32.h> // 声明快照函数的头文件
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
//用来存放快照进程信息的一个结构体。(存放进程信息和调用成员输出进程信息)
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
PROCESSENTRY32 now;
// 给系统内的所有进程拍一个快照
// CreateToolhelp32Snapshot可以通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。
// TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败! ");
return -1;
}
// 遍历进程快照,轮流显示每个进程的信息
//用来 Process32First指向第一个进程信息,并将进程信息抽取到PROCESSENTRY32-pe32中。
BOOL bMore = Process32First(hProcessSnap, &pe32);
while(bMore)
{
printf(" 进程ID号:%10u 进程名称:%20s 线程数目: %d \n ", pe32.th32ProcessID,pe32.szExeFile,pe32.cntThreads);
bMore = Process32Next(hProcessSnap, &pe32); //用Process32Next指向下一条进程信息。
}
int x;
printf("当前进程信息已经打印完毕,请选择想要的功能:\n");
printf(" 1、删除某个指定的进程 2、查询某进程是否存在 3、显示某进程的地址\n");
scanf("%d",&x);
if(x==1){
printf("请输入想关闭的进程的PID\n");
scanf("%u",&now.th32ProcessID);//now.th32parentprocessid存放选择的进程号
system("cls");
printf("您想关闭的进程信息如下:\n");
BOOL aMore = Process32First(hProcessSnap, &pe32);
while(aMore)
{
if(pe32.th32ProcessID == now.th32ProcessID){
printf(" 进程ID号:%10u 进程名称:%30s \n ", pe32.th32ProcessID,pe32.szExeFile);
break;
}
else
{
aMore = Process32Next(hProcessSnap, &pe32);
}
}
HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,pe32.th32ProcessID);
if(hProcess==NULL)
return FALSE;
if(!TerminateProcess(hProcess,0))
return FALSE;
printf("\n您的进程已经关闭成功\n");
}
else if(x==2){
printf("请输入您想查询是否存在的进程的名字 .exe\n");
scanf("%s",&now.szExeFile);//now.th32parentprocessid存放选择的进程号
BOOL cMore = Process32First(hProcessSnap, &pe32);
int a=0;
while(cMore)
{
if(strcmp(pe32.szExeFile,now.szExeFile) ==0 ){
printf(" 存在该进程 且PID =%u ", pe32.th32ProcessID);
a=0;
break;
}
else
{
a++;
cMore = Process32Next(hProcessSnap, &pe32);
}
}
if(a!=0)
{
printf("该进程不存在\n");
}
}
else if(x==3){
printf("请输入需要查看地址的进程名字 .exe\n");
scanf("%s",&now.szExeFile);
BOOL dMore = Process32First(hProcessSnap, &pe32);
while(dMore)
{
if(strcmp(pe32.szExeFile,now.szExeFile) ==0 ){
break;
}
else
{
dMore = Process32Next(hProcessSnap, &pe32);
}
}
MODULEENTRY32 pes;
HANDLE hfilename = NULL ;
hfilename = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE , pe32.th32ProcessID );
if (hfilename == NULL )
{
printf("文件名字访问失败!");
}
BOOL i = Module32First(hfilename , &pes);
printf("文件路径: %s \n" , pes.szExePath);
//system(pes.szExePath);
}
else{
printf("功能还在完善\n");
}
return 0;
}