windows下exe程序的启动过程

接扫理解.exe文件的结构原理即运行过程 阅读详情
执行一个程序,必然就产生一个进程(process)。最直接的程序执行方式就是在shell (如 Win95 的文件总管或Windows 3.x 的文件管理员)中以鼠标双击某一个可执行文件图标 (假设其为App.exe),执行起来的App 进程其实是shell 调用CreateProcess 激活的。
让我们看看整个流程:
1. shell 调用 CreateProcess  激活 App.exe Shell即命令解释器,是操作系统引导时即加载的一个系统进程,在Windows任务管理器里面可以看到一个名为”Explorer.exe”的进程,就是它了。
2. 系统产生一个「 进程核心对象 」,计数值为1。 而系统为该进程创建4GB的虚拟地址空间(在Win2000/WinXP下,每个进程可以有2GB的私有地址空间,剩余的2GB由操作系统占用)用来加载App.exe和其他必要的DLL函数;
3. 系统为此进程建立一个4GB 地址空间。
4. 加载器将必要的码加载到上述地址空间中,包括App.exe 的程序、资料,以及 所需的动态联结函数库(DLLs)。加载器如何知道要加载哪些DLLs 呢?它 们被记录在可执行文件(PE 文件格式)的.idata section 中。
5. 系统为此进程建立一个执行线程,称为 主执行线程 (primary thread)。执行线程才是 CPU 时间的分配对象。
6. 系统调用C runtime 函数库的 Startup code 。( C/C++ run-time startup function )

c/c++运行时库有四个版本的启动函数,他们分别对应不同类型的应用程序。比如,需要ANSI字符和字符串的GUI应用程序的启动函数是WinMainCRTStartup,其对应的进入点函数是WinMain,需要Unicode字符和字符串的GUI应用程序的启动函数是wWinMainCRTStartup,其对应
的进入点函数是wWinMain,而需要ANSI字符和字符串的CUI应用程序(如控制台console程序)的应用程序的启动函数是mainCRTStartup,对应的入口点函数为main;需要Unicode字符和字符串的CUI应用程序(如控制台console程序)的应用程序的启动函数为wmainCRTStartup,对应的入口点函数为wmain;

启动函数的功能可概括如下:

l         检索指向新进程的完整命令行的指针

l         检索指向新进程的环境变量的指针

l         对C/C++ run time's global variables进行初始化。如果包含了stdlib.h头文件,你的代码就能访问这些变量。详见下表:

l         对C运行期内存分配函数(mallco和calloc)以及low-level input/output routines使用的heap(堆)进行初始化

l         为所有的全局和静态C++类对象调用构造函数

 当上述这些初始化操作完成后,C/C++ run-time startup function就调用应用程序的进入点函数。

 
7. Startup code 调用App 程序的 WinMain  函数。

如果编写了一个WinMain函数,它将以如下的形式被调用

GetStartupInfo( &StartupInfo );

int nMainRetVal = WinMain( GetModuleHandle(NULL), NULL, pszCommandLineAnsi,

(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)

? StartupInfo.wShowWindow : SW_SHOWDEFAULT );


8. App 程序开始运作。
9. 使用者关闭App 主窗口,使WinMain 中的消息循环结束掉,于是WinMain 结束。
10. 回到Startup code。

当进入点函数返回时,启动函数便调用C运行期的exit函数,将返回值(nMainRetVal)传递给它。

Exit函数负责如下操作:

l         调用由_onexit函数的调用而注册的任何函数

l         为所有全局的和静态的C++类对象调用析构函数

l         调用操作系统的ExitProcess函数,将nMainRetVal传递给它。这使得操作系统能够撤销此进程并设置它的exit code(该代码保存在该进程对应的内核对象中)。

11. 回到系统,系统调用ExitProcess 结束进程。


运行库在调用用户程序的main或WinMain函数之前,进行了一些初始化工作。初始化完成后,接着才调用了我们自己编写的main或WinMain函数。这样, C/C++运行时库和应用程序就正常地工作起来了。 当用户程序的main或WinMain函数执行结束后,返回值被当做参数传入exit函数中,有exit完成程序执行的收尾工作,包括析构C++全局和静态类,调用操作系统的ExitProcess函数,告知进程退出等。
实现Windows开机自动启动exe程序的MFC教程 启动项通常是指在操作系统启动过程中需要自动加载的程序和服务。这些启动项可以在Windows的"任务管理器"的"启动"选项卡中查看和管理。对于IT专业人士而言,合理的配置启动项不仅可以加速系统启动,还可以防止不必要的程序和服务占用系统资源,影响性能。MFC(Microsoft Foundation Classes)是微软公司提供的一套用于开发Windows应用程序的C++类库,它封装了大部分Windows API,使得程序员可以更加便捷地使用面向对象的方式来开发Windows平台下的应用程序 阅读详情

相关推荐

AS7262六通道可见光传感器:从光谱原理到物联网色彩检测实战

光谱检测是嵌入式感知领域的关键技术,其核心原理是通过特定波长的滤光片分离光线并转换为电信号,从而实现对环境光或物体反射光的成分分析。这项技术的价值在于将复杂的光学分析简化为可编程读取的数字信号,极大降低了色彩检测在物联网和智能设备中的应用门槛。在智能农业、工业分拣、环境监测等场景中,精确的光谱数据能够驱动自动化决策,例如评估植物光照条件或识别物料颜色。本文以Adafruit AS7262传感器为例,深入解析其基于硅干涉滤光片的六通道设计,并通过Arduino与Python实战,演示如何快速构建从数据采集到可

weixin_28738173的博客 570

window 如何使用命令行运行.exe文件?

