毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc

上传人:西安人 文档编号:3286194 上传时间:2019-08-08 格式:DOC 页数:26 大小:505.52KB
返回 下载 相关 举报
毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc_第1页
第1页 / 共26页
毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc_第2页
第2页 / 共26页
毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc_第3页
第3页 / 共26页
毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc_第4页
第4页 / 共26页
毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-简述WINDOWS进程管理工具的原理和实现.doc(26页珍藏版)》请在三一文库上搜索。

1、简述简述 WINDOWS 进程管理工具的原理和实现进程管理工具的原理和实现 摘摘 要要 Windows 自带的任务管理器存在功能上的缺陷,比如不能查看进程的模块 及线程信息。课题设计就是模拟 Windows 任务管理器,开发一个功能更完善的 Windows 进程管理软件。主要设计的是一个基于对话框的 VC+程序,在主对 话框上面放置了一个标签控件,并创建了任务、进程和系统信息三个页面,标 签控件用于选择并显示页面。三个页面分别用于显示当前运行的窗口程序、进 程及进程模块、系统资源使用情况。程序还实现了结束任务、切换任务、终止 进程等对进程管理的基本功能。在程序的设计过程中,通过调用 Windo

2、ws API 函数而获得任务、进程、线程模块,以及系统资源使用情况等信息。最后在 Windows XP 系统上进行测试,实现了进程管理的基本功能,为用户了解当前进 程及系统资源使用情况提供了很好的参考。 关键词关键词:任务管理器;线程;进程;API 591 论文网 www.591LW.com The Design and Implementation of the Processes Management Tool for Windows Abstract There are some defects in the Task Manager built-in Windows. For exam

3、ple, it doesnt show us 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

4、 control in the main dialog 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

5、system resources. This 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 b

6、y calling the Windows 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 591

7、论文网 www.591LW.com 目目 录录 论文总页数:25 页 1引言1 1.1课题背景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.

8、2.3切换任务 10 3.3进程列表页面设计.10 3.3.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 591 论文网 www.591LW.com 3.4.3其他性能显示 19 3.4.4系统信息显示 20 4测试结果.21 4.1测试环境.21 4.2测试方法.21 4.3测试结果.21 结 论.23 参考文献.23 第 2 页 共 25 页 1 1引言引言 1.11.1 课题背景课题背景

9、 随着计算机的广泛应用,很多的软件被安装在计算机上,使计算机运行的 程序进程越来越多;很多的程序在运行时常出现异常(如不能正常结束、占用 大量资源、发现异常的进程等) 。这些现象给我们的计算机使用及管理带来很多 的不便。为了给计算机上运行的程序进行很好的管理,现在出现了许多的进程 管理工具软件。课题设计的目的主要是为了检查综合运用以前所学知识(包括 以前所学的一些关于计算机操作系统、进程、计算机安全、编程等知识)的能 力,模拟 Windows 任务管理器,开发一个功能更完善的 Windows 进程管理软件, 对任务、进程进行查看、结束等操作。 1.21.2 国内外研究现状国内外研究现状 从现状

10、看来,Windows 进程管理工具及其理论的研究,无论是国外还是国 内,技术都相当成熟。微软 Windows 操作系统系列(98 和 ME 除外)都自带有进 程管理器,但功能不是很完善,不能查看进程模块及线程信息,而许多其他版 本的 Windows 进程管理软件都具有完善的功能。 1.31.3 课题研究的意义课题研究的意义 随着计算机技术的迅猛发展,计算机的运用给人们带来了很多便利,无论 是学习,办公,还是商务。一款好的系统管理软件能大大地提高计算机的使用 和管理效率,进程管理器就能很好地对系统上运行的进程进行管理。很多人都 使用过进程管理器之类的软件,或者是 Windows 自带的任务管理器

