在加载完PE可执行文件后,回到kernel32的入口函数__wine_kernel_init中,接下来调用了函数LdrInitializeThunk。dll的装入和连接过程主要是该函数实现的。
函数部分代码如下图所示:
先用main_exe_file判断主模块是否已经被建立了,这是在wine_process_init函数中被赋值的一个句柄类型。
get_moderf的作用正如注释所说,是为可执行文件分配一个模块的引用结构。
在Wine装入和连接dll的时候,每个用到的dll以及exe,都对应于一个“模块的引用结构”,WINE_MODREF类型,并且装载过程中也将单个dll或exe视作一个模块。结构如下图所示:
其中LDR_MODULE类型来源于Windows。由于每个dll中都描述了其直接依赖的一组dll,所以需要用一个指针数组deps来记录。而nDeps顾名思义就是直接依赖的dll个数。
所以在装入和连接过程中,应该是有这样一颗树
然后就是对PEB信息进行填充。
该函数中直接负责dll装载和连接的,只有fixup_imports。函数代码如下图所示: