Browse by type
# YY-Thunks - 让兼容 Windows 更轻松
众所周知,从 Windows 的每次更新又会新增大量 API,这使得兼容不同版本的 Windows 需要花费很大精力。导致现在大量开源项目已经不再兼容一些早期的 Windows 版本,比如 Windows XP RTM。
难道就没有一种快速高效的方案解决无法定位程序输入点的问题吗?
YY-Thunks(鸭船),存在的目的就是抹平不同系统的差异,编译时单纯添加一个 obj 即可自动解决这些兼容性问题。让你兼容旧版本 Windows 更轻松!
[ 鸭船交流群 633710173 ]
使用 LoadLibrary 以及 GetProcAddress 动态加载 API,不存在时做出补偿措施,
最大限度模拟原始 API 行为,让你的程序正常运行。大概就像下面这个GetTickCount64函数:
// 注意:Windows XP 不支持 GetTickCount64
ULONGLONG WINAPI GetTickCount64(VOID)
{
if (auto const _pfnGetTickCount64 = try_get_GetTickCount64())
{
return _pfnGetTickCount64();
}
// Fallback
return GetTickCount();
}
鸭船内建2级缓存以及按需加载机制,同时自动加密所有函数指针,
防止内存爆破攻击。最大程度减少不需要和不必要的 LoadLibrary 以及
GetProcAddress 调用以及潜在安全风险。鸭船添砖加瓦。大家可以在以下方案中任选一种,但是我们优先推荐 NuGet 方案,因为NuGet采用傻瓜式设计,使用更便捷。
YY-Thunks,搜索后点击安装。TargetFramework添加Windows系统平台,比如修改为net8.0-windows或者net9.0-windows。管理 NuGet 程序包。NuGet搜索框中输入:YY-Thunks,搜索后点击安装。如果需要支持XP,请将项目属性SupportedOSPlatformVersion调整为5.1。大致如下:
```xml
<TargetFramework>net8.0-windows</TargetFramework>
<SupportedOSPlatformVersion>5.1</SupportedOSPlatformVersion>
</PropertyGroup>
``` 4. 重新编译代码
在代码根目录创建Directory.Build.props,内容如下:
```xml
native,Version=v0.0
win;win-x86;win-x64;win-arm;win-arm64
<WindowsTargetPlatformMinVersion>5.1.2600</WindowsTargetPlatformMinVersion>
<Version>1.1.7-Beta3</Version>
</PackageReference>
$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))
2. 将VS作为Gen启动编译过程,代码如下:
cmake -G "Visual Studio 17 2022" -A Win32 -DCMAKE_CONFIGURATION_TYPES:STRING=Release -DCMAKE_INSTALL_PREFIX:PATH=.\build\x86-Release .
-- -r,该命令是还原nuget包,此时会自动下载YY-Thunks,并且配置到工程。cmake --build .\build\x86-Release --config Release -- -r
cmake --install .\build\x86-Release --config Release ``` 3. 重新编译代码
objs\$(PlatformShortName)\YY_Thunks_for_WinXP.obj。5.015.02DllMainCRTStartupForYY_Thunks/alternatename:_YY_ThunksOriginalDllMainCRTStartup@12=__DllMainCRTStartup@12/alternatename:YY_ThunksOriginalDllMainCRTStartup=_DllMainCRTStartup温馨提示:如果需要兼容 Vista,【所需的最低版本】无需修改,但是【附加依赖项】请选择
objs\$(PlatformShortName)\YY_Thunks_for_Vista.obj。
LLD-Link链接器无法使用obj方式,因为遇到重复符号会报告错误。
-LIBPATH:YY-Thunks根目录/Lib/5.1.2600.0/x86 类似的参数添加到链接器参数中,并确保顺序比系统SDK靠前。-SUBSYSTEM:WINDOWS",5.1" 或者 -SUBSYSTEM:CONSOLE",5.1" 或者 -SUBSYSTEM:WINDOWS",5.2" 或者 -SUBSYSTEM:CONSOLE",5.2"。-ENTRY:DllMainCRTStartupForYY_Thunks,修改DLL入口点-alternatename:_YY_ThunksOriginalDllMainCRTStartup@12=__DllMainCRTStartup@12-alternatename:YY_ThunksOriginalDllMainCRTStartup=_DllMainCRTStartup温馨提示:如果您看不懂链接器的配置指引那么请使用NuGet版!NuGet对新手友好。
全平台ABI兼容。
/MD、/MT、/MDd、/MTd)。| Thunks等级 | 最低SDK要求 |
|---|---|
| Windows 2000 | SDK 6.0(VS2008默认附带) |
| Windows XP(2003) | SDK 6.0(VS2008默认附带) |
| Windows Vista | SDK 6.0(VS2008默认附带) |
| Windows 7 | SDK 7.0 |
| Windows 8 | SDK 8.0 |
| Windows 8.1 | SDK 8.1 |
| Windows 10 10240 | SDK 10.0.10240 |
| Windows 10 19041 | SDK 10.0.19041 |
温馨提示:VC6.0、VS2005用户请注意,由于这些编译器默认附带的SDK版本太低。请先将SDK升级到6.0或者更高版本,然后再使用YY-Thunks,否则将发生链接失败! 高版本的SDK不影响对老系统的兼容性,请坐和放宽,安心升级。
请参阅 ThunksList.md
请参阅 releases 更新日志
$ claude mcp add YY-Thunks \
-- python -m otcore.mcp_server <graph>