WINE IE 与 wine_gecko 架构分析

发布时间:2026/7/24 7:41:57
WINE IE 与 wine_gecko 架构分析 WINE IE 与 wine_gecko 架构分析一、整体架构ReactOS 中的 Internet Explorer 采用四层架构每一层都是独立的 DLL/EXE 模块iexplore.exe (可执行入口) | v ieframe.dll (浏览器框架 - 窗口、菜单、导航栏、IWebBrowser2) | v mshtml.dll (Trident COM ↔ XPCOM 桥接层 - HTMLDocument, IHTMLDocument2) | v wine_gecko (Mozilla Gecko 引擎 - xul.dll 配套 DLL)核心设计理念mshtml.dll不包含自有的 HTML/CSS 引擎实现而是作为 TridentMSHTMLCOM 接口与 Mozilla GeckoXPCOM引擎之间的桥接层。这使得 ReactOS/Wine 无需重新实现整个浏览器引擎即可提供 HTML 渲染能力。二、各层详解2.1 iexplore.exe — 可执行入口位置base/applications/iexplore/main.c极简的包装器 EXE主要逻辑通过IEWinMain()委托给ieframe.dll支持/regserver和/unregserver命令行参数2.2 ieframe.dll — 浏览器框架位置dll/win32/ieframe/职责完整的浏览器壳shell提供用户可见的 UI 元素和浏览器服务。核心结构体结构体文件职责DocHostieframe.h:119文档宿主机管理 WebBrowser 控件、URL、状态、travel logShellBrowserieframe.h:84IShellBrowser/IBrowserService 实现与 shell 集成WebBrowserieframe.h:178IWebBrowser2 COM 接口实现供外部调用TravelLogshellbrowser.c:41ITravelLog COM 接口管理浏览历史关键 COM 接口接口用途IWebBrowser2外部控制浏览器的主要 COM 接口Navigate, GoBack, GoForward 等IShellBrowser与 Windows Shell 的集成接口IBrowserService浏览器内部服务接口IDocHostUIHandler2自定义 MSHTML 宿主行为菜单、键盘、拖放等IOleClientSiteOLE 嵌入容器接口IDocObjectService文档对象服务BeforeNavigate2, NavigateComplete2 事件启动流程IEWinMain() → InternetExplorer_Construct() → DocHost_Init() # 初始化 DocHost → HlinkFrame_Init() # 初始化超链接框架 → IWebBrowser2_Navigate2() # 导航到 URL → OleCreate(CLSID_HTMLDocument) # 创建 mshtml 的 HTMLDocument2.3 mshtml.dll — Trident/Gecko 桥接层位置dll/win32/mshtml/职责实现 TridentMSHTMLCOM 接口但将实际渲染工作委托给 wine_gecko。核心组件组件文件职责HTMLDocumentObjhtmldoc.cIHTMLDocument2/3 的 COM 实现NSContainernsembed.cGecko 容器持有 XPCOM 接口指针load_gecko()nsembed.c:754Gecko 加载入口load_xul()nsembed.c:472加载 xul.dllinit_xpcom()nsembed.c:690初始化 XPCOM 运行时Gecko 加载流程mshtml.dll DLL_PROCESS_ATTACH → load_gecko() [DLL 加载时调用] → load_wine_gecko(gre_path) [从注册表读取 Gecko 路径] → RegOpenKey(HKLM\Software\Wine\MSHTML\2.40) → RegQueryValueExW(GeckoPath) → %SystemRoot%\wine_gecko (REG_EXPAND_SZ) → ExpandEnvironmentStringsW → C:\ReactOS\wine_gecko → check_version() [验证 VERSION 文件 Wine Gecko 2.40] → load_xul() [LoadLibraryExW(xul.dll)] → set_environment() [设置 PATH, NSPR_LOG_MODULES 等] → GetProcAddress 解析 15 个 XPCOM 核心函数 → init_xpcom(gre_path) [初始化 XPCOM] → NS_InitXPCOM2() → 获取 nsIComponentManager → 注册 nsIComponentRegistrar (nsio, mutation observer) → 设置偏好 (set_preferences) → 注册自定义 nsIO 服务 ← 成功: pCompMgr ! NULL ← 失败: Could not load wine-gecko. HTML rendering will be disabled.动态解析的 XPCOM 函数从 xul.dll 通过GetProcAddress解析的 15 个核心函数函数用途NS_InitXPCOM2初始化 XPCOM 运行时NS_ShutdownXPCOM关闭 XPCOMNS_GetComponentRegistrar获取组件注册器NS_StringContainerInit2初始化 Unicode 字符串容器NS_CStringContainerInit2初始化 C 字符串容器NS_StringContainerFinish销毁 Unicode 字符串容器NS_CStringContainerFinish销毁 C 字符串容器NS_StringSetData设置 Unicode 字符串数据NS_CStringSetData设置 C 字符串数据NS_NewLocalFile创建 nsIFile 本地文件对象NS_StringGetData获取 Unicode 字符串数据NS_CStringGetData获取 C 字符串数据NS_Alloc/NS_FreeXPCOM 内存分配/释放循环收集函数ccref_incr,ccref_decr,ccref_init,ccp_init,describe_cc_node,note_cc_edgeNSContainer — Gecko 与 MSHTML 的桥接位置mshtml_private.h:650NSContainer是 mshtml 中最核心的桥接结构体它持有 Gecko 引擎的 XPCOM 接口指针structNSContainer{nsIWebBrowserChrome nsIWebBrowserChrome_iface;// Gecko 浏览器 chromensIContextMenuListener nsIContextMenuListener_iface;// 右键菜单监听nsIURIContentListener nsIURIContentListener_iface;// URI 内容监听nsIEmbeddingSiteWindow nsIEmbeddingSiteWindow_iface;// 嵌入站点窗口nsITooltipListener nsITooltipListener_iface;// 工具提示nsIInterfaceRequestor nsIInterfaceRequestor_iface;// 接口请求器nsISupportsWeakReference nsISupportsWeakReference_iface;nsIWebBrowser*webbrowser;// Gecko 的 WebBrowser 对象nsIBaseWindow*window;// Gecko 的基础窗口nsIWebNavigation*navigation;// 导航接口 (GoBack, GoForward, LoadURI)nsIWebBrowserFocus*focus;// 焦点管理nsIWebBrowserSetup*setup;// 浏览器设置HTMLDocumentObj*doc;// 关联的 MSHTML 文档对象NSContainer*parent;// 父容器HWND hwnd;// Gecko 子窗口句柄...};导航时序IWebBrowser2::Navigate(url) → navigate_url() [navigate.c:941] → 触发 BeforeNavigate2 事件 [IDocObjectService::FireBeforeNavigate2] → OleCreate(CLSID_HTMLDocument) [创建 HTMLDocument] → HTMLDocument_Create() [htmldoc.c:4821] → create_nscontainer() [nsembed.c:2093] → load_gecko() [首次使用时触发] → init_nscontainer() [创建 nsIWebBrowser nsIBaseWindow] → 创建 IHTMLDocument2 接口 → nsIWebNavigation::LoadURI() [委托给 Gecko] → NavigateComplete2 事件 [IDocObjectService::FireNavigateComplete2] → 更新 travel log [update_travellog in dochost.c] → DocumentComplete 事件 [IDocObjectService::FireDocumentComplete]XPCOM 接口定义位置dll/win32/mshtml/nsiface.idl这是一个特殊的 IDL 文件“This file is not a typical idl file. Interfaces in this file are XPCOM interfaces (NOT MSCOM!), but we generate the header file with WIDL compatible with XPCOM, usable in C code.”定义了约100 个 XPCOM 接口的 C 语言绑定涵盖核心接口nsIWebBrowser, nsIBaseWindow, nsIWebNavigation内容接口nsIURIContentListener, nsIWebPageDescriptor历史接口nsIGlobalHistory, nsIHistoryEntry安全接口nsISecureBrowserUI, nsISSLStatus打印接口nsIWebBrowserPrint, nsIWebProgressListener辅助接口nsIIOService, nsIFileProtocolHandler, nsICategoryManager2.4 wine_gecko — Mozilla Gecko 引擎位置modules/optional/wine_gecko/文件清单wine_gecko/ ├── xul.dll # Gecko 核心引擎 DLL (~30MB) ├── VERSION # 版本文件Wine Gecko 2.40 ├── omni.ja # 打包的 JS/XPCOM 组件ZIP 格式 ├── platform.ini # 平台配置 ├── dependentlibs.list # 依赖列表 ├── LICENSE ├── freebl3.dll # NSS 加密库 ├── mozglue.dll # Mozilla 胶水库 ├── nss3.dll # NSS 安全层 ├── nssckbi.dll # NSS CKBI 内置根证书 ├── nssdbm3.dll # NSS DBM 数据库 ├── softokn3.dll # NSS 软件令牌 ├── libEGL.dll # EGL 图形接口 ├── libGLESv2.dll # GLESv2 图形接口 ├── plugin-container.exe # 插件进程容器 ├── plugin-hang-ui.exe # 插件挂起 UI ├── dictionaries/ │ ├── en-US.aff # 拼写检查词形 │ └── en-US.dic # 拼写检查词典 └── gmp-clearkey/0.1/ # ClearKey DRM ├── clearkey.dll └── clearkey.info注册表配置boot/bootdata/hivedef.inf:1997-1999; Gecko 下载 URL HKCU,SOFTWARE\Wine\MSHTML,GeckoUrl,,http://source.winehq.org/winegecko.php ; 安装 CAB 目录 HKCU,SOFTWARE\Wine\MSHTML,GeckoCabDir,0x00020000,%SystemRoot%\ ; Gecko 安装路径 (REG_EXPAND_SZ) HKLM,SOFTWARE\Wine\MSHTML\2.40,GeckoPath,0x00020000,%SystemRoot%\wine_gecko三、关键接口映射Trident (MSCOM)Gecko (XPCOM)功能IHTMLDocument2nsIWebBrowsernsIDOMDocumentHTML 文档对象IWebBrowser2::NavigatensIWebNavigation::LoadURIURL 导航IHTMLElementnsIDOMHTMLElementDOM 元素操作IHTMLWindow2nsIDOMWindow窗口对象IDocHostUIHandlernsIWebBrowserChrome宿主 UI 自定义IOleInPlaceSitensIEmbeddingSiteWindow内嵌站点窗口四、宿主 UI 自定义链应用程序 → ieframe.dll DocHostUIHandler ↓ (通过 hostui 链式转发) 外部宿主 (如应用程序自定义的 IDocHostUIHandler) ↓ mshtml.dll 内部处理 ↓ NSContainer → nsIWebBrowserChrome ↓ xul.dll (Gecko 引擎)关键方法dochost.c:790-951方法功能ShowContextMenu右键菜单可以禁止或自定义GetHostInfo返回 DOCHOSTUIFLAG如禁用脚本、禁用 ActiveX 等GetOptionKeyPathIE 选项的注册表路径GetExternal提供 window.external 的 IDispatch 接口TranslateAccelerator键盘加速键处理GetDropTargetOLE 拖放目标FilterDataObject剪贴板数据过滤五、wine_gecko 安装机制5.1 首次安装时系统安装向导syssetup/wizard.c:2710调用appwiz.cpl,,install_gecko弹出安装对话框。5.2 安装流程dll/cpl/appwiz/addons.cinstall_addon(ADDON_GECKO) → install_from_registered_dir() # 尝试从 GeckoCabDir 安装 MSI → 搜索 GeckoCabDir\wine_gecko-2.40-x86.msi → MsiInstallProductW() → [失败时] download_proc() # 弹出下载对话框 → URLDownloadToFileW(url, temp_msi) → SHA1 校验 → MsiInstallProductW(temp_msi)5.3 MSI 安装结果MSI 将 xul.dll 等文件解压到%SystemRoot%\wine_gecko\并在注册表中写入 GeckoPath。5.4 系统自带的 wine_geckoReactOS 的 bootcd.iso 中已包含 wine_geckomodules/optional/wine_gecko/通过txtsetup.sif在系统安装时直接复制到%SystemRoot%\wine_gecko\无需下载。六、构建系统集成6.1 mshtml.dll 构建# dll/win32/mshtml/CMakeLists.txt add_idl_headers(mshtml_nsiface_header nsiface.idl) # 从 XPCOM IDL 生成头文件 ... add_library(mshtml MODULE nsembed.c ...) # nsembed.c 是 Gecko 集成核心 add_dependencies(mshtml mshtml_nsiface_header) # 依赖 XPCOM 头文件6.2 wine_gecko 文件集成# modules/CMakeLists.txt # 使用 NO_CAB 确保文件直接放在 ISO 上不打包进 CAB add_cd_file(FILE .../wine_gecko/xul.dll DESTINATION reactos/wine_gecko NO_CAB FOR bootcd livecd regtest)6.3 安装时文件复制txtsetup.sif中定义了 5 个目录 ID82, 88-91和 27 个文件条目确保安装程序将所有 wine_gecko 文件复制到%SystemRoot%\wine_gecko\。七、ReactOS 特有修复详见 wine_gecko集成与修复总结.md主要包括#文件修复1nsembed.c支持REG_EXPAND_SZ展开%SystemRoot%2hivedef.infGeckoPath 使用REG_EXPAND_SZ3msvcrt.spec去掉-version0x600限制4kernel32/time.c实现GetSystemTimePreciseAsFileTime5modules/CMakeLists.txtwine_gecko 用NO_CAB6txtsetup.sif添加目录 ID 和文件复制规则八、调试指南调试频道频道名启用方式范围ieframeWINE_DEFAULT_DEBUG_CHANNEL(ieframe)浏览器框架geckoWINE_DECLARE_DEBUG_CHANNEL(gecko)Gecko 集成 (nsembed.c)常见错误日志日志含义err: Could not open VERSION fileVERSION 文件未找到err: Could not load XUL: %dxul.dll 加载失败依赖缺失err: xul.dll failing with c0000139缺少 CRT 导出函数 (DLL_NOT_FOUND)err: Could not load wine-geckoGecko 加载链路中任一阶段失败fixme: BrowserService_GetTravelLogITravelLog 未实现已修复err: class {591209c7-...} not registeredApplicationAssociationRegistration 未注册已修复九、架构图示┌─────────────────────────────────────────────────────────────────┐ │ iexplore.exe │ │ (base/applications/iexplore/main.c) │ └───────────────────────────┬─────────────────────────────────────┘ │ IEWinMain() ▼ ┌─────────────────────────────────────────────────────────────────┐ │ ieframe.dll │ │ (dll/win32/ieframe/) │ │ │ │ ┌───────────────┐ ┌───────────────┐ ┌────────────────────┐ │ │ │ WebBrowser │ │ ShellBrowser │ │ DocHost │ │ │ │ (IWebBrowser2)│ │(IShellBrowser)│ │(IDocHostUIHandler2) │ │ │ └───────┬───────┘ └───────┬───────┘ └─────────┬──────────┘ │ │ │ │ │ │ │ └─────────────────┴─────────────────────┘ │ │ │ │ │ IWebBrowser2::Navigate() │ └───────────────────────────┬─────────────────────────────────────┘ │ OleCreate(CLSID_HTMLDocument) ▼ ┌─────────────────────────────────────────────────────────────────┐ │ mshtml.dll │ │ (dll/win32/mshtml/) │ │ │ │ ┌──────────────────────┐ ┌──────────────────────────────────┐ │ │ │ HTMLDocumentObj │ │ NSContainer │ │ │ │ (IHTMLDocument2/3) │ │ │ │ │ │ (IDispatch) │ │ nsIWebBrowser │ │ │ └──────────┬───────────┘ │ nsIWebNavigation │ │ │ │ │ nsIBaseWindow │ │ │ │ │ nsIWebBrowserChrome │ │ │ │ │ nsIWebBrowserFocus │ │ │ │ │ ... │ │ │ │ └──────────┬───────────────────────┘ │ │ │ │ │ │ └──────────────────────────┼─────────────────────────┘ │ │ │ │ load_gecko() ◄────────────┘ │ │ (加载 xul.dll 初始化 XPCOM) │ └────────────────────────────────────────┬─────────────────────────┘ │ XPCOM 调用 ▼ ┌─────────────────────────────────────────────────────────────────┐ │ wine_gecko (xul.dll) │ │ (modules/optional/wine_gecko/) │ │ │ │ Mozilla Gecko 引擎 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Gecko │ │ Necko │ │ NSS │ │ │ │ (HTML/CSS)│ │ (网络层) │ │ (安全层) │ │ │ ├──────────┤ ├──────────┤ ├──────────┤ │ │ │ Spider- │ │ DOM │ │ Layout │ │ │ │ monkey │ │ │ │ Engine │ │ │ │ (JS引擎) │ │ │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────────┘十、关键文件索引文件路径说明base/applications/iexplore/main.cIE 可执行入口dll/win32/ieframe/iexplore.cIEWinMain, InternetExplorer_Constructdll/win32/ieframe/webbrowser.cIWebBrowser2 实现dll/win32/ieframe/dochost.cDocHost, IDocHostUIHandler2, travel logdll/win32/ieframe/shellbrowser.cShellBrowser, IBrowserService, ITravelLogdll/win32/ieframe/navigate.cnavigate_url 函数dll/win32/ieframe/client.cIOleClientSite, IOleInPlaceSitedll/win32/ieframe/ieframe.h核心数据结构定义dll/win32/mshtml/nsembed.cGecko 加载、XPCOM 初始化、NSContainerdll/win32/mshtml/nsiface.idl~100 个 XPCOM 接口的 C 绑定dll/win32/mshtml/htmldoc.cHTMLDocument COM 实现dll/win32/mshtml/navigate.cMSHTML 导航逻辑dll/win32/mshtml/mshtml_private.hNSContainer 等内部结构dll/win32/mshtml/main.cDllMain, DLL_PROCESS_ATTACH 时调用 load_geckomodules/optional/wine_gecko/wine_gecko 文件目录modules/optional/wine_gecko-2.40-x86.msiwine_gecko MSI 安装包modules/CMakeLists.txtwine_gecko 构建集成boot/bootdata/hivedef.infGecko 注册表默认值boot/bootdata/txtsetup.sif安装时文件复制规则dll/cpl/appwiz/addons.cGecko 安装/下载 UIdll/win32/syssetup/wizard.c系统安装时触发 Gecko 安装