pe文件版本信息存储在.rsrc资源段中,结构为vs_versioninfo→stringfileinfo→stringtable→string条目,需用windows sdk资源api(如updateresource)修改,不可直接字节编辑。

PE文件版本信息在哪?VS_VERSIONINFO不是直接能改的字段
Windows PE 文件的版本信息(如“文件描述”“产品名称”“版权”等)存储在资源段(.rsrc)中,结构为嵌套的 VS_VERSIONINFO → StringFileInfo → StringTable → 多个 String 条目。它不是普通字符串,而是 Unicode 编码、带长度前缀、按特定对齐规则打包的二进制块。直接用文本编辑器或内存写入会破坏结构校验和,导致资源加载失败或 Windows Explorer 显示为空。
实操建议:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 必须用 Windows SDK 提供的资源操作 API(
BeginUpdateResource/UpdateResource/EndUpdateResource),不能直接读写 PE 文件字节 - 修改前先用
GetFileVersionInfoSize+GetFileVersionInfo验证原始信息是否存在且可解析 - 注意:这些 API 只支持“更新已存在资源”,若目标文件无版本资源,
UpdateResource会静默失败 —— 必须先确保原文件含RT_VERSION资源
如何用 C++ 构造新的版本字符串块?关键在 VS_FIXEDFILEINFO 和语言/代码页标识
新版字符串必须匹配原始资源的语言 ID 和代码页 ID(wLanguage / wCodePage),否则 Windows 会忽略该条目。常见错误是硬编码 0x0409, 0x04E4(美式英语/UTF-16),但实际文件可能是 0x0804, 0x03B5(简体中文/GBK)—— 这些值藏在 StringFileInfo 子块头部,需先解析原始资源提取。
实操建议:
- 用
VerQueryValue查询原始资源中的\VarFileInfo\Translation获取语言/代码页数组 - 构造新字符串时,路径字符串格式必须为
\StringFileInfo\%04x%04x\FileDescription(如\StringFileInfo\080403B5\FileDescription) -
String条目本身是WORD len+WORD valueLen+WORD type+WCHAR key[]+WCHAR value[],结尾双\0;手动拼接极易出错,优先走UpdateResource
调用 UpdateResource 修改时为什么总是失败?检查三件事
失败通常不报具体错误码,只返回 FALSE,需立即调用 GetLastError() 定位。最常见原因不是权限或路径,而是资源数据格式不合法。
实操建议:
- 确保传给
UpdateResource的lpData是完整、对齐、校验和正确的VS_VERSIONINFO二进制块 —— 推荐用GetFileVersionInfo读出原始块,仅替换其中String值部分,其余结构(包括头部大小、偏移、校验和)保持不变 - 第三个参数
lpType必须是RT_VERSION(定义为(LPCTSTR)10),不能写字符串"VERSION" - 第二个参数
lpName必须是MAKEINTRESOURCE(VS_VERSION_INFO),不是字符串"VS_VERSION_INFO"—— 否则系统找不到对应资源槽位
修改后 Explorer 不刷新显示?别信缓存,验证要看 GetFileVersionInfo 实际读取结果
Windows 资源管理器对版本信息有强缓存(尤其在 Shell 扩展中),改完文件后右键属性可能仍显示旧值。这不是修改失败,而是 UI 层没重载。
实操建议:
- 用独立程序调用
GetFileVersionInfoSize+GetFileVersionInfo+VerQueryValue重新读取,这才是真实结果 - 若读取失败,大概率是
EndUpdateResource返回FALSE且未检查GetLastError()—— 常见错误码:ERROR_BAD_EXE_FORMAT(资源块损坏)、ERROR_ACCESS_DENIED(文件被占用)、ERROR_INVALID_DATA(语言 ID 不匹配) - 修改后的文件建议用
dumpbin /headers确认.rsrc段大小变化,再用ResourceHacker手动打开验证字符串内容是否生效
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










