如何在 C++ 中读取硬编码地址的值?
Posted
技术标签:
【中文标题】如何在 C++ 中读取硬编码地址的值?【英文标题】:How to read a value of an hard coded address in C++? 【发布时间】:2011-03-01 17:42:11 【问题描述】:我正在寻找位于地址 302H 中的值。目的是从硬件(104pc 堆栈的一部分)读取输入。当我运行以下代码时出现此错误:Unhandled exception at 0x004134b9 in setOutput.exe: 0xC0000005: Access violation reading location 0x00000302.
#include <stdlib.h>
#define PORTBASE 0x302
int _tmain(int argc, char *argv[])
int value;
int volatile * port = (int *) PORTBASE;
printf("port = %d\n", port);
value = *port;
printf("port value = %d\n", value);
编辑:
我在 widows xp 下运行它。下面是我在板上可以找到的唯一文档
编辑:
从您下面的回答中,我可以看出我需要为该板编写一个驱动程序。有人可以向我指出如何执行此操作的资源吗?
【问题讨论】:
那么它还没有被内存映射到你的地址空间。我希望你不能从 Windows 用户代码中做到这一点——你需要从内核驱动程序中做到这一点。你有什么文档/示例代码? 有一个通用的 Windows 驱动程序,可以让您从用户模式程序读取/写入 IO 端口。我以前用它来读取/写入 0x378 的并行端口。我看看能不能再找到它。 【参考方案1】:为了在Windows下直接访问物理内存,需要开发驱动。我建议您阅读Virtual Address Space 了解原因。简短的故事:您从用户模式进程中看到的内存地址与物理内存地址无关,而硬件所在的地址受到操作系统的保护,以防止用户模式应用程序搞砸。
【讨论】:
【参考方案2】:我假设您的程序以普通用户身份运行。为了防止您损坏操作系统和使系统崩溃,现代操作系统和 CPU 会阻止您访问不属于您的程序的内存。
为了访问此类设备内存,您需要在内核 CPU 模式而不是用户模式下运行。使用此类设备的常用方法是编写在内核模式下运行的低级设备驱动程序,并将其用作用户模式程序的接口。
【讨论】:
【参考方案3】:您不能直接从用户模式程序访问硬件。为此,您需要一个设备驱动程序。
硬件不附带一些您应该安装的软件吗?查看软件文档了解如何调用它。
【讨论】:
没有软件...我想用户(我)可以写:S【参考方案4】:有几个现成的驱动程序可以让用户模式应用程序读写 IO 端口;其中最著名的一个是inpout32.dll,其他提到了here,要找到它们,一个好的搜索关键字是“写并行端口NT”(因为它们最常用于此任务)。
通常,它们通过加载内核模式驱动程序(需要管理权限的操作)然后在每次调用 dll 函数执行读/写时从用户模式调用它来工作。
但是请注意,这些库中的大多数都没有任何形式的访问控制,因此通过加载它们的驱动程序,您实际上允许任何知道如何使用它的应用程序在 IO 端口上读/写,这是相当安全的风险。
【讨论】:
ltalia:感谢您的回答!我将阅读该页面。我认为这不会带来太大的安全风险,因为 104pc 不太可能与任何网络分开。我也有兴趣尝试编写自己的驱动程序。它似乎是一个编写驱动程序的好板子,因为它的操作相对简单 @Richard:嗯,有几个这样的驱动程序是开源的,所以你应该很容易看到它们里面发生了什么。 :)【参考方案5】:当然,如果你想全力以赴,你可以下载Windows Device Driver SDK
【讨论】:
以上是关于如何在 C++ 中读取硬编码地址的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 appSettings.json 中硬编码和读取字符串数组?