6 GetVersionInfo(CHAR *filename, CHAR *szOutput, DWORD dwOutput)
9 LPVOID pVersionInfo = 0;
11 LPDWORD pLangInfo = 0;
14 TCHAR szVerQ[] = TEXT("\\StringFileInfo\\12345678\\FileVersion");
15 DWORD size = GetFileVersionInfoSize(filename, &dwVersionHandle);
18 return GetLastError();
20 pVersionInfo = malloc(size);
22 return ERROR_NOT_ENOUGH_MEMORY;
24 GetFileVersionInfo(filename, dwVersionHandle, size, pVersionInfo);
25 if (retval = GetLastError())
28 VerQueryValue(pVersionInfo, TEXT("\\VarFileInfo\\Translation"),
29 (LPVOID*)&pLangInfo, &len);
30 if (retval = GetLastError())
34 TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"),
35 LOWORD(*pLangInfo), HIWORD(*pLangInfo));
37 VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szVersion, &len);
38 if (retval = GetLastError()) {
39 /* try again with language 409 since the old binaries were tagged wrong */
41 TEXT("\\StringFileInfo\\0409%04x\\FileVersion"),
44 VerQueryValue(pVersionInfo, szVerQ, (LPVOID*)&szVersion, &len);
45 if (retval = GetLastError())
48 snprintf(szOutput, dwOutput, TEXT("%s"), szVersion);
49 szOutput[dwOutput - 1] = 0;
57 ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
58 win32_getLibraryVersion(const char *libname, char **outname, char **outversion)
67 DWORD (WINAPI *pGetModuleFileNameExA)(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize);
68 BOOL (WINAPI *pEnumProcessModules)(HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded);
75 hPSAPI = LoadLibrary("psapi");
79 if (((FARPROC) pGetModuleFileNameExA =
80 GetProcAddress( hPSAPI, "GetModuleFileNameExA" )) == NULL ||
81 ((FARPROC) pEnumProcessModules =
82 GetProcAddress( hPSAPI, "EnumProcessModules" )) == NULL)
87 // Get a list of all the modules in this process.
88 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
89 FALSE, GetCurrentProcessId());
91 if (pEnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
93 for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
97 // Get the full path to the module's file.
98 if (pGetModuleFileNameExA(hProcess, hMods[i], szModName, sizeof(szModName)))
100 CHAR checkName[1024];
101 lstrcpy(checkName, szModName);
104 if (strstr(checkName, libname)) {
105 if (GetVersionInfo(szModName, modVersion, sizeof(modVersion)) == 0) {
108 *outversion = strdup(modVersion);
109 if (*outversion == NULL)
113 *outname = strdup(szModName);
114 if (*outname == NULL)
123 CloseHandle(hProcess);