xref: /minix3/external/bsd/bind/dist/bin/win32/BINDInstall/VersionInfo.cpp (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek // VersionInfo.cpp: implementation of the CVersionInfo class.
2*00b67f09SDavid van Moolenbroek //
3*00b67f09SDavid van Moolenbroek //////////////////////////////////////////////////////////////////////
4*00b67f09SDavid van Moolenbroek 
5*00b67f09SDavid van Moolenbroek #include "stdafx.h"
6*00b67f09SDavid van Moolenbroek #include "bindinstall.h"
7*00b67f09SDavid van Moolenbroek #include "VersionInfo.h"
8*00b67f09SDavid van Moolenbroek #include <winver.h>
9*00b67f09SDavid van Moolenbroek 
10*00b67f09SDavid van Moolenbroek #ifdef _DEBUG
11*00b67f09SDavid van Moolenbroek #undef THIS_FILE
12*00b67f09SDavid van Moolenbroek static char THIS_FILE[]=__FILE__;
13*00b67f09SDavid van Moolenbroek #define new DEBUG_NEW
14*00b67f09SDavid van Moolenbroek #endif
15*00b67f09SDavid van Moolenbroek 
16*00b67f09SDavid van Moolenbroek //////////////////////////////////////////////////////////////////////
17*00b67f09SDavid van Moolenbroek // Construction/Destruction
18*00b67f09SDavid van Moolenbroek //////////////////////////////////////////////////////////////////////
19*00b67f09SDavid van Moolenbroek 
CVersionInfo(CString filename)20*00b67f09SDavid van Moolenbroek CVersionInfo::CVersionInfo(CString filename)
21*00b67f09SDavid van Moolenbroek {
22*00b67f09SDavid van Moolenbroek 	HANDLE hFile;
23*00b67f09SDavid van Moolenbroek 	WIN32_FIND_DATA fd;
24*00b67f09SDavid van Moolenbroek 	memset(&fd, 0, sizeof(WIN32_FIND_DATA));
25*00b67f09SDavid van Moolenbroek 
26*00b67f09SDavid van Moolenbroek 	m_status = ERROR_SUCCESS;
27*00b67f09SDavid van Moolenbroek 	m_isValid = FALSE;
28*00b67f09SDavid van Moolenbroek 	m_filename = filename;
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek 	// See if the given file exists
31*00b67f09SDavid van Moolenbroek 	hFile = FindFirstFile(filename, &fd);
32*00b67f09SDavid van Moolenbroek 	if(hFile == INVALID_HANDLE_VALUE)
33*00b67f09SDavid van Moolenbroek 	{
34*00b67f09SDavid van Moolenbroek 		m_status = ERROR_FILE_NOT_FOUND;
35*00b67f09SDavid van Moolenbroek 		m_versionInfo = NULL;
36*00b67f09SDavid van Moolenbroek 		return;
37*00b67f09SDavid van Moolenbroek 	}
38*00b67f09SDavid van Moolenbroek 	FindClose(hFile);
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek 	// Extract the file info
41*00b67f09SDavid van Moolenbroek 	DWORD handle;
42*00b67f09SDavid van Moolenbroek 	DWORD viSize = GetFileVersionInfoSize((LPTSTR)(LPCTSTR)filename, &handle);
43*00b67f09SDavid van Moolenbroek 	m_versionInfo = NULL;
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek 	if(viSize == 0)
46*00b67f09SDavid van Moolenbroek 	{
47*00b67f09SDavid van Moolenbroek 		m_status = GetLastError();
48*00b67f09SDavid van Moolenbroek 	}
49*00b67f09SDavid van Moolenbroek 	else
50*00b67f09SDavid van Moolenbroek 	{
51*00b67f09SDavid van Moolenbroek 		m_versionInfo = new char[viSize];
52*00b67f09SDavid van Moolenbroek 
53*00b67f09SDavid van Moolenbroek 		// Get the block of version info from the file
54*00b67f09SDavid van Moolenbroek 		if(!GetFileVersionInfo((LPTSTR)(LPCTSTR)filename, handle, viSize, m_versionInfo))
55*00b67f09SDavid van Moolenbroek 		{
56*00b67f09SDavid van Moolenbroek 			if(m_versionInfo)
57*00b67f09SDavid van Moolenbroek 			{
58*00b67f09SDavid van Moolenbroek 				delete [] m_versionInfo;
59*00b67f09SDavid van Moolenbroek 				m_versionInfo = NULL;
60*00b67f09SDavid van Moolenbroek 			}
61*00b67f09SDavid van Moolenbroek 			return;
62*00b67f09SDavid van Moolenbroek 		}
63*00b67f09SDavid van Moolenbroek 
64*00b67f09SDavid van Moolenbroek 		// Now extract the sub block we are interested in
65*00b67f09SDavid van Moolenbroek 		UINT versionLen = 0;
66*00b67f09SDavid van Moolenbroek 		LPVOID viBlob = NULL;
67*00b67f09SDavid van Moolenbroek 		if(!VerQueryValue(m_versionInfo, "\\", &viBlob, &versionLen))
68*00b67f09SDavid van Moolenbroek 		{
69*00b67f09SDavid van Moolenbroek 			if(m_versionInfo)
70*00b67f09SDavid van Moolenbroek 			{
71*00b67f09SDavid van Moolenbroek 				delete [] m_versionInfo;
72*00b67f09SDavid van Moolenbroek 				m_versionInfo = NULL;
73*00b67f09SDavid van Moolenbroek 			}
74*00b67f09SDavid van Moolenbroek 			return;
75*00b67f09SDavid van Moolenbroek 		}
76*00b67f09SDavid van Moolenbroek 
77*00b67f09SDavid van Moolenbroek 		// And finally the version info is ours
78*00b67f09SDavid van Moolenbroek 		m_fixedInfo = (VS_FIXEDFILEINFO *)viBlob;
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek 		UINT blobLen = 0;
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek 		// If we got here, all is good
83*00b67f09SDavid van Moolenbroek 	}
84*00b67f09SDavid van Moolenbroek 	m_isValid = TRUE;
85*00b67f09SDavid van Moolenbroek }
86*00b67f09SDavid van Moolenbroek 
~CVersionInfo()87*00b67f09SDavid van Moolenbroek CVersionInfo::~CVersionInfo()
88*00b67f09SDavid van Moolenbroek {
89*00b67f09SDavid van Moolenbroek 	m_fixedInfo = NULL;
90*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
91*00b67f09SDavid van Moolenbroek 	{
92*00b67f09SDavid van Moolenbroek 		delete [] m_versionInfo;
93*00b67f09SDavid van Moolenbroek 		m_versionInfo = NULL;
94*00b67f09SDavid van Moolenbroek 	}
95*00b67f09SDavid van Moolenbroek }
96*00b67f09SDavid van Moolenbroek 
GetFileVersionString()97*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetFileVersionString()
98*00b67f09SDavid van Moolenbroek {
99*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("FileVersion"));
100*00b67f09SDavid van Moolenbroek }
101*00b67f09SDavid van Moolenbroek 
GetProductVersionString()102*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetProductVersionString()
103*00b67f09SDavid van Moolenbroek {
104*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("ProductVersion"));
105*00b67f09SDavid van Moolenbroek }
106*00b67f09SDavid van Moolenbroek 
GetComments()107*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetComments()
108*00b67f09SDavid van Moolenbroek {
109*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("Comments"));
110*00b67f09SDavid van Moolenbroek }
111*00b67f09SDavid van Moolenbroek 
GetFileDescription()112*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetFileDescription()
113*00b67f09SDavid van Moolenbroek {
114*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("FileDescription"));
115*00b67f09SDavid van Moolenbroek }
116*00b67f09SDavid van Moolenbroek 
GetInternalName()117*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetInternalName()
118*00b67f09SDavid van Moolenbroek {
119*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("InternalName"));
120*00b67f09SDavid van Moolenbroek }
121*00b67f09SDavid van Moolenbroek 
GetLegalCopyright()122*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetLegalCopyright()
123*00b67f09SDavid van Moolenbroek {
124*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("LegalCopyright"));
125*00b67f09SDavid van Moolenbroek }
126*00b67f09SDavid van Moolenbroek 
GetLegalTrademarks()127*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetLegalTrademarks()
128*00b67f09SDavid van Moolenbroek {
129*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("LegalTrademarks"));
130*00b67f09SDavid van Moolenbroek }
131*00b67f09SDavid van Moolenbroek 
GetOriginalFileName()132*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetOriginalFileName()
133*00b67f09SDavid van Moolenbroek {
134*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("OriginalFilename"));
135*00b67f09SDavid van Moolenbroek }
136*00b67f09SDavid van Moolenbroek 
GetProductName()137*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetProductName()
138*00b67f09SDavid van Moolenbroek {
139*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("ProductName"));
140*00b67f09SDavid van Moolenbroek }
141*00b67f09SDavid van Moolenbroek 
GetSpecialBuildString()142*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetSpecialBuildString()
143*00b67f09SDavid van Moolenbroek {
144*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("SpecialBuild"));
145*00b67f09SDavid van Moolenbroek }
146*00b67f09SDavid van Moolenbroek 
GetPrivateBuildString()147*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetPrivateBuildString()
148*00b67f09SDavid van Moolenbroek {
149*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("PrivateBuild"));
150*00b67f09SDavid van Moolenbroek }
151*00b67f09SDavid van Moolenbroek 
GetCompanyName()152*00b67f09SDavid van Moolenbroek CString CVersionInfo::GetCompanyName()
153*00b67f09SDavid van Moolenbroek {
154*00b67f09SDavid van Moolenbroek 	return(QueryStringValue("CompanyName"));
155*00b67f09SDavid van Moolenbroek }
156*00b67f09SDavid van Moolenbroek 
157*00b67f09SDavid van Moolenbroek #ifdef NOTUSED
CopyFileCheckVersion(CVersionInfo & originalFile)158*00b67f09SDavid van Moolenbroek BOOL CVersionInfo::CopyFileCheckVersion(CVersionInfo &originalFile)
159*00b67f09SDavid van Moolenbroek {
160*00b67f09SDavid van Moolenbroek 	_int64 myVer = GetFileVersion();
161*00b67f09SDavid van Moolenbroek 	_int64 origVer = originalFile.GetFileVersion();
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek 	if(origVer > myVer)
164*00b67f09SDavid van Moolenbroek 	{
165*00b67f09SDavid van Moolenbroek 		CString msg;
166*00b67f09SDavid van Moolenbroek 		msg.Format(IDS_EXISTING_NEWER, m_filename);
167*00b67f09SDavid van Moolenbroek 		DWORD query = AfxMessageBox(msg, MB_YESNO);
168*00b67f09SDavid van Moolenbroek 		if(query == IDNO)
169*00b67f09SDavid van Moolenbroek 			return(TRUE);
170*00b67f09SDavid van Moolenbroek 	}
171*00b67f09SDavid van Moolenbroek 
172*00b67f09SDavid van Moolenbroek 	return(CopyFileNoVersion(originalFile));
173*00b67f09SDavid van Moolenbroek }
174*00b67f09SDavid van Moolenbroek #endif
175*00b67f09SDavid van Moolenbroek 
CopyFileNoVersion(CVersionInfo & originalFile)176*00b67f09SDavid van Moolenbroek BOOL CVersionInfo::CopyFileNoVersion(CVersionInfo &originalFile)
177*00b67f09SDavid van Moolenbroek {
178*00b67f09SDavid van Moolenbroek 	int x = 7;
179*00b67f09SDavid van Moolenbroek 	return(CopyFile(originalFile.GetFilename(), m_filename, FALSE));
180*00b67f09SDavid van Moolenbroek }
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 
GetFileVersion()183*00b67f09SDavid van Moolenbroek _int64 CVersionInfo::GetFileVersion()
184*00b67f09SDavid van Moolenbroek {
185*00b67f09SDavid van Moolenbroek 	_int64 ver = 0;
186*00b67f09SDavid van Moolenbroek 
187*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
188*00b67f09SDavid van Moolenbroek 	{
189*00b67f09SDavid van Moolenbroek 		ver = m_fixedInfo->dwFileVersionMS;
190*00b67f09SDavid van Moolenbroek 		ver <<= 32;
191*00b67f09SDavid van Moolenbroek 		ver += m_fixedInfo->dwFileVersionLS;
192*00b67f09SDavid van Moolenbroek 	}
193*00b67f09SDavid van Moolenbroek 	return(ver);
194*00b67f09SDavid van Moolenbroek }
195*00b67f09SDavid van Moolenbroek 
GetProductVersion()196*00b67f09SDavid van Moolenbroek _int64 CVersionInfo::GetProductVersion()
197*00b67f09SDavid van Moolenbroek {
198*00b67f09SDavid van Moolenbroek 	_int64 ver = 0;
199*00b67f09SDavid van Moolenbroek 
200*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
201*00b67f09SDavid van Moolenbroek 	{
202*00b67f09SDavid van Moolenbroek 		ver = m_fixedInfo->dwProductVersionMS;
203*00b67f09SDavid van Moolenbroek 		ver <<= 32;
204*00b67f09SDavid van Moolenbroek 		ver += m_fixedInfo->dwProductVersionLS;
205*00b67f09SDavid van Moolenbroek 	}
206*00b67f09SDavid van Moolenbroek 	return(ver);
207*00b67f09SDavid van Moolenbroek }
208*00b67f09SDavid van Moolenbroek 
GetFileDate()209*00b67f09SDavid van Moolenbroek _int64 CVersionInfo::GetFileDate()
210*00b67f09SDavid van Moolenbroek {
211*00b67f09SDavid van Moolenbroek 	_int64 fDate = 0;
212*00b67f09SDavid van Moolenbroek 
213*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
214*00b67f09SDavid van Moolenbroek 	{
215*00b67f09SDavid van Moolenbroek 		fDate = m_fixedInfo->dwFileDateMS;
216*00b67f09SDavid van Moolenbroek 		fDate <<= 32;
217*00b67f09SDavid van Moolenbroek 		fDate += m_fixedInfo->dwFileDateLS;
218*00b67f09SDavid van Moolenbroek 	}
219*00b67f09SDavid van Moolenbroek 	return(fDate);
220*00b67f09SDavid van Moolenbroek }
221*00b67f09SDavid van Moolenbroek 
GetFileFlagMask()222*00b67f09SDavid van Moolenbroek DWORD CVersionInfo::GetFileFlagMask()
223*00b67f09SDavid van Moolenbroek {
224*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
225*00b67f09SDavid van Moolenbroek 	{
226*00b67f09SDavid van Moolenbroek 		return(m_fixedInfo->dwFileFlagsMask);
227*00b67f09SDavid van Moolenbroek 	}
228*00b67f09SDavid van Moolenbroek 	return(0);
229*00b67f09SDavid van Moolenbroek }
230*00b67f09SDavid van Moolenbroek 
GetFileFlags()231*00b67f09SDavid van Moolenbroek DWORD CVersionInfo::GetFileFlags()
232*00b67f09SDavid van Moolenbroek {
233*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
234*00b67f09SDavid van Moolenbroek 	{
235*00b67f09SDavid van Moolenbroek 		return(m_fixedInfo->dwFileFlags);
236*00b67f09SDavid van Moolenbroek 	}
237*00b67f09SDavid van Moolenbroek 	return(0);
238*00b67f09SDavid van Moolenbroek }
239*00b67f09SDavid van Moolenbroek 
GetFileOS()240*00b67f09SDavid van Moolenbroek DWORD CVersionInfo::GetFileOS()
241*00b67f09SDavid van Moolenbroek {
242*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
243*00b67f09SDavid van Moolenbroek 	{
244*00b67f09SDavid van Moolenbroek 		return(m_fixedInfo->dwFileOS);
245*00b67f09SDavid van Moolenbroek 	}
246*00b67f09SDavid van Moolenbroek 	return(VOS_UNKNOWN);
247*00b67f09SDavid van Moolenbroek }
248*00b67f09SDavid van Moolenbroek 
GetFileType()249*00b67f09SDavid van Moolenbroek DWORD CVersionInfo::GetFileType()
250*00b67f09SDavid van Moolenbroek {
251*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
252*00b67f09SDavid van Moolenbroek 	{
253*00b67f09SDavid van Moolenbroek 		return(m_fixedInfo->dwFileType);
254*00b67f09SDavid van Moolenbroek 	}
255*00b67f09SDavid van Moolenbroek 	return(VFT_UNKNOWN);
256*00b67f09SDavid van Moolenbroek }
257*00b67f09SDavid van Moolenbroek 
GetFileSubType()258*00b67f09SDavid van Moolenbroek DWORD CVersionInfo::GetFileSubType()
259*00b67f09SDavid van Moolenbroek {
260*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
261*00b67f09SDavid van Moolenbroek 	{
262*00b67f09SDavid van Moolenbroek 		return(m_fixedInfo->dwFileSubtype);
263*00b67f09SDavid van Moolenbroek 	}
264*00b67f09SDavid van Moolenbroek 	return(VFT2_UNKNOWN);
265*00b67f09SDavid van Moolenbroek }
266*00b67f09SDavid van Moolenbroek 
QueryStringValue(CString value)267*00b67f09SDavid van Moolenbroek CString CVersionInfo::QueryStringValue(CString value)
268*00b67f09SDavid van Moolenbroek {
269*00b67f09SDavid van Moolenbroek 	UINT blobLen = 0;
270*00b67f09SDavid van Moolenbroek 	LPVOID viBlob = NULL;
271*00b67f09SDavid van Moolenbroek 
272*00b67f09SDavid van Moolenbroek 	if(m_versionInfo)
273*00b67f09SDavid van Moolenbroek 	{
274*00b67f09SDavid van Moolenbroek 		char queryString[256];
275*00b67f09SDavid van Moolenbroek 
276*00b67f09SDavid van Moolenbroek 		// This code page value is for American English.  If you change the resources to be other than that
277*00b67f09SDavid van Moolenbroek 		// You probably should change this to match it.
278*00b67f09SDavid van Moolenbroek 		DWORD codePage = 0x040904B0;
279*00b67f09SDavid van Moolenbroek 
280*00b67f09SDavid van Moolenbroek 		sprintf(queryString, "\\StringFileInfo\\%08X\\%s", codePage, value);
281*00b67f09SDavid van Moolenbroek 
282*00b67f09SDavid van Moolenbroek 		if(VerQueryValue(m_versionInfo, queryString, &viBlob, &blobLen))
283*00b67f09SDavid van Moolenbroek 			return((char *)viBlob);
284*00b67f09SDavid van Moolenbroek 	}
285*00b67f09SDavid van Moolenbroek 	return("Not Available");
286*00b67f09SDavid van Moolenbroek }
287