首页 > 系统相关 >使用 PSAPI 库枚举进程 EnumProcesses()函数

使用 PSAPI 库枚举进程 EnumProcesses()函数

时间:2022-10-06 03:11:06浏览次数:77  
标签:句柄 EnumProcesses cbNeeded 枚举 PSAPI 进程 DWORD

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

标签:句柄,EnumProcesses,cbNeeded,枚举,PSAPI,进程,DWORD
From: https://www.cnblogs.com/kt007/p/16756936.html

相关文章

  • 还在频繁定义常量?不试试用枚举代替
    「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」备战2022春招或暑期实习,祝大家每天进步亿点点!Day5本篇总结的是《Java枚举的正确使用方式》,后......
  • 枚举的使用与详解
    一:枚举的引入【1】数学:枚举法:1<x<42<y<5求x+y=6枚举法:一枚一枚的列举出来。前提:有限,确定【2】在java中,类的对象是有限个,确定的。这个类我们可以定义为......
  • AcWing1362 健康的荷斯坦奶牛(二进制枚举)
    原题链接思路:二进制枚举因为数据量很小,数据只有25和15,因此二进制枚举妥妥的需要注意的是题目中要求下标从1开始,后面记录的时候如果开始是从0开始的记得+1小tipsc++......
  • 补档--【THM】Subdomain Enumeration(子域名枚举)-学习
    简介子域名枚举是为一个域查找有效子域的过程,在本节中我们将学习发现子域的各种方法,我们这样做是为了扩大我们的攻击面,试图发现更多潜在的漏洞点。我们将探讨三种不同的......
  • 枚举和迭代器
    枚举器枚举器是指一个参数类型,有MoveNext()方法和Current属性,MoveNext方法可以将枚举器的游标指向下一个元素,Current属性存储着游标当前指向的参数。可以使用GetEnu......
  • POJ 2110 Mountain Walking(二分 枚举 BFS)
    POJ2110MountainWalking(二分枚举BFS)题目:​ 给出一张\(n*n(n\le100)\)的地图,每个点都有一个点权\((val\le110)\),可以任意选择路径,请问从(1,1)走到(n,n)的路......
  • Java SE 宋红康 days04-高级篇-枚举类
    1.自定义枚举类a.声明类A对象的属性:private final修饰b.私有化类的构造器,并给对象属性赋值c.提供当前枚举类的多个对象:public static final......
  • C语言的enum(枚举)
    一、enum的语法格式为:enum枚举名{枚举元素1,枚举元素2,……}; 二、用enum代替define繁琐的定义1、繁琐的define定义:#defineMON1#defineTUE2#defineW......
  • 传统优化方法:枚举法、启发式算法和搜索算法
    1.枚举法枚举出可行解集合内的所有可行解,以求出精确最优解。对于连续函数,该方法要求先对其进行离散化处理,这样就可能因离散处理而永远达不到最优解。当枚举空间比较大时......
  • Flask 学习-81.Flask-RESTX使用reqparse 解析器校验枚举类型choices 参数
    前言reqparse.RequestParser()解析器可以校验枚举类型,在add_argument中使用choices参数choices设置参数可选值比如性别设置可选项:男、女defpost(self):......