Giz*_*zmo 2 c++ windows memory-management
我正在四处寻找要做的事情,我有了在 Windows 中的特定地址分配内存的想法。
所以我在 stackoverflow 上阅读了一些问题,但没有一个真正提供一个有效的例子,所以我不得不想出我自己的,因为我真的很想尝试:
#include <Windows.h>
#include <iostream>
struct Variable {
int var;
};
#define ACCESS() ((Variable*)0x50000000)
int main()
{
DWORD ptr;
VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT | MEM_RESERVE | MEM_PHYSICAL,PAGE_READWRITE);
VirtualProtect((void*)0x50000000,sizeof(Variable),PAGE_READWRITE,&ptr);
ACCESS()->var = 5;
while(!GetAsyncKeyState('Q')){}
}
Run Code Online (Sandbox Code Playgroud)
但这总是会导致访问冲突..
在特定地址分配数据的正确方法是什么?因为,这种方式以某种方式行不通......同时与“为什么不呢?”混淆。
编辑:
第一个答案后的第二个代码也不起作用:
#include <Windows.h>
#include <iostream>
struct Variable {
int var;
};
#define ACCESS() ((Variable*)0x50000000)
int main()
{
std::cout << VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT,PAGE_READWRITE) << std::endl;
std::cout << GetLastError() << std::endl;
ACCESS()->var = 6;
std::cout << ACCESS() << std::endl;
while(!GetAsyncKeyState('Q')){}
}
Run Code Online (Sandbox Code Playgroud)
返回值为 0,表示失败,GetLastError() 等于 487,
和 487 根据此页面表示:
ERROR_INVALID_ADDRESS; 尝试访问无效地址。
那么,我在互联网上阅读的所有内容和堆栈溢出都是假的?您>不能<在指定地址分配数据?如果这是真的,我们为什么还需要这个功能?
下一个编辑:
似乎完全有可能,工作代码:
#include <Windows.h>
#include <iostream>
struct Variable {
int var;
};
#define ACCESS() ((Variable*)0x50000000)
int main()
{
std::cout << VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE) << std::endl;
std::cout << GetLastError() << std::endl;
std::cout << ACCESS() << std::endl;
ACCESS()->var = 6;
std::cout << ACCESS()->var << std::endl;
while(!GetAsyncKeyState('Q')){}
}
Run Code Online (Sandbox Code Playgroud)
调用VirtualAlloc失败。如果您检查它的返回值,您就会发现这一点。
它失败的原因直接来自文档:MEM_PHYSICAL必须与MEM_RESERVE其他值一起使用。MEM_PHYSICAL反正你可能不想要,它与AWE 有关。删除标志将使分配成功。
调用VirtualProtect是不必要的。
以下应该工作:
#include <windows.h>
int main()
{
VirtualAlloc((void*)0x50000000,0x1000,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
*((int*)0x50000000) = 5;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |