WIN API当中的堆管理,虚拟内存及常规复制,移动,填充代码
代码一个一个的输入,有点累,但也充实。
感觉收获较多。
特别是书中将C标准库的malloc最终调用的是HeapAlloc函数。
而相对于堆内存管理负责的HeapAlloc(GlobalAlloc,LocalAlloc),属于虚拟内存管理范围的VirtualAlloc更底层。
这对理解操作系统实现及以后的软件性能及内存泄漏调度,更有帮助。
Heap.c
1 #include <Windows.h> 2 #include <stdio.h> 3 4 #define MEM_BLOCK_SIZE 32 5 6 BOOL ShowMemContent(LPVOID, SIZE_T); 7 int main(void) 8 { 9 HANDLE hHeap = GetProcessHeap(); 10 LPVOID lpSrc; 11 LPVOID lpDis; 12 13 lpSrc = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE); 14 lpDis = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE); 15 16 printf("HeapAlloc distribut but not make zero: \n"); 17 ShowMemContent(lpDis, MEM_BLOCK_SIZE); 18 19 ZeroMemory(lpDis, MEM_BLOCK_SIZE); 20 printf("ZeroMemory make zero: \n"); 21 ShowMemContent(lpDis,MEM_BLOCK_SIZE); 22 23 FillMemory(lpSrc, MEM_BLOCK_SIZE, 0xBB); 24 FillMemory(lpSrc, MEM_BLOCK_SIZE/2, 0xAA); 25 CopyMemory(lpDis, lpSrc, MEM_BLOCK_SIZE); 26 27 printf("FillMemory fill Memory: \n"); 28 ShowMemContent(lpDis,MEM_BLOCK_SIZE); 29 30 HeapFree(hHeap, 0, lpSrc); 31 HeapFree(hHeap, 0, lpDis); 32 return 0; 33 } 34 35 BOOL ShowMemContent(LPVOID lpMem, SIZE_T dwSize) 36 { 37 BYTE lpShow[MEM_BLOCK_SIZE]; 38 INT i; 39 40 if(dwSize > MEM_BLOCK_SIZE) 41 { 42 printf("over-flow!"); 43 return FALSE; 44 } 45 46 CopyMemory((LPVOID)lpShow, lpMem, dwSize); 47 for(i = 0; i < dwSize; i++) 48 { 49 printf("%.2x",lpShow[i]); 50 if(!((i+1)%16)) 51 { 52 printf("\n"); 53 } 54 } 55 printf("\n"); 56 return TRUE; 57 }
Virtual.c
1 #include <Windows.h> 2 #include <stdio.h> 3 4 int main(void) 5 { 6 SIZE_T sizeVirtual = 4000; 7 LPVOID lpRound = (LPVOID)0x100000FF; 8 MEMORY_BASIC_INFORMATION mbi; 9 10 LPVOID lpAddress = VirtualAlloc( 11 lpRound, sizeVirtual, 12 MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE13 ); 14 if(lpAddress == NULL) 15 { 16 printf("VirtualAlloc error: %d\n",GetLastError()); 17 return 1; 18 } 19 printf("Alloc:MEM_COMMIT|MEM_RESERVE\n"); 20 CopyMemory(lpAddress, "Hello", lstrlen("Hello")); 21 printf("Alloction,Copy sucess.address: 0x%.8x, content: %s\n",lpAddress, lpAddress); 22 VirtualQuery(lpAddress, &mbi, sizeof(mbi)); 23 printf("Information from VirtualQuery: \n" 24 "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t" 25 "AllocationProtect:0x%.8x\tRegionSize:%u\t" 26 "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n", 27 mbi.BaseAddress,mbi.AllocationBase, 28 mbi.AllocationProtect,mbi.RegionSize, 29 mbi.State,mbi.Protect,mbi.Type 30 ); 31 32 printf("Free: DECOMMIT\n"); 33 if(!VirtualFree(lpRound, sizeVirtual, MEM_DECOMMIT)) 34 { 35 printf("VirtualFree error: %d",GetLastError()); 36 return 1; 37 } 38 39 VirtualQuery(lpAddress, &mbi, sizeof(mbi)); 40 printf("Information from VirtualQuery: \n" 41 "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t" 42 "AllocationProtect:0x%.8x\tRegionSize:%u\t" 43 "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n", 44 mbi.BaseAddress,mbi.AllocationBase, 45 mbi.AllocationProtect,mbi.RegionSize, 46 mbi.State,mbi.Protect,mbi.Type 47 ); 48 49 printf("Free:RELEASE\n"); 50 if(!VirtualFree(lpAddress, 0, MEM_RELEASE)) 51 { 52 printf("VirtualFree error: %d",GetLastError()); 53 return 1; 54 } 55 return 0; 56 }
MemOp.c
1 #include <Windows.h> 2 #include <stdio.h> 3 4 #define MEM_BLOCK_SIZE 32 5 6 BOOL ShowMemContent(LPVOID, SIZE_T); 7 int main(void) 8 { 9 HANDLE hHeap = GetProcessHeap(); 10 LPVOID lpSrc; 11 LPVOID lpDis; 12 13 lpSrc = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE); 14 lpDis = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE); 15 16 printf("HeapAlloc distribut but not make zero: \n"); 17 ShowMemContent(lpDis, MEM_BLOCK_SIZE); 18 19 ZeroMemory(lpDis, MEM_BLOCK_SIZE); 20 printf("ZeroMemory make zero: \n"); 21 ShowMemContent(lpDis,MEM_BLOCK_SIZE); 22 23 FillMemory(lpSrc, MEM_BLOCK_SIZE, 0xBB); 24 FillMemory(lpSrc, MEM_BLOCK_SIZE/2, 0xAA); 25 CopyMemory(lpDis, lpSrc, MEM_BLOCK_SIZE); 26 27 printf("FillMemory fill Memory: \n"); 28 ShowMemContent(lpDis,MEM_BLOCK_SIZE); 29 30 HeapFree(hHeap, 0, lpSrc); 31 HeapFree(hHeap, 0, lpDis); 32 return 0; 33 } 34 35 BOOL ShowMemContent(LPVOID lpMem, SIZE_T dwSize) 36 { 37 BYTE lpShow[MEM_BLOCK_SIZE]; 38 INT i; 39 40 if(dwSize > MEM_BLOCK_SIZE) 41 { 42 printf("over-flow!"); 43 return FALSE; 44 } 45 46 CopyMemory((LPVOID)lpShow, lpMem, dwSize); 47 for(i = 0; i < dwSize; i++) 48 { 49 printf("%.2x",lpShow[i]); 50 if(!((i+1)%16)) 51 { 52 printf("\n"); 53 } 54 } 55 printf("\n"); 56 return TRUE; 57 }
运行图:
WIN API当中的堆管理,虚拟内存及常规复制,移动,填充代码相关推荐
- windows 2000 堆管理的一点心得和体会
windows 2000堆管理 较为复杂 基本是通过三种方式来管理堆 分别是sidealook freelist cache freelist是个双向连表 把同样大小的空闲的对快连接到一起 fre ...
- 使用Win API创建顶级菜单(不使用资源文件)
作者:朱金灿 来源:http://blog.csdn.net/clever101 最近使用Code::Blocks进行业余学习(VS200x对我的机子来说太庞大了).我就编编些Win API程序.Co ...
- Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- Libc堆管理机制及漏洞利用技术 (一)
0×01 Libc堆浅析 1.1 堆管理结构 struct malloc_state {mutex_t mutex; /* Serialize access. */int flags; /* Flag ...
- C#用WebBrowser与WIN API辅助模拟获取网站完整Cookie
网上找到的可以完整获取Cookie的方法,转载一下希望能帮助更多人. 亲测可用 在Winform中使用WebBrowser控件获取网站的Cookie有时候是不完整的,默认调用Document.Cook ...
- react调用api等待返回结果_React新Context API在前端状态管理的实践
### React新Context API在前端状态管理的实践 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redu ...
- 小内存堆管理算法详细解析
1.小内存堆管理算法介绍 本文所介绍的内存堆管理是RT Thread操作系统中的小内存管理算法,参考mem.c源文件.这个程序适用于小内存的CPU,比如像STM32F这样的只有几十-几百KB内存的处理 ...
- Api接口的模块化管理
Api接口的模块化管理 1.模块一 import axios from './axios' function login(){return axios.post('login'); } export ...
- 盘点 8 款好用的 API 接口文档管理工具
随着互联网的普及和发展,API 接口已经无处不在.它已经在 Web 应用程序.移动应用程序.云计算.物联网.人工智能等领域中得到广泛应用. 例如,在金融行业中,API 接口可以被用于构建支付服务.银行 ...
最新文章
- jstat_使用jstat报告自定义JVM指标集
- WordPress的插件激活实现
- Azure与Scott Guthrie:Azure安全中心和基于角色的访问控制
- oracle job 与存储过程,应用oracle job和存储过程
- 基于windows使用fabric将gitlab的文件远程同步到服务器(本地)
- linux python2.7安装教程_Linux RedHat下安装Python2.7开发环境
- 安装详细步骤win7_windows安装器怎么安装原版win7【详细教程】
- Sicily 1156. Binary tree 解题报告
- 搭建dubbo客户端
- Winform开发全套31个UI组件开源共享
- [100124]红楼梦:林黛玉与北静王【硬盘版】[带全CG存档+攻略]
- limesurvey-怎么用
- 计算机 统计学考研,统计学考研科目有哪些
- 【操作系统】王道考研 笔记总结目录(完结)
- 【linux内核分析与应用-陈莉君】IO空间管理
- 国企直招,内推! 科陆电子--嵌入式工程师/C# 工程师
- 基金男孩女孩的「养基」心碎史
- SVN checkout 之后图标(绿色勾之类的)没有显示出来的问题
- 计算机应用基础与实训教程word2003文字处理软件 教学目标,计算机基础教学计划多篇...
- 【编译原理】Python语法分析LL(1)、LR(1)
热门文章
- JavaWeb监听器
- ue4 开发动作游戏_【图片】第三人称动作游戏开发日志【虚幻4吧】_百度贴吧
- Zookeeper分布式一致性原理(十一):Zookeeper在JStorm中应用
- c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果
- matlab如何模拟竹蜻蜓飞行,JSBSim_Matlab 将 与 进行联合仿真 模拟飞行计算 247万源代码下载- www.pudn.com...
- Nginx环境下PHP flush失效的解决方法
- Hadoop与Hbase基本配置
- linux inode详解
- 16第一章	ASP.Net编程基础知识
- PYTHON_DACORATOR