使用 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 的进程列表。

最新文章

  1. Java 虚拟机并发编程
  2. 用JS来控制 div的高度随浏览器变化而变化
  3. SendEmail语法
  4. sys模块的初步认识
  5. [HDOJ5510]Bazinga(并查集)
  6. passenger nginx
  7. ubuntu上安装vsftp-使用java进行匿名链接
  8. JVM中GC浅解:垃圾回收的了解
  9. 关于C++中的前置声明(附程序运行图)
  10. JavaScript知识点整理 (二)
  11. appium+python+eclipse简单编写小示例!
  12. jQuery 与 Ajax 的应用
  13. ACM-ICPC 2018 徐州赛区网络预赛 HRyuji doesn't want to study 树状数组
  14. Hexo NexT主题/cnblog等博客增加点击出现红心的特效
  15. Spring 声明事务中transactionAttributes属性 + - Exception 实现逻辑
  16. 【转】对random_state参数的理解
  17. C#中IEnumerable、ICollection、IList、IQueryable 、IQueryable 、List之间的区别
  18. 【代码审计】ThinkSNS_V4 任意文件下载漏洞分析
  19. 数字三角形 · Triangle
  20. Python读取Excel中的数据并导入到MySQL

热门文章

  1. requests进行webdriver协议,模仿selenium
  2. Vditor文件上传跨域
  3. cannot load "mso.dll" vs2008 web开发问题
  4. Eureka+SpringCloud微服务(入门一)
  5. 解析sensor_msgs::PointCloud2 ROS点云数据
  6. ideal的基础使用2022版本,黑马程序员的基础使用
  7. NuGet私有服务器ProGet Docker搭建和公司中实战用法
  8. 把Excel自动转换Json格式
  9. 嵌入式Linux—FreeType矢量字体
  10. JZOJ 2020.07.30【NOIP提高组】模拟