Chrome 49 在 ReactOS 上 c0000005 崩溃的修复过程
Chrome 49 在 ReactOS 上 c0000005 崩溃的修复过程概述Chrome 49 (Chrome_V49) 在 ReactOS 上启动时立即崩溃异常代码c0000005访问违例EIP0。本文档详细记录了从问题分析到修复的完整过程。1. 启用 Chrome 专用崩溃调试日志修改文件dll/win32/kernel32/client/except.c修改内容在UnhandledExceptionFilter调用的PrintStackTrace函数中添加进程名判断仅当当前进程为Chrome.exe时才打印详细的崩溃调试信息。关键代码 - 进程名判断staticBOOLIsChromeProcess(VOID){CHAR szPath[MAX_PATH];CHAR*pName,*pSlash;if(!GetModuleFileNameA(NULL,szPath,sizeof(szPath)))returnFALSE;/* Extract filename from full path */pNameszPath;pSlashstrrchr(szPath,\\);if(pSlash)pNamepSlash1;pSlashstrrchr(szPath,/);if(pSlashpSlashpName-1)pNamepSlash1;/* Convert to lowercase for comparison */for(pSlashpName;*pSlash;pSlash){if(*pSlashA*pSlashZ)*pSlasha-A;}return(strcmp(pName,chrome.exe)0);}调试日志输出10 步步骤内容说明Step 1Exception Basic Information异常代码、标志、地址Step 2Access Violation Details读/写/执行类型、目标地址Step 3Stack Data DumpESP 附近栈数据定位调用参数Step 4Wine Stub Check缺失函数检查Step 5CPU Registers Dump所有寄存器值Step 6Crash Location Analysis崩溃所在的模块名、基址、偏移Step 7Call Stack Trace帧回溯最多 128 帧Step 8All Loaded Modules所有已加载 DLL 列表Step 9Instruction at EIP崩溃位置的 16 字节机器码Step 10Debug Summary异常类型、崩溃位置摘要2. 第一次崩溃分析EIP0 的 NULL 指针调用崩溃日志摘要ExceptionCode: c0000005 (ACCESS_VIOLATION) ExceptionAddress: 00000000 Operation: READ Faulting Address: 00000000 Registers: EAX: 00000000 EBX: 00000000 ECX: 0012fce4 EDX: c0000001 EBP: 0012fe14 ESI: 0015b0d0 ESP: 0012fca0 EDI: 00400000 EIP: 00000000 Call Stack (3 frames): Frame[0]: Chrome.exe:0x1078f (base00400000) Frame[1]: Chrome.exe:0x63e1a (base00400000) Frame[2]: kernel32.dll:0x12535 (base7C5E0000)分析过程调用栈过短仅 3 帧→ 崩溃发生在 Chrome.exe 的非常早期初始化阶段EIP0→ CPU 试图执行地址 0 处的代码 → 通过 NULL 函数指针调用Frame[0]0x1078f→ 单例构造函数返回后的地址反汇编 Chrome.exe 构造函数使用 hex dump objdump 反汇编 Chrome.exe关键代码段RVA 0x104C0 ~ 0x1078f; Chrome 单例对象构造函数 (size 0x4C 76 bytes) ; 第一次 API 动态解析 0x104EE: call [GetCurrentProcess] ; 获取当前进程句柄 0x10504: call [GetModuleHandleW] ; GetModuleHandleW(kernel32.dll) 0x1050B: call [GetProcAddress] ; GetProcAddress(hMod, IsWow64Process) 0x10513: test eax, eax 0x10515: je SKIP ; 如果 NULL 则跳过 ... 0x1052C: call *%eax ; 调用 IsWow64Process ; 第二次 API 动态解析 0x106B9: push GetProductInfo ; 函数名 0x106BE: push kernel32.dll ; 模块名 0x106C3: call [GetModuleHandleW] ; GetModuleHandleW(kernel32.dll) 0x106C9: push eax ; hModule 0x106CA: call [GetProcAddress] ; GetProcAddress(hMod, GetProductInfo) ... 0x106E7: call *%eax ; 调用 GetProductInfo ← CRASH HERE!根因定位寄存器 栈数据综合分析ESP at 0x0012FCA0: 0x0012FCA0: 004106E9 00000006 00000000 00000000ESP 顶部值0x004106E9对应call *%eax指令后的返回地址RVA 0x106E9指令本身在RVA 0x106E7。call *%eax的分析GetProcAddress(hKernel32, GetProductInfo)→ EAX如果 EAX0函数未找到则call *%eax→ EIP0 → 崩溃根因确认ReactOS 的kernel32.spec文件将GetProductInfo定义为转发器 stdcall GetProductInfo(long long long long ptr) ntdll.RtlGetProductInfo但ntdll.dll 并没有导出 RtlGetProductInfoDLL导出 RtlGetProductInfontdll.dll❌ntdll_vista.dll✅ (Ordinal 2)Chrome 通过GetProcAddress(GetModuleHandleW(kernel32.dll), GetProductInfo)查找函数 → 转发器指向ntdll.RtlGetProductInfo→ ntdll 中没有此函数 → 返回 NULL → Chrome 调用 NULL 指针 → 崩溃。3. 修复修改 kernel32.spec 转发器修改文件dll/win32/kernel32/kernel32.spec修改内容- stdcall GetProductInfo(long long long long ptr) ntdll.RtlGetProductInfo stdcall GetProductInfo(long long long long ptr) ntdll_vista.RtlGetProductInfo修复原理Chrome 在 Vista 兼容模式下运行LdrpInitializeProcessCompat: Found guid for winver 0x600Vista 兼容 shim DLLntdll_vista.dll会被自动加载ntdll_vista.dll确实导出了RtlGetProductInfo修改转发器指向ntdll_vista.RtlGetProductInfo后GetProcAddress能正确解析4. 修复验证修复前ExceptionCode: c0000005 ExceptionAddress: 00000000 Call Stack: 3 frames (Chrome.exe → Chrome.exe → kernel32)修复后ExceptionCode: 80000003 (BREAKPOINT) ExceptionAddress: 021D7BCB (chrome.dll 内有效地址) Call Stack: 20 frames (全部在 chrome.dll 内) EIP Bytes: cc c3 6a 01 e8 05 2d ec 00 cc ...结论✅c0000005NULL 指针崩溃已完全修复✅ Chrome 通过了单例构造函数阶段✅ Chrome 进入了chrome.dll 的主初始化代码⏳ 新的80000003断点异常是 Chrome 内部断言失败需要进一步分析5. 文件变更汇总文件变更类型说明dll/win32/kernel32/client/except.c新增调试代码添加IsChromeProcess()和 10 步调试日志dll/win32/kernel32/kernel32.spec修复GetProductInfo转发器从ntdll改为ntdll_vista6. 编译与部署流程# 编译ninja-C output-MinGW-i386 kernel32# 停止 VME:\VirtualBox\VBoxManage.exe controlvmReactOS-Test-Newpoweroff# 部署到 VDIvdi_tool.exe add output-MinGW-i386\ReactOS-Test.vdi ^ output-MinGW-i386\dll\win32\kernel32\kernel32.dll ^/ReactOS/system32/kernel32.dll# 清除串口日志 启动 VMRemove-Itemoutput-MinGW-i386\serial_output.log E:\VirtualBox\VBoxManage.exe startvmReactOS-Test-New# 查看日志Select-String-Pathoutput-MinGW-i386\serial_output.log-PatternCHROME-DBG

