WIN32核心编程 - 内存管理 内存页面

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

目录

VirtualAlloc - VirtualFree

VirtualAllocEx - VirtualFreeEx

VirtualLock(Ex) - VirtualUnlock(Ex)

VirtualQuery(Ex)

Process Memory Information

VirtualProtect(Ex)

Heap - GetProcessHeap - HeapCreate - HeapAlloc - HeapReAlloc - HeapFree - HeapDestroy

Heap - HeapSize - GetProcessHeaps

Heap - Heap32ListFirst - Heap32First


VirtualAlloc - VirtualFree

#include <iostream>
#include <windows.h>int main() 
{//Cint* p1 = (int*)malloc(sizeof(int));if (p1 != NULL){std::cout << *p1 << std::endl;memset(p1, 0, sizeof(int));std::cout << *p1 << std::endl;*p1 = 0x12345678;std::cout << *p1 << std::endl;free(p1);p1 = nullptr;}//CPPint* p2 = new int(0xCC);if (p2 != NULL){std::cout << *p2 << std::endl;memset(p2, 0, sizeof(int));std::cout << *p2 << std::endl;*p2 = 0x12345678;std::cout << *p2 << std::endl;delete p2;p1 = nullptr;}//WIN32LPVOID lpBuffer = VirtualAlloc(/*(LPVOID)0x800000*/NULL, 0xFF, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (lpBuffer != NULL){memset(lpBuffer, 0xCC, 0xFF);BOOL bRet = VirtualFree(lpBuffer, 0, MEM_RELEASE);}//跨进程内存管理VirtualAllocEx;VirtualFreeEx;return 0;
}

VirtualAllocEx - VirtualFreeEx

#include <iostream>
#include <Windows.h>int main()
{DWORD dwPid = 65772;HANDLE hProcess = 0;LPVOID lpBase = 0;DWORD dwWriteData = 0;DWORD dwWriteLeng = 0;DWORD dwReadData = 0;DWORD dwReadLeng = 0;//打开进程hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);if (NULL == hProcess) return 0;//申请内存lpBase = VirtualAllocEx(hProcess, NULL, 0xFF, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (lpBase == NULL) return 0;//操作内存for (size_t i = 0; i < 0xFF; i++){CHAR szBuffer = i;WriteProcessMemory(hProcess, (PUCHAR)lpBase + i, &szBuffer, sizeof(CHAR), &dwWriteLeng);}ReadProcessMemory(hProcess, (LPVOID)0x400000, &dwReadData, sizeof(DWORD), &dwReadLeng);//释放资源VirtualFreeEx(hProcess, lpBase, 0, MEM_RELEASE);CloseHandle(hProcess);return 0;
}

VirtualLock(Ex) - VirtualUnlock(Ex)

#include <iostream>
#include <Windows.h>int main()
{//申请内存LPVOID lpBuffer = VirtualAlloc(NULL, 0xFF,MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (lpBuffer == NULL) return 0;//锁定页面VirtualLock(lpBuffer, 0xFF);//快速交互//解锁页面VirtualUnlock(lpBuffer, 0xFF);//释放内存VirtualFree(lpBuffer, 0, MEM_RELEASE);return 0;
}

VirtualQuery(Ex)

