揭秘Windows程序启动的神秘之旅
程序的真正入口winmain或者main不是真正的入口只是语法规定的入口。通常通过mainCRTStartup、wimmainCRTStartup、WinMainCRTStartup或者wWinMainCRTStartup。启动函数默认的#includeiostreamintmain() {std::cout Hello, World! std::endl;return0;}直接使用msvc我是用的tools可能不一样自己的为准。挂断点看堆栈我们的调用流我反着写main()àinvoke_main()à__scrt_common_main_seh()à__scrt_common_main()àmainCRTStartup()àkernel32.dllàntdl\windows内核再次我会在后续补充完整流程这个不太支持windows的编译工具。调用的函数invoke_main__scrt_common_main_seh()__scrt_common_main()mainCRTStartup()kernel32.dllàBaseThreadInitThunk12()ntdll.dllà__RtlUserThreadStart()__RtlUserThreadStart8()详细流程内核调度(ntdll.dll) __RtlUserThreadStart8()和__RtlUserThreadStart()àstdcall 调用约定初始化teb(Thread Environment Block)设置seh(结构化异常处理) 链初始化浮点/向量寄存器状态调用线程入口函数 (BaseThreadInitThunk)à kernel32.dll BaseThreadInitThunk12()发送 DLL_THREAD_ATTACH 通知给所有已加载的 DLL初始化线程本地存储Thread Local Storage捕获未处理的异常并上报入口函数返回后调用 ExitThread 清理stdcall由被调用者清理栈调用mainCRTStartup()à进入exe mainCRTStartup()进程专用入口点连接器是*.exe入口控制台使用gui使用winmaincrtstartupà__scrt_common_main()你的可执行文件静态链接到 CRT 库核心主逻辑负责运行时库所有的初始化和清理à__scrt_common_main_seh()(she异常保护壳)用—try/--except包裹主流程兜底捕获未处理的系统异常à invoke_main调用main的封装统一处理参数最终进入用户代码àmain()详细说明__RtlUserThreadStart()// 原型简化void RtlUserThreadStart(PVOID StartAddress, // 线程要执行的函数地址通常是 BaseThreadInitThunkPVOID Parameter // 传递给线程函数的参数);① 初始化 TEB (Thread Environment Block)② 设置 SEH (结构化异常处理) 链③ 初始化浮点/向量寄存器状态④ 调用线程入口函数 (BaseThreadInitThunk)起始返回后调用__RtlExitUserThread终止线程BaseThreadInitThunk参考ReactOSVOID NTAPI BaseThreadInitThunk(BOOL InitialThread,PVOID StartAddress,PVOID Parameter){// 1. 通知 DLL 新线程创建LdrInitializeThunk(InitialThread, NULL, NULL);// 2. 调用实际的线程入口__try {((VOID (WINAPI *)(PVOID))StartAddress)(Parameter);}__except(UnhandledExceptionFilter(GetExceptionInformation())) {// 3. 异常处理ExitProcess(GetExceptionCode());}// 4. 线程退出ExitThread(STATUS_SUCCESS);}用户线程最初始入口设置初始环境结构化寻常帧调用win32线程mainCRTStartup// 实际 CRT 启动代码简化呈现void mainCRTStartup(){// ① 初始化 CRT 的全局状态_set_app_type(_crt_console_app);// ② 设置浮点环境_fpreset();// ③ 调用主初始化含异常保护__scrt_common_main_seh();// ④ 正常情况下不会执行到这里}具体分析就好这里主要功能就是控制台程序的连接器入口点操作系统加载exe不直接调用main会调用本函数。作为薄壳交给__scrt_common_main处理所有初始化。如果是gui程序就调用winmainCRTStartup但是再底层同样会触发执行__scrt_common_main。__scrt_common_main通用crt堆、环境变量、安全、cookie、浮点单元调用__scrt_common_main_seh去执行受保护的程序的后续流程cookie是栈保护就是canary__scrt_common_main_sehshe结构化异常保护边界结构__try{//调用全局/静态对象的构造函数调用invoke_main正常退出exit(result)}__except{//异常终止显示错误的对话框、生成转储等内部操作}调用invoke_main异常处理的最后的防线invoke_main给main的参数envpagrcagrv传参调用main封装

相关新闻

上海复杂APP项目找哪家公司靠谱?

上海复杂APP项目找哪家公司靠谱?