window使用命令行运行.exe文件

qq_44871531的博客 7万+

反相器(inverter)和缓冲器(buffer)---附加与非门原理图

下面是对反相器(Inverter)和缓冲器(Buffer)从面积、驱动能力、时序等多个角度的详细对比,列出的是一般情况下的比较,具体情况可能会受到工艺节点、设计库和特定设计要求的影响。缓冲器(Buffer)是数字电路中常见的逻辑门之一,用于增强信号的驱动能力,而不改变信号的逻辑状态。如下图所示的CMOS反相器,由一个NMOS和PMOS组成,栅端gate相连作为输入端Vin,漏端相连作为输出端Vout,NMOS的源端接地,PMOS的源端接电源VDD.与反相器不同,缓冲器的输出与输入保持相同的逻辑状态。

hzmscut的博客 1万+

Windows 中一个应用程序启动过程

# 1. Explorer.exe Windows 能够流行起来,很大一个原因是它有友好的用户图形界面,操作方便简单,容易上手。在Windows环境下打开一个程序,只要双击软件的图标就行了,那么它是如何启动起来的? 当我们启动电脑进入桌面时,系统会创建 Explorer.exe 进程。Explorer.exeWindows程序管理器 或者叫 文件资源管理器,用于管理...

cpp_mybest的博客 4757

网页调用本地exe文件

本文介绍在网页里通过url protocol方式调用本地exe文件的方法,主要分为两步,首先,编写注册表,然后页面里调用。

蝈蝈的博客 1万+

Windows.exe程序启动过程和C/C++运行时库

Windows系统中,.exe后缀的文件一般可以双击运行。编程时,编译出来的最终结果一般也表现为一个exe程序和其他的为程序执行提供支持的dll。我们双击一个exe程序的时候,在操作系统层面上,做了些什么使得应用程序能够执行呢? 现在有一个App.exe文件,根据这篇文章的说法,我总结了一下,双击App.exe之后操作系统做的工作如下: 1、 shell调用CreateProcss激活

nkliujianghunter的专栏 727

Windows.exe程序启动过程和C/C++运行时库<转载>

Windows系统中,.exe后缀的文件一般可以双击运行。编程时,编译出来的最终结果一般也表现为一个exe程序和其他的为程序执行提供支持的dll。我们双击一个exe程序的时候,在操作系统层面上,做了些什么使得应用程序能够执行呢?现在有一个App.exe文件,根据这篇文章的说法,我总结了一下,双击App.exe之后操作系统做的工作如下:1、 shell调用CreateProcss激活一个...

LEWENCAI560618的博客 362

编写bat脚本启动exe程序

编写bat脚本启动exe程序 此处以本机上安装的EpicGamesLauncher.exe程序为例。 编写bat脚本 大致过程就是:进入exe所在路径、运行即可 @echo off F: cd F:\EpicGames\Epic Games\Launcher\Portal\Binaries\Win32 EpicGamesLauncher.exe cmd 注:对于自己编写的exe程序,可以带上相应的启动参数,比如MyApplication.exe,将以上的EpicGamesLauncher.exe替换为My

知其然而后知其所以然 2万+

windows运行一个.exe过程

来自于《windows核心编程》 1,运行.exe(双击,右键运行,命令行等),操作系统的加载程序(估计是开机就启动的一个.exe)会检查.exe文件头。 文件头包含着一些exe级别的信息,比如“这是个控制台程序还是窗口程序”。 2,操作系统调用C/C++运行库实现的运行时启动函数,比如wWinMainCRTStartup()。C/C++运行库安装VS都会有。 大家熟悉的m

dmxjMao的博客 4004

一个microsoft的.exe程序启动过程

<br />转自:http://blogold.chinaunix.net/u3/95026/showart_2224740.html<br /> <br />一个microsoft的.exe程序启动过程<br /><br /><br /><br />   学习windows 编程从mfc角度来说可分为两部分那就是WinMain函数以前的,和WinMain函数以后的。前者涉及很多windows操作系统内部的知识,后者么看mfc源码就可以了。虽然大多数程序不需要你了解太多关于os加载应用程序这方面的知识,但

liushizhe1987的专栏 577

windows启动顺序大概流程和服务程序遇到的问题

1.服务程序目前遇到的问题 (1)服务程序无法监控剪贴板; (2)服务程序无法设置挂载的磁盘卷标; (3)服务端发到客户端的thritf消息,调用剪贴板写入时会提示com失败的问题; 2.服务程序启动顺序 参考文档:https://blog.csdn.net/singleyellow/article/details/104031963/ 电脑开机后,大致的启动顺序是BIOS—>MBR—>活动分区—>Ntoskrnl.exe、HAL—>服务类型为0、1的服务—>会话

onlyfunboy的专栏 2635

一个microsoft的.exe程序文件的启动过程

      学习windows 编程从mfc角度来说可分为两部分那就是WinMain函数以前的,和WinMain函数以后的。前者涉及很多windows操作系统内部的知识,后者需要看mfc源码。虽然大多数程序不需要了解太多关于os加载应用程序这方面的知识,但能较深入了解windows os的运行情况对程序员是很有帮助的。     关于os如何加载程序,它包括进程创建,主线程 创建,PE文件加载,程序

stone_kingnet的专栏 5105

exe文件注册为windows服务 | instsrv + srvany

exe文件注册为服务,如redis启动每次都有一个窗口,通过注册为服务,我们的redis就可以后台运行,没有窗口。

suweijie的博客 1475
上一篇: C++常用的编译器
下一篇: Windows XP 系统启动过程分析
Zenhobby
博客等级 码龄16年 468粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值