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_READWRITE

13         );
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 }

运行图:

时间: 2024-09-11 10:39:46

WIN API当中的堆管理,虚拟内存及常规复制,移动,填充代码的相关文章

Win8当中的游戏管理器

  从Vista开始,Windows就引入了游戏管理器作为整合所有游戏的一个工具.至少Windows 自带的扫雷,纸牌等等都包含在其中.但是Windows8引入了Windows UI,经典的游戏都以应用的方式出现在市场当中,而不是系统自带的了.那么Win8还有游戏管理器么? 我也是在使用的时候偶然发现了Windows 8并没有将游戏管理器去掉,而是正常的情况下搜索不到,下面就来说说怎么把Windows 8当中的游戏管理器调出来: 在桌面或者其他空白处点击右键,调出右键菜单,其中选择新建快捷方式,

显示-请教C#如何领用Win API将窗体绘制为椭圆

问题描述 请教C#如何领用Win API将窗体绘制为椭圆 如题,请教C#如何领用Win API将窗体绘制为椭圆,利用paint事件绘制的在系统特别卡的时候总是先显示长方形的窗体在编程椭圆的,有没有避免这种情况的方法 解决方案 和Paint没有关系,有专门的API来剪裁窗体 http://www.doc88.com/p-046807075488.html 解决方案二: 和Paint没有关系,有专门的API来剪裁窗体 http://www.doc88.com/p-046807075488.html

试来试去,WIN下最简单的WIN API开发工具,Pelles C就好啦

昨晚试过N个,不是太大,就是不容易和WIN API集成. 今早一试就灵了个.... Pelles C. Pelles C是一款windows下的C IDE,支持调试,且为免费.它有一个高效率的链接器,目前已被广泛采用为各种语言的后台链接器使用LCC作为编译器并且完整支持win32编程,支持任何API调用,包含所有winAPI的库且含有完整 C Runtime Library. /*----------------------------------------------------------

C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基于JSON数据格式的Web API接口,在我之前的几篇随笔中,对这方面都有一定的介绍,本篇继续这个主题,细致深入的阐述如何在接口和源码的基础上整合Web API.微信后台管理及前端微信小程序的应用方案. 1.基于Web API的微信开发框架 首先我们各个业务模块,都应该围绕着Web API进行展开,

datagridview1-怎么将dataGridView1的数据插入到数据库当中去,老师叫我们写这个,求段代码

问题描述 怎么将dataGridView1的数据插入到数据库当中去,老师叫我们写这个,求段代码 怎么将dataGridView1的数据插入到数据库当中去,老师叫我们写这个,求段代码 解决方案 先循环每一行dataGridView1.Rows(DataGridViewRow表示每一行,具体单词不记得了), 然后通过该行的对象.Cells[列的索引].value拿到每一列的值, 然后自己组装对象添加到数据库中

如何通过SmartCloud Enterprise+API执行基本的管理任务

IBM http://www.aliyun.com/zixun/aggregation/13696.html">SmartCloud Enterprise+ 的用户可通过一个基于集成服务管理的 (ISM) 的 Web 门户来创建和管理虚拟资产.大部分门户功能都可以通过 API 进行使用.通过使用这些 API,您可以用一个程序来控制 SmartCloud Enterprise+ 资源的创建和维护.SmartCloud Enterprise+ 云解决方案可自动置备.扩展和重新配置. Smart

如何用Win XP自带“磁盘管理”进行分区操作

  在同众多电脑新手的交往中,发现他们最大的苦恼是Windows系统过于庞大,学起来不知道从何入手. 其实Windows看似庞大,却也是由一个个模块组成,要精通Windows就要从模块着手.在Windows中,"控制面板"是相当重要的一个模块,对于新手来说,从"控制面板"入手逐步了解Windows操作很有必要. "磁盘管理"不简单 "磁盘管理"是控制面板"计算机管理"中的一个重要组件.利用磁盘管理工具可以一

程序屏蔽了Win Api SendMessage函数,如何模拟在目标窗体键盘输入?

问题描述 是这样的,我做了个测试程序目的是通过c#程序A发送消息到Delphy程序B,实现自动登陆功能.我通过Spy++获得了程序B的窗体句柄信息,通过c#调用WinApi函数FindWindow和FindWindowEx等等程序步骤如下:1.首先通过标题找到了父窗体2.再通过窗体标题和类名找到了子窗体3.再最大化窗体4.将窗体置于顶层5将窗体置于首页6.并通过枚举窗体内的控件找到了文本输入框TEdit7.通过EnumWindowChild的回调函数将字符串通过SendMessage发送给找到的

有关WIN API函数 FtpPutFile

问题描述 这个api函数,返回的是true,false,问:如果返回false,表示放文件失败是指没有放到ftp服务器上,还是已经在ftp服务器上创建了要传送的文件,但是内容没有写完? 解决方案 解决方案二:if(!FtpPutFile(...)){InternetErrorOut(hDlg,GetLastError(),TEXT("FtpGetFile"));}显示错误对话框.GetLastError()会返回如下错误号ERROR_INTERNET_HTTP_TO_HTTPS_ON_