【问题标题】:How can I get the mapi system stub dll to pass extended mapi calls to my dll?如何让 mapi 系统存根 dll 将扩展的 mapi 调用传递给我的 dll?
【发布时间】:2012-05-09 21:44:14
【问题描述】:

由于各种原因(质疑原因对我没有帮助),我想为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 说它在那里。

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

【问题讨论】:

    标签: windows mapi


    【解决方案1】:

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

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

    【讨论】:

    • DLL 导出函数的名称修改通常表示使用不同的调用约定进行编译。每个调用约定都使用稍微不同的名称修饰形式作为安全检查。通过添加名称重定向,您已经绕过了该检查,并且可能会引入运行时堆栈损坏问题。很可能,DLL 的公共方法应该使用正常的 Windows API 调用约定:extern "C" __declspec(__stdcall)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多