11、,它们都能 够对进程进行管理。课题设计选择开发一个进程管理器软件,能够使自己综合 运用以前所学知识(包括操作系统、编程、系统安全等知识)的能力,同时也 使自己了解当今软件编程的一些新技术;既锻炼了自己的实际动手能力,又引 导自己进行了一次模拟实际产品的开发,对于自己以后工作能力的培养具有重 要的意义。 1.41.4 课题的研究方法课题的研究方法 系统使用 VC+ 6.0 的开发环境,模拟 Windows 的任务管理器进行设计与开 发。因此,课题设计应首先分析进程管理器软件的相关功能;其次,综合运用 以前所学的相关知识,广泛查阅资料(尤其是进程、线程及其相关知识) ,选择 所熟悉的开发工具进行开

12、发;同时,在开发设计与实现中,要保存好相关的设 计文挡。 第 3 页 共 25 页 1.51.5进程与线程简介进程与线程简介 1.5.11.5.1 进程简介进程简介 进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:一个 是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的 统计信息的地方。另一个是地址空间,它包含所有可执行模块或 DLL 模块的代 码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。 进程是一个动态的执行过程,它动态地被创建,并被调度执行后消亡。进 程是资源分配的基本单位,也是抢占处理机的调度单位,它拥有一个完整的虚 拟地址空间。 系统中需

13、要有描述进程存在和能够反应其变化的物理实体,即进程的静态 描述。进程的静态描述由三部份组成:进程控件块 PCB,有关程序段和该程序 段对其进行操作的数据结构集。进程控制块包含了有关进程的描述信息、控制 信息以及资源信息,是进程动态特征的集中反应。系统根据 PCB 感知进程的存 在和通过 PCB 中所包含的各项变量的变化,掌握进程所处的状态以及达到控制 进程活动的目的。由于进程的 PCB 是系统感知进程的唯一实体,因此,在几乎 所有的多道操作系统中,一个进程的 PCB 结构都是全部或部分常驻内存的。 进程的程序部分描述进程所要完成的功能。而数据结构集是程序在执行时 必不可少的工作区和操作对象。这

14、两部分是进程完成所需功能的物质基础。由 于进程的这两部分内容与控制进程的执行及完成进程功能直接有关,因而,在 大部分多道操作系统中,这两部分内容存放在外存中,直到该进程执行时再调 入内存。 一个进程的生命周期可以划分为一组状态,这些状态描述了整个进程。系 统根据 PCB 结构中的状态值控制进程。 在进程的整个生命周期内,一个进程至少具有三种基本状态,它们是:执 行状态、等待状态和就绪状态。这三种状态之间可以相互换,处于就绪状态的 进程已经得到除 CPU 之外的其它资源,只要由调度得到处理机,便可立即投入 执行。处于执行状态的进程因时间片到而放弃处理机进入就绪状态,因等待某 个事件发生而放弃处理

15、机进入等待状态。处于等待状态的进程因等待的事件发 生而被唤醒进入就绪状态,如图 1。 第 4 页 共 25 页 图 1 进程状态转换 1.5.21.5.2 线程简介线程简介 线程是一个进程内的基本调度单位,它既可以由操作系统内核控制,也可 由用户程序控制。 线程是由两个部分组成的:一个是线程的内核对象,操作系统用它来对线 程实施管理。内核对象也是系统用来存放线程统计信息的地方。另一个是线程 堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量 线程只由相关的堆栈(系统栈或用户栈) 、寄存器和线程控制表 TCB 组成。 寄存器可被用来存储线程内的局部变量,但不能存储其它线程的相关变量。

16、线程也有三个基本状态:执行状态、就绪状态和阻塞状态。针对线程的三 种基本状态,存在五种基本操作来转换线程的状态。这五种基本操作是: 1、派生:线程在进程内派生出来,它既可由进程派生,也可由线程派生。 2、阻塞:如果一个线程在执行过程中需要等待某个事件发生,则被阻塞。 3、激活:如果阻塞线程的事件发生,则该线程被激活并进入就绪队列。 4、调度:选择一个就绪线程进入执行状态。 5、结束:如果一个线程执行结束,它的寄存器上下文以及堆栈内容等将被 释放。 1.5.31.5.3 进程与线程的关系进程与线程的关系 进程是不活泼的。若要使进程完成某项操作,它必须拥有一个在它的环境 中运行的线程,该线程负责执

