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. 绑定hover事件

    <label> <span id="pattern">实战模式</span> <div class='tab' style="t ...

  2. spring学习(二)---依赖注入

    spring第二个特性是依赖注入. 学习依赖注入,首先应该明白两个问题:1,谁依赖谁:2,谁注入,注入什么? 首先还是看代码: 还是这个bean: package testSpring.busines ...

  3. python循环解压rar文件

    python循环解压rar文件 C:. │ main.py │ ├─1_STL_算法简介 │ STL_算法简介.rar │ └─2_STL_算法_填充新值 STL_算法_填充新值.rar 事情是这样的 ...

  4. JDBC&Oracle启动

    [Wed Apr 26 2017 16:05:11 GMT+0800]PLSQL Developer连接远程oracle配置(本地不安装客户端).在windows机器上不想安装oracle或者orac ...

  5. ICO图标下载地址

    http://findicons.com/ http://www.iconfont.cn/

  6. Djangoの1

    有ip无路由是404,ip也无是无法访问此网站.url中?前的是路由,?后是GET请求的各组参数.   子项目和子应用下的两类urls.py:[]内的各个路由函数url,其首参网址的开头无/,结尾有/ ...

  7. java持有对象-集合类

    面阿里的时候,面试就让我说一下集合 当时由于条件原因没听清面试官的问题,后来面试后,面试官让问他问题的时候,才说明白是什么 下面就接受一下我了解的集合类 集合类中大致可以分为两个体系 一.collec ...

  8. Windows的奇巧淫技(为什么GIF显示不出来??)

    谁的电脑里没点小秘密?东藏西藏到最后自己都找不到了有木有?今天教大家个隐藏文件的高招: 将任意文件隐藏到图片中!怎么样?再也不用建什么「马列主义哲学」的文件夹啦!

  9. 代码雨 html实现

    <!DOCTYPE html> <html>    <head>        <meta charset="utf-8">    ...

  10. Redis-09.慢查询

    慢查询指的是redis命令的执行时间,不包括网络传输和排队时间. Redis配置文件redis.conf中描述慢查询相关的选项在SLOW LOG部分 ######################### ...