基于visual c++之windows核心编程代码分析(6)分配和释放可读可写的虚拟内存页面
2016-12-08 21:46
501 查看
我们在进行Windows核心编程,经常要用到读取虚拟内存。
我们来亲自实践一个分配与释放可读可写的虚拟内存页面,请见代码实现与注释讲解。
[cpp] view
plain copy
#include <windows.h>
#include <stdio.h>
/*************************************
* int main(void)
* 功能 演示虚拟内存的使用
*
* 参数 未使用
**************************************/
int main(void)
{
SIZE_T sizeVirtual = 4000; //大小
LPVOID lpRound = (LPVOID)0x100000FF; //地址
MEMORY_BASIC_INFORMATION mbi; //内存信息
//分配内存,直接分配已提交的内存
LPVOID lpAddress = VirtualAlloc(
lpRound,sizeVirtual,
MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE
);
if(lpAddress == NULL)
{
printf("VirtualAlloc error: %d\n",GetLastError());
return 1;
}
printf("Alloc:MEM_COMMIT|MEM_RESERVE\n");
//复制数据到内存中
CopyMemory(lpAddress,"hello",lstrlen("hello"));
printf("分配、复制成功,地址:0x%.8x,内容:%s\n",
lpAddress,lpAddress);
//获取内存信息并打印
VirtualQuery(lpAddress,&mbi,sizeof(mbi));
printf("使用VirtualQuery获得的信息:\n"
"BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
"AllocationProtect:0x%.8x\tRegionSize:%u\t"
"State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
mbi.BaseAddress,mbi.AllocationBase,
mbi.AllocationProtect,mbi.RegionSize,
mbi.State,mbi.Protect,mbi.Type
);
////设置为READ-ONLY属性
//if(!VirtualProtect(lpAddress,0,PAGE_READONLY,NULL))
//{
// printf("VirtualProtect error: %d",GetLastError());
// return 1;
//}
////测试READ-ONLY属性,异常
//CopyMemory(lpAddress,"read only",lstrlen("read only"));
//printf(lpAddress);
////获取内存信息并打印
//VirtualQuery(lpAddress,&mbi,sizeof(mbi));
//printf("使用VirtualQuery获得的信息:\n"
// "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
// "AllocationProtect:0x%.8x\tRegionSize:%d\t"
// "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
// mbi.BaseAddress,mbi.AllocationBase,
// mbi.AllocationProtect,mbi.RegionSize,
// mbi.State,mbi.Protect,mbi.Type
// );
//DECOMMIT释放,页面将变为保留状态
printf("Free: DECOMMIT\n");
if(!VirtualFree(lpRound,sizeVirtual,MEM_DECOMMIT))
{
printf("VirtualFree error: %d",GetLastError());
return 1;
}
//获取内存信息并打印
VirtualQuery(lpAddress,&mbi,sizeof(mbi));
printf("使用VirtualQuery获得的信息:\n"
"BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
"AllocationProtect:0x%.8x\tRegionSize:%u\t"
"State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
mbi.BaseAddress,mbi.AllocationBase,
mbi.AllocationProtect,mbi.RegionSize,
mbi.State,mbi.Protect,mbi.Type
);
//释放内存
printf("Free:RELEASE\n");
if(!VirtualFree(lpAddress,0,MEM_RELEASE))
{
printf("VirtualFree error: %d",GetLastError());
return 1;
}
return 0;
}
我们来亲自实践一个分配与释放可读可写的虚拟内存页面,请见代码实现与注释讲解。
[cpp] view
plain copy
#include <windows.h>
#include <stdio.h>
/*************************************
* int main(void)
* 功能 演示虚拟内存的使用
*
* 参数 未使用
**************************************/
int main(void)
{
SIZE_T sizeVirtual = 4000; //大小
LPVOID lpRound = (LPVOID)0x100000FF; //地址
MEMORY_BASIC_INFORMATION mbi; //内存信息
//分配内存,直接分配已提交的内存
LPVOID lpAddress = VirtualAlloc(
lpRound,sizeVirtual,
MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE
);
if(lpAddress == NULL)
{
printf("VirtualAlloc error: %d\n",GetLastError());
return 1;
}
printf("Alloc:MEM_COMMIT|MEM_RESERVE\n");
//复制数据到内存中
CopyMemory(lpAddress,"hello",lstrlen("hello"));
printf("分配、复制成功,地址:0x%.8x,内容:%s\n",
lpAddress,lpAddress);
//获取内存信息并打印
VirtualQuery(lpAddress,&mbi,sizeof(mbi));
printf("使用VirtualQuery获得的信息:\n"
"BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
"AllocationProtect:0x%.8x\tRegionSize:%u\t"
"State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
mbi.BaseAddress,mbi.AllocationBase,
mbi.AllocationProtect,mbi.RegionSize,
mbi.State,mbi.Protect,mbi.Type
);
////设置为READ-ONLY属性
//if(!VirtualProtect(lpAddress,0,PAGE_READONLY,NULL))
//{
// printf("VirtualProtect error: %d",GetLastError());
// return 1;
//}
////测试READ-ONLY属性,异常
//CopyMemory(lpAddress,"read only",lstrlen("read only"));
//printf(lpAddress);
////获取内存信息并打印
//VirtualQuery(lpAddress,&mbi,sizeof(mbi));
//printf("使用VirtualQuery获得的信息:\n"
// "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
// "AllocationProtect:0x%.8x\tRegionSize:%d\t"
// "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
// mbi.BaseAddress,mbi.AllocationBase,
// mbi.AllocationProtect,mbi.RegionSize,
// mbi.State,mbi.Protect,mbi.Type
// );
//DECOMMIT释放,页面将变为保留状态
printf("Free: DECOMMIT\n");
if(!VirtualFree(lpRound,sizeVirtual,MEM_DECOMMIT))
{
printf("VirtualFree error: %d",GetLastError());
return 1;
}
//获取内存信息并打印
VirtualQuery(lpAddress,&mbi,sizeof(mbi));
printf("使用VirtualQuery获得的信息:\n"
"BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
"AllocationProtect:0x%.8x\tRegionSize:%u\t"
"State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
mbi.BaseAddress,mbi.AllocationBase,
mbi.AllocationProtect,mbi.RegionSize,
mbi.State,mbi.Protect,mbi.Type
);
//释放内存
printf("Free:RELEASE\n");
if(!VirtualFree(lpAddress,0,MEM_RELEASE))
{
printf("VirtualFree error: %d",GetLastError());
return 1;
}
return 0;
}
相关文章推荐
- 基于visual c++之windows核心编程代码分析(31)SNMP协议编程
- 基于visual c++之windows核心编程代码分析(31)SNMP协议编程
- 基于visual c++之windows核心编程代码分析(26)实现文件关联
- 基于visual c++之windows核心编程代码分析(33)实现防火墙模型
- 基于visual c++之windows核心编程代码分析(35)实践NT服务的框架
- 基于visual c++之windows核心编程代码分析(22)Mapping File编程
- 基于visual c++之windows核心编程代码分析(34)WinIo驱动级模拟按键的实现
- 基于visual c++之windows核心编程代码分析(38)实践服务器压力测试-SYN请求
- 基于visual c++之windows核心编程代码分析(26)实现文件关联
- 基于visual c++之windows核心编程代码分析(29)ICMP实现远程控制
- 基于visual c++之windows核心编程代码分析(36)实践SYN安全隐患监测
- 基于visual c++之windows核心编程代码分析(23)遍历驱动器并获取驱动器属性
- 基于visual c++之windows核心编程代码分析(20) 纤程与线程的互相转换
- 基于visual c++之windows核心编程代码分析(27)保持程序单实例运行
- 基于visual c++之windows核心编程代码分析(33)实现防火墙模型
- 基于visual c++之windows核心编程代码分析(21)获取和设置环境变量
- 基于visual c++之windows核心编程代码分析(37)实践信息安全隐患监测-嗅探
- 基于visual c++之windows核心编程代码分析Mapping File编程
- 基于visual c++之windows核心编程代码分析(28)实现开机自启动
- 基于visual c++之windows核心编程代码分析(27)保持程序单实例运行