写在前面:最近在研究一个VC界面库DuiLib,在细读它的源码时遇到些问题,比如它的界面是如何绘制上去的,底层操作是如何实现的,就是CreateWindow和ShowWindow又是如何实现的,也不得而知,因此我想有必要重新认识下Win32应用程序的启动/运行原理才好。如题所述,本文讲的的Windows环境下exe可执行文件的运行原理,这里面涉及的知识很多,需要读者对Windows操作系统(如注册表、进程、线程、内存管理、PE文件格式等)、Windows编程(本文使用c++语言)等有所了解。本文试图以通俗易懂的语言描述,让更多的人看的懂,从运行原理上对程序的运行有个好的了解。文章安排方面,我这里是以大家都懂的main/WinMain函数执行前,执行时,执行后分为三个部分:exe程序的初始化;主函数的运行过程;程序收尾工作PS:本人的技术也是有限的,文章中难免会有错误疏漏之处,还请各位高手批评指正。转载请注明出处,:下载地址1:?key=1b4d4178e&uid=1035291&token=l1az8klrmhi8bwxl49201cxedj&dir=%2F&name=:/file/clg0o6il#一、一、一、一、exeexeexeexe程序的初始化程序的初始化程序的初始化程序的初始化打开一个软件是如此简单,双击软件的图标就是了!但你是否想过,当你双击那个图标时,系统都做了哪些工作?为什么双击图标软件就运行起来了?没错,就是Shell()。当你启动电脑进入桌面时,,而其它的进程,,。也就是说,当你双击图标时Shell会侦测到这个动作,注册表中有相关的项保存着双击操作的信息,如exe文件关联、启动exe的Shell是哪个。注册表中保存的exe文件关联信息打开一个exe时指定的参数信息指定启动exe程序的Shell我们看到,。因此,我们应该知道了,,它根据注册表中的信息取得文件名(根据%1这个参数),,这个函数做了很多工作。CreateProcess函数的定义是这样的:BOOLWINAPICreateProcess(__in_optLPCTSTRlpApplicationName,mandLine,__in_optLPSECURITY_ATTRIBUTESlpProcessAttributes,__in_optLPSECURITY_ATTRIBUTESlpThreadAttributes,__inBOOLbInheritHandles,__inDWORDdwCreationFlags,__in_optLPVOIDlpEnvironment,__in_optLPCTSTRlpCurrentDirectory,__inLPSTARTUPINFOlpStartupInfo,__outLPPROCESS_INFORMATIONlpProcessInformation);此函数的具体信息和用法在MSDN上已有详细的描述,在此就不作介绍了http://msdn./en-us/library/ms682425%28v=%?别急,马上为你一一道来!创建进程内核对象CreateProcess实际上是通过NtCreateProcess函数实现的,此时,系统会创建一个被称为内核对象的对象,这里是进程内核对象。进程内核对象可以看作一个操作系统用来管理进程的内核对象,它也是系统用来存放关于进程统计信息的地方(一个小的数据结构),进程内核对象维护了一个句柄表的结构。当进程被初始化之后,其句柄表是空的。当进程内的一线程通过指定的函数创建了一个内核对象时,内核会为对象分配一块内存区域并初始化这块区域。然后内核会在进程的句柄表中查找一个空的入口,找到之后会初始化句柄表的以索引定位的区域。初始化的主要过程就是填充句柄表的一个单元,包括指定内核对象地址,指定访问码,指定标记等。关于句柄表的描述,可以看看<<Windows进程内核对象句柄表>>这篇文章创建进程的虚拟地址空间进程内核对象创建后,它的引用计数被置为1。然后系统为刚刚
一个exe可执行文件的生与死(运行原理).pdf 来自淘豆网m.daumloan.com转载请标明出处.