0

由于各种原因(质疑原因对我没有帮助),我想为windows xp实现我自己的扩展mapi dll。我现在有一个框架 dll,只有几个入口点用于测试,但是系统 mapi 存根(c:\windows\system32\mapi32.dll,我已经检查它与 mapistub.dll 相同)不会通过调用我的 dll,虽然它很高兴地将相同的调用传递给 MS Outlook 的 msmapi32.dll,(MAPIInitialize、MAPILoginEx 是两个这样的调用)。在存根和扩展的 mapi dll 之间有一些秘密握手,其中存根检查“是的,它是一个扩展的 mapi dll”:也许是我还没有实现的一些额外入口点的存在,也许是某个函数的返回值, 我不知道。一世' 我尝试跟踪我编写的一个示例应用程序,该应用程序使用 STraceNT 和 ProcessMonitor 调用 MAPIInitialize,但这并没有显示任何明显的内容。跟踪表明,存根确实加载了我的 dll,但随后发现秘密酱明显丢失,并返回错误代码而不是调用我的 dll 的函数。除了在我的 dll 的导出表中存在 MAPIInitialize 之外,调用 MAPIInitialize 还需要什么?GetProcAddress 说它在那里。除了在我的 dll 的导出表中存在 MAPIInitialize 之外,调用 MAPIInitialize 还需要什么?GetProcAddress 说它在那里。除了在我的 dll 的导出表中存在 MAPIInitialize 之外,调用 MAPIInitialize 还需要什么?GetProcAddress 说它在那里。

我想知道的是如何最小化扩展我的骨架扩展 mapi dll,以便存根 mapi dll 将通过扩展 mapi 调用传递给我的 dll。秘方是什么?我宁愿不要在 msvc 对存根行为进行逆向工程上度过痛苦的一周。

4

1 回答 1

1

通过加载 MS 的调试符号并深入调试器中的存根库代码来解决这个问题。存根库不加载“MAPIInitialize”,而是加载“MAPIInitialize@4”。我将 MAPIInitialize@4=_MAPIInitialize@4 添加到 .def 文件的 EXPORTS 部分,现在一切正常。

顺便说一句,为了获得系统库的符号,不要下载微软的 XP SP3 调试符号包,符号没有正确更新,在调试器中不起作用。而是将 VS 指向 MS 的在线符号服务器 ( http://msdl.microsoft.com/download/symbols ) 并让 VS 将符号 slurp 到本地符号缓存目录。

于 2010-04-20T08:34:42.750 回答