使用 PSAPI 库枚举进程 EnumProcesses()函数
使用 PSAPI 库枚举进程
在 Windows NT 中,创建进程列表使用 PSAPI 函数,这些函数在 PSAPI.DLL 中。这个文件是随 Platform SDK 一起分发的:
使用这个库所需的 PSAPI.h 和 PSAPI.lib 文件也在该 Platform SDK 中。
为了使用 PSAPI 库中的函数,需将 PSAPI.lib 添加到代码项目中,同时在所有调用 PSAPI API 的模块中包含 PSAPI.h 文件。记住一定要随可执行文件一起分发 PSAPI.DLL,因为它不随 Windows NT 一起分发。
与 ToolHelp32 一样,PSAPI 库也包含各种各样有用的函数。由于篇幅所限,本文只讨论与枚举进程有关函数:EnumProcesses()、EnumProcessModules ()、GetModuleFileNameEx()和 GetModuleBaseName()。
创建进程列表的第一步是调用 EnumProcesses()。该函数的声明如下:
BOOL EnumProcesses( DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded );
EnumProcesses()带三个参数,DWORD 类型的数组指针 lpidProcess;该数组的大小尺寸 cb;以及一个指向 DWORD 的指针 cbNeeded,它接收返回数据的长度。DWORD 数组用于保存当前运行的进程 IDs。cbNeeded 返回数组所用的内存大小。下面算式可以得出返回了多少进程:nReturned = cbNeeded / sizeof(DWORD)。
注意:虽然文档将返回的 DWORD 命名为“cbNeeded”,实际上是没有办法知道到底要传多大的数组的。EnumProcesses()根本不会在 cbNeeded 中返回一个大于 cb 参数传递的数组值。结果,唯一确保 EnumProcesses()函数成功的方法是分配一个 DWORD 数组,并且,如果返回的 cbNeeded 等于 cb,分配一个较大的数组,并不停地尝试直到 cbNeeded 小于 cb
现在,你获得了一个数组,其元素保存着系统中每个进程的ID。如果你要想获取进程名,那么你必须首先获取一个句柄。要想从进程 ID 得到句柄,就得调用 OpenProcess()。
一旦有了句柄,则需要得到该进程的第一个模块。为此调用 EnumProcessModules() API:
EnumProcessModules( hProcess, &hModule, sizeof(hModule), &cbReturned );
调用之后,hModule 变量中保存的将是进程中的第一个模块。记住进程其实没有名字,但进程的第一个模块既是该进程的可执行模块。现在你可以用 hModule 中返回的模块句柄调用 GetModuleFileNameEx() 或 GetModuleBaseName() API 函数获取全路径名,或者仅仅是进程可执行模块名。两个函数均带四个参数:进程句柄,模块句柄,返回名字的缓冲指针以及缓冲大小尺寸。
用 EnumProcesses() API 返回的每一个进程 ID 重复这个调用过程,你便可以创建 Windows NT 的进程列表。
最新文章
- Java 虚拟机并发编程
- 用JS来控制 div的高度随浏览器变化而变化
- SendEmail语法
- sys模块的初步认识
- [HDOJ5510]Bazinga(并查集)
- passenger nginx
- ubuntu上安装vsftp-使用java进行匿名链接
- JVM中GC浅解:垃圾回收的了解
- 关于C++中的前置声明(附程序运行图)
- JavaScript知识点整理 (二)
- appium+python+eclipse简单编写小示例!
- jQuery 与 Ajax 的应用
- ACM-ICPC 2018 徐州赛区网络预赛 HRyuji doesn't want to study 树状数组
- Hexo NexT主题/cnblog等博客增加点击出现红心的特效
- Spring 声明事务中transactionAttributes属性 + - Exception 实现逻辑
- 【转】对random_state参数的理解
- C#中IEnumerable、ICollection、IList、IQueryable 、IQueryable 、List之间的区别
- 【代码审计】ThinkSNS_V4 任意文件下载漏洞分析
- 数字三角形 · Triangle
- Python读取Excel中的数据并导入到MySQL
热门文章
- requests进行webdriver协议,模仿selenium
- Vditor文件上传跨域
- cannot load ";mso.dll"; vs2008 web开发问题
- Eureka+SpringCloud微服务(入门一)
- 解析sensor_msgs::PointCloud2 ROS点云数据
- ideal的基础使用2022版本,黑马程序员的基础使用
- NuGet私有服务器ProGet Docker搭建和公司中实战用法
- 把Excel自动转换Json格式
- 嵌入式Linux—FreeType矢量字体
- JZOJ 2020.07.30【NOIP提高组】模拟