分配与释放可读可写的虚拟内存页面
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于visual c++之windows核心编程代码分析(6)分配和释放可读可写地虚拟内存页面
分类:VC++编程技术Visual C++2010编程技术Windows8Visual Studio20122011-12-16 21:40112人阅
读评论(0)收藏举报我们在进行Windows核心编程,经常要用到读取虚拟内存.
我们来亲自实践一个分配与释放可读可写地虚拟内存页面,请见代码实现与注释讲解. view plaincopy to clipboardprint?b5E2R。
1.#include
2.#include
3.
4./*************************************
5.* int main(void)
6.* 功能演示虚拟内存地使用
7.*
8.* 参数未使用
9.**************************************/
10.int main(void)
11.{
12.SIZE_T sizeVirtual = 4000; //大小
13.LPVOID lpRound = (LPVOID)0x100000FF; //地址
14. MEMORY_BASIC_INFORMATION mbi; //内存信息
15.
16. //分配内存,直接分配已提交地内存
17.LPVOID lpAddress = VirtualAlloc(
18. lpRound,sizeVirtual,
19. MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE
20. );
21. if(lpAddress == NULL)
22. {
23. printf("VirtualAlloc error: %d\n",GetLastError());
24. return 1;
25. }
26. printf("Alloc:MEM_COMMIT|MEM_RESERVE\n");
27. //复制数据到内存中
28. CopyMemory(lpAddress,"hello",lstrlen("hello"));
29. printf("分配、复制成功,地址:0x%.8x,内容:%s\n",
30. lpAddress,lpAddress);
31. //获取内存信息并打印
32. VirtualQuery(lpAddress,&mbi,sizeof(mbi));
33. printf("使用VirtualQuery获得地信息:\n"
34. "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
35. "AllocationProtect:0x%.8x\tRegionSize:%u\t"
36. "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
37. mbi.BaseAddress,mbi.AllocationBase,
38. mbi.AllocationProtect,mbi.RegionSize,
39. mbi.State,mbi.Protect,mbi.Type
40. );
41.
42. ////设置为READ-ONLY属性
43. //if(!VirtualProtect(lpAddress,0,PAGE_READONLY,NULL)) p1Ean。
44. //{
45. // printf("VirtualProtect error: %d",GetLastError()); DXDiT。
46. // return 1;
47. //}
48. ////测试READ-ONLY属性,异常
49. //CopyMemory(lpAddress,"read only",lstrlen("read only")); RTCrp。
50. //printf(lpAddress);
51. ////获取内存信息并打印
52. //VirtualQuery(lpAddress,&mbi,sizeof(mbi));
53. //printf("使用VirtualQuery获得地信息:\n"
54. // "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
55. // "AllocationProtect:0x%.8x\tRegionSize:%d\t"
56. // "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
57. // mbi.BaseAddress,mbi.AllocationBase,
58. // mbi.AllocationProtect,mbi.RegionSize,
59. // mbi.State,mbi.Protect,mbi.Type
60. // );
61.
62. //DECOMMIT释放,页面将变为保留状态
63. printf("Free: DECOMMIT\n");
64. if(!VirtualFree(lpRound,sizeVirtual,MEM_DECOMMIT))
65. {
66. printf("VirtualFree error: %d",GetLastError());
67. return 1;
68. }
69. //获取内存信息并打印
70. VirtualQuery(lpAddress,&mbi,sizeof(mbi));
71. printf("使用VirtualQuery获得地信息:\n"
72. "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
73. "AllocationProtect:0x%.8x\tRegionSize:%u\t"
74. "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
75. mbi.BaseAddress,mbi.AllocationBase,
76. mbi.AllocationProtect,mbi.RegionSize,
77. mbi.State,mbi.Protect,mbi.Type
78. );
79. //释放内存
80. printf("Free:RELEASE\n");
81. if(!VirtualFree(lpAddress,0,MEM_RELEASE))
82. {
83. printf("VirtualFree error: %d",GetLastError());
84. return 1;
85. }
86. return 0;
87.}
#include
#include
/******************************
* int main(void)
* 功能演示虚拟内存的使用