windows获取文件版本信息(VS)

    文件版本信息包含在结构体VS_FIXEDFILEINFO中,VS_FIXEDFILEINFO结构在头文件WinVer.h中

typedef struct tagVS_FIXEDFILEINFO { 

  DWORD dwSignature; //包含的值是0xFEEF04BD 

  DWORD dwStrucVersion; //该结构的32位二进制版本号,高16位是主版本号,低16位是副版本号 

  DWORD dwFileVersionMS; //该文件二进制版本号的高32bits 

  DWORD dwFileVersionLS; //该文件二进制版本号的低32bits  

  DWORD dwProductVersionMS; //发布该文件的产品二进制版本号高32bits 

  DWORD dwProductVersionLS; //发布该文件的产品二进制版本号低32bits 

  DWORD dwFileFlagsMask; //比特掩码,标志dwFileFlags的有效位  

  DWORD dwFileFlags; //VS_FF_DEBUG---该文件包含调试信息或是由调试版编译的 

                       //VS_FF_INFOINFERRED---文件的版本结构是动态创建的, 

//因此,该结构中有的成员是空的或不正确的 

                       //VS_FF_PATCHED---该文件被修改过 

                       //VS_FF_PRERELEASE---该文件是开发版,不是商业发布版 

                       //VS_FF_PRIVATEBUILD---该文件不是由标准发布步骤构建的 

                       //VS_FF_SPECIALBUILD---该文件是由标准发布步骤构建的, 

//但是相同版本号文件的变种 

  DWORD dwFileOS; //该文件设计用于的操作系统  

  DWORD dwFileType; //文件类型:VFT_APP---文件包含一个应用程序 

                                  VFT_DLL---文件包含一个DLL 

                                  VFT_DRV---文件包含一个设备驱动 

                                  VFT_FONT---文件包含一个字体文件 

                                  VFT_STATIC_LIB---文件包含一个静态链接库 

                                  VFT_UNKNOWN---文件类型未知 

                                  VFT_VXD---文件包含一个虚拟设备 

  DWORD dwFileSubtype; //文件的子类型,由dwFileType决定 

  DWORD dwFileDateMS; //二进制文件创建日期和时间戳的高32bits  

  DWORD dwFileDateLS; //二进制文件创建日期和时间戳的低32bits 

} VS_FIXEDFILEINFO;
  1. 判断文件路径不为空,用PathFileExists()判断文件有效。
BOOL PathFileExists(LPCTSTR pszPath);

    pszPath:要验证的文件的完整路径字符串

    返回值:文件存在返回TRUE,否则返回FALSE

    2. 使用函数GetFileVersionInfoSize()获取文件版本信息的大小(以字节为单位)。

DWORD GetFileVersionInfoSize(LPCTSTR lptstrFilename,LPDWORD lpdwHandle);

	lptstrFilename: 要验证的文件的完整路径字符串

	lpdwHandle:指向函数设置为零的变量的指针

	返回值:成功返回文件版本信息的大小(以字节为单位),否则返回0

      3.  使用函数GetFileVersionInfo()获取文件版本信息。

BOOL GetFileVersionInfo( LPCTSTR lptstrFilename, DWORD dwHandle, 
                          DWORD dwLen, LPVOID lpData);

    lptstrFilename:要验证的文件的完整路径字符串

    dwHandle:忽略此参数,设置为0

    dwLen:使用GetFileVersionInfoSize()获取的版本信息大小

    lpData:指向接收文件版本信息的缓冲区的指针

    返回值:成功返回非0,失败返回0

     4.  使用VerQueryValue()函数从指定的版本信息资源中检索指定的版本信息。(要检索适当的资源,在调用VerQueryValue之前,必须先调用GetFileVersionInfoSize函数,然后调用GetFileVersionInfo函数)

BOOL VerQueryValue(LPCVOID pBlock, LPCTSTR lpSubBlock,
                     LPVOID *lplpBuffer, PUINT puLen);

    pBlock:指向包含由GetFileVersionInfo函数返回的版本信息资源的缓冲区的指针

    lpSubBlock:指向以零结尾的字符串的指针,该字符串指定要检索哪个版本信息值。字符串必须由反斜(\)分隔的名称组成

    lplpBuffer:指向VS_FIXEDFILEINFO结构体指针的地址(二级指针)

    puLen:包含一个指向lplpBuffer所指向的请求数据大小的指针

    返回值:成功返回非0,失败返回0

     5.  从FIXEDFILEINFO结构中提取版本信息。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python内置的`ctypes`模块来读取PE文件版本信息。 以下是一个示例代码: ```python import ctypes class VS_FIXEDFILEINFO(ctypes.Structure): _fields_ = [ ("dwSignature", ctypes.c_uint32), ("dwStrucVersion", ctypes.c_uint32), ("dwFileVersionMS", ctypes.c_uint32), ("dwFileVersionLS", ctypes.c_uint32), ("dwProductVersionMS", ctypes.c_uint32), ("dwProductVersionLS", ctypes.c_uint32), ("dwFileFlagsMask", ctypes.c_uint32), ("dwFileFlags", ctypes.c_uint32), ("dwFileOS", ctypes.c_uint32), ("dwFileType", ctypes.c_uint32), ("dwFileSubtype", ctypes.c_uint32), ("dwFileDateMS", ctypes.c_uint32), ("dwFileDateLS", ctypes.c_uint32), ] def get_file_version(filename): """ 获取PE文件版本信息 """ try: # 打开文件 with open(filename, "rb") as f: # 读取文件头 data = f.read(0x40) # 获取PE文件的偏移量 pe_offset = data.find(b"PE\0\0") + 4 # 获取文件头 file_header = data[pe_offset+4:pe_offset+24] # 获取Optional Header的大小 optional_header_size = data[pe_offset+20] + data[pe_offset+21]*256 # 获取Optional Header optional_header = data[pe_offset+24:pe_offset+24+optional_header_size] # 获取Version Info的偏移量 version_info_offset = optional_header.find(b"\0\0\0\0\0\0\0\0\xFF\xFF\x00\x00") # 获取Version Info的大小 version_info_size = optional_header[version_info_offset+12] + optional_header[version_info_offset+13]*256 # 获取Version Info version_info = data[pe_offset+24+optional_header_size+version_info_offset:pe_offset+24+optional_header_size+version_info_offset+version_info_size] # 获取FixedFileInfo结构体 fixed_file_info = VS_FIXEDFILEINFO.from_buffer_copy(version_info[0x28:]) # 获取版本号 major_version = fixed_file_info.dwFileVersionMS >> 16 minor_version = fixed_file_info.dwFileVersionMS & 0xFFFF build_number = fixed_file_info.dwFileVersionLS >> 16 revision_number = fixed_file_info.dwFileVersionLS & 0xFFFF version = f"{major_version}.{minor_version}.{build_number}.{revision_number}" return version except: return None ``` 这个函数接受一个PE文件的路径作为输入,返回该文件的版本号,如果无法读取版本号则返回`None`。 以下是一个示例用法: ```python filename = "C:\\Windows\\notepad.exe" version = get_file_version(filename) print(f"{filename}: {version}") ``` 输出: ``` C:\Windows\notepad.exe: 10.0.19041.1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值