相关新闻

机器学习模型生产化落地:从Notebook到高可靠服务的全链路实践

机器学习模型生产化落地:从Notebook到高可靠服务的全链路实践

1. 项目概述:当模型走出Jupyter,真正开始呼吸真实世界空气“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号,懂的人立刻会心一笑。它不是在讲怎么调参、怎么画loss曲线,而是…

2026/7/23 16:25:34 阅读更多 →
AI化学家Coscientist:GPT-4自主设计实验的突破

AI化学家Coscientist:GPT-4自主设计实验的突破

1. AI化学家Coscientist:当GPT开始自主设计实验 上周Nature杂志封面文章报道的Coscientist系统,可能是2023年最令人不安又兴奋的AI突破之一。这个由卡内基梅隆大学团队开发的AI化学家,已经能够独立完成从文献检索、实验设计到仪器操作的全流程…

2026/7/22 14:18:58 阅读更多 →
基于LSTM的古诗接龙模型构建与实践

基于LSTM的古诗接龙模型构建与实践

1. 项目概述:古诗接龙小模型的构建思路去年在GitHub上看到一个用LSTM生成古诗的仓库,当时就萌生了自己动手实现一个能玩"古诗接龙"的小模型的想法。这种文字生成任务特别适合用来理解自然语言处理的基础原理,而且相比现代文&#x…

