Wine Gecko 集成与运行修复总结概述本文档记录了让 ReactOS 加载 Wine Geckoxul.dll所需的全部修改。Wine Gecko 是 MSHTMLInternet Explorer 核心用于渲染 HTML 内容的引擎加载失败会导致浏览器无法显示网页。核心加载路径mshtml.dll 加载时 (DLL_PROCESS_ATTACH) └─ load_gecko() [nsembed.c:742] └─ load_wine_gecko() [nsembed.c:583] ├─ RegOpenKey(HKLM\Software\Wine\MSHTML) ├─ RegOpenKey(2.40) ← 子键 ├─ RegQueryValueExW(GeckoPath) → %SystemRoot%\wine_gecko ├─ ExpandEnvironmentStringsW → C:\ReactOS\wine_gecko [★ 修复1] ├─ check_version() → 验证 VERSION 文件 [★ 修复2] └─ load_xul() → LoadLibraryExW(xul.dll) [★ 修复3,4]修改清单涉及5 个源文件和1 个构建文件共 6 处修改。修复 1mshtml 读取注册表路径未展开 %SystemRoot%文件dll/win32/mshtml/nsembed.c问题load_wine_gecko_v()使用RegQueryValueExW读取 GeckoPath只允许REG_SZ类型且不展开%SystemRoot%。注册表中存储的是%SystemRoot%\wine_gecko但代码直接把它传给CreateFileW和LoadLibraryExW导致路径错误。修复第 571-587 行resRegQueryValueExW(hkey,wszGeckoPath,NULL,type,(LPBYTE)gre_path,size);if(res!ERROR_SUCCESS)returnFALSE;if(typeREG_EXPAND_SZ){PRUnichar expanded_path[MAX_PATH];DWORD expanded_lenExpandEnvironmentStringsW(gre_path,expanded_path,MAX_PATH);if(expanded_len0||expanded_lenMAX_PATH)returnFALSE;strcpyW(gre_path,expanded_path);}elseif(type!REG_SZ){returnFALSE;}支持REG_SZ和REG_EXPAND_SZ两种类型并展开%SystemRoot%。修复 2注册表 GeckoPath 设为 REG_EXPAND_SZ文件boot/bootdata/hivedef.inf问题第 1999 行GeckoPath使用默认的REG_SZ空 flags 字段而路径中含环境变量%SystemRoot%需要标记为REG_EXPAND_SZ才能被识别。修复第 1999 行; 原: HKLM,SOFTWARE\Wine\MSHTML\2.40,GeckoPath,,%SystemRoot%\wine_gecko ; 改: HKLM,SOFTWARE\Wine\MSHTML\2.40,GeckoPath,0x00020000,%SystemRoot%\wine_gecko0x00020000FLG_ADDREG_TYPE_EXPAND_SZREG_EXPAND_SZ。修复 3msvcrt.dll 缺少 xul.dll 所需的 CRT 导出函数文件dll/win32/msvcrt/msvcrt.spec问题Wine Gecko 的 xul.dll 是用 MinGW 编译的导入多个 Microsoft 安全 CRT 函数如__snwprintf_s、_snwprintf_s、_wcslwr_s等。这些函数在 msvcrt.spec 中被-version0x600限制只对 Vista 导出。ReactOS 以--version0x502(WinXP) 构建 msvcrt.dll因此这些函数不在导出表中。修复 A——添加 MinGW 双下划线别名第 930 行 varargs _snwprintf_s(ptr long long wstr) varargs __snwprintf_s(ptr long long wstr) _snwprintf_s ← 新增别名__snwprintf_s转发到_snwprintf_s。修复 B——去掉所有-version0x600版本限制# 去掉 spec 文件中所有 -version0x600 约束(Get-Contentmsvcrt.spec)-replace-version0x600\ ,-replace-version0x600\,涉及约 180 个函数包括_snwprintf_s、_wcslwr_s、_snprintf_s、strcpy_s、wcscpy_s、memcpy_s、fopen_s等全部安全 CRT 函数。修复 4kernel32.dll 缺少 GetSystemTimePreciseAsFileTime文件dll/win32/kernel32/client/time.c问题xul.dll 调用GetSystemTimePreciseAsFileTime该函数在 ReactOS 中只有STUB;空实现导致 xul.dll 加载失败c0000139。修复第 141-153 行VOID WINAPIGetSystemTimePreciseAsFileTime(OUT PFILETIME lpFileTime){LARGE_INTEGER SystemTime;NtQuerySystemTime(SystemTime);lpFileTime-dwLowDateTimeSystemTime.u.LowPart;lpFileTime-dwHighDateTimeSystemTime.u.HighPart;}NtQuerySystemTime和FILETIME使用相同的格式1601 年以来的 100ns 间隔直接赋值即可。修复 5构建系统将 wine_gecko 放入 ISO文件modules/CMakeLists.txt问题wine_gecko 文件通过add_cd_file(FOR bootcd)进入reactos.cab但安装程序 (USETUP) 不会自动提取 CAB 中所有文件到目标系统导致安装后%SystemRoot%\wine_gecko\目录缺失。修复第 53-81 行改用NO_CAB文件直接放在 ISO 的i386/wine_gecko/路径下在txtsetup.sif中添加目录 ID 和文件条目安装时由 USETUP 自动复制到%SystemRoot%\wine_gecko\add_cd_file(FILE .../wine_gecko/xul.dll DESTINATION reactos/wine_gecko NAME_ON_CD xul.dll NO_CAB ← 关键不打包进 CAB FOR bootcd livecd regtest)修复 6txtsetup.sif 添加 wine_gecko 文件复制规则文件boot/bootdata/txtsetup.sif问题安装程序不知道 wine_gecko 文件需要复制到目标系统。修复 A——添加目录 ID 映射第 41-45 行[Directories] 82 wine_gecko 88 wine_gecko\dictionaries 89 wine_gecko\gmp-clearkey\0.1 90 wine_gecko\gmp-fake\1.0 91 wine_gecko\gmp-fakeopenh264\1.0修复 B——添加 27 条文件条目第 145-171 行[SourceDisksFiles] ; Wine Gecko 根目录文件 (目标目录 82) xul.dll 1,wine_gecko,,,,,,82,,,,1,82 VERSION 1,wine_gecko,,,,,,82,,,,1,82 omni.ja 1,wine_gecko,,,,,,82,,,,1,82 freebl3.dll 1,wine_gecko,,,,,,82,,,,1,82 mozglue.dll 1,wine_gecko,,,,,,82,,,,1,82 nss3.dll 1,wine_gecko,,,,,,82,,,,1,82 ... ; 字典文件 (目标目录 88) en-US.aff 1,wine_gecko\dictionaries,,,,,,88,,,,1,88 en-US.dic 1,wine_gecko\dictionaries,,,,,,88,,,,1,88 ; GMP 插件 (目标目录 89-91) clearkey.dll 1,wine_gecko\gmp-clearkey\0.1,,,,,,89,,,,1,89 ...涉及文件完整列表#文件修改类型说明1dll/win32/mshtml/nsembed.c修复展开%SystemRoot%支持 REG_EXPAND_SZ2boot/bootdata/hivedef.inf修复GeckoPath 改为 REG_EXPAND_SZ3dll/win32/msvcrt/msvcrt.spec修复去掉全部-version0x600约束 添加__snwprintf_s别名4dll/win32/kernel32/client/time.c实现GetSystemTimePreciseAsFileTime5modules/CMakeLists.txt修复wine_gecko 改用 NO_CAB6boot/bootdata/txtsetup.sif修复添加目录 ID 和文件复制条目构建与测试# 1. 配置 CMake确保 wine_gecko 文件被 GLOB 识别cd D:\reactos cmake-G Ninja-DCMAKE_TOOLCHAIN_FILEtoolchain-mingw32.cmake-DARCHi386-S.-B output-MinGW-i386# 2. 构建ninja-C output-MinGW-i386-j 20 bootcd# 3. 输出文件# output-MinGW-i386/bootcd.iso ← 新 ISO含 wine_gecko# output-MinGW-i386/dll/ntdll/ntdll.dll ← 新 ntdll去掉 LDR 日志# output-MinGW-i386/dll/win32/kernel32/kernel32.dll ← 新 kernel32# output-MinGW-i386/dll/win32/msvcrt/msvcrt.dll ← 新 msvcrt# 4. 不重装的快速测试需要 PE 启动盘复制:copyoutput-MinGW-i386\dll\ntdll\ntdll.dll C:\ReactOS\system32\copyoutput-MinGW-i386\dll\win32\kernel32\kernel32.dll C:\ReactOS\system32\copyoutput-MinGW-i386\dll\win32\msvcrt\msvcrt.dll C:\ReactOS\system32\ md C:\ReactOS\wine_gecko xcopy/E D:\reactos\modules\optional\wine_gecko\*.*C:\ReactOS\wine_gecko\调试日志说明日志内容含义对应阶段Could not open VERSION fileVERSION 文件未找到check_versionCould not load XUL: %dxul.dll 加载失败依赖缺失load_xulUnexpected version %sVERSION 文件内容不匹配check_versionxul.dll failing with c0000139缺少 CRT 导出函数LoadLibraryExWCould not load wine-gecko以上任一阶段失败load_geckoFailed to init Gecko, returning CLASS_E_CLASSNOTAVAILABLEGecko 初始化失败init_xpcom