mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-10-29 08:13:44 +01:00
Common (Windows): reverts 42509f115c
Fixes warp terminal version detection
This commit is contained in:
@@ -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 <windows.h>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user