Windows程序启动过程:
1.操作系统为进程分配地址空间,然后将exe的映像文件载入进程地址空间。
2.操作系统读取exe映像文件的导入段数据,找到需要导入的dll文件,并且导入dll到进程地址空间。
3.操作系统读取dll映像文件的导入段数据,找到需要导入的dll文件,并且导入dll到进程地址空间。
4.操作系统读取exe映像文件的导入段数据,找到导入的函数,并且到对应的dll中找到对应函数的地址,然后修改exe映像文件导入数据段函数地址的偏移。
5.操作系统读取dll映像文件的导入段数据,找到导入的函数,并且到对应的dll中找到导入函数的地址,然后修改dll映像文件导入数据段函数地址的偏移。
6.执行完以上步骤后,操作系统会给进程创建主线程,然后由主线程调用每个DLL的DllMain函数。并且传入DLL_PROCESS_ATTACH参数。
7.当每个DLL的DllMain函数都执行完以后,主线就会调用C++运行库的代码,然后由C++运行库调用程序的入口函数。
8.当程序的入口函数执行完毕,会返回到C++运行库的代码。c++运行库最后会调用ExitProcess函数告诉操作系统退出进程。
9.操作系统在结束进程之前,会用主线程调用每个DLL的DllMain函数,并且传参数DLL_PROCESS_DETACH。
10.最后操作系统清理进程资源,并结束进程。