首页
社区
课程
招聘
[已解决]VirtualAlloc 申请内存的问题
发表于: 2022-3-20 09:57 9355

[已解决]VirtualAlloc 申请内存的问题

2022-3-20 09:57
9355

环境:VS 2022
编译程序:x64
目的:在自身进程内申请大小为: A1F0000 的大小的空白内存.(需指定地址)

1
Util::Alloc_Address = (DWORD64)VirtualAlloc(NULL, 0xA1F0000 + 1, MEM_COMMIT, PAGE_READWRITE);

是可以成功申请,并使用的.

 

但是使用

1
Util::Alloc_Address = (DWORD64)VirtualAlloc((LPVOID)0x0000000240000000, 0xA1F0000 + 1, MEM_COMMIT, PAGE_READWRITE);

就申请失败了,GetLastError 结果为 487 .是否不支持这种情况?还是说要启用什么令牌?还是其它的问题?
只是在申请的时候指定了地址而已,很好奇,特来求助.
程序自身的 0x0000000240000000 基本上就是 ?? No Access

 

解决了...

1
MEM_COMMIT 变成 MEM_RESERVE | MEM_COMMIT

就好了..算是个解决方法把..


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-3-20 10:44 被maxwudi编辑 ,原因: 增加了解决方法
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 328
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
VirtualAlloc最终还是通过内存管理器NtAllocateVirtualMemory执行体函数分配的内存,指定的第一个地址必须有效(不能随便指定一个地址),要不然会覆盖进程当前内存中的数据,第一个参数可以指定一段保留内存的地址就可以了。
2022-3-20 10:23
0
雪    币: 2492
活跃值: (1685)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
bopin2022 VirtualAlloc最终还是通过内存管理器NtAllocateVirtualMemory执行体函数分配的内存,指定的第一个地址必须有效(不能随便指定一个地址),要不然会覆盖进程当前内存中的数据,第 ...

看了一下那个地址,在CE看的,基本上都是No Access.

刚刚也测试了一下,申请 0x1000 也错

更改:使用了  MEM_RESERVE | MEM_COMMIT 后就可以申请到了...

最后于 2022-3-20 10:42 被maxwudi编辑 ,原因: 补充说明
2022-3-20 10:37
0
雪    币: 178
活跃值: (391)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你好,我想把一块内容加载到固定的基址(0x400000),直接申请一直失败的,用MEM_COMMIT 报487 ;用MEM_RESERVE | MEM_COMMIT 崩溃
2022-4-11 22:25
0
雪    币: 2492
活跃值: (1685)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
气旋 你好,我想把一块内容加载到固定的基址(0x400000),直接申请一直失败的,用MEM_COMMIT 报487 ;用MEM_RESERVE | MEM_COMMIT 崩溃
会不会是那个内存是有的?或者是你申请的区块太大?
2022-4-11 22:34
0
雪    币: 178
活跃值: (391)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
maxwudi 会不会是那个内存是有的?或者是你申请的区块太大?
我把那块内存先占住,然后再申请别的内存,把所有内容转移过去(到这成功了),按理说我释放完原本的内存以后是可以申请过来的。大小我看了,申请的区域改成再小都申请失败。
2022-4-11 23:16
0
雪    币: 2492
活跃值: (1685)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
气旋 我把那块内存先占住,然后再申请别的内存,把所有内容转移过去(到这成功了),按理说我释放完原本的内存以后是可以申请过来的。大小我看了,申请的区域改成再小都申请失败。
按照道理来说申请的时候必须那个地方是不能有东西的,有的话就申请失败了,被其他的东西保留了,你是再别的进程申请的?我这个是再自身进程申请的 (X64位进程所以空间很大,x86的话估计被占用了,看看是不是这个东西导致的),不要先占住,直接申请就行(我是这样干的),读入的东西直接申请成功后写到这里?
2022-4-12 11:04
0
雪    币: 178
活跃值: (391)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
maxwudi 按照道理来说申请的时候必须那个地方是不能有东西的,有的话就申请失败了,被其他的东西保留了,你是再别的进程申请的?我这个是再自身进程申请的 (X64位进程所以空间很大,x86的话估计被占用了,看看是不是 ...
我的程序是x86的。之前试过,把程序加载到别的固定的地方,直接申请失败;后来用的先占位置,也是先把程序自己加载到要申请的地方,之后再挪开,释放那个空间再申请。 
2022-4-12 11:23
0
雪    币: 2492
活跃值: (1685)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
气旋 我的程序是x86的。之前试过,把程序加载到别的固定的地方,直接申请失败;后来用的先占位置,也是先把程序自己加载到要申请的地方,之后再挪开,释放那个空间再申请。
x86 就不太清楚了,估计是范围太小了? 先占坑,然后再释放,在申请?
2022-4-16 08:14
0
雪    币: 178
活跃值: (391)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
maxwudi x86 就不太清楚了,估计是范围太小了? 先占坑,然后再释放,在申请?
确实跟大小有关的,占坑的image大了,就申请不到了
2022-4-18 16:00
0
游客
登录 | 注册 方可回帖
返回
//