Index: base/shell/explorer-new/explorer.c =================================================================== --- base/shell/explorer-new/explorer.c (revision 40499) +++ base/shell/explorer-new/explorer.c (working copy) @@ -26,6 +26,12 @@ HKEY hkExplorer = NULL; DRAWCAPTEMP DrawCapTemp = NULL; +typedef struct _LANGCODEPAGE +{ + WORD wLanguage; + WORD wCodePage; +} LANGCODEPAGE, *PLANGCODEPAGE; + /* undoc GUID */ DEFINE_GUID(CLSID_RebarBandSite, 0xECD4FC4D, 0x521C, 0x11D0, 0xB7, 0x92, 0x00, 0xA0, 0xC9, 0x03, 0x12, 0xE1); @@ -270,6 +276,85 @@ return FALSE; } +BOOL +GetVersionInfoString(IN TCHAR *szFileName, + IN TCHAR *szVersionInfo, + OUT TCHAR *szBuffer, + IN UINT cbBufLen) +{ + LPVOID lpData = NULL; + TCHAR szSubBlock[128]; + TCHAR *lpszLocalBuf = NULL; + LANGID UserLangId; + PLANGCODEPAGE lpTranslate = NULL; + DWORD dwLen; + DWORD dwHandle; + UINT cbTranslate; + UINT cbLen; + BOOL bRet = FALSE; + unsigned int i; + + dwLen = GetFileVersionInfoSize(szFileName,&dwHandle); + + if (dwLen > 0) + { + lpData = HeapAlloc(hProcessHeap,0,dwLen); + + if (lpData != NULL) + { + if (GetFileVersionInfo(szFileName, + 0, + dwLen, + lpData) != 0) + { + UserLangId = GetUserDefaultLangID(); + + /* The lower eight bits of + any two language id's will + be the same for any pair of + languages that are the same. */ + UserLangId &= 0x00FF; + + VerQueryValue(lpData, + TEXT("\\VarFileInfo\\Translation"), + (LPVOID *)&lpTranslate, + &cbTranslate); + + for (i = 0;i < (cbTranslate / sizeof(LANGCODEPAGE));i++) + { + /* If the bottom eight bits of the language id's + match, use this version information (since this + means that the version information and the users + default language are the same). */ + if ((UserLangId & lpTranslate[i].wLanguage) == UserLangId) + { + wnsprintf(szSubBlock, + sizeof(szSubBlock) / sizeof(szSubBlock[0]), + TEXT("\\StringFileInfo\\%04X%04X\\%s"), + lpTranslate[i].wLanguage, + lpTranslate[i].wCodePage,szVersionInfo); + + if (VerQueryValue(lpData, + szSubBlock, + (LPVOID *)&lpszLocalBuf, + &cbLen) != 0) + { + wcsncpy(szBuffer,lpszLocalBuf,cbBufLen); + + bRet = TRUE; + break; + } + } + } + } + HeapFree(hProcessHeap,0,lpData); + lpData = NULL; + } + } + + return bRet; +} + INT WINAPI _tWinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, Index: base/shell/explorer-new/explorer.rbuild =================================================================== --- base/shell/explorer-new/explorer.rbuild (revision 40499) +++ base/shell/explorer-new/explorer.rbuild (working copy) @@ -13,6 +13,7 @@ shell32 shlwapi uuid + version precomp.h desktop.c dragdrop.c