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. 山东省ACM多校联盟省赛个人训练第六场 poj 3335 D Rotating Scoreboard

    山东省ACM多校联盟省赛个人训练第六场 D Rotating Scoreboard https://vjudge.net/problem/POJ-3335 时间限制:C/C++ 1秒,其他语言2秒 空 ...

  2. C语言内存四区的学习总结(二)---- 堆区

    接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...

  3. WPF中的数据绑定

    WPF中的数据绑定 基础概念 System.Windows.Data.Binding,他会把两个对象(UI对象与UI对象之间,UI对象与.NET数据对象之间)按照指定的方式粘合在一起,并在他们之间建立 ...

  4. Git使用(二、分支的创建和上传)

    介绍使用TortoiseGit创建分支并push到gitlab项目库,转载请注明出处. 一.创建一个新的文件夹,把要待编辑的工程从gitlab上pull到该文件夹. 其中URL从gitlab的对应项目 ...

  5. java开发师笔试面试每日12题(1)

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设计 ...

  6. MySQL数据库(三)索引总结

    一.什么是索引?  索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存. 如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录 ...

  7. What's the Difference Between Iterators and Generators in Python

    https://www.quora.com/Whats-the-difference-between-iterators-and-generators-in-Python

  8. Astrology PHP 框架

    1.Web 服务器配置 PHP 支持 URL Rewrite.PATH_INFO 2.环境需求 PHP 7.2+ 扩展:gettext 3.目录结构 + src | - autoload.php | ...

  9. 画PCB之电流与线宽的关系

    来源:(多图) 超强整理!PCB设计之电流与线宽的关系http://www.51hei.com/bbs/dpj-39134-1.html 关于PCB线宽和电流的经验公式,关系表和软件网上都很多,本文把 ...

  10. Vue笔记整理——第一天

    1.为什么学习Vue? 提高开发效率. 提高效率历程:原生js——>jq(解决兼容性)——>前端模板引擎——>Vue.js(减少DOM操作,注重数据业务逻辑). 2.框架与库的区别? ...