2010-04-19 38 views
0

由于各种原因(质疑原因对我没有帮助),我想实现我自己的扩展的mapi DLL的Windows XP。我现在有一个骨架DLL,只有几个入口点用于测试,但系统映射存根(c:\ windows \ system32 \ mapi32.dll,我检查过它与mapistub.dll相同)不会通过调用我的DLL,而它愉快地将相同的调用传递给MS Outlook的msmapi32.dll,(MAPIInitialize,MAPILoginEx是两个这样的调用)。在存根和扩展mapi dll之间存在一些秘密握手,其中存根检查“yup,它是一个扩展的mapi dll”:可能它存在一些额外的入口点,我还没有实现,也许它是来自某个函数的返回值, 我不知道。我试过跟踪一个我写的样本应用程序,它使用STraceNT和ProcessMonitor调用MAPIInitialize,但没有显示任何明显的内容。跟踪显示,确实存根加载我的DLL,但后来发现秘密酱显然失踪,并返回一个错误代码,而不是调用我的DLL的函数。调用MAPIInitialize需要更多的东西比在我的dll的exports表中存在MAPIInitialize? GetProcAddress表示它在那里。如何获得mapi系统存根dll将扩展mapi调用传递给我的dll?

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

回答

1

通过加载MS的调试符号并潜入调试器中的存根库代码中找出它。存根库不加载“MAPIInitialize”,它加载“MAPIInitialize @ 4”。我将MAPIInitialize @ 4 = _MAPIInitialize @ 4添加到.def文件的EXPORTS部分,现在所有工作都正常。

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

+0

DLL导出函数的名称改变通常指示使用不同的调用约定进行编译。每个调用约定使用一个稍微不同的名称形式作为安全检查。通过添加名称重定向,您已绕过该检查并可能引入运行时堆栈损坏问题。大多数情况下,DLL的公共方法应该使用正常的Windows API调用约定:extern“C”__declspec(__stdcall) – 2015-03-12 22:27:30