From 66edea702e30acd937c3502946af4ffcef60734b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 13 Mar 2026 13:58:50 +0800 Subject: [PATCH] Common (Windows): reverts 42509f115cfbf264cc053100242f0b4489f6e1f0 Fixes warp terminal version detection --- src/common/windows/version.c | 124 +++++++++++++++++++++++++---------- 1 file changed, 91 insertions(+), 33 deletions(-) diff --git a/src/common/windows/version.c b/src/common/windows/version.c index 6d5ceefa1..42033ef8e 100644 --- a/src/common/windows/version.c +++ b/src/common/windows/version.c @@ -1,5 +1,6 @@ -#include "common/windows/version.h" +#include "common/debug.h" #include "common/mallocHelper.h" +#include "common/windows/version.h" #include "common/windows/unicode.h" #include @@ -8,42 +9,99 @@ bool ffGetFileVersion(const wchar_t* filePath, const wchar_t* stringName, FFstrbuf* version) { + FF_DEBUG("ffGetFileVersion: enter filePath=%ls stringName=%ls", filePath, stringName); + DWORD handle; DWORD size = GetFileVersionInfoSizeW(filePath, &handle); - if (size > 0) + if (size == 0) { - FF_AUTO_FREE void *versionData = malloc(size); - if (GetFileVersionInfoW(filePath, handle, size, versionData)) - { - if (!stringName) - { - VS_FIXEDFILEINFO* verInfo; - UINT len; - if (VerQueryValueW(versionData, L"\\", (void **)&verInfo, &len) && len && verInfo->dwSignature == 0xFEEF04BD) - { - ffStrbufSetF(version, "%u.%u.%u.%u", - (unsigned)((verInfo->dwProductVersionMS >> 16) & 0xffff), - (unsigned)((verInfo->dwProductVersionMS >> 0) & 0xffff), - (unsigned)((verInfo->dwProductVersionLS >> 16) & 0xffff), - (unsigned)((verInfo->dwProductVersionLS >> 0) & 0xffff)); - return true; - } - } - else - { - wchar_t* value; - UINT valueLen; - - wchar_t subBlock[128] = L"\\StringFileInfo\\" FF_VERSION_LANG_EN_US L"\\"; - wcscat_s(subBlock, ARRAY_SIZE(subBlock), stringName); - if (VerQueryValueW(versionData, subBlock, (void **)&value, &valueLen) && valueLen > 0) - { - ffStrbufSetWS(version, value); - return true; - } - } - } + DWORD err = GetLastError(); + FF_DEBUG("GetFileVersionInfoSizeW failed: err=%lu (%s)", + (unsigned long) err, ffDebugWin32Error(err)); + return false; } + FF_DEBUG("GetFileVersionInfoSizeW ok: size=%lu handle=%lu", + (unsigned long) size, (unsigned long) handle); + + FF_AUTO_FREE void* versionData = malloc(size); + if (!versionData) + { + FF_DEBUG("malloc failed: size=%lu", (unsigned long) size); + return false; + } + + if (!GetFileVersionInfoW(filePath, handle, size, versionData)) + { + DWORD err = GetLastError(); + FF_DEBUG("GetFileVersionInfoW failed: err=%lu (%s)", + (unsigned long) err, ffDebugWin32Error(err)); + return false; + } + + FF_DEBUG("GetFileVersionInfoW ok"); + + if (!stringName) + { + VS_FIXEDFILEINFO* verInfo; + UINT len; + if (VerQueryValueW(versionData, L"\\", (void**) &verInfo, &len) && + len && + verInfo->dwSignature == 0xFEEF04BD) + { + ffStrbufSetF(version, "%u.%u.%u.%u", + (unsigned) ((verInfo->dwProductVersionMS >> 16) & 0xffff), + (unsigned) ((verInfo->dwProductVersionMS >> 0) & 0xffff), + (unsigned) ((verInfo->dwProductVersionLS >> 16) & 0xffff), + (unsigned) ((verInfo->dwProductVersionLS >> 0) & 0xffff)); + FF_DEBUG("fixed version resolved: %s", version->chars); + return true; + } + + FF_DEBUG("fixed version query failed or invalid signature"); + return false; + } + + wchar_t* value; + UINT valueLen; + + wchar_t subBlock[128]; + snwprintf(subBlock, ARRAY_SIZE(subBlock), L"\\StringFileInfo\\" FF_VERSION_LANG_EN_US L"\\%ls", stringName); + FF_DEBUG("query version string with default lang (en_US): %ls", subBlock); + + if (VerQueryValueW(versionData, subBlock, (void**) &value, &valueLen) && valueLen > 0) + { + ffStrbufSetNWS(version, valueLen / sizeof(wchar_t), value); + FF_DEBUG("version string resolved (default lang): %s", version->chars); + return true; + } + + FF_DEBUG("default lang query failed, trying translation fallback"); + + struct { WORD language; WORD codePage; }* translations; + UINT translationsLen; + + if (VerQueryValueW(versionData, L"\\VarFileInfo\\Translation", (void**) &translations, &translationsLen) && + translationsLen >= sizeof(*translations)) + { + snwprintf(subBlock, ARRAY_SIZE(subBlock), L"\\StringFileInfo\\%04x%04x\\%ls", + translations[0].language, translations[0].codePage, stringName); + FF_DEBUG("query version string with translation: %ls", subBlock); + + if (VerQueryValueW(versionData, subBlock, (void**) &value, &valueLen) && valueLen > 0) + { + ffStrbufSetNWS(version, valueLen / sizeof(wchar_t), value); + FF_DEBUG("version string resolved (translation fallback): %s", version->chars); + return true; + } + + FF_DEBUG("translation fallback query failed"); + } + else + { + FF_DEBUG("no translation table found in version resource"); + } + + FF_DEBUG("ffGetFileVersion failed"); return false; }