




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简述简述 windows 进程管理工具的原理和实现进程管理工具的原理和实现 摘摘 要要 windows 自带的任务管理器存在功能上的缺陷,比如不能查看进程的模块 及线程信息。课题设计就是模拟 windows 任务管理器,开发一个功能更完善的 windows 进程管理软件。主要设计的是一个基于对话框的 vc+程序,在主对 话框上面放置了一个标签控件,并创建了任务、进程和系统信息三个页面,标 签控件用于选择并显示页面。三个页面分别用于显示当前运行的窗口程序、进 程及进程模块、系统资源使用情况。程序还实现了结束任务、切换任务、终止 进程等对进程管理的基本功能。在程序的设计过程中,通过调用 windo
2、ws api 函数而获得任务、进程、线程模块,以及系统资源使用情况等信息。最后在 windows xp 系统上进行测试,实现了进程管理的基本功能,为用户了解当前进 程及系统资源使用情况提供了很好的参考。 关键词关键词:任务管理器;线程;进程;api the design and implementation of the processes management tool for windows abstract there are some defects in the task manager built-in windows. for example, it doesnt show us
3、 the information of process modules and threads. the work of my design is to follow the windows task manager and develop the software which has improved function for managing process. this software is designed to be a program based on a dialog write in the vc+. there is a label control in the main d
4、ialog box, and there are three pages for task, process and system information. the label control is used to select the page and to show it. the three pages are used respectively to display the information of task runs at current, process and process modules, the utilization of system resources. this
5、 software also realized some basic function for managing process, such as ending the task, switching the task, terminating the process and so on. during the process of my program, the information for tasks, process, thread modules and the utilization of system resource is got by calling the windows
6、api functions. finally i test it on the windows xp system. and it achieves the basic function for managing process. it provides a good reference for users to view the process at current and the utilization of system resources. key words: task manager; threads; process; api 目目 录录 论文总页数:25 页 1引言.1 1.1
7、课题背景.1 1.2国内外研究现状.1 1.3课题研究的意义.1 1.4课题的研究方法.1 1.5进程与线程简介.1 1.5.1进程简介 .1 1.5.2线程简介 .3 1.5.3进程与线程的关系 .3 1.5.4windows 自带的任务管理器分析.4 2主要功能及设计思路.4 2.1主要功能.4 2.2设计思路.5 3详细设计.5 3.1主框架的实现.5 3.1.1子对话框的显示 .6 3.1.2实现菜单 .7 3.1.3提升程序权限 .8 3.2任务列表页面设计.8 3.2.1显示任务信息 .8 3.2.2结束任务 .9 3.2.3切换任务 .10 3.3进程列表页面设计.10 3.3.
8、1显示进程信息 .11 3.3.2显示模块及线程信息 .13 3.3.3结束进程 .15 3.3.4删除文件 .16 3.3.5保存进程信息到文件 .17 3.4系统性能页面设计.17 3.4.1绘制 cpu 使用率图 .17 3.4.2绘制内存使用率图 .19 3.4.3其他性能显示 .19 3.4.4系统信息显示 .20 4测试结果.21 4.1测试环境.21 4.2测试方法.21 4.3测试结果.21 结 论.23 参考文献.23 1 1引言引言 1.11.1 课题背景课题背景 随着计算机的广泛应用,很多的软件被安装在计算机上,使计算机运行的 程序进程越来越多;很多的程序在运行时常出现异
9、常(如不能正常结束、占用 大量资源、发现异常的进程等) 。这些现象给我们的计算机使用及管理带来很多 的不便。为了给计算机上运行的程序进行很好的管理,现在出现了许多的进程 管理工具软件。课题设计的目的主要是为了检查综合运用以前所学知识(包括 以前所学的一些关于计算机操作系统、进程、计算机安全、编程等知识)的能 力,模拟 windows 任务管理器,开发一个功能更完善的 windows 进程管理软件, 对任务、进程进行查看、结束等操作。 1.21.2 国内外研究现状国内外研究现状 从现状看来,windows 进程管理工具及其理论的研究,无论是国外还是国 内,技术都相当成熟。微软 windows 操
10、作系统系列(98 和 me 除外)都自带有进 程管理器,但功能不是很完善,不能查看进程模块及线程信息,而许多其他版 本的 windows 进程管理软件都具有完善的功能。 1.31.3 课题研究的意义课题研究的意义 随着计算机技术的迅猛发展,计算机的运用给人们带来了很多便利,无论 是学习,办公,还是商务。一款好的系统管理软件能大大地提高计算机的使用 和管理效率,进程管理器就能很好地对系统上运行的进程进行管理。很多人都 使用过进程管理器之类的软件,或者是 windows 自带的任务管理器,它们都能 够对进程进行管理。课题设计选择开发一个进程管理器软件,能够使自己综合 运用以前所学知识(包括操作系统
11、、编程、系统安全等知识)的能力,同时也 使自己了解当今软件编程的一些新技术;既锻炼了自己的实际动手能力,又引 导自己进行了一次模拟实际产品的开发,对于自己以后工作能力的培养具有重 要的意义。 1.41.4 课题的研究方法课题的研究方法 系统使用 vc+ 6.0 的开发环境,模拟 windows 的任务管理器进行设计与开 发。因此,课题设计应首先分析进程管理器软件的相关功能;其次,综合运用 以前所学的相关知识,广泛查阅资料(尤其是进程、线程及其相关知识) ,选择 所熟悉的开发工具进行开发;同时,在开发设计与实现中,要保存好相关的设 计文挡。 1.51.5进程与线程简介进程与线程简介 1.5.11
12、.5.1 进程简介进程简介 进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:一个 是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的 统计信息的地方。另一个是地址空间,它包含所有可执行模块或 dll 模块的代 码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。 进程是一个动态的执行过程,它动态地被创建,并被调度执行后消亡。进 程是资源分配的基本单位,也是抢占处理机的调度单位,它拥有一个完整的虚 拟地址空间。 系统中需要有描述进程存在和能够反应其变化的物理实体,即进程的静态 描述。进程的静态描述由三部份组成:进程控件块 pcb,有关程序段和该程序 段对其
13、进行操作的数据结构集。进程控制块包含了有关进程的描述信息、控制 信息以及资源信息,是进程动态特征的集中反应。系统根据 pcb 感知进程的存 在和通过 pcb 中所包含的各项变量的变化,掌握进程所处的状态以及达到控制 进程活动的目的。由于进程的 pcb 是系统感知进程的唯一实体,因此,在几乎 所有的多道操作系统中,一个进程的 pcb 结构都是全部或部分常驻内存的。 进程的程序部分描述进程所要完成的功能。而数据结构集是程序在执行时 必不可少的工作区和操作对象。这两部分是进程完成所需功能的物质基础。由 于进程的这两部分内容与控制进程的执行及完成进程功能直接有关,因而,在 大部分多道操作系统中,这两部
14、分内容存放在外存中,直到该进程执行时再调 入内存。 一个进程的生命周期可以划分为一组状态,这些状态描述了整个进程。系 统根据 pcb 结构中的状态值控制进程。 在进程的整个生命周期内,一个进程至少具有三种基本状态,它们是:执 行状态、等待状态和就绪状态。这三种状态之间可以相互换,处于就绪状态的 进程已经得到除 cpu 之外的其它资源,只要由调度得到处理机,便可立即投入 执行。处于执行状态的进程因时间片到而放弃处理机进入就绪状态,因等待某 个事件发生而放弃处理机进入等待状态。处于等待状态的进程因等待的事件发 生而被唤醒进入就绪状态,如图 1。 图 1 进程状态转换 1.5.21.5.2 线程简介
15、线程简介 线程是一个进程内的基本调度单位,它既可以由操作系统内核控制,也可 由用户程序控制。 线程是由两个部分组成的:一个是线程的内核对象,操作系统用它来对线 程实施管理。内核对象也是系统用来存放线程统计信息的地方。另一个是线程 堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量 线程只由相关的堆栈(系统栈或用户栈) 、寄存器和线程控制表 tcb 组成。 寄存器可被用来存储线程内的局部变量,但不能存储其它线程的相关变量。 线程也有三个基本状态:执行状态、就绪状态和阻塞状态。针对线程的三 种基本状态,存在五种基本操作来转换线程的状态。这五种基本操作是: 1、派生:线程在进程内派生出来,
16、它既可由进程派生,也可由线程派生。 2、阻塞:如果一个线程在执行过程中需要等待某个事件发生,则被阻塞。 3、激活:如果阻塞线程的事件发生,则该线程被激活并进入就绪队列。 4、调度:选择一个就绪线程进入执行状态。 5、结束:如果一个线程执行结束,它的寄存器上下文以及堆栈内容等将被 释放。 1.5.31.5.3 进程与线程的关系进程与线程的关系 进程是不活泼的。若要使进程完成某项操作,它必须拥有一个在它的环境 中运行的线程,该线程负责执行包含在进程的地址空间中的代码。实际上,单 个进程可能包含若干个线程,所有这些线程都“同时”执行进程地址空间中的 代码。 线程与资源分配无关,它属于某一个进程,并与
17、进程内的其它线程一起共 享进程的资源。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而 同一进程内的不同线程共享同一地址空间。为此,每个线程都有它自己的一组 cpu 寄存器和它自己的堆栈。每个进程至少拥有一个线程,来执行进程的地址 空间中的代码。如果没有线程来执行进程的地址空间中的代码,那么进程就没 有存在的理由了,系统就将自动撤消该进程和它的地址空间。 若要使所有这些线程都能运行,操作系统就要为每个线程安排一定的 cpu 时间。它通过以一种循环方式为线程提供时间片(称为量程) ,造成一种假象, 仿佛所有线程都是同时运行的一样。图 3 显示了在单个 cpu 的计算机上是如何 实现这种运行
18、方式的。如果计算机拥有多个 cpu,那么操作系统就要使用复杂 得多的算法来实现 cpu 上线程负载的平衡。 当创建一个进程时,系统会自动创建它的第一个线程,称为主线程。然后, 该线程可以创建其他的线程,而这些线程又能创建更多的线程。 1.5.41.5.4 windowswindows 自带的任务管理器分析自带的任务管理器分析 windows 任务管理器由性能、进程、应用程序三大部分组成。其实这三大 部分是有机的联系在一起的,尤其是性能和进程,性能中除了 cpu 使用率以外, 其余的数据都是由进程模块顺便取得的。 windows2000/xp 的任务管理器通过 ntquerysysteminfo
19、rmation 的调用来 获取各类信息,如 cpu 使用率,内存使用率,句柄总数,线程总数,进程总数 等等。在任务管理器中的几乎所有信息都是来自该函数。 ntquerysysteminformation 函数隶属 ntdll.dll,是一个未公开的函数。其调 用方式为: ntstatus ntquerysysteminformation(system_information_class systeminformationclass,pvoid systeminformation, ulong systeminformationlength,pulong returnlength); syste
20、minformationclass:在 system_information_class 中的枚举值之一, 声明返回信息的种类; systeminformation:指到一个要求返回信息的缓冲区,这个系统信息变量 的尺寸和结构依赖于 systeminformationclass 参数的值; systeminformationlength:systeminformation 参数指定的缓冲区尺寸; returnlength:返回值尺寸。 这个函数是一个正在修改的函数,在 windows2000 和 windows xp 中可用, 但在 windows 98 和 windows me 中不可用。而
21、且该函数调用的入口参数非常之 多,调用复杂。因此,在此次进程管理器的开发中,将使用其它方法来获取各 类信息。 2 2主要功能及设计思路主要功能及设计思路 2.12.1主要功能主要功能 设计要求实现的主要功能进程管理功能,具体包括以下内容: (1)任务管理:列出所有当前运行的窗口程序名、运行状态等信息;对它们 进行终止、切换等操作。 (2)进程管理:列出所有的 windows 进程,以及进程所在的磁盘绝对路径, 进程消耗资源状况等;列出所有进程的相关模块挂载名,模块所在磁盘的绝对 路径以及进程的线程情况,包括资源占用情况、所在内存空间地址等;除核心 进程外,所有的其他进程均可以被终止,能够尽量不
22、丢失信息,在提升本管理 进程级别后,也能够对系统的核心进程终止。 ; (3)系统性能显示:绘制 cpu、内存使用率图,以描述系统性能;列出物理 内存、虚拟内存和页文件的使用情况;显示系统当前信息,包括系统名、计算 机名和用户名等。 2.22.2设计思路设计思路 在 visual c+ 6.0 环境设计一个基于对话框的应用程序,类似于 windows 自带的任务管理器,主窗口上添加一个标签控件,加入三个页面,分别是:任 务、进程和系统性能信息。 其中,任务页面显示当前正在运行的任务(可见且有窗口标题),用列表控 件进行显示,并能够对任务进行操作,如:添加新任务,结束任务,切换任务 等。 进程页面
23、显示当前系统正在运行的进程及相关的模块,线程等,用列表控 件进行显示,并能够实行终止进程、进程列表保存到文件等操作。 系统性能页面显示物理内存、虚拟内存和页文件等详细使用情况,cpu、内 存的使用率,并绘制 cpu 使用率和内存使用率的图形,并用列表控件显示系统 当前信息(系统名、计算机名和当前用户等)。 3 3详细设计详细设计 程序主界面如图 2。 在主界面上面设置了一个标签控件,并创建了任务列表、进程列表和系统 信息三个页面,标签控件用于选择并显示页面。三个页面分别用于显示当前运 行的窗口程序、进程及进程模块、系统资源使用情况。 图 2 主界面 3.13.1主框架的实现主框架的实现 所设计
24、的程序是基于对话框的程序。首先创建一个基于对话框的应用程序 pcsmgr.exe, 在主对话框类 pcsmgrdlg 中添加一个标签控件用于放置任务、进 程和系统信息等三个页面,如图 3。 图 3 标签控件 3.1.13.1.1 子对话框的显示子对话框的显示 子对话框的显示与切换,是通过标签控件完成的。当用户点击标签控件上 的每一项时,分别显示对应页面的相关信息。 要显示三个子对话框,需要添加三个对话框到工程中,并将 style 属性设 为 child,board 设为 none,取消标题栏。再分别创建三个对话框的类 ctask ,cprocess,cchart,并定义这三个类的变量: cta
25、sk m_task; /任务 cprocess m_process; /进程 cchart m_chart; /图表 并定义一个图像列表变量用于存放标签图标:cimagelist m_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(); 当用户选择标签中的一项是,为了将对应的对话框在标签控件中显示出来,
26、需要在 onshowwindow(bool bshow,uint nstatus)中添加代码相关代码。这样 便可将在个对话框分别显示于标签控件的每个页面中,但要实现选择标签的不 同项显示不同页面还需在 onselchangemaintab(nmhdr* pnmhdr,lresult* presult)和 onselchangingmaintab(nmhdr* pnmhdr,lresult* presult)两函数 中添加显示代码。 void cpcsmgrdlg:onselchangemaintab(nmhdr* pnmhdr, lresult* presult) switch(m_tab.g
27、etcursel() case 0:m_task.showwindow(sw_show);/任务页面被选中,则显示任务 页面 m_task.centerwindow(); break; case 1:m_process.showwindow(sw_show); /任务页面被选中,则显示 进程页面 m_process.centerwindow(); break; case 2:m_chart.showwindow(sw_show); /任务页面被选中,则显示系 统信息页面 m_chart.centerwindow(); break; 3.1.23.1.2 实现菜单实现菜单 关机、注销、重起菜单命
28、令是通过调用一个 windows api 函数 exitwindowsex()完成的。但在 windows 98 和 windows 2000 实现稍有不同。 exitwindowsex()函数定义格式: bool exitwindowsex( uint uflags /操作 dword dwreason /原因 ); 在 windows 98 实现“注销/重启/关机”功能将直接调用 exitwindiwsex 函 数: exitwindowsex(ewx_logoff,0); / 注销 exitwindowsex(ewx_reboot,0); / 重启 exitwindowsex(ewx_s
29、hutdown,0); / 关机 在 windows 2000 实现“注销/重启/关机”功能须取得高级权限: lookupprivilegevalue(null,se_shutdown_name, tkp.privilegecount = 1; tkp.privileges0.attributes = se_privilege_enabled; adjusttokenprivileges(htoken,false, exitwindowsex(fflag,0); 新建菜单直接调用系统运行对话框: run runfiledlg; runfiledlg = (run)getprocaddress(
30、hshell32, makeintresource(61); 开机自动运行可在注册表的主键”hkey_local_machine”下的运行子键” softwaremicrosoftwindowscurrentversionrun”下写入和删除一个键值的 方法实现。 3.1.33.1.3 提升程序权限提升程序权限 为了能够终止所有进程,需要提升本进程的权限: 1、先调用 getcurrentprocess 函数取得当前进程的句柄; 2、然后调用 openprocesstoken 打开当前进程的访问令牌; 3、接着调用 lookupprivilegevalue 函数取得你想提升的权限的值; 4、最
31、后调用 adjusttokenprivileges 函数给当前进程的访问令牌增加权限。 相关代码是在 cpcsmgrapp 类的 initinstance()函数中添加。 3.23.2任务列表页面设计任务列表页面设计 该类实现当前系统运行任务(有可见窗口的程序)的管理,如查看当前任 务,添加新任务,结束任务,切换任务等。 3.2.13.2.1 显示任务信息显示任务信息 任务信息包括窗口中可见程序的程序名、路径、运行状态等信息,将在任 务列表页面中添加一个列表控件,用于将任务信息显示出来,如图 4。 图 4 任务列表 要显示桌面窗口中的任务信息,首先要一个结构体类型用于存放任务的相 关信息: t
32、ypedef struct cstring strtaskname; /窗口标题 dword dwprocessid; /进程 id dword dwthreadid; /线程 id cstring strrunstate; /运行状态 dword dwwndhandle; /窗口句柄 task_ifno,*ptask_info; 获取窗口标题,使用 api 标准函数 getwindowtext (): char tempmax_path; getwindowtext(hwnd,temp,sizeof(temp) 获取进程及线程 id: tid=getwindowthreadprocessid
33、(hwnd, 确定运行状态是利用 sendmessagetimeout 向窗口发送消息而取得: if(sendmessagetimeout(hwnd,wm_syscommand,null,null,smto_abortifhu ng,1000,null) strrunstate = 正在运行; else strrunstate = 没有响应; 然后添加任务信息到数组: task_ifno ti; ti.strtaskname = temp; ti.dwprocessid = pid; ti.dwthreadid = tid; ti.dwwndhandle = (dword)hwnd; ti.s
34、trrunstate = strrunstate; ptaskthis-m_taskinfoarray.add(ti); 最后把任务信息的每一行在任务列表中显示出来: for(int i=0;inewcount;i+) m_task.insertitem(i,ti.strtaskname,i);/任务名 str.format(%d,ti.dwprocessid); m_task.setitemtext(i,1,str);/进程 id str.format(%d,ti.dwthreadid); m_task.setitemtext(i,2,str);/线程 id m_task.setitemte
35、xt(i,3,ti.strrunstate);/运行状态 3.2.23.2.2 结束任务结束任务 结束任务操作将调用 sendmessagetimeout 函数向要关闭的窗口发送关闭消 息,如果没有响应则用 terminateprocess 函数强行终止该窗口进程。 if(!sendmessagetimeout(hwnd,wm_syscommand,sc_close,null,smto_bloc k|smto_abortifhung,1000,null) handle hprocess = openprocess( process_all_access, false, ti.dwprocess
36、id);/打开进程 terminateprocess(hprocess,1);/强制终止该窗口进程 closehandle(hprocess); 3.2.33.2.3 切换任务切换任务 我们知道,windows 9x/2000 中 setforegroundwindow 函数当用户正在操 作其他窗口时是不能强制某个窗口为前景窗口的,而是激活窗口并调用 flashwindowex 函数来通知用户。但是很多实际情况要求将激活窗口的同时将 创建这个窗口的线程置为前景状态。碰到这种情况我们可以使用 user32.dll 中 的几个未公开 api 函数。 void switchtothiswindow
37、( hwnd hwnd, /被激活的窗口句柄 bool brestore /如果被极小化,则恢复窗口 ); typedef void (winapi *procswitchtothiswindow)(hwnd,bool); procswitchtothiswindow switchtothiswindow; hmodule huser32 = getmodulehandle(user32); switchtothiswindow = (procswitchtothiswindow) getprocaddress(huser32,switchtothiswindow); 接下来只要用任何现存窗口
38、的句柄调用这个函数即可,参数 brestore 指定 如果窗口极小化,是否恢复其原状态。 switchtothiswindow(hwnd,true); 3.33.3进程列表页面设计进程列表页面设计 该页面主要实现显示当前系统正在运行的所有进程并对其进程管理,如结 束进程,显示进程模块信息,显示进程线程信息,保存进程信息在网页文件中 等功能。同显示任务列表一样,我们将添加两个列表控件,分别显示所有进程 信息和当前选择的进程的所以模块信息,如图 5。 图 5 进程列表页面 3.3.13.3.1 显示进程信息显示进程信息 进程信息包括进程图标,进程名、进程 id、cpu 使用率、内存使用率、优 先级
39、、线程数、父进程 id 和进程路径等,如图 6。 图 6 进程信息 通过调用 toolhelp api 函数可枚举所有运行的进程并取得进程路径,进程 id,父进程 id,线程数和优先级。要使用该类接口函数需要包含头文件 tlhelp32.h。主要用到 toolhelp api 中的以下几个函数: 1、hprocesssnap = createtoolhelp32snapshot(th32cs_snapprocess,0); 该函数用于创建一个系统进程快照,取得系统中的所有进程的信息。 2、process32first(hprocesssnap,该函数取得快照中第一个进程 信息,pe32 参数是
40、一个 processentry32 结构类型,该函数将取得的进程信息 填充到 pe32 中。processentry32 的定义如下: typedef struct tagprocessentry32 dword dwsize;/结构大小 dword cntusage; dword th32processid;/进程 id ulong_ptr th32defaultheapid; dword th32moduleid; dword cntthreads;/线程计数 dword th32parentprocessid;/父进程 id long pcpriclassbase;/优先级 dword
41、dwflags; tchar szexefilemax_path;/进程路径 processentry32,然后从该结构中解析出所需的进程名、进程 id、优先 级、线程数、父进程 id 和进程路径等信息。 3、bool winapi process32next(handle hsnapshot,lpprocessentry32 lppe);该函数取得快照中下一个进程信息,参数同 process32first 函数。 进程基本信息的获取过程如图 7。 图 7 进程基本信息的获取 进程 cpu 使用率是使用 windows nt 以上系统提供的性能监视器取得。 windows 性能监视器所用的编程
42、接口是以性能数据助手库(pdh.dll)及一系列 c/c+头文件(即 pdh.h、pdhmsg.h 和 winperf.h,它们是操作系统附带的)的 形式公开给用户的。部分主要代码如下: pdh_status pdhstatus; pdh_fmt_countervalue fmtvalue; pdhstatus = pdhcollectquerydata(m_hquery);/收集数据 pdhstatus = pdhgetformattedcountervalue( hcounter,pdh_fmt_long,/得到格式化数据, fmtvalue 即是我们需要得到的 cpu 使用率数据。 wi
43、ndows 9x 系统上不能通过以上方法获得 cpu 使用率,因此设计的该进程 管理软件不能获取 9x 系统上进程的 cpu 使用率。 要得到进程的内存使用率要用到 psapi.dll 的函数 getprocessmemoryinfo,首先在 process.h 中定义 winapi 函数类型: getprocessmemoryinfo getprocessmemoryinfo;,再取得内存使用数: process_memory_counters pmc; getprocessmemoryinfo(hprocess, dwmemoryuse = pmc.workingsetsize;/内存使用
44、大小 pmc 返回进程的内存使用信息,它是定义的一个 process_memory_counters 结构,定义如下: typedef struct _process_memory_counters dword cb; dword pagefaultcount;/结构尺寸 size_t peakworkingsetsize;/缺页数 size_t workingsetsize;/当前工作集尺寸 size_t quotapeakpagedpoolusage;/最高页池使用数 size_t quotapagedpoolusage;/当前页池使用数 size_t quotapeaknonpagedp
45、oolusage;/最高无页池使用数 size_t quotanonpagedpoolusage; /当前无页池使用数 size_t pagefileusage;/当前分配页文件空间 size_t peakpagefileusage;/最高分配页文件空间 process_memory_counters,*pprocess_memory_counters; 3.3.23.3.2 显示模块及线程信息显示模块及线程信息 模块信息有模块名、模块大小、基地址。直接通过 toolhelp api 函数便可 实现。主要用到的函数有: 1、hmodulesnap = createtoolhelp32snaps
46、hot(th32cs_snapmodule,dwpid )该 函数用于创建指定进程的模块快照。 2、module32first(hmodulesnap,该函数获取指定进程的第一个模 块信息,将取得的信息填充到 me32 中。me32 是一个 moduleentry32 结构类型, 对它的定义如下: typedef struct tagmoduleentry32 dword dwsize; dword th32moduleid; dword th32processid; dword glblcntusage; dword proccntusage; byte * modbaseaddr; dwo
47、rd modbasesize; hmodule hmodule; char szmodulemax_module_name32 + 1; char szexepathmax_path; moduleentry32; 3、module32next(hmodulesnap,该 函数创建指定进程的线程快照,取得所有线程信息。 2、thread32first(hthreadsnap,/取得指定进程的第一个线程信 息将取得的信息填充到 te32 中。te32 也是一个数据结构,它的定义和存放进 程信息或存放模块信息的数据结构类似。 typedef struct tagthreadentry32 dwor
48、d dwsize;/结构体尺寸,必须在调用前指定 dword cntusage; dword th32threadid;/线程 id dword th32ownerprocessid;/创建该线程的进程 id long tpbasepri;/基本优先级 long tpdeltapri; dword dwflags; threadentry32,*pthreadentry32; 3、thread32next(hthreadsnap,其参数 uexitcode 为进程设置了退出 代码。该函数具有强制性,在执行完毕后进程即已经被结束,因此位于其后的 任何代码将不能被执行。虽然 exitprocess
49、()函数可以在结束进程的同时通 知与其相关联的动态链接库,但是由于它的这种执行的强制性,使得 exitprocess()函数在使用上将存在有安全隐患。例如,如果在程序调用 exitprocess()函数之前曾用 new 操作符申请过一段内存,那么将会由于 exitprocess()函数的强制性而无法通过 delete 操作符将其释放,从而造成 内存泄漏。有鉴于 exitprocess()函数的强制性和不安全性,在使用时一定 要引起注意。 exitprocess()只能强制执行本进程的退出,如果要在一个进程中强制结 束其他的进程就要用 terminateprocess()来实现。与 exitpr
50、ocess()不同, terminateprocess()函数执行后,被终止的进程是不会得到任何关于程序退 出的通知的。也就是说,被终止的进程是无法在结束运行前进行退出前的收尾 工作的。所以,通常只有在其他任何方法都无法迫使进程退出时才会考虑使用 terminateprocess()去强制结束进程的。下面给出 terminateprocess()的 函数原型: bool terminateprocess(handle hprocess,uint uexitcode);参数 hprocess 和 uexitcode 分别为进程句柄和退出代码。第二个参数 uexitcode, 当它为 0 时,在调
51、用 terminateprocess()杀死进程后,windows 又将自动唤醒 该进程;当它为 1 时,杀死进程后,windows 不会再唤醒该进程。 本程序中的结束进程,是指强制结束其他应用程序运行的进程,应采用 terminateprocess()强制结束。要终止进程先要用 openprocess 函数将进程 打开,然后用 terminateprocess 函数结束进程。 handle hprocess=openprocess(process_terminate,false, m_dwprocessid.getat(m_icursel); terminateprocess(hproces
52、s,1); /终止进程 终止进程的流程如图 9。 图 9 终止进程 3.3.43.3.4 删除文件删除文件 当发现进程列表中有不正常的程序,如病毒或木马程序,我们不仅需要把 它们结束了,还需要将对应的文件删除,使其不能再次运行。删除文件同样需 要用 openprocess 函数将进程打开,用 findfirstfile 找到文件,然后用 terminateprocess 函数结束进程,再删除该进程对应的文件。 handle hprocess=openprocess(process_terminate,false, m_dwprocessid.getat(m_icursel); handle h
53、=:findfirstfile(filename,/查找文件 terminateprocess(hprocess,1); /终止进程 :deletefile(fdata.cfilename); /删除文件 3.3.53.3.5 保存进程信息到文件保存进程信息到文件 用文件类创建一个 html 文件,将当前进程列表中的各项信息按照网页格式 写入文件中。 3.43.4系统性能页面设计系统性能页面设计 该页面主要显示 cpu 使用率和内存使用率的图形,各种内存的使用情况, 如页文件,虚拟内存,物理内存等,以及系统当前信息,如系统名、计算机名、 当前用户名等。 3.4.13.4.1 绘制绘制 cpuc
54、pu 使用率图使用率图 3.4.23.4.2 绘制内存使用率图绘制内存使用率图 取得内存使用率可通过一个全局内存函数 globalmemorystatus 实现,该函 数原型为: memorystatus memstat; memstat.dwlength = sizeof(memorystatus); globalmemorystatus( m_ulnewusges = memstat.dwmemoryload; 绘制图形也是通过位图绘制函数进行绘制,方法和绘制 cpu 使用率图一样。 内存使用率图如图 11。 图 11 内存使用率 3.4.33.4.3 其他性能显示其他性能显示 其他性能主
55、要包括物理内存、虚拟内存和页文件的使用情况。它们都是通 过 globalmemorystatus 函数得到的。memorystatus memstat; memstat.dwlength = sizeof(memorystatus); globalmemorystatus( memstat.dwtotalphys /物理内存总大小 memstat.dwavailphys /物理内存可用数 memstat.dwtotalpagefile /页文件总大小 memstat.dwavailpagefile /页文件可用数 memstat.dwtotalvirtual /虚拟内存总大小 memstat.
56、dwavailvirtual /虚拟内存可用数 3.4.43.4.4 系统信息系统信息显示显示 系统信息包括当前操作系统名、用户名、计算机名等。 1、获取操作系统名需要用到微软标准函数 getversionex()。在 windows.h 中定义了 osversioninfo 结构,osversioninfo 结构包含了操作系统的版本信 息,包括操作系统的主版本号、副版本号、创建号、以及操作系统平台 id 号和 关于操作系统的其他信息。 typedef struct _osversioninfo dword dwosversioninfosize;/指定该数据结构的字节大小 dword dwmajorversion; /操作系统的主版本号 dword dwminorversion; /操作系统的副版本号 dword dwbuildnumber; /操作系统的创建号 dword dwplatformid; /操作系统 id 号 tchar szcsdversion128; /关于操作系统的一些附加信息 osversioninfo; 其中 dwplatformid 可为以下值: ver_platform_win32s:标识为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年心理咨询师考试试卷及答案指导
- 2025年人力资源管理师职业能力测试试题及答案
- 2025年婚姻家庭关系考试卷及答案
- 2025年房地产经济学学科知识考核试卷及答案
- 2025年公共政策与决策分析考试试卷及答案
- 2025年广告学专业考试试题及答案
- 2025年公共卫生与事业发展专业综合素质测评试题及答案
- 下册第一单元语文作文7篇
- 特色农产品产销对接合作契约
- 诗词创作体验活动设计
- 七年级课外名著阅读知识竞赛试题及答案
- 赣美版八年级美术下册《第5课 产品包装设计》教学设计
- 中国血脂管理指南理论知识考核试题及答案
- 村级积分制管理
- Nikon尼康D3100中文说明书
- 国家开放大学2024春《1494员工劳动关系管理》期末考试真题及答案-开
- DBJ∕T 13-234-2024 不发火建筑地面应用技术标准
- 2024年安徽省高考政治+历史+地理试卷(真题+答案)
- 2024年新疆中考地理真题卷及答案
- 人教版初三物理总复习电学专题复习教学设计
- 项目风险记录及跟踪表
评论
0/150
提交评论