工控安全系统编程之 实现进程管理器

1.实验要求

要求:
实现进程管理器

  1. 能列出操作系统当前运行的进程
  2. 实现进程管理,如杀掉进程,输入进程名或进程ID,自动结束进程
  3. 不要求有界面,命令行窗口即可

提示:

  1. 可参考用如下系列API:
    ToolHelpAPI
    PSAPI
    Native API
    ZwQuerySystemInfo
  2. 参考taskMgr.exe

2.实验原理:
CreateToolhelp32Snapshot可以通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。说到底,可以获取系统中正在运行的进程信息,线程信息,等
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是 TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);

process32First是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄。

CloseHandle关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。

OpenProcess 函数用来打开一个已存在的进程对象,并返回进程 的句柄。
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);

TerminateProcess函数终止指定进程及其所有线程。
BOOL TerminateProcess(
HANDLE hProcess,//进程句柄
UINT uExitCode //进程终止码
);

3.源代码
#include “stdafx.h”
#include “windows.h”
#include “tlhelp32.h”
#include “stdio.h”
#include
using namespace std;

BOOL killps(DWORD ProcessId)
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
if (hProcess == NULL)
return FALSE;
if (!TerminateProcess(hProcess, 0))
return FALSE;
return TRUE;
}

void showps()
{
PROCESSENTRY32 pe32;
//在使用这个结构前,先设置它的大小
pe32.dwSize = sizeof(pe32);
//给系统内所有的进程拍个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(“CreateToolhelp32Snapshot 调用失败.\n”);
//return -1;
}
//遍历进程快照,轮流显示第一个进程的句柄
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while (bMore)
{
printf(“进程名称:%s\n”, pe32.szExeFile);
printf(“进程ID:%u\n\n”, pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap, &pe32);
}
//不要忘记清除掉snapshot对象
::CloseHandle(hProcessSnap);
}

int main(int argc, char* argv[])
{
int flag;
cout << “输入1显示进程,输入2杀掉进程” << endl;
while (cin >> flag)
{
if (flag == 1)
{
showps();
cout << “########################” << endl;
}

	if (flag == 2)
	{
		int id;
		cout << "杀掉:";
		cin >> id;
		killps(id);
	}
	cout << "输入1显示进程,输入2杀掉进程" << endl;
}

int a;
cin >> a;
return 0;

}

4.截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.注:
老师代码
#include “stdafx.h”
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include “psapi.h”
#include <TlHelp32.h>

#pragma comment(lib, “Psapi.lib”)

void main()
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
	return;

cProcesses = cbNeeded / sizeof(DWORD);
for (i = 0; i < cProcesses; i++)
{
	DWORD	dwProcessId = aProcesses[i];
	HANDLE	hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessId);
	TCHAR	szPath[MAX_PATH];
	GetModuleBaseName(hProcess, NULL, szPath, ARRAYSIZE(szPath));
	printf("%ws\n", szPath);
}

PROCESSENTRY32	pe32;
HANDLE	hSnap;

hSnap = CreateToolhelp32Snapshot(2, 0);

pe32.dwSize = sizeof(pe32);
Process32First(hSnap, &pe32);
do
{
	printf("%ws\n", pe32.szExeFile);
} while (Process32Next(hSnap, &pe32));
//return	0;

}
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值