gpt4 book ai didi

c++ - 我可以将 dll 加载到共享内存中吗?

转载 作者:可可西里 更新时间:2023-11-01 14:42:36 25 4
gpt4 key购买 nike

我可以从 64 位应用程序访问 32 位 dll。为此,我正在使用共享内存 IPC,并且我做了类似的事情

TCHAR szName[]=TEXT(Path of DLL on local machine); 
TCHAR szMsg[]=TEXT("abc");

HANDLE file = CreateFile(szName,
GENERIC_READ,
0,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);

通过 IPC 共享 dll 是正确的方法吗?我可以在阅读器界面访问 DLL 中定义的函数吗?

最佳答案

根据定义,不可能从 64 位代码调用 32 位函数。处理器在 32 位和 64 位模式下的行为不同。通过将代码段选择器分别设置为 32 位和 64 位模式,操作系统可以为 32 位和 64 位应用程序做不同的事情,但这对整个应用程序来说是一个很大的转变。

  • 32 位调用与 64 位代码具有不同的调用约定。 (64 位模式将寄存器用于所有调用的前 5-6 个参数,32 位模式仅使用 3 个参数,而不是用于所有函数)。一般寄存器的用法(哪些寄存器用于什么)是不同的,因此需要在 32 位中保留的寄存器在 64 位中不需要,等等。

  • 32 位操作清除 64 位寄存器的高位部分,无论它们是否愿意。所以只需将 eax 设置为 5 就会改变 eax 的高 64 位,而 32 位代码甚至不知道它的存在。

  • 64 位模式下的指针在完整的 64 位范围内分配 [好吧,47 位,但仍然比 32 位多 15 位],因此您将无法将任何指针传递给调用的代码,即使不存在任何其他问题。

  • 带有寄存器操作数的
  • pushpop 指令现在是 64 位的(无论您是否想要),因此 32 位代码将保存寄存器认为它们占用 4 个字节的堆栈,它们将占用 8 个,这意味着堆栈指针计算的任何偏移量在被调用函数内都是错误的 - 包括常见序列:push ebpmov ebp, espesp 的值现在是错误的。

  • 一些说明不再可用或仅以其替代形式提供。特别是,字节值 0x40-0x4f 是 64 位指令的“前缀”,而不是它们过去的指令。

  • 来自“导入代码”的任何调用都将被视为 64 位,因此操作系统调用、C 库调用等将无法正常工作。

当然,您可以读取文件,将其转录为 64 位模式,但这需要大量工作才能找到理解代码并可以翻译它的翻译器(因为您需要知道什么是实际代码,什么是例如 switch 语句的跳转表或代码段中嵌入的文本字符串,不应翻译,至少不应该以相同的方式翻译)。

很可能将代码重新编译为 64 位要容易 10 倍。或者将您的 64 位应用程序重新编译为 32 位应用程序(这几乎可以肯定是最简单的选择)。

关于c++ - 我可以将 dll 加载到共享内存中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33910477/

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