我正在浏览要做的事情,我有想法在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')){}
}
但这总是导致访问声音..
在特定地址分配数据的正确方法是什么? 因为,这种方式不会起作用..但同时又混淆了“为什么不呢?”。
编辑:
第一个答案后的第二个代码也不起作用:
#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')){}
}
返回值为0,表示失败,GetLastError()等于487,
和487根据this page表示:
ERROR_INVALID_ADDRESS; 尝试访问无效地址。
那么,我在互联网上读到的所有内容都是假的?你&gt;不能&lt;在指定地址分配数据?如果这是真的,为什么我们还需要这个功能呢?
下一次修改:
似乎完全有可能,工作代码:
#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')){}
}
答案 0 :(得分:3)
对VirtualAlloc
的调用失败。如果你检查了它的返回值,你会想出来的。
失败的原因直接来自documentation: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;
}