17、行包含在进程的地址空间中的代码。实际上,单 个进程可能包含若干个线程,所有这些线程都“同时”执行进程地址空间中的 代码。 线程与资源分配无关,它属于某一个进程,并与进程内的其它线程一起共 享进程的资源。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而 同一进程内的不同线程共享同一地址空间。为此,每个线程都有它自己的一组 CPU 寄存器和它自己的堆栈。每个进程至少拥有一个线程,来执行进程的地址 空间中的代码。如果没有线程来执行进程的地址空间中的代码,那么进程就没 有存在的理由了,系统就将自动撤消该进程和它的地址空间。 若要使所有这些线程都能运行,操作系统就要为每个线程安排一定的 CPU 时

18、间。它通过以一种循环方式为线程提供时间片(称为量程) ,造成一种假象, 第 5 页 共 25 页 仿佛所有线程都是同时运行的一样。图 3 显示了在单个 CPU 的计算机上是如何 实现这种运行方式的。如果计算机拥有多个 CPU,那么操作系统就要使用复杂 得多的算法来实现 CPU 上线程负载的平衡。 当创建一个进程时,系统会自动创建它的第一个线程,称为主线程。然后, 该线程可以创建其他的线程,而这些线程又能创建更多的线程。 1.5.41.5.4 WindowsWindows 自带的任务管理器分析自带的任务管理器分析 Windows 任务管理器由性能、进程、应用程序三大部分组成。其实这三大 部分是有

19、机的联系在一起的,尤其是性能和进程,性能中除了 CPU 使用率以外, 其余的数据都是由进程模块顺便取得的。 Windows2000/XP 的任务管理器通过 NtQuerySystemInformation 的调用来 获取各类信息,如 CPU 使用率,内存使用率,句柄总数,线程总数,进程总数 等等。在任务管理器中的几乎所有信息都是来自该函数。 NtQuerySystemInformation 函数隶属 Ntdll.dll,是一个未公开的函数。其调 用方式为: NTSTATUS NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInfo

20、rmationClass,PVOID SystemInformation, ULONG SystemInformationLength,PULONG ReturnLength); SystemInformationClass:在 SYSTEM_INFORMATION_CLASS 中的枚举值之一, 声明返回信息的种类; SystemInformation:指到一个要求返回信息的缓冲区,这个系统信息变量 的尺寸和结构依赖于 SystemInformationClass 参数的值; SystemInformationLength:SystemInformation 参数指定的缓冲区尺寸; Retur

21、nLength:返回值尺寸。 这个函数是一个正在修改的函数,在 Windows2000 和 Windows XP 中可用, 但在 Windows 98 和 Windows Me 中不可用。而且该函数调用的入口参数非常之 多,调用复杂。因此,在此次进程管理器的开发中,将使用其它方法来获取各 类信息。 2 2主要功能及设计思路主要功能及设计思路 2.12.1主要功能主要功能 设计要求实现的主要功能进程管理功能,具体包括以下内容: (1)任务管理:列出所有当前运行的窗口程序名、运行状态等信息;对它们 进行终止、切换等操作。 (2)进程管理:列出所有的 Windows 进程,以及进程所在的磁盘绝对路径

22、, 第 6 页 共 25 页 进程消耗资源状况等;列出所有进程的相关模块挂载名,模块所在磁盘的绝对 路径以及进程的线程情况,包括资源占用情况、所在内存空间地址等;除核心 进程外,所有的其他进程均可以被终止,能够尽量不丢失信息,在提升本管理 进程级别后,也能够对系统的核心进程终止。 ; (3)系统性能显示:绘制 CPU、内存使用率图,以描述系统性能;列出物理 内存、虚拟内存和页文件的使用情况;显示系统当前信息,包括系统名、计算 机名和用户名等。 2.22.2设计思路设计思路 在 Visual C+ 6.0 环境设计一个基于对话框的应用程序,类似于 Windows 自带的任务管理器,主窗口上添加一

