首页
社区
课程
招聘
[求助]如何使用MEM_RESERVE类型的内存?
2020-6-17 20:21 4388

[求助]如何使用MEM_RESERVE类型的内存?

2020-6-17 20:21
4388

尝试了 VirtualProtect 失败。

然后又尝试了 VirtualAlloc MEM_COMMIT|MEM_RESERVE 无效

然后又尝试了 VirtualAlloc MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE 无效 getlasterror 487

百度google好像也没找到什么有效的方式,不知道有没有大佬研究过


尽管还是没发现什么好的解决方法,但是可以从另外一个方面来解决问题,就是调用NtWriteVirtualMemory,它并不检查内存可用性(也许)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-6-27 22:25 被萌克力编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (6)
雪    币: 13
活跃值: (3256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
麻木的时间 2020-6-17 22:40
2
0
MEM_RESERVE  预留的内存是没有物理页的,需要使用VirtualAlloc 再次在这里已预留的内存中申请 MEM_COMMIT属性,就可以使用了。
雪    币: 433
活跃值: (1805)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
萌克力 2020-6-18 22:42
3
0
麻木的时间 MEM_RESERVE  预留的内存是没有物理页的,需要使用VirtualAlloc 再次在这里已预留的内存中申请 MEM_COMMIT属性,就可以使用了。

您好,我刚去测试了VirtualAlloc MEM_COMMIT,PAGE_READWRITE。 还是失败,错误代码是87。


这是测试代码,在确定state是MEM_RESERVE的情况下,VirtualProtect 和 VirtualAlloc都是同时失败的..

    MEMORY_BASIC_INFORMATION info;
    VirtualQuery((LPCVOID)nice, &info, sizeof(MEMORY_BASIC_INFORMATION));
    sprintf_s(tmpsay, "State:0x%x", info.State);
    std::cout << tmpsay << std::endl;

    if (!VirtualProtect((LPVOID)nice, 10, PAGE_READWRITE, &old)) {
        sprintf_s(tmpsay, "属性更改失败 错误代码:%d", GetLastError());
        std::cout << tmpsay << std::endl;
    }

    add = VirtualAlloc((LPVOID)nice, 10, MEM_COMMIT, PAGE_READWRITE);
    if (add == NULL) {
        sprintf_s(tmpsay, "申请失败 错误代码:%d", GetLastError());
        std::cout << tmpsay << std::endl;
    }


最后于 2020-6-18 22:45 被萌克力编辑 ,原因:
雪    币: 433
活跃值: (1805)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
萌克力 2020-6-19 16:59
4
0
顶顶
雪    币: 13
活跃值: (3256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
麻木的时间 2020-6-20 05:39
5
0
857305819 加Q说
雪    币: 433
活跃值: (1805)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
萌克力 2020-6-20 23:42
6
0
再顶顶
雪    币: 88
活跃值: (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
绝地周润发 2020-8-30 03:12
7
0
顶顶顶
游客
登录 | 注册 方可回帖
返回