在Windows中的特定地址分配数据?

问题描述 投票:1回答:1

我正在浏览要做的事情,我有想法在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,

根据this page的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')){}
}
c++ windows memory-management
1个回答
4
投票

VirtualAlloc的呼吁失败了。如果你检查了它的返回值,你会想出来的。

它失败的原因直接来自documentationMEM_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;
}
© www.soinside.com 2019 - 2024. All rights reserved.