Windows编程之模块遍历(C++实现)
Windows编程之模块遍历
PS: 主要扣代码使用,直接滑动到最下面使用.
遍历模块需要几个API,和一个结构体
1.创建进程快照
2.遍历首次模块
3.继续下次遍历
4.模块信息结构体
API 分别是:
1.创建进程快照
HANDLE WINAPI CreateToolhelp32Snapshot( 进程快照API
DWORD dwFlags, 遍历的标志,表示你要遍历什么(进程,模块,堆...)
DWORD th32ProcessID 遍历的进程ID,如果为0,则是当前进程,如果不为0,则是创建指定进程的快照进行遍历
);
注意,创建进程快照需要包含头文件 Tlhelp32.h
返回值:
成功返回快照句柄
失败返回 INVALID_HANDLE_VALUE
2.遍历首次模块.
BOOL WINAPI Module32First(
HANDLE hSnapshot, 快照句柄
LPMODULEENTRY32 lpme 模块信息结构体
);
模块信息结构体
对我们有用的就是
dwSize 初始化结构体的大小
th32ProcessId 进程ID
szExeFile[MAX_PATH] 进程路径 3.遍历下一次进程
BOOL WINAPI Process32Next(
HANDLE hSnapshot, 进程句柄
LPPROCESSENTRY32 lppe 进程信息结构体
);
typedef struct tagMODULEENTRY32 {
DWORD dwSize; 大小,第一次使用必须初始化
DWORD th32ModuleID; 进程模块标识符
DWORD th32ProcessID; 进程ID
DWORD GlblcntUsage; 全局模块使用次数
DWORD ProccntUsage; 模块的引用计数
BYTE * modBaseAddr; 模块的基址
DWORD modBaseSize; 模块的大小
HMODULE hModule; 模块的句柄
TCHAR szModule[MAX_MODULE_NAME32 + ]; 模块名称的字符串
TCHAR szExePath[MAX_PATH]; 模块路径字符串
} MODULEENTRY32;
typedef MODULEENTRY32 *PMODULEENTRY32;
这个常用的也很多
模块基址 模块大小 模块句柄 模块名称,以及模块路径等等.
兼容代码,遍历自己进程模块(DLL)
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
MODULEENTRY32 mi;
mi.dwSize = sizeof(MODULEENTRY32); //第一次使用必须初始化成员
BOOL bRet = Module32First(hSnapshot,&mi);
while (bRet)
{
/*
循环遍历添加自己的额外代码
*/ bRet = Module32Next(hSnapshot,&mi);
}
return ;
}
兼容代码,遍历指定进程模块
思路:
1.获取你想要遍历的进程ID (可以通过遍历进程,也可以通过通过句柄获得进程ID)
2.创建进程快照,第一个参数传入遍历模块,第二个参数传入你想要遍历进程的ID
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
if (INVALID_HANDLE_VALUE == hProcessSnapshot)
{
return ;
}
DWORD dwPid = ;
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32);
BOOL Ret = Process32First(hProcessSnapshot,&pi);
while (Ret)
{
if (strcmp("QQ.exe",pi.szExeFile) == )
{
dwPid = pi.th32ProcessID;
break;
}
Ret = Process32Next(hProcessSnapshot,&pi);
}
CloseHandle(hProcessSnapshot); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPid);//上面获取了进程PID,下面使用即可.
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
MODULEENTRY32 mi;
mi.dwSize = sizeof(MODULEENTRY32); //第一次使用必须初始化成员
BOOL bRet = Module32First(hSnapshot,&mi);
while (bRet)
{
/*
循环遍历添加自己的额外代码
*/ bRet = Module32Next(hSnapshot,&mi);
}
CloseHandle(hSnapshot);
return ;
}
Windows编程之模块遍历(C++实现)的更多相关文章
- Windows编程之进程遍历(C++实现)
Windows编程之进程遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历进程需要几个API,和一个结构体 1.创建进程快照 2.遍历首次进程 3.继续下次遍历 4.进程信息结构体 API 分 ...
- [Windows编程]模块遍历
模块遍历 整体思路 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 相关API的调用 创建进程快照API HANDLE WINAPI CreateToolhelp32Snap ...
- MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型
1.1 Windows编程模型 为传统的操作系统编写的程序使用的是过程化模型,即程序从头到尾按顺序执行.例如C程序,从main函数入口开始执行,中间调用不同的函数一直到程序结束返回,这种过程是程序本身 ...
- 《Windows编程零基础学》第零节
首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...
- windows编程 进程的创建销毁和分析
Windows程序设计:进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,在Windows编程环境下,主要由两大元素组成: • 一个是操作系统用来管理进程的内核对象.操作系统使用内 ...
- Windows编程
本文整理自百科.知乎与 科学家的世界 问题一:为什么开发windows应用程序不用c 而用.net,java,c++? 用 c+windows API 开发windows 应用程序 比用.net, ...
- Windows编程 Windows程序的生与死(上)
引子 “Windows 程序分为‘程序代码’和‘UI(User Interface)资源’两大部份,两部份最后以RC编译器(资源编译器)整合为一个完整的EXE 文件.所谓UI 资源是指功能菜单.对话框 ...
- 资源在windows编程中的应用----菜单
资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...
- 3.C++逐行读取txt文件数据,利用getline -windows编程
引言:今天学会了getline的用法,顺手编写一个逐行读取txt文件的程序.关于getline的用法可以看我之前的博客:2.C++标准库函数:getline函数 定界流输入截取函数 -zobol的 ...
随机推荐
- logstash报错 :backtrace=>["org/jruby/RubyIO.java:1457:in `write'", "org/jruby/RubyIO.java:1428:in `write'"
报错: [2019-04-16T15:54:07,827][FATAL][logstash.runner ] An unexpected error occurred! {:error=>#&l ...
- error: failed to push some refs to 'https://gitee.com/xxx/xxx'
一开始以为是本地版本和线上的差异 果断先直接pull 之后 还是不对,哎 不瞎搞了 搜... 获得消息: git pull --rebase origin master 原来如此:是缺失了文件
- python pandas.DataFrame.append
1.使用append首先要注意的是,你要合并两个DataFrame的columns即列名是否是相同的,不相同的就会报错. 2.我们会发现DataFrame的列名是不能够重复的,而行名(index)是可 ...
- 隐藏Spring Elements
Spring Elements 显示出来很烦,如何隐藏
- Day09 (黑客成长日记) 爬虫入门
爬虫的基本流程: 发起请求通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应 获取响应内容如果服务器能正常响应,会得到一个Respon ...
- Maths | 层次分析法(Analytic Hierarchy Process)
目录 1. 概述 2. AHP算法 2.1. 建立层级 2.2. 构造 成对 比较 矩阵 2.3. 成对比较矩阵的 一致性检验 与 层次单排序 2.4. 层次总排序 参考: (中文)https://z ...
- [swarthmore cs75] Lab 0 Warmup & Basic OCaml
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下 ...
- python按照指定字符或者长度 截取字符串
1.截取指定位置字符串 Python字符串可以理解为一个数组,获取某一部分的可以使用 str[beginIndex:endPosition],其中str为需要截取的字符串,beginIndex为需要截 ...
- Centos 安装 mysql yum
http://www.cnblogs.com/007sx/p/7083143.html https://www.linode.com/docs/databases/mysql/how-to-insta ...
- PowerBI
1.官方PowerBI实例:https://docs.microsoft.com/zh-cn/power-bi/sample-tutorial-connect-to-the-samples 2.配置计 ...