参考链接:

1、MS docs - GetFileVersionInfoA:https://docs.microsoft.com/zh-cn/windows/desktop/api/winver/nf-winver-getfileversioninfoa

2、Cppblog - Win32汇编--使用资源—版本信息资源:http://www.cppblog.com/luqingfei/archive/2010/09/21/127239.html

3、CSDN blog - 【PE】Windows资源文件rc定义和使用:https://blog.csdn.net/soaringlee_fighting/article/details/80596261

4、CSDN blog - 获取EXE版本信息 GetFileVersionInfo:https://blog.csdn.net/mfkjq/article/details/53064243

在一些hips软件中,会显示一些exe、dll、sys等的厂商信息,这些信息便存在于"详细信息"中。

0、什么是StringFileInfo

通俗来说,这里的“详细信息”指PE文件(dll,exe,sys等)的信息,包括属性页中的“详细信息”tab页中一部分内容。



对应VS中的.rc中的VS_VERSION_INFO信息



以及*.rc文件源码中的VS_VERSION_INFO部分

1、获取方法

如果E文可以,请直接阅读MS Docs中GetFileVersionInfoA说明,详细权威,且VerQueryValueA部分有一段示例代码。

微软version.lib(version.dll)提供了中的3个函数用来获取这些信息,获取步骤:

  • 首先使用GetFileVersionInfoSizeA(W)获取VersionInfo的大小,申请缓冲区;
  • 接着使用GetFileVersionInfoA(W)获取VersionInfo数据到缓冲区
  • 接着使用VerQueryValueA(W)依次获取\,\VarFileInfo\Translation,再根据Translation获取语言类型,接着\VarFileInfo\080404B0\CompanyName便获取到了厂商信息。

附:CompanyName域可取值:

2、示例代码

// conGetVer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include "pch.h"
#include <tchar.h>
#include <windows.h>
#include <iostream> // pName可取值:
// _T("CompanyName"),_T("FileDescription"),_T("FileVersion"),
// _T("InternalName"),_T("LegalCopyright"),_T("OriginalFilename"),
// _T("ProductName"),_T("ProductVersion"),
BOOL GetFileVersionString(LPCTSTR pFileName, LPCTSTR pName /* = NULL */, LPTSTR ptBuf, UINT lenBuf)
{
DWORD dwDummyHandle = 0; // will always be set to zero
DWORD dwLen = 0;
BYTE* pVersionInfo = NULL;
BOOL bRetVal; VS_FIXEDFILEINFO FileVersion; HMODULE hVerDll;
hVerDll = LoadLibrary(_T("VERSION.dll"));
if (hVerDll == NULL)
return FALSE; #ifdef _UNICODE
typedef DWORD(WINAPI *Fun_GetFileVersionInfoSize)(LPCTSTR, DWORD *);
typedef BOOL(WINAPI *Fun_GetFileVersionInfo)(LPCTSTR, DWORD, DWORD, LPVOID);
typedef BOOL(WINAPI *Fun_VerQueryValue)(LPCVOID, LPCTSTR, LPVOID, PUINT);
#else
typedef DWORD(WINAPI *Fun_GetFileVersionInfoSize)(LPCSTR, DWORD *);
typedef BOOL(WINAPI *Fun_GetFileVersionInfo)(LPCSTR, DWORD, DWORD, LPVOID);
typedef BOOL(WINAPI *Fun_VerQueryValue)(LPCVOID, LPCSTR, LPVOID, PUINT);
#endif Fun_GetFileVersionInfoSize pGetFileVersionInfoSize;
Fun_GetFileVersionInfo pGetFileVersionInfo;
Fun_VerQueryValue pVerQueryValue; #ifdef _UNICODE
pGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeW");
pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoW");
pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueW");
#else
pGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA");
pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoA");
pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueA");
#endif struct TRANSLATION {
WORD langID; // language ID
WORD charset; // character set (code page)
} Translation; Translation.langID = 0x0409; //
Translation.charset = 1252; // default = ANSI code page dwLen = pGetFileVersionInfoSize(pFileName, &dwDummyHandle);
if (dwLen == 0)
{
bRetVal = FALSE;
goto End;
} pVersionInfo = new BYTE[dwLen]; // allocate version info
bRetVal = pGetFileVersionInfo(pFileName, 0, dwLen, pVersionInfo);
if (bRetVal == FALSE)
{
goto End;
} VOID * pVI;
UINT uLen; bRetVal = pVerQueryValue(pVersionInfo, _T("\\"), &pVI, &uLen);
if (bRetVal == FALSE)
{
goto End;
} memcpy(&FileVersion, pVI, sizeof(VS_FIXEDFILEINFO)); bRetVal = pVerQueryValue(pVersionInfo, _T("\\VarFileInfo\\Translation"),
&pVI, &uLen);
if (bRetVal && uLen >= 4)
{
memcpy(&Translation, pVI, sizeof(TRANSLATION));
}
else
{
bRetVal = FALSE;
goto End;
} // BREAKIF(FileVersion.dwSignature != VS_FFI_SIGNATURE);
if (FileVersion.dwSignature != VS_FFI_SIGNATURE)
{
bRetVal = FALSE;
goto End;
} VOID *pVal;
UINT iLenVal; if (pName == NULL)
{
_stprintf_s(ptBuf, lenBuf, _T("%d.%d.%d.%d"),
HIWORD(FileVersion.dwFileVersionMS), LOWORD(FileVersion.dwFileVersionMS),
HIWORD(FileVersion.dwFileVersionLS), LOWORD(FileVersion.dwFileVersionLS));
}
else
{
TCHAR szQuery[1024];
_stprintf_s(szQuery, 1024, _T("\\StringFileInfo\\%04X%04X\\%s"),
Translation.langID, Translation.charset, pName); bRetVal = pVerQueryValue(pVersionInfo, szQuery, &pVal, &iLenVal);
if (bRetVal)
{
_stprintf_s(ptBuf, lenBuf, _T("%s"), (TCHAR*)pVal);
}
else
{
_stprintf_s(ptBuf, lenBuf, _T("%s"), _T(""));
}
} End:
FreeLibrary(hVerDll);
hVerDll = NULL;
delete[] pVersionInfo;
pVersionInfo = NULL; return bRetVal;
} int main()
{
TCHAR* ptszStr = NULL; ptszStr = new TCHAR[1024];
BOOL bRet = GetFileVersionString(_T("F:\\Wireshark-win32-1.11.2.exe"),
_T("CompanyName"), ptszStr, 1024); delete ptszStr;
ptszStr = NULL; std::cout << "Hello World!\n";
}

