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.mzph.cn/pingmian/42153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据Spark 面经

1: Spark 整体架构 Spark 是新一代的大数据处理引擎&#xff0c;支持批处理和流处理&#xff0c;也还支持各种机器学习和图计算&#xff0c;它就是一个Master-worker 架构&#xff0c;所以整个的架构就如下所示&#xff1a; 2: Spark 任务提交命令 一般我们使用shell 命令提…

Flutter-实现双向PK进度条

如何实现一个双向PK进度条 在Flutter应用中&#xff0c;进度条是一个非常常见的组件。而双向PK进度条则能够展示两个对立的数值&#xff0c;如对战中的双方得分对比等。本文将介绍如何实现一个具有双向PK效果的进度条&#xff0c;并支持竖直和斜角两种过渡效果。 1. 需求 我…

FMEA在大型光伏电站安全生产管理中的应用

一、FMEA概述 FMEA&#xff08;Failure Modes and Effects Analysis&#xff09;即失效模式和影响分析&#xff0c;是一种用于识别和分析产品或过程中潜在故障模式及其影响的方法。它通过对产品或过程中可能出现的故障模式进行系统性地梳理和分析&#xff0c;评估其可能的影响…

配置Nginx来代理多个Docker微服务组成统一的后台服务

配置Nginx来代理多个Docker微服务组成统一的后台服务可以通过以下步骤完成&#xff1a; 假设情境和准备工作 假设你有多个 Docker 容器&#xff0c;每个容器运行一个微服务&#xff0c;例如&#xff1a; 微服务1: 可以通过 http://localhost:8001 访问微服务2: 可以通过 htt…

并查集[讲课留档]

并查集&#xff08;DSU&#xff09; 一些可以实现合并和 查询的 集合。 简洁优雅的树型数据结构&#xff0c;主要用于解决一些元素分组的问题。可以管理一系列不相交的集合&#xff0c;并支持两种操作&#xff1a; 合并&#xff08;join&#xff09;&#xff1a;把两个不相交…

通过SDK使用百度智能云的图像生成模型SDXL

登录进入百度智能云控制台&#xff0c;在模型广场按照图像生成类别进行筛选&#xff0c;可以找到Stable-Diffusion-XL模型。点击Stable-Diffusion-XL模型的API文档后在弹出的新页面下拉可以找到SDK调用的说明。 import qianfandef sdxl(file: str, prompt: str, steps: int 2…

MySQL——PreparedStatement对象

PreparedStatement可以防止SQL注入&#xff0c;效率更高。 1. 增 public class TestInsert {public static void main(String[] args) throws SQLException {Connection conn null;PreparedStatement ps null;ResultSet rs null;try {conn jdbcUtils.getConnection();// …

矩阵分析与应用1-矩阵代数基础

矩阵分析与应用1-矩阵代数基础 1 矩阵的基本运算2 矩阵的初等变换3 向量空间、线性映射与Hilbert空间4 内积与范数5 随机向量6 矩阵的性能指标7 逆矩阵与伪逆矩阵8 Moore-Penrose逆矩阵9 矩阵的直和与Hadamard积10 Kronecker积与Khatri-Rao积11 向量化与矩阵化12 稀疏表示与压缩…

金丝键合强度测试仪试验条件要求:键合拉脱/引线拉力/剪切力等

金丝键合强度测试仪是测量引线键合强度&#xff0c;评估键合强度分布或测定键合强度是否符合有关的订购文件的要求。键合强度试验机可应用于采用低温焊、热压焊、超声焊或有关技术键合的、具有内引线的器件封装内部的引线-芯片键合、引线-基板键合或内引线一封装引线键合&#…

华为机试HJ23删除字符串中出现次数最少的字符

华为机试HJ23删除字符串中出现次数最少的字符 题目&#xff1a; 实现删除字符串中出现次数最少的字符&#xff0c;若出现次数最少的字符有多个&#xff0c;则把出现次数最少的字符都删除。输出删除这些单词后的字符串&#xff0c;字符串中其它字符保持原来的顺序。 想法&…

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

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

PostgreSQL和Mysql的对比

PostgreSQL 是一种功能强大、开源的对象关系型数据库管理系统&#xff0c;广泛用于企业级应用和复杂数据查询。以下是一些关于 PostgreSQL 的基本介绍及其主要特性&#xff1a; 基本介绍 开源和社区支持&#xff1a;PostgreSQL 是一个开源项目&#xff0c;有一个活跃的社区支…

【vue2】记录mounted里面某三个接口调完之后才能执行其他方法的写法

背景 vue2&#xff0c;异步操作并行运行 需求 某个页面现时需要一些接口请求回来的枚举值作为查询条件可供选择&#xff0c;然后将这些查询条件作为入参&#xff0c;请求列表数据。这就造成了我需要先调用枚举值接口&#xff0c;等枚举值接口调用完了&#xff0c;再调查询接…

Docker部署Seata与Nacos整合

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Docker部署Seata与Nacos整合 Docker 部署 Seata 与 Nacos 整合 运行所使用的 demo项目地址 …

提升系统稳定性:熔断、降级和限流策略详解

文章目录 前言一、熔断&#xff08;Circuit Breaker&#xff09;二、降级&#xff08;Degradation&#xff09;三、限流&#xff08;Rate Limiting&#xff09;四、应用案例五、小结推荐阅读 前言 随着互联网业务的快速发展&#xff0c;系统稳定性和高可用性成为现代分布式系统…

RedHat9 | Zabbix-Server监控服务部署

系统版本以及软件版本 使用的系统版本&#xff1a; Red Hat Enterprise Linux release 9.2 软件版本&#xff1a; zabbix-release-7.0-3.el9.noarchzabbix-web-7.0.0-release1.el9.noarchzabbix-web-mysql-7.0.0-release1.el9.noarchzabbix-web-deps-7.0.0-release1.el9.noar…

路径规划之基于二次规划的路径平滑Matlab代码

参考&#xff1a; 自动驾驶决策规划算法第二章第二节(上) 参考线模块_哔哩哔哩_bilibili 自动驾驶决策规划算法第二章第二节(下) 参考线代码实践_哔哩哔哩_bilibili QP函数&#xff0c;二次规划的逻辑 function [smooth_path_x,smooth_path_y] QP(path_x, path_y, w_cost_s…

STM32嵌入式工业机器人控制系统教程

目录 引言环境准备工业机器人控制系统基础代码实现&#xff1a;实现工业机器人控制系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 运动控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与优化问题解决方案与优化收尾与总结 1. 引言 工业机器人控制系统…

element表格高度撑开div滚动失效解决方案

描述&#xff1a;当显示区域小于表格列表显示内容时 列表完全撑开表格 无法触发el-table组件的滚动事件 解决&#xff1a;包裹表格的div&#xff0c;加上display: flex;flex-direction: column;即可 <template><div class"table-wrap table-scrollable"&g…

Bahdanau 注意力中上下文变量 ′的公式解释

公式 (10.4.1) 是 Bahdanau 注意力模型中的一个关键公式&#xff0c;用于计算在解码时间步 ( t’ ) 的上下文变量 (\mathbf{c}_{t’})&#xff1a; [ \mathbf{c}{t’} \sum{t1}^T \alpha(\mathbf{s}_{t’ - 1}, \mathbf{h}_t) \mathbf{h}_t ] 下面对公式进行详细解释&#x…