| 83 | |
| 84 | #pragma comment(lib, "version.lib") |
| 85 | BOOL GetBrowserVersion(HANDLE hProcess, BrowserVersion& browserVersion) { |
| 86 | |
| 87 | LPWSTR filePath = (wchar_t*)malloc(sizeof(wchar_t) * MAX_PATH); |
| 88 | if (filePath == NULL || GetModuleFileNameEx(hProcess, NULL, filePath, MAX_PATH) == 0) { |
| 89 | PRINT("GetModuleFileNameEx failed"); |
| 90 | free(filePath); |
| 91 | return FALSE; |
| 92 | } |
| 93 | DWORD dwHandle; |
| 94 | DWORD dwSize = GetFileVersionInfoSize(filePath, &dwHandle); |
| 95 | if (dwSize == 0) |
| 96 | { |
| 97 | PRINT("GetFileVersionInfoSize failed"); |
| 98 | free(filePath); |
| 99 | return FALSE; |
| 100 | } |
| 101 | |
| 102 | BYTE* buffer = (BYTE*)malloc(dwSize); |
| 103 | if (buffer == nullptr || !GetFileVersionInfo(filePath, 0, dwSize, buffer)) |
| 104 | { |
| 105 | PRINT("GetFileVersionInfo failed"); |
| 106 | free(buffer); |
| 107 | free(filePath); |
| 108 | return FALSE; |
| 109 | } |
| 110 | |
| 111 | free(filePath); |
| 112 | |
| 113 | VS_FIXEDFILEINFO* fileinfo; |
| 114 | UINT len = 0; |
| 115 | if (!VerQueryValue(buffer, TEXT("\\"), reinterpret_cast<void**>(&fileinfo), &len)) |
| 116 | { |
| 117 | PRINT("VerQueryValue failed"); |
| 118 | free(buffer); |
| 119 | return FALSE; |
| 120 | } |
| 121 | |
| 122 | if (len == 0) |
| 123 | { |
| 124 | PRINT("VerQueryValue returned empty VS_FIXEDFILEINFO"); |
| 125 | free(buffer); |
| 126 | return FALSE; |
| 127 | } |
| 128 | |
| 129 | PRINT("[*] Application Version: %hu.%hu.%hu.%hu\n\n", |
| 130 | HIWORD(fileinfo->dwProductVersionMS), |
| 131 | LOWORD(fileinfo->dwProductVersionMS), |
| 132 | HIWORD(fileinfo->dwProductVersionLS), |
| 133 | LOWORD(fileinfo->dwProductVersionLS) |
| 134 | ); |
| 135 | browserVersion.highMajor = HIWORD(fileinfo->dwProductVersionMS); |
| 136 | browserVersion.lowMajor = LOWORD(fileinfo->dwProductVersionMS); |
| 137 | browserVersion.highMinor = HIWORD(fileinfo->dwProductVersionLS); |
| 138 | browserVersion.lowMinor = LOWORD(fileinfo->dwProductVersionLS); |
| 139 | |
| 140 | free(buffer); |
| 141 | return TRUE; |
| 142 | } |