分配与释放可读可写的虚拟内存页面

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

* 功能演示虚拟内存的使用

相关文档
最新文档