23、个标签控件,加入三个页面,分别是:任 务、进程和系统性能信息。 其中,任务页面显示当前正在运行的任务(可见且有窗口标题),用列表控 件进行显示,并能够对任务进行操作,如:添加新任务,结束任务,切换任务 等。 进程页面显示当前系统正在运行的进程及相关的模块,线程等,用列表控 件进行显示,并能够实行终止进程、进程列表保存到文件等操作。 系统性能页面显示物理内存、虚拟内存和页文件等详细使用情况,CPU、内 存的使用率,并绘制 CPU 使用率和内存使用率的图形,并用列表控件显示系统 当前信息(系统名、计算机名和当前用户等)。 3 3详细设计详细设计 程序主界面如图 2。 在主界面上面设置了一个标签控件

24、,并创建了任务列表、进程列表和系统 信息三个页面,标签控件用于选择并显示页面。三个页面分别用于显示当前运 行的窗口程序、进程及进程模块、系统资源使用情况。 第 7 页 共 25 页 图 2 主界面 3.13.1主框架的实现主框架的实现 所设计的程序是基于对话框的程序。首先创建一个基于对话框的应用程序 PcsMgr.exe, 在主对话框类 PcsMgrDlg 中添加一个标签控件用于放置任务、进 程和系统信息等三个页面,如图 3。 图 3 标签控件 3.1.13.1.1 子对话框的显示子对话框的显示 子对话框的显示与切换,是通过标签控件完成的。当用户点击标签控件上 的每一项时,分别显示对应页面的相

