gpt4 book ai didi

c++ - Windows 64 位和 32 位之间的共享内存接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:31 25 4
gpt4 key购买 nike

我需要在 Windows 7(64 位)中编写代码来执行具有共享内存接口(interface) (SMI) 的 32 位程序。更准确地说,我正在编写的程序写入 SMI,而 32 位程序从该 SMI 读取。

我遇到的第一个问题是无法访问32位程序的源代码,无法解决的问题。第二个问题是 SMI 存储写入信息的地址。使用以下代码将此指向存储为基础指针:

gpSharedBlock->m_pData[uiDataPointer] = (char __based(gpSharedBlock)*)pData;

其中 pData 是指向我们正在写入的数据的指针,而 gpSharedBlock->m_pData[i] 指向存储的第 i^th 个元素。

可能从这里您已经注意到了这个问题; W32 中的指针是 4 个字节,而 W64 中的指针是 8 个字节。那么,由于存储的值是64位指针,所以32位程序最终读取到的值并不是我们想要的。

我的问题是:有没有办法将 64 位地址转换为 32 位地址,以便运行的程序读取正确的信息?

我读过有关 WOW64 的文章,我想 W32 程序正在其下运行,但我不知道如何利用它。有什么想法吗?

最佳答案

__based 指针是相对于另一个指针的数字偏移量。它实际上是一个在运行时解释的虚拟指针。

指针在 64 位中是 8 个字节,因此要与 32 位程序兼容,您必须在 64 位代码中声明 SharedBlock 类型的指针成员使用 4 位整数而不是指针,例如:

struct sSharedBlock
{
int32_t m_pData[...];
};

pData __based gpSharedBlock,所以 pData 的值是相对于gpSharedBlock。使用该事实确定数据 block 相对于 gpSharedBlock 内存块的实际字节偏移量,然后将该偏移量值作为整数存储到 m_pData[] 中。这就是 SMI 内存块实际上所期望的 - 一个偏移量,而不是一个真正的指针。 __based 关键字只是一种使用指针处理偏移量的奇特方式,无需在代码中手动进行偏移量计算。

原始代码实际上与以下代码相同,不需要 __based 关键字:

gpSharedBlock->m_pData[uiDataPointer] = (int32_t) ( ((char*)pData) - ((char*)gpSharedBlock) );

关于c++ - Windows 64 位和 32 位之间的共享内存接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com