Windows进程管理工具设计与实现要点.docx
《Windows进程管理工具设计与实现要点.docx》由会员分享,可在线阅读,更多相关《Windows进程管理工具设计与实现要点.docx(17页珍藏版)》请在冰豆网上搜索。
Windows进程管理工具设计与实现要点
Windows进程管理工具设计与实现
摘要
Windows是操作系统中使用最广泛,使用人数最多的系统,它自身带有一个任务管理器,可以对系统中的进程,任务进行管理,本课题主要模仿Windows的任务管理器,对系统中的程序、进程进行控制。
在程序的设计过程中,需要通过VC++调用一些WindowsAPI函数,从而获得程序、进程、线程模块,以及系统信息资源。
最后在WindowsXP系统上进行测试,通过开发,最终程序实现了进程管理的基本功能,能够正确实现对系统当前进程和系统资源的控制。
关键词:
管理器;线程;进程;VC++
TheDesignandImplementationoftheProcessesManagementToolforWindows
Abstract
Windowsisthemostwidelyusedintheoperatingsystem,system,bythelargestnumberofitsownwithataskmanager,isabletoprocessinthesystem,managetasks,thistopicmainlyimitatetheWindowstaskmanager,thesystemofproceduresandprocesscontrol.Intheprocessofprogramdesign,needsomeWindowsAPIfunctioncalledbyvc++,therebygainingprocedure,process,threadmodule,andsysteminformationresources.FinallytestedonWindowsXPsystem,throughthedevelopment,finallyapplicationimplementsthebasicfunctionofprocessmanagement,correctlyimplementcontrolofthesystemtothecurrentprocessandsystemresources.
Keywords:
TaskManager;Threads;Process;VC++
目录
1绪论1
1.1研究背景1
1.2研究意义与目的1
1.3课题的研究方法1
1.4相关知识介绍2
1.4.1进程与线程2
1.4.2VisualC++介绍3
2主要功能及设计思路4
2.1软件要实现的具体功能4
2.2软件概要设计4
3软件详细设计5
3.1窗体的设计与实现5
3.2正在运行的程序功能设计7
3.3正在运行的进程功能设计8
3.3.1进程、模块及线程信息9
3.3.2结束进程子模块的设计11
3.3.3删除文件子模块的设计11
3.4系统信息查看功能设计11
3.4.1画刷绘制CPU和内存使用率11
3.4.2其他信息显示12
3.4.3系统信息显示12
4软件测试13
4.1测试环境配置13
4.2对比测试13
4.3结果验证13
结论16
参考文献17
致谢18
1绪论
1.1研究背景
Windows任务管理器是用来管理windows系统当前正在运行程序的具体情况的,通过该管理器,可以轻松管理系统中的运行程序。
本设计的主要目的就是为了能够很好的运行VC++的所学知识(包括以前所学的一些关于计算机操作系统、进程、计算机安全、编程等知识)进行实践的能力,本课题就是模拟制作一个Windows任务管理器,使其能够成功的对任务、进程进行查看、结束等操作。
1.2研究意义与目的
本课题主要研究如何开发一个windows进程管理器,系统应该具有的功能应该满足一般进程管理的需要,最大限度的模仿Windows任务管理器。
本课题对进程管理进行详细的设计,分别能够实现管理正在运行的程序,正在运行的进程和线程,还可以对系统信息进行查看。
正在运行的程序,主要包括:
结束任务、新建任务、切换到新程序以及刷新程序列表。
正在运行程序包括:
进程列表查看,结束进程、删除文件、导出列表以及刷新进程,另外还可以查看某一个进程的信息,进程包含哪些线程。
系统信息查看包括:
系统信息,物理内存,虚拟内存,页文件以及cup和内存的使用率表示图。
用过电脑的人大都使用过任务管理器之类的软件,它们都能够对进程进行管理。
本设计的主要目的就是为了能够很好的运行VC++的所学知识(包括以前所学的一些关于计算机操作系统、进程、计算机安全、编程等知识)进行实践的能力;既能够锻炼自身的实际动手能力,还可以把课题当做项目一样进行开发,了解一下项目的开发流程与经历,这对于以后工作能力的培养更是具有相当重要的意义。
1.3课题的研究方法
研究方法上,笔者查阅了近十年来与进程管理相关的资料,并且仔细研读了操作系统和VisualC++6.0的相关书籍,进行仔细琢磨、推敲、分析并且加以总结,最终为本论文提供了科学的理论基础。
接着向指导老师不断询问、沟通和访谈,在论文构思和结构上面进行详细交流。
1.4相关知识介绍
1.4.1进程与线程
(1)进程
进程是应用程序在计算机上的一次执行活动,他是一个正在运行的程序的实例,由操作系统用来管理进程的内核对象和地址空间组成。
内核对象是系统用来存放进程统计信息的地方。
而地址空间则包含了所有的可执行模块或动态链接库(DLL)模块的代码和数据。
同时,他还可以把内存空间进行动态分配。
比如说:
线程分配空间。
进程的执行过程是动态的,它对着程序的运行,动态地被创建,然后被调度执行,最后会消亡。
它是计算机中资源分配的基本单位,同时也是占用处理器的调度单位,一个进程拥有完整的虚拟地址空间。
了解进程,不得不说的就是进程的生命周期,进程的生命周期至少包含三种基本状态,分别是:
执行、等待与就绪。
其中,三种状态能够相互转换,他的基本原理是,位于就绪状态的进程已经获得了处理器以外的其它系统资源,所以只需要得到处理器的调度,就能马上转变为执行状态。
位于执行状态的进程由于时间片到期而放弃处理器转换到了就绪状态,因为要等待某个事件发生而放弃处理器则转换为等待状态。
位于等待状态的进程由于等待的事件发生从而被唤醒,则转换为就绪状态,如图1。
图1进程状态转换
(2)线程
了解完进程,就下来就了解一下线程,所谓线程就是进程中的基本调度单位,线程不仅可以由操作系统内核控制,同时还可以由用户的应用程序进行控制。
和进程一样,线程也具有三种基本状态:
执行、就绪和阻塞。
在这三种基本状态下,有五种基本操作对线程的状态进行转换。
这五种基本分别操作是:
1、派生:
线程是在进程内派生出来的,它能用由进程进行派生,也可由线程进行派生。
2、阻塞:
如果线程在执行的过程中需要等待一个特定的事件发生,则他会被阻塞。
3、激活:
如果阻塞线程的事件终于发生了,则该线程就会被激活并且进入就绪队列。
4、调度:
选择一个就绪线程进入执行状态。
5、结束:
一个线程执行结束,它的寄存器上下文以及堆栈内容等将会被统统释放掉。
(3)进程与线程的关系
进程是应用程序在计算机上的一次执行活动,他是一个正在运行的程序的实例。
如果系统要让一个进程完成某项操作,那么进程就会拥有一个在其自身环境中运行的线程,这个线程负责执行包含在进程地址空间中的代码。
当操作系统创建一个进程后,系统会自动为其创建第一个线程,这就是主线程。
接着,该线程还能够继续创建其他的线程,以此类推,就能过创建更多的线程。
所以对于操作系统的设计,能够归结为三种:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
1.4.2VisualC++介绍
MircrosoftVisualC++6.0(通常简称VC++6.0),属于微软可视化编程套件VisualStudio98中的重要组成部分。
这套功能强大的Windows应用程序开发系统是由MicrosoftC/C++演化而来的。
从MicrosoftC/C++8.0开始改称为VisualC++,以至发展到今天的VisualC++6.0。
由于VC是微软的产品,Visual平台是当前Windows应用开发系统中与Windows平台本身支持最彻底的开发平台。
VisualC++6.0包含了支持Windows95.WindowsNT4.0以及Windows98的Win32SDK文档,即人们可以在VisualC++环境下使用WindowsSDK的SDK文档提供的API来进行Windows应用程序的开发。
VisualC++6.0采用的是32位编程方式,也就是说其生成的程序是在像Windows95WindowsNT4.0和Windows98等这样的32位操作系统下运行的。
VC++6.0继承了其以前版本的最主要的技术。
它提供了一系列可视化编程的工具,如AppWizard和ClassWizard等。
它们使Windows内在的复杂的运行机制,通过微软基础类库MFC,使Windows编程更为简单易学。
2主要功能及设计思路
2.1软件要实现的具体功能
课题要求实现的主要功能包括以下三个方面的内容:
(1)正在运行的程序,主要包括:
结束任务、新建任务、切换到新程序以及刷新程序列表。
(2)正在运行程序包括:
进程列表查看,结束进程、删除文件、导出列表以及刷新进程,另外还可以查看某一个进程的信息,进程包含哪些线程。
(3)系统信息查看包括:
系统信息,物理内存,虚拟内存,页文件以及cup和内存的使用率表示图。
2.2软件概要设计
在IDE编辑环境中创建一个基于对话框的MFC应用程序,在Task主窗口上添加一个标签控件,并且在上面加入三个页面,分别是:
正在运行程序、正在运行进程和系统信息查看。
正在运行程序页面显示当前正在运行的任务(可见且有窗口标题),用列表控件进行显示,并能够对任务进行操作,如:
结束任务、新建任务、切换到新程序以及刷新程序列表。
正在运行进程页面显示当前系统正在运行的进程及相关的模块,线程等,用列表控件进行显示,并且可以实现终止进程、进程列表保存到文件等操作。
系统信息查看页面显示物理内存、虚拟内存和页文件等详细使用情况,CPU、内存的使用率,并且让他们以图形的方式显示出来,并用列表控件清楚的显示出系统当前信息。
3软件详细设计
制作完的程序如图2。
在主界面上面设置了一个标签控件,并创建了正在运行程序、正在运行进程和系统信息查看三个页面,标签控件用于选择并显示各自对应的页面。
三个页面分别用于显示当前运行的应用程序、正在运行的进程及进程模块、具体系统信息情况。
图2程序运行主界面
3.1窗体的设计与实现
所设计的程序是基于MFC对话框的应用程序。
所以先要创建一个基于MFC的应用程序PcsMgr,并且在主对话框类PcsMgrDlg中添加标签控件用来放置正在运行程序、正在运行进程和系统信息查看这三个页面,如图3。
图3标签控件
(1)子对话框的显示
子对话框的显示与切换,是通过标签控件完成的。
当用户点击标签控件上的每一项时,分别显示对应页面的相关信息。
要显示三个子对话框,需要添加三个对话框到工程中,并将Style属性设为Child,Board设为None,取消标题栏。
再分别创建三个对话框的类CTask,CProcess,CChart,并定义了要实现的三个变量:
CTaskm_Task;//任务
CProcessm_Process;//进程
CChartm_Chart;//图表
并定义一个图像列表变量用于存放标签图标:
CImageListm_ImageList;
接下来就创建子窗口:
m_Task.Create(IDD_TASK,m_Tab.GetActiveWindow());
m_Process.Create(IDD_PROCESS,m_Tab.GetActiveWindow());
m_Chart.Create(IDD_CHART,m_Tab.GetActiveWindow());
(2)把创建好的进程管理器程序的权限提升。
提升后才能对各个任务进行管理和控制。
具体的方法如下:
第一步:
使用GetCurrentProcess()函数取得当前进程的句柄;
第二步:
使用OpenProcessToken()打开当前进程的访问令牌;
第三步:
使用LookupPrivilegeValue()函数取得想提升的权限的值;
第四步:
使用AdjustTokenPrivileges()函数给当前进程的访问令牌增加权限。
具体添加在在CPcsMgrApp类的InitInstance()函数中。
到此为止,程序的权限就已经被提升了。
(3)实现菜单
关机、注销、重起这些菜单命令都是通过调用Windows的API函数ExitWindowsEx()完成的。
这里不做过多描述。
3.2正在运行的程序功能设计
该页面实现了当前系统中所有的运行程序,并且能够对运行程序进行控制,比如结束任务、创建新任务、切换到新程序等。
(1)显示任务信息
正在运行程序是由列表控件进行显示的,如图4。
图4正在运行程序列表
要显示任务信息,首先要定义一个结构体类型用于存放任务的相关信息:
接着要获取窗口标题,使用API标准函数GetWindowText():
chartemp[MAX_PATH];
GetWindowText(hwnd,temp,sizeof(temp))
获取进程及线程ID:
TID=GetWindowThreadProcessId(hwnd,&PID);
确定运行状态是利用SendMessageTimeout向窗口发送消息而取得:
if(SendMessageTimeout(hwnd,WM_SYSCOMMAND,NULL,NULL,SMTO_ABORTIFHUNG,1000,NULL))
strRunState="正在运行";
else
strRunState="没有响应";
(2)结束任务
调用SendMessageTimeout()函数向要指定关闭的窗口发送程序关闭的消息,如果程序无响应,就需要调用TerminateProcess()函数进行强行终止。
3.3正在运行的进程功能设计
主要实现进程的查看和管理,如结束进程,删除文件,导出列表至网页文件等功能。
和显示正在运行程序采用同样的方法,添加两个列表控件,分别显示当前系统中所有的进程以及每一个进程包含的模块信息,如图5。
图5正在运行进程列表页面
3.3.1进程、模块及线程信息
(1)进程
每一个进程都包括各自的信息,这些信息有进程图标,进程名、ID、CPU占有率、内存使用大小、优先级别、线程数、父进程ID和进程路径等信息,如图6。
图6进程信息
通过调用ToolHelpAPI函数能够枚举所有正在运行的进程同时取得进程的路径,在这个功能中,主要用到了ToolHelpAPI中的函数,分别是:
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);用于创建系统进程快照,通过它能够取得系统中的所有进程的信息。
Process32First(hProcessSnap,&pe32);用于获取快照中第一个进程的信息。
BOOLWINAPIProcess32Next(HANDLEhSnapshot,LPPROCESSENTRY32lppe);用于取得快照中下一个进程信息。
进程CPU使用率是通过操作系统提供的性能监视器获得的。
部分主要代码如下:
pdhStatus=PdhCollectQueryData(m_hQuery);//收集数据
pdhStatus=PdhGetFormattedCounterValue(
hCounter,PDH_FMT_LONG,&dwctrType,&fmtValue);//得到格式化数据,fmtValue就是需要得到的CPU使用率数据。
进程的内存占用率需要用到GetProcessMemoryInfo()函数:
GETPROCESSMEMORYINFOGetProcessMemoryInfo;,再取得内存使用数:
dwMemoryUse=pmc.WorkingSetSize;//内存使用大小
pmc则是返回进程的内存使用信息,它是定义的一个PROCESS_MEMORY_COUNTERS结构。
(2)模块和线程
模块信息还是需要通过ToolHelpAPI函数实现。
用到的有:
CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPID)这个和显示进程信息中作用一样。
Module32First(hModuleSnap,&me32);用于获取特定进程的第一个模块信息。
Module32Next(hModuleSnap,&me32)用于获取指定进程的下一个模块信息。
线程信息包括线程ID和线程优先级,也是通过ToolHelpAPI函数取得。
具体不做多余描述
3.3.2结束进程子模块的设计
进程除了正常的退出方式外,有时候还需要通过进程管理器进行强制退出。
强制退出可以使用ExitProcess()函数,该函数可以在进程中的某个线程中使用,并且能够立即终止本进程的运行。
ExitProcess()函数只能强制执行自身进程的退出,如果要在一个进程中强制结束其他进程,就要使用TerminateProcess()函数来实现。
使用TerminateProcess()后,被终止的进程无法得到任何关于程序退出的通知。
因此,只有在其他方法无法迫使进程结束时才考虑使用TerminateProcess()函数。
3.3.3删除文件子模块的设计
对于病毒或木马程序,不仅需要把它们的进程结束了,还需要将其所对应的文件统统删除,让他无法再次运行。
改功能需要用OpenProcess()函数将进程打开,用FindFirstFile()函数找到文件,然后用TerminateProcess()函数结束该进程,最后删除该进程对应的文件。
3.4系统信息查看功能设计
系统信息查看页面主要显示CPU的使用率以及内存的使用率,并且以图形的方式展示出来,以及显示系统的当前信息,如系统名、计算机名等。
3.4.1画刷绘制CPU和内存使用率
为了计算系统中CPU的使用率,需要使用下面的公式:
CurrentValue=NewValue–OldValue;
CurrentCpuIdle=IdleTime/SystemTime;
CurrentCpuUsage%=100-(CurrentCpuIdle*100)/NumberOfProcessors。
其中CurrentValue指的是处理器数量值;CurrentCpuIdle指的是CPU的空闲时间;CurrentCpuUsage%指的是CPU的使用率。
得到这些值后,使用VC++的画刷将其绘制出来,如图7。
图7CPU使用率
绘制图形也是通过位图绘制函数进行绘制,方法和绘制CPU使用率图一样。
内存使用率图如图8。
图8内存使用率
3.4.2其他信息显示
物理内存、虚拟内存和页文件的使用情况都是通过GlobalMemoryStatus()函数得到的。
3.4.3系统信息显示
系统信息包括当前操作系统名、用户名、计算机名等。
通过GetVersionEx()函数就可以操作系统名。
调用GetUserName()函数能搞得到计算机名。
获取计算机名还有其他的方式,就是通过GetComputerName()函数。
UserName=Temp;//用户名
GetComputerName(lpszSystemInfo,&cchBuff);//计算机名
4软件测试
4.1测试环境配置
系统配置:
WindowsXP;
硬件配置:
CPU:
AMDAthlon(tm)xp2500+1.8GHz以上
内存:
512M以上
硬盘:
SATA80G以上
4.2对比测试
将程序取得的任务、进程以及资源使用情况获取到的信息与Windows任务管理器中的信息进行对比,验证程序的正确性。
4.3结果验证
程序能够在WindowsXP系统上能正常运行。
正在运行的程序能够进行结束任务、新建任务、切换到新程序以及刷新程序列表。
正在运行程序能够进行进程列表查看,结束进程、删除文件、导出列表以及刷新进程,另外还可以查看某一个进程的信息,进程包含哪些线程。
系统信息查看能够查看系统信息,物理内存,虚拟内存,页文件以及cup和内存的使用率表示图。
将获取的进程信息与Windows任务管理器中的信息进行对比,结果一致,如图9,10。
图9程序获取的进程信息
图10Windows任务管理器进程信息
系统资源使用情况与Window任务管理器取得的信息进行比较,如图11,结果一致。
图11资源使用情况
结论
通过本课题的研究和制作,在VC++的IDE环境中进行编程,只知道理论知识是远远不够的,还需要对IDE进行不断熟悉,另外系统提供给我们接口函数,需要通过MSDN帮助进行详细了解和熟悉,才能够正确的使用,通过本课题的开发,发现软件开发并不是一件容易的事情,需要逻辑性强,思路明确。
另外,注释是很重要的,没有注释,代码是毫无价值的。
Windows进程管理工具能够显示正在运行的程序,正在运行进程、系统信息查看功能,可以正常结束程序、结束进程,并能以图像的方式显示CPU、内存使用率,基本完成了最初课题的定位。
不过在一些模块和Dll的调用上,还有些不熟练,今后还需要继续努力学习。
参考文献
[1]汤子瀛,哲风屏,汤小丹.计算机操作系统[M].西安:
西安电子科大出版社,2005。
[2](美)StevenHolzner.VisualC++6.0轻松进阶[M].北京:
电子工业出版社,2005。
[3](美)BenEzzell.Windows环境下VC++编程[M].北京:
电子工业出版社,2005。
[4](美)JeffreyRichter.Windows核心编程[M].北京:
机械工业出版社,2005。
[5]齐舒创作室.Windows2000高级变成技巧[M].北京:
清华大学出版社,2000。
[6](美)JohnE.Swanke.VisualC++MFC编程实例[M].北京:
机械工业出版社,2005。
[7](美)DavidJ.Kruglinski.VC++技术内幕[M].北京:
清华大学出版社,2002。
[8]张海棠.VisualC++6.0编程指南[M].北京:
航空工业出版社,2002。
致谢
本研究及学位论文是在我的导师老师的亲切关怀和悉心指导下完成的。
他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。
老师不仅在进程管理、Windows编程给我以精心指导,同时还在思想、生活上给我以无微不至的关怀,在此谨向指导老师