我可以将dll加载到共享内存中吗

Can I load a dll into shared memory?

本文关键字:内存 共享 dll 加载 我可以      更新时间:2023-10-16

我可以从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, esp,CCD_ 8的值现在是错误的。

  • 某些指令已不再可用或仅以其替代形式可用。特别是,字节值0x40-0x4f是64位指令的"前缀",而不是它们过去的指令。

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

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

很可能将代码重新编译为64位会容易10倍。或者将64位应用程序重新编译为32位(这几乎可以肯定是EASIEST选项)。

如果你不能将这个dll重新编译为64位,那么你唯一的选择确实是IPC,但不是你描述它的方式。你必须编写额外的应用程序,让它命名为dllwrapper32.exe,它将加载你的32位dll,并使用一些IPC方法公开它的接口。您的64位应用程序将使用此IPC方法通过dllwrapper32.exe进程与32位dll通信。

你也可以写64位dll包装器,它将在64位进程和dllwrapper32.exe之间进行通信

                      ^-- loads ----> [32 bit dll]
                     /
           [dllwrapper32.exe] <---- IPC -----> [64 bit process]

现在有64位包装器dll:

                      ^-- loads ----> [32 bit dll]
                     /
           [dllwrapper32.exe] <---- IPC -----> [64 bit wrapper dll]
                                                          /
                             [64 bit process] - loads ----'

IPC可以是你想要的东西:

  • 剪贴板
  • COM
  • 数据复制
  • DDE
  • 文件映射
  • 邮件槽
  • 管道
  • RPC窗口
  • 插座

我想COM会被推荐。

所以最后——做了很多工作。