2026/7/22 23:07:33 阅读更多 →

最新新闻

宝鸡收表老炮儿掏心窝子:战斧进过水修过机芯到底还能卖多少钱?别被中介忽悠了

宝鸡收表老炮儿掏心窝子:战斧进过水修过机芯到底还能卖多少钱?别被中介忽悠了

宝鸡收表老炮儿掏心窝子:战斧进过水修过机芯到底还能卖多少钱?别被中介忽悠了

2026/7/23 16:24:51 阅读更多 →
编写程序设置情绪缓冲倒计时,生气烦躁时强制等待三分钟再做决定,避免冲动扼杀新思路。

编写程序设置情绪缓冲倒计时,生气烦躁时强制等待三分钟再做决定,避免冲动扼杀新思路。

情绪缓冲倒计时系统:用 Python 给冲动装上"刹车片"心理健康与创新能力课程 技术实践工具纯 Python 3.8 零第三方依赖 本地优先 隐私安全一、实际应用场景描述这是一套为"心理健康与创新能力"课程设计的技术实践工具,解决一个几乎…

2026/7/23 16:24:51 阅读更多 →
UE4SS终极指南:从零掌握虚幻引擎4游戏脚本注入与修改

UE4SS终极指南:从零掌握虚幻引擎4游戏脚本注入与修改

1. 项目概述:为什么UE4SS是游戏修改的“瑞士军刀”? 如果你玩过一些基于虚幻引擎4(UE4)开发的PC游戏,比如《艾尔登法环》、《赛博朋克2077》或者《森林之子》,你可能听说过“修改器”或者“模组”。这些工具…

2026/7/23 16:24:51 阅读更多 →
2026电吉他新手选购全攻略!吃透核心参数,4款高性价比机型闭眼入

2026电吉他新手选购全攻略!吃透核心参数,4款高性价比机型闭眼入

电吉他入门门槛极低,只要掌握基础选购常识,结合自身预算和曲风需求挑选,就能轻松入手一把适配长期练习的优质琴。本文为大家带来零基础专属电吉他科普干货,同时精选4款经过实测验证的入门、进阶机型,覆盖全主流预算区间…

2026/7/23 16:24:51 阅读更多 →
编写程序统计情绪内耗消耗的时长,换算成可以完成的创意任务数量,直观展示内耗机会成本。

编写程序统计情绪内耗消耗的时长,换算成可以完成的创意任务数量,直观展示内耗机会成本。

情绪内耗时长统计与创意机会成本可视化系统:把你"看不见的时间"变成"看得见的选择"心理健康与创新能力课程 技术实践工具纯 Python 3.8 零第三方依赖 本地优先 隐私安全一、实际应用场景描述这是一套为"心理健康与创新能力"课程设…

2026/7/23 16:24:51 阅读更多 →
嵌入式低功耗设计实战:时钟门控与休眠模式原理与应用

嵌入式低功耗设计实战:时钟门控与休眠模式原理与应用

1. 低功耗设计的基石:时钟门控与休眠模式 在嵌入式系统,尤其是电池供电的物联网设备和便携式电子产品中,功耗管理是决定产品成败的关键。我见过太多项目,功能实现得花里胡哨,结果一上电池,续航直接“见光死…

2026/7/23 16:23:51 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