1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4//
5// GetProductVersionNumber.h
6//
7// Helper function to retrieve the file version number of a file.
8//
9// ======================================================================================
10
11
12
13#ifndef __GetProductVersionNumber_h__
14#define __GetProductVersionNumber_h__
15
16#include "contract.h"
17#include "sstring.h"
18#include "holder.h"
19#include "ex.h"
20
21//---------------------------------------------------------------------------------------
22//
23// Given the full path to an image, return the product version number.
24//
25// Arguments:
26// szFullPath - full path to the image
27// pdwVersionMS - out parameter; return the most significant 4 bytes of the version number according to
28// the VS_FIXEDFILEINFO convention
29// pdwVersionLS - out parameter; return the least significant 4 bytes of the version number according to
30// the VS_FIXEDFILEINFO convention
31//
32// Notes:
33// Throws on error
34
35void inline GetProductVersionNumber(SString &szFullPath, DWORD * pdwVersionMS, DWORD * pdwVersionLS)
36{
37 WRAPPER_NO_CONTRACT;
38#ifndef FEATURE_PAL
39
40 DWORD dwDummy = 0;
41 DWORD dwFileInfoSize = 0;
42
43 // Get the size of all of the file version information.
44 dwFileInfoSize = GetFileVersionInfoSize(szFullPath, &dwDummy);
45 if (dwFileInfoSize == 0)
46 {
47 ThrowLastError();
48 }
49
50 // Create the buffer to store the file information.
51 NewHolder<BYTE> pbFileInfo(new BYTE[dwFileInfoSize]);
52
53 // Actually retrieve the file version information.
54 if (!GetFileVersionInfo(szFullPath, NULL, dwFileInfoSize, pbFileInfo))
55 {
56 ThrowLastError();
57 }
58
59 // Now retrieve only the relevant version information, which will be returned in a VS_FIXEDFILEINFO.
60 UINT uVersionInfoSize = 0;
61 VS_FIXEDFILEINFO * pVersionInfo = NULL;
62
63 if (!VerQueryValue(pbFileInfo, W("\\"), reinterpret_cast<LPVOID *>(&pVersionInfo), &uVersionInfoSize))
64 {
65 ThrowLastError();
66 }
67 _ASSERTE(uVersionInfoSize == sizeof(VS_FIXEDFILEINFO));
68
69 *pdwVersionMS = pVersionInfo->dwProductVersionMS;
70 *pdwVersionLS = pVersionInfo->dwProductVersionLS;
71#else
72 *pdwVersionMS = 0;
73 *pdwVersionLS = 0;
74#endif // FEATURE_PAL
75}
76
77#endif // __GetProductVersionNumber_h__
78