mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.0 KiB
129 lines
3.0 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000
|
|
//
|
|
// File: verread.cpp
|
|
//
|
|
// Contents: code for reading version info for app matching
|
|
//
|
|
// History: 24-Feb-00 dmunsil created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "stdio.h"
|
|
#include "assert.h"
|
|
#include "verread.h"
|
|
|
|
BOOL bInitVersionData(TCHAR *szPath, PVERSION_DATA pVersionData)
|
|
{
|
|
UINT unSize = 0;
|
|
DWORD dwNull = 0;
|
|
|
|
assert(szPath && pVersionData);
|
|
|
|
ZeroMemory(pVersionData, sizeof(VERSION_DATA));
|
|
|
|
pVersionData->dwBufferSize = GetFileVersionInfoSize(szPath, &dwNull);
|
|
if (!pVersionData->dwBufferSize) {
|
|
goto err;
|
|
}
|
|
|
|
pVersionData->pBuffer = new BYTE[pVersionData->dwBufferSize];
|
|
if (!pVersionData->pBuffer) {
|
|
goto err;
|
|
}
|
|
|
|
if (!GetFileVersionInfo(szPath, 0, pVersionData->dwBufferSize, pVersionData->pBuffer)) {
|
|
goto err;
|
|
}
|
|
|
|
if (!VerQueryValue(pVersionData->pBuffer, TEXT("\\"), (PVOID*)&pVersionData->pFixedInfo, &unSize)) {
|
|
goto err;
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
err:
|
|
|
|
if (pVersionData->pBuffer) {
|
|
delete [] pVersionData->pBuffer;
|
|
ZeroMemory(pVersionData, sizeof(VERSION_DATA));
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*--
|
|
|
|
Search order is:
|
|
|
|
- Language neutral, Unicode (0x000004B0)
|
|
- Language neutral, Windows-multilingual (0x000004e4)
|
|
- US English, Unicode (0x040904B0)
|
|
- US English, Windows-multilingual (0x040904E4)
|
|
|
|
If none of those exist, it's not likely we're going to get good
|
|
matching info from what does exist.
|
|
|
|
--*/
|
|
|
|
TCHAR *szGetVersionString(PVERSION_DATA pVersionData, TCHAR *szString)
|
|
{
|
|
TCHAR szTemp[100] = "";
|
|
TCHAR *szReturn = NULL;
|
|
static DWORD adwLangs[] = {0x000004B0, 0x000004E4, 0x040904B0, 0x040904E4, 0};
|
|
int i;
|
|
|
|
assert(pVersionData && szString);
|
|
|
|
for (i = 0; adwLangs[i]; ++i) {
|
|
UINT unLen;
|
|
|
|
_stprintf(szTemp, TEXT("\\StringFileInfo\\%08X\\%s"), adwLangs[i], szString);
|
|
if (VerQueryValue(pVersionData->pBuffer, szTemp, (PVOID*)&szReturn, &unLen)) {
|
|
goto out;
|
|
}
|
|
}
|
|
out:
|
|
|
|
return szReturn;
|
|
}
|
|
|
|
ULONGLONG qwGetBinFileVer(PVERSION_DATA pVersionData)
|
|
{
|
|
LARGE_INTEGER liReturn;
|
|
|
|
assert(pVersionData);
|
|
|
|
liReturn.LowPart = pVersionData->pFixedInfo->dwFileVersionLS;
|
|
liReturn.HighPart = pVersionData->pFixedInfo->dwFileVersionMS;
|
|
|
|
return liReturn.QuadPart;
|
|
}
|
|
|
|
ULONGLONG qwGetBinProdVer(PVERSION_DATA pVersionData)
|
|
{
|
|
LARGE_INTEGER liReturn;
|
|
|
|
assert(pVersionData);
|
|
|
|
liReturn.LowPart = pVersionData->pFixedInfo->dwProductVersionLS;
|
|
liReturn.HighPart = pVersionData->pFixedInfo->dwProductVersionMS;
|
|
|
|
return liReturn.QuadPart;
|
|
}
|
|
|
|
void vReleaseVersionData(PVERSION_DATA pVersionData)
|
|
{
|
|
assert(pVersionData);
|
|
|
|
if (pVersionData->pBuffer) {
|
|
delete [] pVersionData->pBuffer;
|
|
ZeroMemory(pVersionData, sizeof(VERSION_DATA));
|
|
}
|
|
}
|
|
|
|
|