修改PE文件版本信息(简单演示)
2008-10-14 23:11
375 查看
struct VS_VERSIONINFO {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding1[];
VS_FIXEDFILEINFO Value;
WORD Padding2[];
WORD Children[];
};
struct KString {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
WORD Value[];
};
struct StringTable {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
KString Children[];
};
struct StringFileInfo {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
StringTable Children[];
};
DWORD versioninfosize = GetFileVersionInfoSize("c://TestVerInfo.exe",0);
if(versioninfosize > 0){
PWideChar versioninfodata=(PWideChar)new BYTE[versioninfosize];
try{
ZeroMemory(versioninfodata,versioninfosize);
if(GetFileVersionInfo("c://TestVerInfo.exe",0,versioninfosize,versioninfodata)){
UINT uTemp = 0 ;
VS_VERSIONINFO * pVerInfo;
LPBYTE pOffsetBytes;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} * lpTranslate = NULL;
VerQueryValue(versioninfodata, PChar("//VarFileInfo//Translation"),(LPVOID*)&lpTranslate,&uTemp);
AnsiString lengcode=IntToHex(lpTranslate->wLanguage,4)+IntToHex(lpTranslate->wCodePage,4);
LPTSTR pValueBuffer;
if(!VerQueryValue(versioninfodata,("//StringFileInfo//"+lengcode+"//CompanyName").c_str(),(LPVOID*)&pValueBuffer,&uTemp)) return;
int iLen;
pVerInfo = (VS_VERSIONINFO *)versioninfodata;
char * p;
VS_FIXEDFILEINFO *fixInfo;
p = ((char * )(pVerInfo->szKey) ) + (wcslen(pVerInfo->szKey)+1 ) * sizeof(wchar_t);
iLen = pVerInfo->wLength - (p - (char *)pVerInfo);
//VS_VERSIONINFO Padding1[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
int iii = (wcslen(pVerInfo->szKey))*2%4==0?0:(wcslen(pVerInfo->szKey))*2%4;
fixInfo =(VS_FIXEDFILEINFO *) (p + iii);
if (pVerInfo->wValueLength == 0 ) {
return;
}else{
p = (char *)fixInfo + sizeof(VS_FIXEDFILEINFO);
iLen -= sizeof(VS_FIXEDFILEINFO);
//check VS_FIXEDFILEINFO's Signature
if(fixInfo->dwSignature!=0xfeef04bd)return;
}
StringFileInfo * strFileInfo;
strFileInfo = (StringFileInfo *)( p);
StringTable *strtab;
p = (char *)strFileInfo->szKey + (wcslen(strFileInfo->szKey) + 1) * sizeof(wchar_t);
//StringFileInfo Padding[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
iii = (wcslen(strFileInfo->szKey))*2%4==0?0:(wcslen(strFileInfo->szKey))*2%4;
strtab = (StringTable *)(p + iii);
p = (char *)strtab->szKey + (wcslen(strtab->szKey)+1) * sizeof(wchar_t);
//StringTable Padding[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
iii = (wcslen(strtab->szKey))*2%4==0?0:(wcslen(strtab->szKey))*2%4;
p += iii;
while (( (p - (char *)strtab))<strtab->wLength){
KString *ks;
ks = (KString *)p;
int iilen = wcslen(ks->szKey)+1;
p = (char *)ks->szKey + (iilen ) * sizeof(wchar_t) ;
//String Padding[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
iii = (iilen - 1)*2%4==0?0:(iilen - 1)*2%4;
p += iii;
if (ks->wValueLength) {
ShowMessage((wchar_t *)p);
}
if (!_wcsicmp(ks->szKey,L"CompanyName")){
memcpy(p,L"测试修改公司名/0",((ks->wValueLength-1)> (wcslen(L"测试修改公司名/0")+1)?(wcslen(L"测试修改公司名/0")+1):(ks->wValueLength-1))*sizeof(wchar_t));
HANDLE hResource=BeginUpdateResource("c://TestVerInfo.exe",false);
if(NULL!=hResource){
if(UpdateResource(hResource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate -> wLanguage, versioninfodata, versioninfosize)){
EndUpdateResource(hResource,false);
}
}
break;
}
p +=((ks->wValueLength) * 2 )+
//32-bit Alignment Adj
((ks->wValueLength) * 2 % 4 ==0?0:2) ;
}
}
}__finally{
delete []versioninfodata;
}
}
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding1[];
VS_FIXEDFILEINFO Value;
WORD Padding2[];
WORD Children[];
};
struct KString {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
WORD Value[];
};
struct StringTable {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
KString Children[];
};
struct StringFileInfo {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
StringTable Children[];
};
DWORD versioninfosize = GetFileVersionInfoSize("c://TestVerInfo.exe",0);
if(versioninfosize > 0){
PWideChar versioninfodata=(PWideChar)new BYTE[versioninfosize];
try{
ZeroMemory(versioninfodata,versioninfosize);
if(GetFileVersionInfo("c://TestVerInfo.exe",0,versioninfosize,versioninfodata)){
UINT uTemp = 0 ;
VS_VERSIONINFO * pVerInfo;
LPBYTE pOffsetBytes;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} * lpTranslate = NULL;
VerQueryValue(versioninfodata, PChar("//VarFileInfo//Translation"),(LPVOID*)&lpTranslate,&uTemp);
AnsiString lengcode=IntToHex(lpTranslate->wLanguage,4)+IntToHex(lpTranslate->wCodePage,4);
LPTSTR pValueBuffer;
if(!VerQueryValue(versioninfodata,("//StringFileInfo//"+lengcode+"//CompanyName").c_str(),(LPVOID*)&pValueBuffer,&uTemp)) return;
int iLen;
pVerInfo = (VS_VERSIONINFO *)versioninfodata;
char * p;
VS_FIXEDFILEINFO *fixInfo;
p = ((char * )(pVerInfo->szKey) ) + (wcslen(pVerInfo->szKey)+1 ) * sizeof(wchar_t);
iLen = pVerInfo->wLength - (p - (char *)pVerInfo);
//VS_VERSIONINFO Padding1[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
int iii = (wcslen(pVerInfo->szKey))*2%4==0?0:(wcslen(pVerInfo->szKey))*2%4;
fixInfo =(VS_FIXEDFILEINFO *) (p + iii);
if (pVerInfo->wValueLength == 0 ) {
return;
}else{
p = (char *)fixInfo + sizeof(VS_FIXEDFILEINFO);
iLen -= sizeof(VS_FIXEDFILEINFO);
//check VS_FIXEDFILEINFO's Signature
if(fixInfo->dwSignature!=0xfeef04bd)return;
}
StringFileInfo * strFileInfo;
strFileInfo = (StringFileInfo *)( p);
StringTable *strtab;
p = (char *)strFileInfo->szKey + (wcslen(strFileInfo->szKey) + 1) * sizeof(wchar_t);
//StringFileInfo Padding[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
iii = (wcslen(strFileInfo->szKey))*2%4==0?0:(wcslen(strFileInfo->szKey))*2%4;
strtab = (StringTable *)(p + iii);
p = (char *)strtab->szKey + (wcslen(strtab->szKey)+1) * sizeof(wchar_t);
//StringTable Padding[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
iii = (wcslen(strtab->szKey))*2%4==0?0:(wcslen(strtab->szKey))*2%4;
p += iii;
while (( (p - (char *)strtab))<strtab->wLength){
KString *ks;
ks = (KString *)p;
int iilen = wcslen(ks->szKey)+1;
p = (char *)ks->szKey + (iilen ) * sizeof(wchar_t) ;
//String Padding[]: wLength + wValueLength + wType + szKey[] 32-bit Alignment
iii = (iilen - 1)*2%4==0?0:(iilen - 1)*2%4;
p += iii;
if (ks->wValueLength) {
ShowMessage((wchar_t *)p);
}
if (!_wcsicmp(ks->szKey,L"CompanyName")){
memcpy(p,L"测试修改公司名/0",((ks->wValueLength-1)> (wcslen(L"测试修改公司名/0")+1)?(wcslen(L"测试修改公司名/0")+1):(ks->wValueLength-1))*sizeof(wchar_t));
HANDLE hResource=BeginUpdateResource("c://TestVerInfo.exe",false);
if(NULL!=hResource){
if(UpdateResource(hResource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate -> wLanguage, versioninfodata, versioninfosize)){
EndUpdateResource(hResource,false);
}
}
break;
}
p +=((ks->wValueLength) * 2 )+
//32-bit Alignment Adj
((ks->wValueLength) * 2 % 4 ==0?0:2) ;
}
}
}__finally{
delete []versioninfodata;
}
}
相关文章推荐
- 修改文件版本信息(PE文件版本信息、资源Version)
- 实验: 得PE文件的版本信息
- 设置程序版本等信息(可直接修改pro文件设置,但是更推荐使用rc文件设置)
- [置顶] 【PE】Windows平台下为可执行文件或动态库dll添加版本信息
- C# 获得程序集版本信息,文件修改日期,最后修改日期的类,IList 排序类
- 内存中取PE文件版本信息
- 自己写的一个PE文件FileVersionInfo类,可以轻松获取PE文件版本信息
- 修改内核文件屏蔽nginx版本信息
- C++外部程序修改exe文件属性信息的版本信息
- 修改InstallShield打包生成的安装文件的图标和版本信息的方法
- 修改vc程序的.rc资源文件中的版本信息等
- 获取文件的版本信息和修改时间
- C#,C++修改vs文件模板,添加自定义代码版权版本信息
- 得到一个wma或mp3文件,如何用最简单的方法得到它的长度信息呢?
- pe文件简单分析
- 手动添加PE文件数字签名信息及格式详解图之下(历史代码,贴出学习)
- Git 查看某个版本修改了哪些文件
- pe文件解析:读取pe信息获取文件资源
- 获取文件大小,修改日期,版本
- C#简单读取、改变文件的创建、修改及访问时间的方法