win32两种获取进程句柄的方式
获取进程句柄
获取进程句柄的方式有很多种,之前有说到CreateProcess函数,该函数在一个进程中打开另一个进程,并且得到子进程的句柄,不过有时候我们更想获得正在运行的进程的句柄。获取正在运行的进程句柄也有几种方式,下面介绍一下几个函数。
FindWindow
invoke FindWindow,lpClassName,lpWindowName
该函数返回一个窗口句柄,第一个参数指向要取得句柄的窗口类的名称,第二个参数指向窗口的标题。
GetWindowThreadProcessId
invoke GetWindowThreadProcessId,hWnd,lpdwProcessId
该函数获取创建窗口的进程的ID。第一个参数就是要获取ID的进程创建的窗口的句柄。第二个参数指向一个双字变量,函数会返回 进程的ID到里面。
OpenProcess
invoke OpenProcess,dwDesireAccess,bInheritHandle,dwProcessId
.if eaxmov hProcess,eax
.endif
该函数通过进程ID获得进程的句柄。
- dwDesiredAccess:指定需要对该进程进行的操作,指定操作需要操作代码,操作代码可以在MSDN中查看。
- bInheritHandle:指明返回的句柄是否可以被当前进程的子进程继承,如果参数指定为TRUE,那么句柄可以被继承。
- dwProcessId:指定目标进程的进程ID。
函数执行成功返回被打开的进程的句柄,如果失败则返回NULL,这个时候可能时因为权限不够。如果我们不需要再对该进程进行操作了,一定要用CloseHandle函数将获得的句柄关闭。
按照以上的顺序使用函数,就能获得一个已经打开的进程的句柄。
第二种方法就是通过快照函数获得进程的句柄。快照,也就是说该函数会像照相一样,获取一下当前系统这一刻的进程的状态。
通过快照函数可以获取一个进程的列表,还可以获取获取线程和模块等对象的列表。
CreateToolhelp32Snapshot
invoke CreateToolhelp32Snapshot,dwFlags,th32ProcessID
.if eaxmov hSnapShot,eax
.endif
dwFlags参数用来指定快照中需要返回的对象,参数可以指定对进程中的堆进行枚举,对进程中的模块进行枚举,对系统范围内进程进行枚举,对系统范围内的线程进行枚举。
后面一个参数用来指定一个进程ID,当dwFlags参数指定为进行系统范围的枚举时,这个会自动忽略。
该函数执行成功后返回一个快照句柄,然后我们可以通过两个函数来获得系统里所有进程的信息。
Process32First
invoke Process32First,hSnapShot,offset stProcess
该函数用来进行首次调用。第一个参数是之前获得的快照句柄。第二个参数指向一个结构。
PROCESSENTRY32结构
PROCESSENTRY32 STRUCTdwSize DWORD ?cntUsage DWORD ? th32ProcessID DWORD ? ;进程IDth32ModuleID DWORD ? ;进程默认堆的IDcntThreads DWORD ? ;进程模块的IDth32ParentProcessID DWORD ? ;pcPriClassBase DWORD ? ;进程的父进程的IDdwFlags DWORD ?szExeFile db MAX_PATH dup(?) ;进程对应的可执行文件名
PROCESSENTRY32 ENDS
函数执行成功后进程的信息就会返回到这个结构中。但是在使用函数前要先将结构中的dwSize字段填写为结构的长度。
用该函数首次获取进程的信息后,后面再到循环中用Process32Next函数获取剩余的进程的信息。获取进程的顺序是按照26个英文字母的顺序来的。
这两个函数是通过快照获取进程的函数,前面讲过快照函数还可以获取线程,堆,模块的信息。对应的函数:Thread32First,Thread32Next,Heap32First,Heap32Next,Module32First,Module32Next。不同的函数对应的结构也不一样。
win32两种获取进程句柄的方式相关推荐
- 两种获取connectionString的方式
两种获取connectionString的方式 1. public static string connectionString = ConfigurationManager.ConnectionSt ...
- Hibernate中两种获取Session的方式
转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...
- java获取项目中的路径_java中几种获取项目路径方式
转自http://caodaoxi.iteye.com/blog/1234805 在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是Web ...
- python用outlook自动发邮件_python使用两种发邮件的方式smtp和outlook示例
smtp是直接调用163邮箱的smtp服务器,需要在163邮箱中设置一下.outlook发送就是Python直接调用win32方式.调用程序outlook直接发送邮件. import win32com ...
- python通过outlook发送邮件_python使用两种发邮件的方式smtp和outlook示例
本篇文章主要介绍了python使用两种发邮件的方式smtp和outlook示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. smtp是直接调用163邮箱的smtp服务器,需要在163邮箱中设置 ...
- 二阶段补充:文件上传服务端处理,后端文件上传、前端两种文件上传方式
1.文件上传 2.后端文件上传 两种方案: 兼容性较好的commons-fileupload,支持所有版本的Servlet,即所有版本的Tomcat 优点: 兼容性 缺点 需要外部jar,比较麻烦.代 ...
- 在计算机系统中有两种不同的图像编码方式,第二章计算机系统与计算原理.ppt...
第二章计算机系统与计算原理 大学计算机基础 * 信息表示与处理 ----西文字符 ASCII 码是美国信息交换标准代码(American Standard Code for Information I ...
- TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable
TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable 目录 输出结果 代码设计 输出结果 代码设计 # tensorflow中的两种定义scope(命 ...
- php怎么获取分类数,php 两种获取分类树的方法
php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...
最新文章
- php新窗口打开链接,wordpress如何设置在新窗口打开链接
- 卢伟冰曝Redmi K50系列最新进展:天玑9000调校比较顺利
- C语言中结构体内存存储方式
- Python中fastapi构建的web项目进行docker部署
- 【细胞分割】基于matlab中值滤波+分水岭法细胞计数【含Matlab源码 640期】
- navicat执行.sql文件
- Linux抓包(wireshark+tcpdump)
- 统计学中p值计算公式_统计学中的p值怎么算,具体步骤
- 概率论 方差公式_数学提高方差的计算公式是什么
- arduino并口屏_74HC595等串口转并口芯片的Arduino实用封装
- 计算机硬盘如何制作成移动硬盘,电脑拆出来的闲置硬盘别扔 这么做帮你把它变成移动硬盘...
- node项目部署到云服务器
- javaFx(7)文本阅读器
- 201919102004张雪婷(第七次作业)
- 第二章 Spring MVC入门 —— 跟开涛学SpringMVC
- Python批量读取txt文件
- 有关联想拯救者Y7000重装window10系统
- PCB板区域裁剪及尺寸标注
- 攻防世界mfw解题wp
- 是什么原因让上海宝付感觉现在的钱越来越不经花?