快速业务通道

利用DelayLoad来优化应用程序的性能及拦截API

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
。现在,剩下不能支持VirtualAllocEx的Win9x,针对这个问题,我利用了win9x内存映射文件的一个特殊的特性,这些文件在所有的地址空间都可见。并且,是同一个地址。我简单的利用系统页面文件作为支持,创建了一个小的内存映射文件,写了LoadLibrary根区进去。该根区对于被调试程序,是可见的。更多的详细情况,请看文章首部的连结的CDebugInjector::GetMemoryForLoadLibraryStub。

使用DelayLoadProfile:

DelayLoadProfile是一个输出结果到标准输出的命令行程序。在命令行提示中,运行DelayLoadProfile,制定目的程序,和它需要的参数,例如: DelayLoadProfile notepad c:\autoexec.bat下面是针对(windows 2000 Release Candidate2)的calc.exe, 运行DelayLoadProfile的结果:

[d:\column\col66\debug]delayloadprofile calc

DelayLoadProfile: SHELL32.dll was called 0 times

DelayLoadProfile: MSVCRT.dll was called 9 times

DelayLoadProfile: ADVAPI32.dll was called 0 times

DelayLoadProfile: GDI32.dll was called 60 times

DelayLoadProfile: USER32.dll was called 691 times

我简单的开始calc,然后,立即关闭。注意到,shell32.dll和advapi32.dll都没有调用,这2个dll是最初的calc用来DelayLoad的候选。

你将回觉得奇怪,为什么calc调用shell32.dll,你没有调用它。如果你针对CALC,调用DumpBin /IMPORTS或者Depends.exe分析,你将看到,CALC从SHELL32.DLL中引入的函数只有ShellAboutW。简单来说,只有你选者CALC的HELP|About Calculator菜单项,才会完全的调用SHELL32.DLL入内存。这个是一个最明显的/DELAYLOAD显示其价值的例子。顺便说,SHELL322.DLL简单的,毫无条件的加载SHLWAPI.DLL和COMCTL32.DLL,并且初始化。

如果只是因为DelayLoadProfile报告一个dll没有被调用,或者很少调用,你就可以自动的 延迟加载,你要认真的确定,哪一个暗中连结的dll,你要使用/DELAYLOAD。这种情况下,如果由于其他的依赖,你的DLL要被自动的加载和初始化,那么,/DELAYLOAD就没有意义了。平台sdk带的Depends.exe是一个很有用的工具,可以看到一个dll的使用情况。

在你的测试过程中,你的测试的程序的个数,也是值得考虑的。如果你测试了所有的程序的功能,所有的被引入的dll都包括了。个人认为,我觉得应该尽量缩小初始化时间,这个可能是意味着你只是开始你的程序,然后关闭它。要加快初始化,就依次加载dll。用户都是主观的由启动时间判断你的程序的速度。

我发现几个DLL可以从/DELAYLOAD处得益。从上所述,SHELL32.DLL是其中一个。另外一个是打印支持的WINSPOOL.DRV。既然很多用户都不经常打印,那么,就是很好的采用者。还有,类似的OLE32.DLL和OL3AUT32.DLL。一个多态的程序,在小容器中,用到COM和OLE,那么,相关的DLL也是可以选用的。例如,WIN2000的CDPLAYER.EXE和OLE32.DLL连接,用到了CreateStreamOnHGlobal函数。但是,在通常的情况下,我没有觉察到这个函数被调用。

DelayLoadProfile并不是没有它的毛病,当我在很多程序针对IAT,用DelayLoadProfileDLL成功测试后,你可能还会碰到不正确的运行的情况。要完全解决这个问题,就超出了本次讨论的范围。然而,如果你成功解决了其中一个问题,请让我知道。我将在将来的一天更新DelayLoadProfile。 我知道某些引入mfc42.dll和mfc42u.dll的程序会和DelayLoadProfile冲突,于是,我采用了一个方法,在DelayLoadProfileDLL.cpp,有一个IsModuleOKToHook函数,我放了MFC42.DLL,MFC42U.DLL和KERNEL32.DLL进去。(你不能用 /DELAYLOAD 和KERNEL32.DLL关联,因为,是没有作用的)如果一个特别的DLL会出问题,你应该放到IsModuleOKToHook函数中。 我希望DelayLaodPro

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号