微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我浏览周围的东西要做我有想法分配内存在Windows中的特定地址。

所以我在这里读了一些关于stackoverflow的问题,但是没有一个真正提出一个工作的例子,所以我不得不拿出我自己的,因为我reaaaalywant要尝试一下:

#include <Windows.h> #include <iostream> class Variable { public: 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,PAGE_READWRITE,&ptr); ACCESS()->var = 5; while(!GetAsyncKeyState('Q')){} }

但是这总是导致访问voilation ..

在特定地址分配数据的正确方法是什么? 因为,这种方式不知怎么办,但同时又混淆了“为什么不呢?”。

CMFCToolbar布局在会话之间没有正确恢复

如何将对象的安全描述符重置为认?

如何使这个简单的C程序重新启动只需一个按键,而不是两个

有没有办法让任何窗口被点击?

内存中丢失了一些Structs值

编辑:

一个答案之后的第二个代码不工作了:

#include <Windows.h> #include <iostream> class Variable { public: int var; }; #define ACCESS() ((Variable*)0x50000000) int main() { std::cout << VirtualAlloc((void*)0x50000000,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就是说:

ERROR_INVALID_ADDRESS; 尝试访问无效的地址。

所以,我通过互联网和堆栈溢出读取是假的? 你>不能<在指定的地址分配数据? 如果这是真的,为什么我们仍然需要这个function?

一个编辑:

看来这是完全可能的,工作代码

#include <Windows.h> #include <iostream> class Variable { public: int var; }; #define ACCESS() ((Variable*)0x50000000) int main() { std::cout << VirtualAlloc((void*)0x50000000,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')){} }

如何获得从shell调用的二进制文本段的基地址?

用C中的零覆盖整个文件的最快方法是什么?

在Windows 7的任务栏上获取窗口列表?

ApplicationDbContext.Create未find

Qmake在创buildVisual Studio项目时不会replace环境variables?

对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; }

操作系统整个工作的一半是阻止你,程序和病毒这样做。

如果你想写任意的物理内存位置,写你自己的操作系统。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