获取文件属性“详细信息” - StringFileInfo的更多相关文章

  1. ttf文件属性详细信息

    python实现ttf文件属性详细信息 import sys from fontTools import ttLib def shortName( font ): name = "" ...

  2. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  3. 钉钉开发入门,微应用识别用户身份,获取用户免登授权码code,获取用户userid,获取用户详细信息

    最近有个需求,在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去企业内部的用户中心做校验,校验通过,相关子系统直接登陆; 就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所 ...

  4. 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”

    之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...

  5. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> UF_initialize ...

  6. 【Android Developers Training】 99. 获取联系人详细信息

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. winPcap编程之获取适配器详细信息(三)

    显示适配器详细信息 先贴上代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #includ ...

  8. ionic基于GPS定位并通过百度地图获取定位详细信息

    相信所有的前端攻城狮都会碰到移动端App.里面获取用户定位信息. 那么问题来了,怎么获取用户的定位信息(经纬度)呢. 当然方法有很多,通过百度地图API 以及 高德地图 API都是可以的.但是两个获取 ...

  9. Python-根据照片信息获取用户详细信息(微信发原图或泄露位置信息)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 蒙娜丽胖 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...

随机推荐

  1. vs安装部署“必备”组件里面正常情况没有出现office2010 PIA组件

    vs安装部署“必备”组件里面正常情况没有出现office2010 pia组件时,将 Office2010PIARedist 文件夹放在C:\Program Files\Microsoft SDKs\W ...

  2. Python学习---线程/协程/进程学习 1220【all】

    Python学习---线程基础学习 Python学习---线程锁/信号量/条件变量同步1221 Python学习---同步条件event/队列queue1223 Python学习---进程 1225 ...

  3. Linux基础入门 - 3

    第四节 Linux 目录结构及文件基本操作 4-1.Linux目录结构 Linux 的目录与 Windows 的目录的实现机制是完全不同的.一种不同是体现在目录与存储介质(磁盘,内存,DVD 等)的关 ...

  4. iOS动画的逻辑结构:动画的定义--动画是采用连续播放静止图像的方法产生物体运动的效果。

    动画的定义:视图+时间+空间+速度 视图信息的时空变换: 视图组的按时间逐帧展示: Core Animation 类的继承关系图 各类常用属性 CAMediaTiming:CALayer和Core A ...

  5. CSS样式命名规则

    1.样式命名外 套: wrap主导航: mainnav子导航: subnav页 脚: footer整个页面: content页 眉: header页 脚: footer商 标: label标 题: t ...

  6. java开发优化常用的快捷键

    快速打印的输出语句:输入syso,然后按alt+/,即可 快速删除一行:ctrl+D 让代码块缩进:选中要缩进的代码,然后按tab键 让代码块退格:选中要退格的代码,然后按shift+tab键 格式化 ...

  7. 多GPU计算

    多GPU计算已经可以说,只要是个成熟的模型,都使用了这一点. 例如: gluoncv:https://github.com/dmlc/gluon-cv/blob/master/scripts/dete ...

  8. bzoj4403:序列统计

    我好傻啊 题目 先来看看长度只能为\(n\)的情况 那么答案非常显然是\(\binom{m+n-1}{n}\) 其中\(m=R-L+1\) 因为我们要构造一个非降序列,显然可能一个数会被选择多次,组合 ...

  9. luogu P2742 【模板】二维凸包

    嘟嘟嘟 没错,我开始学凸包了. 其实挺简单的. 前置技能: 1.极坐标系 2.向量叉积 1.极坐标系 就是一种二维坐标系.只不过两个坐标分别表示向量和极轴的角度和自身的长度.对于不同的问题,极轴可以自 ...

  10. ssrf绕过记录

    第一道题来自2018 上海市大学生网络安全大赛线上赛web01 if(isset($_POST['url']) && parse_url($_POST['url'])['host']= ...