3

我想使用Windows API 的 PatchAPI来应用一些补丁。补丁的应用是在 mspatcha.dll 中实现的,它应该位于一个人的 system32 文件夹中。

在阅读了各个地方(例如他们的 ref 和谷歌搜索)之后,我还没有找到链接到这个 DLL 的正确方法。我想静态链接,处理 LoadLibrary 似乎很混乱,有点违背了他们的 patchapi.h 标头的目的。由于我没有找到要链接的 .lib 文件,因此我使用以下命令创建了自己的文件:

1) 转储箱 /exports C:\windows\system32\mspatcha.dll

2) 创建一个 mspatcha.def 文件,写一个“EXPORTS”行,然后为出现在 dumpbin 输出中的每个函数名写一行

3) 库 /def:mspatcha.def /out:mspatcha.lib

虽然我确定这不是与 patchapi 进行静态链接的正确方法,但我还没有找到正确的方法。无论如何,在执行了这些步骤并编写了一个由单个调用 ApplyPatchToFileExA() 构成的简单测试用例之后,我仍然在符号 _ApplyPatchToFileA@16 上收到链接器错误。查看我新创建的 mspatcha.lib 的导出符号,这些函数似乎使用了错误的命名约定

D:\tmp\mspatcha>dumpbin /exports mspatcha.lib|找到“ApplyPatchToFileExA”

             _ApplyPatchToFileExA

除非我错了,否则这表明 lib 使用 cdecl 导出函数,而 dll 使用 stdcall(或至少将函数声明为 _stdcall)。请参阅:Microsoft Windows 中的 C 名称修饰

我的问题是:在我的应用程序中使用 mspatcha.dll 的正确方法是什么,以及我从 dll 创建库以便进行静态链接的过程有什么问题?

我的终端的详细输出可以在这里找到:http: //pastebin.com/q4FV4Se6

4

1 回答 1

0

作为一个术语,您试图隐式链接而不是静态链接,这意味着完全不同的东西。

如果您真的无法获得 .lib 文件,那么生成一个文件的一种简单方法是为每个函数创建一个带有空存根的虚拟 DLL。调用 DLL mspatcha.dll。确保使用 .def 文件和 stdcall。

构建 DLL 后,将其丢弃但保留 .lib 文件!

我过去这样做是为了为使用不发出 .lib 文件的工具链构建的 DLL 生成 .lib 文件。

您使用的技术仅适用于 cdecl 函数。

于 2011-04-18T22:37:51.127 回答