25、关信息。 要显示三个子对话框,需要添加三个对话框到工程中,并将 Style 属性设 为 Child,Board 设为 None,取消标题栏。再分别创建三个对话框的类 CTask ,CProcess,CChart,并定义这三个类的变量: CTask m_Task; /任务 CProcess m_Process; /进程 CChart m_Chart; /图表 并定义一个图像列表变量用于存放标签图标:CImageList m_ImageList; 接下来就创建子窗口: m_Task.Create(IDD_TASK,m_Tab.GetActiveWindow(); m_Process.Create(

26、IDD_PROCESS,m_Tab.GetActiveWindow(); m_Chart.Create(IDD_CHART,m_Tab.GetActiveWindow(); 当用户选择标签中的一项是,为了将对应的对话框在标签控件中显示出来, 需要在 OnShowWindow(BOOL bShow,UINT nStatus)中添加代码相关代码。这样 便可将在个对话框分别显示于标签控件的每个页面中,但要实现选择标签的不 同项显示不同页面还需在 OnSelchangeMaintab(NMHDR* pNMHDR,LRESULT* 第 8 页 共 25 页 pResult)和 OnSelchanging

27、Maintab(NMHDR* pNMHDR,LRESULT* pResult)两函数 中添加显示代码。 void CPcsMgrDlg:OnSelchangeMaintab(NMHDR* pNMHDR, LRESULT* pResult) switch(m_Tab.GetCurSel() case 0:m_Task.ShowWindow(SW_SHOW);/任务页面被选中,则显示任务 页面 m_Task.CenterWindow(); break; case 1:m_Process.ShowWindow(SW_SHOW); /任务页面被选中,则显示 进程页面 m_Process.CenterW

28、indow(); break; case 2:m_Chart.ShowWindow(SW_SHOW); /任务页面被选中,则显示系 统信息页面 m_Chart.CenterWindow(); break; 3.1.23.1.2 实现菜单实现菜单 关机、注销、重起菜单命令是通过调用一个 Windows API 函数 ExitWindowsEx()完成的。但在 Windows 98 和 Windows 2000 实现稍有不同。 ExitWindowsEx()函数定义格式: BOOL ExitWindowsEx( UINT uFlags /操作 DWORD dwReason /原因 ); 在 Win

29、dows 98 实现“注销/重启/关机”功能将直接调用 ExitWindiwsEx 函 数: ExitWindowsEx(EWX_LOGOFF,0); / 注销 ExitWindowsEx(EWX_REBOOT,0); / 重启 ExitWindowsEx(EWX_SHUTDOWN,0); / 关机 在 Windows 2000 实现“注销/重启/关机”功能须取得高级权限: 第 9 页 共 25 页 LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME, tkp.PrivilegeCount = 1; tkp.Privileges0.Attributes = S

30、E_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,FALSE, ExitWindowsEx(FFlag,0); 新建菜单直接调用系统运行对话框: RUN RunFileDlg; RunFileDlg = (RUN)GetProcAddress(hShell32, MAKEINTRESOURCE(61); 开机自动运行可在注册表的主键”HKEY_LOCAL_MACHINE”下的运行子键” SoftwareMicrosoftWindowsCurrentVersionRun”下写入和删除一个键值的 方法实现。 3.1.33.1.3 提升程序权限提升程

31、序权限 为了能够终止所有进程,需要提升本进程的权限: 1、先调用 GetCurrentProcess 函数取得当前进程的句柄; 2、然后调用 OpenProcessToken 打开当前进程的访问令牌; 3、接着调用 LookupPrivilegeValue 函数取得你想提升的权限的值; 4、最后调用 AdjustTokenPrivileges 函数给当前进程的访问令牌增加权限。 相关代码是在 CPcsMgrApp 类的 InitInstance()函数中添加。 3.23.2任务列表页面设计任务列表页面设计 该类实现当前系统运行任务(有可见窗口的程序)的管理,如查看当前任 务,添加新任务,结束任

32、务,切换任务等。 3.2.13.2.1 显示任务信息显示任务信息 任务信息包括窗口中可见程序的程序名、路径、运行状态等信息,将在任 务列表页面中添加一个列表控件,用于将任务信息显示出来,如图 4。 第 10 页 共 25 页 图 4 任务列表 要显示桌面窗口中的任务信息,首先要一个结构体类型用于存放任务的相 关信息: typedef struct CString strTaskName; /窗口标题 DWORD dwProcessID; /进程 ID DWORD dwThreadID; /线程 ID CString strRunState; /运行状态 DWORD dwWndHandle; /

33、窗口句柄 TASK_IFNO,*PTASK_INFO; 获取窗口标题,使用 API 标准函数 GetWindowText (): char tempMAX_PATH; GetWindowText(hwnd,temp,sizeof(temp) 获取进程及线程 ID: TID=GetWindowThreadProcessId(hwnd, 确定运行状态是利用 SendMessageTimeout 向窗口发送消息而取得: if(SendMessageTimeout(hwnd,WM_SYSCOMMAND,NULL,NULL,SMTO_ABORTIFHU NG,1000,NULL) strRunState

34、 = “正在运行“; else strRunState = “没有响应“; 然后添加任务信息到数组: TASK_IFNO ti; ti.strTaskName = temp; ti.dwProcessID = PID; ti.dwThreadID = TID; ti.dwWndHandle = (DWORD)hwnd; ti.strRunState = strRunState; pTaskThis-m_TaskInfoArray.Add(ti); 最后把任务信息的每一行在任务列表中显示出来: for(int i=0;inewCount;i+) 第 11 页 共 25 页 m_task.Inse

35、rtItem(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.SetItemText(i,3,ti.strRunState);/运行状态 3.2.23.2.2 结束任务结束任务 结束任务操作将调用 SendMessageTimeout 函数向要关闭的窗口发送关闭消 息,如果没有响应则用 TerminateProc

36、ess 函数强行终止该窗口进程。 if(!SendMessageTimeout(hwnd,WM_SYSCOMMAND,SC_CLOSE,NULL,SMTO_BLOC K|SMTO_ABORTIFHUNG,1000,NULL) HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, ti.dwProcessID);/打开进程 TerminateProcess(hProcess,1);/强制终止该窗口进程 CloseHandle(hProcess); 3.2.33.2.3 切换任务切换任务 我们知道,Windows 9x/2000 中 S

37、etForegroundWindow 函数当用户正在操 作其他窗口时是不能强制某个窗口为前景窗口的,而是激活窗口并调用 FlashWindowEx 函数来通知用户。但是很多实际情况要求将激活窗口的同时将 创建这个窗口的线程置为前景状态。碰到这种情况我们可以使用 USER32.DLL 中 的几个未公开 API 函数。 void SwitchToThisWindow ( HWND hWnd, /被激活的窗口句柄 BOOL bRestore /如果被极小化,则恢复窗口 ); typedef void (WINAPI *PROCSWITCHTOTHISWINDOW)(HWND,BOOL); PROCS

38、WITCHTOTHISWINDOW SwitchToThisWindow; HMODULE hUser32 = GetModuleHandle(“user32“); SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW) 第 12 页 共 25 页 GetProcAddress(hUser32,“SwitchToThisWindow“); 接下来只要用任何现存窗口的句柄调用这个函数即可,参数 bRestore 指定 如果窗口极小化,是否恢复其原状态。 SwitchToThisWindow(hWnd,TRUE); 3.33.3进程列表页面设计进程列表页面设计

39、该页面主要实现显示当前系统正在运行的所有进程并对其进程管理,如结 束进程,显示进程模块信息,显示进程线程信息,保存进程信息在网页文件中 等功能。同显示任务列表一样,我们将添加两个列表控件,分别显示所有进程 信息和当前选择的进程的所以模块信息,如图 5。 第 13 页 共 25 页 图 5 进程列表页面 3.3.13.3.1 显示进程信息显示进程信息 进程信息包括进程图标,进程名、进程 ID、CPU 使用率、内存使用率、优 先级、线程数、父进程 ID 和进程路径等,如图 6。 图 6 进程信息 通过调用 ToolHelp API 函数可枚举所有运行的进程并取得进程路径,进程 ID,父进程 ID,

40、线程数和优先级。要使用该类接口函数需要包含头文件 tlhelp32.h。主要用到 ToolHelp API 中的以下几个函数: 1、hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 该函数用于创建一个系统进程快照,取得系统中的所有进程的信息。 2、Process32First(hProcessSnap,该函数取得快照中第一个进程 信息,pe32 参数是一个 PROCESSENTRY32 结构类型,该函数将取得的进程信息 填充到 pe32 中。PROCESSENTRY32 的定义如下: 第 14 页 共 25 页 typ

41、edef struct tagPROCESSENTRY32 DWORD dwSize;/结构大小 DWORD cntUsage; DWORD th32ProcessID;/进程 ID ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads;/线程计数 DWORD th32ParentProcessID;/父进程 ID LONG pcPriClassBase;/优先级 DWORD dwFlags; TCHAR szExeFileMAX_PATH;/进程路径 PROCESSENTRY32,然后从该结构中解析出所需的进程名、

42、进程 ID、优先 级、线程数、父进程 ID 和进程路径等信息。 3、BOOL WINAPI Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);该函数取得快照中下一个进程信息,参数同 Process32First 函数。 进程基本信息的获取过程如图 7。 图 7 进程基本信息的获取 进程 CPU 使用率是使用 Windows NT 以上系统提供的性能监视器取得。 Windows 性能监视器所用的编程接口是以性能数据助手库(PDH.dll)及一系列 第 15 页 共 25 页 C/C+头文件(即 pdh.h、pdhmsg.h 和 winpe

43、rf.h,它们是操作系统附带的)的 形式公开给用户的。部分主要代码如下: PDH_STATUS pdhStatus; PDH_FMT_COUNTERVALUE fmtValue; pdhStatus = PdhCollectQueryData(m_hQuery);/收集数据 pdhStatus = PdhGetFormattedCounterValue( hCounter,PDH_FMT_LONG,/得到格式化数据, fmtValue 即是我们需要得到的 CPU 使用率数据。 Windows 9X 系统上不能通过以上方法获得 CPU 使用率,因此设计的该进程 管理软件不能获取 9X 系统上进程

44、的 CPU 使用率。 要得到进程的内存使用率要用到 Psapi.dll 的函数 GetProcessMemoryInfo,首先在 Process.h 中定义 WINAPI 函数类型: GETPROCESSMEMORYINFO GetProcessMemoryInfo;,再取得内存使用数: PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo(hProcess, dwMemoryUse = pmc.WorkingSetSize;/内存使用大小 pmc 返回进程的内存使用信息,它是定义的一个 PROCESS_MEMORY_COUNTERS 结构,定义如

45、下: typedef struct _PROCESS_MEMORY_COUNTERS DWORD cb; DWORD PageFaultCount;/结构尺寸 SIZE_T PeakWorkingSetSize;/缺页数 SIZE_T WorkingSetSize;/当前工作集尺寸 SIZE_T QuotaPeakPagedPoolUsage;/最高页池使用数 SIZE_T QuotaPagedPoolUsage;/当前页池使用数 SIZE_T QuotaPeakNonPagedPoolUsage;/最高无页池使用数 SIZE_T QuotaNonPagedPoolUsage; /当前无页池使

46、用数 SIZE_T PagefileUsage;/当前分配页文件空间 SIZE_T PeakPagefileUsage;/最高分配页文件空间 PROCESS_MEMORY_COUNTERS,*PPROCESS_MEMORY_COUNTERS; 3.3.23.3.2 显示模块及线程信息显示模块及线程信息 模块信息有模块名、模块大小、基地址。直接通过 ToolHelp API 函数便可 实现。主要用到的函数有: 1、hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPID )该 第 16 页 共 25 页 函数用于创建指定进程的模

47、块快照。 2、Module32First(hModuleSnap,该函数获取指定进程的第一个模 块信息,将取得的信息填充到 me32 中。me32 是一个 MODULEENTRY32 结构类型, 对它的定义如下: Typedef struct tagMODULEENTRY32 DWORD dwSize; DWORD th32ModuleID; DWORD th32ProcessID; DWORD GlblcntUsage; DWORD ProccntUsage; BYTE * modBaseAddr; DWORD modBaseSize; HMODULE hModule; char szMod

48、uleMAX_MODULE_NAME32 + 1; char szExePathMAX_PATH; MODULEENTRY32; 3、Module32Next(hModuleSnap,该 函数创建指定进程的线程快照,取得所有线程信息。 2、Thread32First(hThreadSnap,/取得指定进程的第一个线程信 息将取得的信息填充到 te32 中。te32 也是一个数据结构,它的定义和存放进 程信息或存放模块信息的数据结构类似。 typedef struct tagTHREADENTRY32 DWORD dwSize;/结构体尺寸,必须在调用前指定 DWORD cntUsage; DW

49、ORD th32ThreadID;/线程 ID DWORD th32OwnerProcessID;/创建该线程的进程 ID LONG tpBasePri;/基本优先级 LONG tpDeltaPri; DWORD dwFlags; THREADENTRY32,*PTHREADENTRY32; 3、Thread32Next(hThreadSnap,其参数 uExitCode 为进程设置了退出 代码。该函数具有强制性,在执行完毕后进程即已经被结束,因此位于其后的 任何代码将不能被执行。虽然 ExitProcess()函数可以在结束进程的同时通 知与其相关联的动态链接库,但是由于它的这种执行的强制性,使得 ExitProcess()函数在使用上将存在有安全隐患。例如,如果在程序调用 ExitProcess()函数之前曾用 new 操作符申请过一段内存,那么将会由于 ExitProcess()函数的强制性而无法通过 delete

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1