很多项目涉及多端、多角色、多系统和大量业务状态的上海企业,一开始都会把复杂企业APP理解成“做几个页面,再接一个后台”。真正聊到业务以后才发现,项目远没有这么简单。 如果企业正在上海寻找相关开发团队,虎链科技和上海元码科…

2026/8/4 15:50:38 阅读更多 →
C++循环依赖的根源与四大解决方案:前向声明、接口解耦与设计重构

C++循环依赖的根源与四大解决方案:前向声明、接口解耦与设计重构

1. 循环依赖:C项目中的“死锁”陷阱干了这么多年C,要说最让人头疼的编译错误,循环依赖绝对能排进前三。它不像内存泄漏那样运行时才暴露,也不像逻辑错误那样难以定位,它就像一个设计上的“死锁”,在编译阶段…

2026/8/4 10:22:50 阅读更多 →
MKS Monster8 8轴主板终极指南:双固件支持下的3D打印控制板完整教程

MKS Monster8 8轴主板终极指南:双固件支持下的3D打印控制板完整教程

MKS Monster8 8轴主板终极指南:双固件支持下的3D打印控制板完整教程 【免费下载链接】MKS-Monster8 MKS Monster8 is an 8-axis motherboard, which supports Voron printers and can run Marlin and Klipper firmware. 项目地址: https://gitcode.com/gh_mirrors…

2026/8/4 16:13:12 阅读更多 →

最新新闻

Linux内核container_of宏:原理与应用详解

Linux内核container_of宏:原理与应用详解

1. container_of宏在Linux内核中的核心价值在Linux内核开发中,container_of宏堪称最精妙的设计之一。这个看似简单的宏定义,实际上解决了内核数据结构管理的核心痛点——如何通过成员变量指针反向获取其所属结构体的起始地址。我第一次在驱动代码中遇到这…

2026/8/4 18:17:16 阅读更多 →
Java程序员收藏!从后端开发转向AI大模型应用开发的实战路线图

Java程序员收藏!从后端开发转向AI大模型应用开发的实战路线图

本文针对Java程序员在AI大模型时代面临的转型焦虑,提出不必从零学习算法,而是应聚焦AI应用开发。文章强调Java程序员的核心竞争力在于将AI能力落地业务系统,并提供从基础概念学习到项目落地的学习步骤,包括使用Java接入大模型API、…

2026/8/4 18:17:16 阅读更多 →
云市场模板一键复用:如何用行业最佳实践把BI交付周期从月压缩到周

云市场模板一键复用:如何用行业最佳实践把BI交付周期从月压缩到周

导语 很多企业启动BI项目时都默认接受了一个规则:核心业务分析场景的上线交付必须以月为单位,少则1个月,多则三四个月都不算罕见——需求对齐要花时间,数据建模重新梳理要花时间,可视化看板从0到1开发调整也要花时间。…

2026/8/4 18:17:16 阅读更多 →
【限时解密】Unity/Unreal实时管线兼容的AI 3D角色工作流:仅3个API调用+2次迭代即交付PBR-ready模型

【限时解密】Unity/Unreal实时管线兼容的AI 3D角色工作流:仅3个API调用+2次迭代即交付PBR-ready模型

更多请点击: https://kaifayun.com 第一章:AI生成3D角色 AI生成3D角色正迅速重塑游戏开发、影视制作与虚拟人交互的技术范式。不同于传统建模依赖人工雕刻与绑定,现代AI驱动流程融合多模态理解、隐式神经表示(如NeRF、SDF&#x…

2026/8/4 18:17:16 阅读更多 →
多语种实时翻译失效?扣子机器人响应延迟超2.8秒的7大根因诊断与秒级修复方案

多语种实时翻译失效?扣子机器人响应延迟超2.8秒的7大根因诊断与秒级修复方案

更多请点击: https://kaifayun.com 第一章:多语种实时翻译失效与扣子机器人响应延迟的全局现象洞察 近期,全球多个区域用户集中反馈多语种实时翻译服务出现不可预期中断,同时基于扣子(Doubao)平台构建的对…

2026/8/4 18:16:15 阅读更多 →
矩阵幸运数查找算法与Python实现

矩阵幸运数查找算法与Python实现

1. 题目解析与核心思路 1380题要求我们找出矩阵中的"幸运数"。根据题目定义,幸运数需要同时满足两个条件: 在所在行是最小值 在所在列是最大值 这个定义看似简单,但实际处理时需要特别注意边界条件和效率问题。我们先来看一个具…

2026/8/4 18:16:15 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →