我浏览周围的东西要做,我有想法分配内存在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; }
操作系统整个工作的一半是阻止你,程序和病毒这样做。
如果你想写任意的物理内存位置,写你自己的操作系统。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。