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++实现)的更多相关文章

  1. Windows编程之进程遍历(C++实现)

    Windows编程之进程遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历进程需要几个API,和一个结构体 1.创建进程快照 2.遍历首次进程 3.继续下次遍历 4.进程信息结构体 API 分 ...

  2. [Windows编程]模块遍历

    模块遍历 整体思路 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 相关API的调用 创建进程快照API HANDLE WINAPI CreateToolhelp32Snap ...

  3. MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

    1.1 Windows编程模型 为传统的操作系统编写的程序使用的是过程化模型,即程序从头到尾按顺序执行.例如C程序,从main函数入口开始执行,中间调用不同的函数一直到程序结束返回,这种过程是程序本身 ...

  4. 《Windows编程零基础学》第零节

    首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...

  5. windows编程 进程的创建销毁和分析

    Windows程序设计:进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,在Windows编程环境下,主要由两大元素组成: • 一个是操作系统用来管理进程的内核对象.操作系统使用内 ...

  6. Windows编程

    本文整理自百科.知乎与 科学家的世界 问题一:为什么开发windows应用程序不用c 而用.net,java,c++? 用 c+windows API  开发windows 应用程序  比用.net, ...

  7. Windows编程 Windows程序的生与死(上)

    引子 “Windows 程序分为‘程序代码’和‘UI(User Interface)资源’两大部份,两部份最后以RC编译器(资源编译器)整合为一个完整的EXE 文件.所谓UI 资源是指功能菜单.对话框 ...

  8. 资源在windows编程中的应用----菜单

    资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...

  9. 3.C++逐行读取txt文件数据,利用getline -windows编程

      引言:今天学会了getline的用法,顺手编写一个逐行读取txt文件的程序.关于getline的用法可以看我之前的博客:2.C++标准库函数:getline函数 定界流输入截取函数 -zobol的 ...

随机推荐

  1. python实现简单动画——生命游戏

    生命游戏 生命游戏的宇宙是一个无限的,其中细胞的二维正交网格,每个细胞处于两种可能的状态之一,即*活着*或*死亡*(分别是*人口稠密*和*无人居住*).每个细胞与它的八个邻居相互作用,这八个邻居是水平 ...

  2. JavaScript基础视频教程总结(081-090章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. HTTP二、HTTP请求处理过程的七个步骤

      HTTP02 HTTP请求处理过程的七个步骤     1.web服务处理步骤 web服务的处理过程可总结为七个步骤:   1)发起请求:客户端向服务器端发起连接请求,建立”三次握手“: 2)接收请 ...

  4. 利用UiWatchers 监听解决安卓自动化各种自动化各种非期待弹窗,弹层,升级,广告,对话框,来电等问题

    app自动化时,各种不期待的弹层弹窗,升级广告等时有飞出,由于弹窗具有不定时,不定页面等很多不确定性.有的弹窗很不友好,不×掉,很难进行下一步操作,造成 测试用例失败.而判断是否有弹窗,弹层很麻烦.研 ...

  5. android 界面设计

    wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetric ...

  6. matplotlib&numpy画图

    import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,6,100) y=np.cos(2*np.pi*x)*np.exp ...

  7. VSCode插件开发全攻略(八)代码片段、设置、自定义欢迎页

    更多文章请戳VSCode插件开发全攻略系列目录导航. 代码片段 代码片段,也叫snippets,相信大家都不陌生,就是输入一个很简单的单词然后一回车带出来很多代码.平时大家也可以直接在vscode中创 ...

  8. 细说SpringDI Setter注入

    依赖注入(DI)是一个过程,通过这个过程,对象可以通过构造函数参数,工厂方法的参数或者在构造或返回对象实例后设置的属性来定义它们的依赖关系从工厂方法.然后容器在创建bean时注入这些依赖关系.这个过程 ...

  9. 每天学点SpringCloud(十一):Hystrix仪表盘

    在SpringCloud学习系列博客第六篇文章中,我们已经学习了Hystrix的使用,但是那篇文章中有一点遗漏没有讲,那就是Hystrix Dashboard ,它可以实时的监控Hystrix的运行情 ...

  10. 10分钟看懂Docker和K8S

    本文来源:鲜枣课堂 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的 ...