|
9 | 9 | #include <ntstatus.h> |
10 | 10 | #include <winternl.h> |
11 | 11 |
|
| 12 | +static bool getProductVersion(const wchar_t* filePath, FFstrbuf* version) |
| 13 | +{ |
| 14 | + DWORD handle; |
| 15 | + DWORD size = GetFileVersionInfoSizeW(filePath, &handle); |
| 16 | + if(size > 0) |
| 17 | + { |
| 18 | + FF_AUTO_FREE void* versionData = malloc(size); |
| 19 | + if(GetFileVersionInfoW(filePath, handle, size, versionData)) |
| 20 | + { |
| 21 | + VS_FIXEDFILEINFO* verInfo; |
| 22 | + UINT len; |
| 23 | + if(VerQueryValueW(versionData, L"\\", (void**)&verInfo, &len) && len && verInfo->dwSignature == 0xFEEF04BD) |
| 24 | + { |
| 25 | + ffStrbufAppendF(version, "%u.%u.%u.%u", |
| 26 | + (unsigned)(( verInfo->dwProductVersionMS >> 16 ) & 0xffff), |
| 27 | + (unsigned)(( verInfo->dwProductVersionMS >> 0 ) & 0xffff), |
| 28 | + (unsigned)(( verInfo->dwProductVersionLS >> 16 ) & 0xffff), |
| 29 | + (unsigned)(( verInfo->dwProductVersionLS >> 0 ) & 0xffff) |
| 30 | + ); |
| 31 | + return true; |
| 32 | + } |
| 33 | + } |
| 34 | + } |
| 35 | + |
| 36 | + return false; |
| 37 | +} |
| 38 | + |
12 | 39 | static bool getProcessInfo(uint32_t pid, uint32_t* ppid, FFstrbuf* pname, FFstrbuf* exe, const char** exeName) |
13 | 40 | { |
14 | 41 | HANDLE hProcess = pid == 0 |
@@ -150,7 +177,9 @@ static uint32_t getShellInfo(const FFinstance* instance, FFTerminalShellResult* |
150 | 177 | { |
151 | 178 | if(wcsncmp(module.szModule, L"clink_dll_", strlen("clink_dll_")) == 0) |
152 | 179 | { |
153 | | - ffStrbufAppendS(&result->shellPrettyName, "CMD (with Clink)"); |
| 180 | + ffStrbufAppendS(&result->shellPrettyName, "CMD (with Clink "); |
| 181 | + getProductVersion(module.szExePath, &result->shellPrettyName); |
| 182 | + ffStrbufAppendC(&result->shellPrettyName, ')'); |
154 | 183 | break; |
155 | 184 | } |
156 | 185 | } |
|
0 commit comments