#include <iostream>
#include <Windows.h>int main()
{LPVOID lpBuffer = VirtualAlloc(NULL, 4097, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (lpBuffer != NULL){MEMORY_BASIC_INFORMATION mbi = { 0 };if (VirtualQuery((LPVOID)0x400000, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) != 0){return 0;}VirtualFree(lpBuffer, 0, MEM_RELEASE);}return 0;
}

Process Memory Information

#include <iostream>
#include <string>
#include <Windows.h>std::string StateToStr(DWORD State)
{switch (State){case MEM_COMMIT	: return "MEM_COMMIT";case MEM_FREE	: return "MEM_FREE";case MEM_RESERVE: return "MEM_RESERVE";default			: return "UNKONW_STATE";}
}std::string ProtectToStr(DWORD Protect)
{switch (Protect) {case PAGE_READONLY				: return "PAGE_READONLY";case PAGE_READWRITE				: return "PAGE_READWRITE";case PAGE_EXECUTE				: return "PAGE_EXECUTE";case PAGE_EXECUTE_READ			: return "PAGE_EXECUTE_READ";case PAGE_EXECUTE_READWRITE		: return "PAGE_EXECUTE_READWRITE";case PAGE_NOACCESS				: return "PAGE_NOACCESS";default							: return "UNKNOWN_PROTECT";}
}std::string TypeToStr(DWORD Type)
{switch (Type) {case MEM_IMAGE		: return "MEM_IMAGE";case MEM_MAPPED		: return "MEM_MAPPED";case MEM_PRIVATE	: return "MEM_PRIVATE";default				: return "UNKNOWN_TYPE";}
}int main()
{// 进程标识DWORD dwPid = 0;std::cout << "please input processid ";std::cin >> dwPid;// 打开进程HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);if (hProcess == NULL){std::cout << "OpenProcess Failed" << std::endl;return 0;}// 内存信息LPVOID lpBaseAddr = 0;MEMORY_BASIC_INFORMATION mbi;RtlZeroMemory(&mbi, sizeof(MEMORY_BASIC_INFORMATION));while (VirtualQueryEx(hProcess, lpBaseAddr, &mbi, sizeof(MEMORY_BASIC_INFORMATION))){printf("==============================\r\n");printf("BaseAddress				0x%08x\r\n", mbi.BaseAddress);printf("AllocationBase				0x%08x\r\n", mbi.AllocationBase);printf("AllocationProtect			%s\r\n", ProtectToStr(mbi.AllocationProtect).c_str());printf("RegionSize				0x%08x\r\n", mbi.RegionSize);printf("State					%s\r\n", StateToStr(mbi.State).c_str());printf("Protect					%s\r\n", ProtectToStr(mbi.Protect).c_str());printf("Type					%s\r\n", TypeToStr(mbi.Type).c_str());lpBaseAddr = (PUCHAR)mbi.BaseAddress + mbi.RegionSize;}return 0;
}

VirtualProtect(Ex)

#include <iostream>
#include <Windows.h>int main()
{// 页面大小SYSTEM_INFO si = { 0 };GetSystemInfo(&si);// 申请内存LPVOID lpBuffer = VirtualAlloc(NULL, si.dwPageSize, MEM_COMMIT, PAGE_READONLY);if (lpBuffer == NULL) return 1;// 修改属性DWORD dwOldProtect = 0;if (VirtualProtect(lpBuffer, si.dwPageSize, PAGE_READWRITE, &dwOldProtect) == NULL) return 1;// 数据写入memset(lpBuffer, 0xCC, si.dwPageSize);// 内存查询MEMORY_BASIC_INFORMATION mbi = { 0 };VirtualQuery(lpBuffer, &mbi, sizeof(MEMORY_BASIC_INFORMATION));// 属性恢复if (VirtualProtect(lpBuffer, si.dwPageSize, dwOldProtect, &dwOldProtect) == NULL) return 1;// 释放资源VirtualFree(lpBuffer, 0, MEM_RELEASE);return 0;
}

Heap - GetProcessHeap - HeapCreate - HeapAlloc - HeapReAlloc - HeapFree - HeapDestroy

#include <iostream>
#include <Windows.h>int main()
{// 进程默认堆HANDLE hHeap1 = GetProcessHeap();LPVOID lpBuffer1 = HeapAlloc(hHeap1, HEAP_ZERO_MEMORY, 4);if(lpBuffer1 == NULL) return 1;// 创建进程堆HANDLE hHeap2 = HeapCreate(0, 0x1000, 0x10000);if (hHeap2 == NULL) return 1;// 申请堆内存LPVOID lpBuffer2 = HeapAlloc(hHeap2, HEAP_ZERO_MEMORY, 16);if (lpBuffer2 == NULL){HeapDestroy(hHeap2);return 1;}memset(lpBuffer2, 0xCC, 16);// 扩大堆内存LPVOID lpBuffer3 = HeapReAlloc(hHeap2, 0, lpBuffer2, 32);if (lpBuffer3 == NULL){HeapFree(hHeap2, 0, lpBuffer2);HeapDestroy(hHeap2);return 1;}memset(lpBuffer3, 0xCC, 32);// 释放堆内存HeapFree(hHeap2, 0, lpBuffer2);// 释放堆句柄HeapDestroy(hHeap2);return 0;
}

Heap - HeapSize - GetProcessHeaps


#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>int main()
{// 进程默认堆HANDLE hHeap = GetProcessHeap();if (hHeap == NULL) return 1;// 申请堆内存LPVOID lpBuffer1 = HeapAlloc(hHeap, 0, 16);LPVOID lpBuffer2 = HeapAlloc(hHeap, 0, 32);// 内存块大小std::cout << HeapSize(hHeap, 0, lpBuffer1) << std::endl;std::cout << HeapSize(hHeap, 0, lpBuffer2) << std::endl;// 释放堆资源HeapFree(hHeap, 0, lpBuffer1);HeapFree(hHeap, 0, lpBuffer2);// 创建进程堆HeapCreate(0, 0x1000, 0x10000);// 进程堆数量DWORD dwHeapCount = GetProcessHeaps(0, NULL);if (dwHeapCount == NULL) return 1;PHANDLE pHeaps = new HANDLE[dwHeapCount];dwHeapCount = GetProcessHeaps(dwHeapCount, pHeaps);if (dwHeapCount == NULL) return 1;// 输出堆信息for (size_t i = 0; i < dwHeapCount; i++){std::cout << pHeaps[i] << std::endl;}delete[] pHeaps;CreateToolhelp32Snapshot;HEAPENTRY32;Heap32First;Heap32Next;return 0;
}

Heap - Heap32ListFirst - Heap32First

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>int main()
{// 创建堆的数据HANDLE hHeap = HeapCreate(0, 0x1000, 0x10000);// 获取进程标识DWORD dwPid = GetCurrentProcessId();// 创建内存快照HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, dwPid);if (hSnap == INVALID_HANDLE_VALUE) return EXIT_FAILURE;// 结构描述信息HEAPLIST32 hl = { 0 };hl.dwSize = sizeof(HEAPLIST32);HEAPENTRY32 he = { 0 };he.dwSize = sizeof(HEAPENTRY32);// 遍历堆的列表if (Heap32ListFirst(hSnap, &hl)){do{printf("========\r\n");//遍历块的数据if (Heap32First(&he, dwPid, hl.th32HeapID)){do{std::cout << he.dwAddress << "\t" << he.dwBlockSize << std::endl;} while (Heap32Next(&he));}} while (Heap32ListNext(hSnap, &hl));}return EXIT_SUCCESS;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473868.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2024年江苏省研究生数学建模竞赛B题火箭烟幕弹运用策略优化论文和代码分析

经过不懈的努力&#xff0c; 2024年江苏省研究生数学建模竞赛B题火箭烟幕弹运用策略优化论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模…

基于Java中的SSM框架实现计算机类考研院校推荐系统项目【项目源码+论文说明】

基于Java中的SSM框架实现计算机类考研院校推荐系统演示 摘要 在互联网时代人们获取信息的方式变得非常快捷&#xff0c;登录网站搜索就能快速查找到相关的信息&#xff0c;但是网络上面的信息数量非常庞大&#xff0c;有很多信息虽然和自己搜索的相关&#xff0c;但并不是自己…

猫狗图像分类-划分数据集

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

网络-calico问题分析

项目场景&#xff1a; calico-node日志提示 Failed to auto-detect host MTU - no interfaces matched the MTU interface pattern. To use auto-MTU, set mtuifacePattern to match your hosts’s interfaes. 同时&#xff0c;cali开头网卡的mtu是1440大小 原因分析&#xff…

强技能 展风采 促提升——北京市大兴区餐饮行业职工技能竞赛精彩呈现

6月19日&#xff0c;由大兴区总工会、区商务局、青云店镇人民政府联合主办&#xff0c;区服务工会、区餐饮行业协会承办的“传承中国技艺&#xff0c;打造新一代餐饮工匠”2024年大兴区餐饮行业职工职业技能竞赛决赛在北京华联创新学习中心隆重开幕。区总工会副主席郝泽宏&…

Alibaba Cloud Toolkit前端使用proxy代理配置

1、vscode 先安装插件 Alibaba Cloud Toolkit 2、前端代码&#xff1a; /personnel: {// target: http://xxx.xx.xxx.xx:9100, // 测试环境// target: http://xxx.xx.xxx.xx:9200, // 线上环境target: http://127.0.0.1:18002, // toolkit 代理changeOrigin: true,},3、打开插…

【Pyhton】读取寄存器数据到MySQL数据库

目录 步骤 modsim32软件配置 Navicat for MySQL 代码实现 步骤 安装必要的库&#xff1a;确保安装了pymodbus和pymysql。 配置Modbus连接&#xff1a;设置Modbus从站的IP地址、端口&#xff08;对于TCP&#xff09;或串行通信参数&#xff08;对于RTU&#xff09;。 连接M…

第三方商城对接重构(HF202407)

文章目录 项目背景一、模块范围二、问题方案1. 商品模块整体来说这块对接的不是太顺利,梳理了几条大概的思路:2. 订单模块3. 售后4. 发票5. 结算单经验总结项目背景 作为供应商入围第三方商城成功,然后运营了一段时间,第三方通知要重构, 需要重新对接打通接口完成系统对接…

gcc/g++的四步编译

目录 前言1.预处理&#xff08;进行宏替换&#xff09;2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成二进制文件&#xff09;4. 链接 &#xff08;生成可执行文件&#xff09;a. 动态库 && 动态链接b. 静态库 && 静态链接c. 验证d. 动静态链接…

SCI论文发表:构建清晰论文框架的10个原则 (附思维导图,建议收藏)

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 论文框架是什么&#xff1f;对我们完成一篇论文有哪些作用&#xff1f; 之前娜姐分享过一篇深圳湾实验室周耀旗教授关于论文写作的文章&#xff0c;他提出的第一个重要原则就…

VScode将界面语言设置为中文

1. 点击左侧的扩展图标&#xff0c;打开侧边栏“EXTENSIONS”面板。 2. 在搜索框中输入“Chinese”&#xff0c;查找出“中文简体”插件&#xff0c;点击“install”按钮。 3. 等待插件安装完成&#xff0c;点击右下角“restart”按钮&#xff0c;从而重新启动Vscode。

Linux多进程和多线程(七)进程间通信-信号量

进程间通信之信号量 资源竞争 多个进程竞争同一资源时&#xff0c;会发生资源竞争。 资源竞争会导致进程的执行出现不可预测的结果。 临界资源 不允许同时有多个进程访问的资源, 包括硬件资源 (CPU、内存、存储器以及其他外 围设备) 与软件资源(共享代码段、共享数据结构) …

【HTML入门】第二课 - head标签下的常见标签们

目录 1 本节概要 2 head下的常见标签 2.1 网页编码设置 2.2 网页的标题 2.3 样式标签 3 head标签的内容不会显示到网页上 4 查看网页源代码 1 本节概要 上一节&#xff0c;我们说了HTML网页最基本的框架标签&#xff0c;说到标签分为head头部和body身体部分。这一小节呢…

baomidou多数据源切换注解@DS没有效果

baomidou多数据源切换注解DS没有效果 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.1.1</version> </dependency> ##原因 方法上有Transaction…

代理模式的实现

1. 引言 1.1 背景 代理模式&#xff08;Proxy Pattern&#xff09;是一种常用的设计模式&#xff0c;它允许通过一个代理对象来控制对另一个对象的访问。在面向对象编程的框架中&#xff0c;代理模式被广泛应用&#xff0c;尤其在Spring框架的AOP&#xff08;面向切面编程&am…

Mongodb oplog的作用及如何评估和更改保留时间

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享。oplog …

【论文解读】AGENTLESS:揭开基于LLM的软件工程代理的神秘面纱,重塑软件工程自动化新基线

&#x1f4dc; 文献卡 英文题目: Agentless: Demystifying LLM-based Software Engineering Agents;作者: Chunqiu Steven Xia; Yinlin Deng; Soren Dunn; Lingming ZhangDOI: 10.48550/arXiv.2407.01489摘要翻译: 大型语言模型&#xff08;LLM&#xff09;的最新进展显著推进…

Python + OpenCV 开启图片、写入储存图片

这篇教学会介绍OpenCV 里imread()、imshow()、waitKey() 方法&#xff0c;透过这些方法&#xff0c;在电脑中使用不同的色彩模式开启图片并显示图片。 imread() 开启图片 使用imread() 方法&#xff0c;可以开启图片&#xff0c;imread() 有两个参数&#xff0c;第一个参数为档…

基于顺序表的通讯录实现

一、前言 基于已经学过的顺序表&#xff0c;可以实现一个简单的通讯录。 二、通讯录相关头文件 //Contact.h #pragma once#define NAME_MAX 20 #define TEL_MAX 20 #define ADDR_MAX 20 #define GENDER_MAX 20typedef struct PersonInfo {char name[NAME_MAX];char gender[G…

Hugging face Transformers(2)—— Pipeline

Hugging Face 是一家在 NLP 和 AI 领域具有重要影响力的科技公司&#xff0c;他们的开源工具和社区建设为NLP研究和开发提供了强大的支持。它们拥有当前最活跃、最受关注、影响力最大的 NLP 社区&#xff0c;最新最强的 NLP 模型大多在这里发布和开源。该社区也提供了丰富的教程…