5.6 修改虚拟内存页面保护属性

效果

图1,可以看到内存属性已经修改为只读,保护值4变成了2.复制内容因为在修改前执行,所以正确执行

图2,将复制代码移到修改保护属性代码后,弹出异常.这是在调试状态,如果在正常执行时则会显示如图3

源码

#include

#include

int main(int argc, PCHAR argv[]){

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("分配虚拟内存失败: %d\n", GetLastError());

return 1;

}

printf("分配成功: MEM_COMMIT | MEM_RESERVE 内存已从 空闲 提交为 已提交\n");

//获取内存信息并打印

VirtualQuery(lpAddress, &mbi, sizeof(mbi));

printf("使用VirtualQuery函数获得的信息是;\n");

printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);

printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);

printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);

//修改内存保护属性 [这里修改了]

printf("修改内存保护属性\n");

if (!VirtualProtect(lpAddress, mbi.RegionSize, PAGE_READONLY, &mbi.Protect)){

printf("修改保护属性失败: %d\n", GetLastError());

return 1;

}

//复制数据到内存中 [这里执行会出错]

CopyMemory(lpAddress, TEXT("misaka"), lstrlen(TEXT("misaka")));

printf("复制成功,地址: 0x%x, 内容: %s\n", lpAddress, lpAddress);

//获取内存信息并打印

VirtualQuery(lpAddress, &mbi, sizeof(mbi));

printf("使用VirtualQuery函数获得的信息是;\n");

printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);

printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);

printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);

//释放内存,将页面变为保留状态

printf("释放内存,将页面变为保留状态 DECOMMIT\n");

if (!VirtualFree(lpAddress, sizeVirtual, MEM_DECOMMIT)){

printf("释放虚拟内存失败: %d\n", GetLastError());

return 1;

}

getchar();

return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 效果 源码 #include #include int main(int argc, PCHAR argv[]){...
    f675b1a02698阅读 383评论 0 0
  • C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是...
    一生信仰阅读 1,204评论 0 2
  • 前言 C语言作为一门应用途广泛、功能强大、使用灵活的面向过程式编程语言。既可用于编写应用软件,又能用于编写系统软件...
    老板娘来盘一血阅读 13,067评论 32 83
  • 史上最全的iOS面试题及答案 迷途的羔羊--专为路痴量身打造的品牌。史上最精准的定位。想迷路都难!闪电更新中......
    南虞阅读 1,558评论 0 8
  • 喜欢我的朋友请大胆关注我! 好了,今天继续画球球。 1、首先,你要先画一个球。像下图这样,超级大超级圆,一定要画端...
    顧文畫阅读 281评论 2 2