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 }
复制代码

运行图:

目录
相关文章
|
2月前
|
边缘计算 监控 Java
跨境电商 API 对接避坑指南:亚马逊 SP-API 超时问题的 5 种解决方案(附重试代码模板)
在对接亚马逊 SP-API 时,超时问题常导致订单延迟、库存失败,影响运营。本文总结某 3C 品牌实战经验,详解超时的 3 大根源与 5 大解决方案,涵盖动态超时、重试机制、请求拆分、并发控制与边缘加速,并附可复用 Python 代码,助你将超时率从 20% 降至 1% 以下。
|
2月前
|
缓存 JSON API
VIN车辆识别码查询车五项 API 实践指南:让每一俩车有迹可循(Python代码示例)
VIN(车辆识别代码)是全球唯一的17位汽车标识码,可快速获取车架号、发动机号、品牌型号等核心信息。在二手车交易、保险理赔、维修保养等场景中,准确解析VIN有助于提升效率与风控能力。本文介绍VIN码结构、适用场景,并提供Python调用示例及优化建议,助力企业实现车辆信息自动化核验。
473 1
|
2月前
|
安全 API 数据安全/隐私保护
低代码革命:API无代码集成如何让企业“3天上线一个生态”?
在数字化转型浪潮中,API成为释放数据价值、提升企业效率的核心。本文详解API架构设计、安全实践与跨平台集成,为CTO提供效率提升指南,涵盖微服务、安全认证、协议选择、低代码集成及未来趋势,助力企业构建敏捷、安全、高效的数字生态。
|
2月前
|
自然语言处理 供应链 前端开发
深度解析与技术实践:高效调用淘宝商品评论API的策略与代码实现
本文深入解析淘宝开放平台商品评论接口(Taobao.item_review),涵盖接口功能、调用逻辑与实战代码,助力开发者高效获取用户评价数据,提升电商数据分析能力。
|
5月前
|
JSON 安全 Java
什么是用于REST API的JWT Bearer令牌以及如何通过代码和工具进行调试
在Web开发中,保护REST API至关重要,而JSON Web令牌(JWT)特别是JWT Bearer令牌,是一种高效方法。它通过紧凑、自包含的结构实现安全信息交换,提升用户体验。本文探讨JWT Bearer的基本概念、结构与实现,包括在Java中的应用步骤,以及使用Apipost和cURL进行测试的方法。JWT优势明显:无状态、互操作性强,适用于分布式系统。掌握JWT Bearer,可助开发者构建更安全、高效的API解决方案。
|
2月前
|
缓存 算法 API
从 0 实现 API 接口签名验证系统:基于 HMAC-SHA256 的防篡改方案(附 Python 全代码)
本文介绍基于 的 API 接口签名验证系统,实现防篡改与防重放攻击,包含完整设计原理、签名生成规则及可运行的 Python 客户端与服务端代码,并提供安全性优化与部署建议。
|
5月前
|
人工智能 JSON API
0代码将存量 API 适配 MCP 协议
本文主要讲述通过 Nacos+Higress 的方案实现0代码改造将 Agent 连接到存量应用,能够显著降低存量应用的改造成本。
818 44
0代码将存量 API 适配 MCP 协议
|
2月前
|
人工智能 供应链 物联网
效率提升300%:开放银行API驱动电商分账系统的“零代码”革命
在数字经济背景下,开放银行API与电商生态深度融合,推动支付清算与分账系统从封闭走向开放。通过技术解耦与系统重构,实现资金流、信息流与业务流的高效协同,提升支付效率与分账灵活性,助力电商场景创新。本文从技术驱动力、重构路径、实践案例与未来趋势四方面,解析这一变革的核心逻辑与落地价值。
|
5月前
|
安全 Java API
什么是用于 REST API 的 Bearer Token以及如何通过代码和工具进行调试
Bearer Token 是一种基于 OAuth 2.0 的身份验证机制,广泛应用于 REST API 的授权访问中。它通过在 HTTP 请求头中传递令牌,确保用户凭据安全传输并验证。本文深入解析了 Bearer Token 的概念、实现步骤及调试方法,包括其无状态特性、灵活性与安全性优势。同时,提供了 Java 实现示例和使用 Apipost、cURL 等工具测试的实践指导,帮助开发者掌握这一核心技能,保障 API 系统的安全与高效运行。
|
6月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~