关于进程地址空间中DLL加载的问题
好吧,我读了几篇关于可移植可执行文件(PE)的Matt Pietrek的文章,比如:
深入研究Win32可移植可执行文件格式,第1部分和第2部分
MSJ关于连接子的文章
MSJ关于COFF格式的文章
另外,我已经阅读了关于这个主题的一些其他来源。要么是我忽略了某些部分,要么就是那里没有回答问题。
那么,这里有一些问题:
众所周知,在加载EXE时,Windows Loader从Importa地址表(IAT)读取导入的DLL列表,并将它们加载到进程地址空间。
进程地址空间是一个虚拟空间。 DLL可能已经加载到某个物理空间中。对于像
KERNEL32.dll
或USER32.dll
这样的DLL会发生这种情况。物理地址和虚拟地址之间有什么关系?加载器是仅分配页面并复制DLL,还是引用?
如果没有加载DLL,Loader是加载整个DLL,还是仅加载所需的函数?例如,如果你使用bar.dll
中的函数foo()
,加载程序是否将整个bar.dll
加载到进程地址空间?或者,它只是将foo
的代码加载到进程地址空间中吗?
假设你的EXE文件使用USER32.DLL
中的函数MessageBox()
,它位于%WINDIR%system32user32.dll
。你可以开发一个定制的USER32.DLL
,把它放在与你的EXE文件相同的目录中,并期望你的应用程序调用你的自定义MessageBox
而不是系统默认的MessageBox
?
没有找到相关结果
已邀请:
2 个回复
疮痪徘弦漏
嗓瑰
。看到这个链接。但是作为位于
的大多数WinAPI函数,您的自定义dll必须导出很多它们。