VersionHelper.cpp
1 2 3 //-------------------------------------------------------------------- 4 // 5 // GetLanguageVersionString 6 // 7 // Gets version information for a particular code page. 8 // 9 //-------------------------------------------------------------------- 10 #include <stdio.h> 11 #include "pch.h" 12 #include "VersionHelper.h" 13 14 PTCHAR GetLanguageVersionString(P_VERSION_INFO VersionInfo, 15 LANGID LanguageId, WORD Charset, 16 LPCTSTR VersionString) 17 { 18 TCHAR szQueryStr[0x100]; 19 PTCHAR pszVerRetVal; 20 UINT cbReturn; 21 BOOL fFound = FALSE; 22 23 // Format the string 24 _stprintf_s(szQueryStr, ARRAYSIZE(szQueryStr), _T("\\StringFileInfo\\%04X%04X\\%s"), 25 LanguageId, Charset, 26 VersionString); 27 28 fFound = VerQueryValue(VersionInfo, szQueryStr, 29 reinterpret_cast<LPVOID *>(&pszVerRetVal), &cbReturn); 30 31 if (!fFound) { 32 return NULL; 33 } 34 else { 35 return pszVerRetVal; 36 } 37 } 38 39 // 40 // explicitly use wide char version 41 // this is used when show banner in remote session before display eula from console which requires unicode for French 42 // it's needed for multibyte app 43 // 44 PWCHAR GetLanguageVersionStringW(P_VERSION_INFO VersionInfo, 45 LANGID LanguageId, WORD Charset, 46 LPCWSTR VersionString) 47 { 48 WCHAR szQueryStr[0x100]; 49 PWCHAR pszVerRetVal; 50 UINT cbReturn; 51 BOOL fFound = FALSE; 52 53 // Format the string 54 swprintf_s(szQueryStr, ARRAYSIZE(szQueryStr), L"\\StringFileInfo\\%04X%04X\\%s", 55 LanguageId, Charset, 56 VersionString); 57 58 fFound = VerQueryValueW(VersionInfo, szQueryStr, 59 reinterpret_cast<LPVOID *>(&pszVerRetVal), &cbReturn); 60 61 if (!fFound) { 62 return NULL; 63 } 64 else { 65 return pszVerRetVal; 66 } 67 } 68 69 //-------------------------------------------------------------------- 70 // 71 // GetVersionString 72 // 73 // Gets a version string. 74 // 75 //-------------------------------------------------------------------- 76 PTCHAR GetVersionString(P_VERSION_INFO VersionInfo, 77 LPCTSTR VersionString) 78 { 79 PTCHAR pszVerRetVal; 80 P_VERSION_TRANSLATION pTranslation; 81 VERSION_TRANSLATION translation; 82 unsigned int length; 83 84 // 85 // Get the language id 86 // 87 translation.langID = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); 88 pTranslation = &translation; 89 VerQueryValue(VersionInfo, 90 _T("\\VarFileInfo\\Translation"), 91 reinterpret_cast<PVOID *>(&pTranslation), 92 &length); 93 94 pszVerRetVal = GetLanguageVersionString(VersionInfo, 95 pTranslation->langID, 96 pTranslation->charset, 97 VersionString); 98 return pszVerRetVal; 99 } 100 101 // 102 // explicitly use wide char version 103 // this is used when show banner in remote session before display eula from console which requires unicode for French 104 // it's needed for multibyte app 105 // 106 PWCHAR GetVersionStringW(P_VERSION_INFO VersionInfo, 107 LPCWSTR VersionString) 108 { 109 PWCHAR pszVerRetVal; 110 P_VERSION_TRANSLATION pTranslation; 111 VERSION_TRANSLATION translation; 112 unsigned int length; 113 114 // 115 // Get the language id 116 // 117 translation.langID = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); 118 pTranslation = &translation; 119 VerQueryValueW(VersionInfo, 120 L"\\VarFileInfo\\Translation", 121 reinterpret_cast<PVOID *>(&pTranslation), 122 &length); 123 124 pszVerRetVal = GetLanguageVersionStringW(VersionInfo, 125 pTranslation->langID, 126 pTranslation->charset, 127 VersionString); 128 return pszVerRetVal; 129 }