由于各种原因(质疑原因对我没有帮助),我想为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函数。调用MAPIInitialize还需要在我的dll导出表中是否存在MAPIInitialize? GetProcAddress说它就在那里。
我想知道的是如何最小化扩展我的骨架扩展mapi dll,以便stub mapi dll将通过扩展mapi调用传递给我的dll。什么是秘诀?我宁愿不在msvc逆向工程中度过一个痛苦的一周。
答案 0 :(得分:1)
通过加载MS的调试符号并深入调试器中的存根库代码来计算出来。存根库不加载“MAPIInitialize”,它加载“MAPIInitialize @ 4”。我将MAPIInitialize @ 4 = _MAPIInitialize @ 4添加到.def文件的EXPORTS部分,现在一切正常。
顺便说一下,为了获取系统库的符号,不要下载MS SPL3的MS调试符号包,这些符号没有正确更新,也无法在调试器中使用。而是将VS指向MS的在线符号服务器(http://msdl.microsoft.com/download/symbols)并让VS将符号粘贴到本地符号缓存目录。