代码一个一个的输入,有点累,但也充实。

感觉收获较多。

特别是书中将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当中的堆管理,虚拟内存及常规复制,移动,填充代码相关推荐

  1. windows 2000 堆管理的一点心得和体会

    windows 2000堆管理 较为复杂 基本是通过三种方式来管理堆 分别是sidealook  freelist  cache freelist是个双向连表 把同样大小的空闲的对快连接到一起 fre ...

  2. 使用Win API创建顶级菜单(不使用资源文件)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 最近使用Code::Blocks进行业余学习(VS200x对我的机子来说太庞大了).我就编编些Win API程序.Co ...

  3. Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  4. Libc堆管理机制及漏洞利用技术 (一)

    0×01 Libc堆浅析 1.1 堆管理结构 struct malloc_state {mutex_t mutex; /* Serialize access. */int flags; /* Flag ...

  5. C#用WebBrowser与WIN API辅助模拟获取网站完整Cookie

    网上找到的可以完整获取Cookie的方法,转载一下希望能帮助更多人. 亲测可用 在Winform中使用WebBrowser控件获取网站的Cookie有时候是不完整的,默认调用Document.Cook ...

  6. react调用api等待返回结果_React新Context API在前端状态管理的实践

    ### React新Context API在前端状态管理的实践 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redu ...

  7. 小内存堆管理算法详细解析

    1.小内存堆管理算法介绍 本文所介绍的内存堆管理是RT Thread操作系统中的小内存管理算法,参考mem.c源文件.这个程序适用于小内存的CPU,比如像STM32F这样的只有几十-几百KB内存的处理 ...

  8. Api接口的模块化管理

    Api接口的模块化管理 1.模块一 import axios from './axios' function login(){return axios.post('login'); } export ...

  9. 盘点 8 款好用的 API 接口文档管理工具

    随着互联网的普及和发展,API 接口已经无处不在.它已经在 Web 应用程序.移动应用程序.云计算.物联网.人工智能等领域中得到广泛应用. 例如,在金融行业中,API 接口可以被用于构建支付服务.银行 ...

最新文章

  1. jstat_使用jstat报告自定义JVM指标集
  2. WordPress的插件激活实现
  3. Azure与Scott Guthrie:Azure安全中心和基于角色的访问控制
  4. oracle job 与存储过程,应用oracle job和存储过程
  5. 基于windows使用fabric将gitlab的文件远程同步到服务器(本地)
  6. linux python2.7安装教程_Linux RedHat下安装Python2.7开发环境
  7. 安装详细步骤win7_windows安装器怎么安装原版win7【详细教程】
  8. Sicily 1156. Binary tree 解题报告
  9. 搭建dubbo客户端
  10. Winform开发全套31个UI组件开源共享
  11. [100124]红楼梦:林黛玉与北静王【硬盘版】[带全CG存档+攻略]
  12. limesurvey-怎么用
  13. 计算机 统计学考研,统计学考研科目有哪些
  14. 【操作系统】王道考研 笔记总结目录(完结)
  15. 【linux内核分析与应用-陈莉君】IO空间管理
  16. 国企直招,内推! 科陆电子--嵌入式工程师/C# 工程师
  17. 基金男孩女孩的「养基」心碎史
  18. SVN checkout 之后图标(绿色勾之类的)没有显示出来的问题
  19. 计算机应用基础与实训教程word2003文字处理软件 教学目标,计算机基础教学计划多篇...
  20. 【编译原理】Python语法分析LL(1)、LR(1)

热门文章

  1. JavaWeb监听器
  2. ue4 开发动作游戏_【图片】第三人称动作游戏开发日志【虚幻4吧】_百度贴吧
  3. Zookeeper分布式一致性原理(十一):Zookeeper在JStorm中应用
  4. c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果
  5. matlab如何模拟竹蜻蜓飞行,JSBSim_Matlab 将 与 进行联合仿真 模拟飞行计算 247万源代码下载- www.pudn.com...
  6. Nginx环境下PHP flush失效的解决方法
  7. Hadoop与Hbase基本配置
  8. linux inode详解
  9. 16第一章 ASP.Net编程基础知识
  10. PYTHON_DACORATOR