+/* modified copy of function from apitests/apphelp/apitest.c */
+BOOL get_module_version(
+ _In_ HMODULE mod,
+ _Out_ VS_FIXEDFILEINFO *fileinfo)
+{
+ BOOL res = FALSE;
+ HRSRC hResInfo;
+ char *errmsg;
+ DWORD dwSize, errcode = 0;
+ UINT uLen;
+ HGLOBAL hResData = 0;
+ LPVOID pRes = NULL;
+ HLOCAL pResCopy = 0;
+ VS_FIXEDFILEINFO *lpFfi;
+
+ if (fileinfo == NULL)
+ {
+ errmsg = "fileinfo is NULL.\n";
+ goto cleanup;
+ }
+
+ hResInfo = FindResource(mod, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
+ if (hResInfo == 0)
+ {
+ errmsg = "FindResource failed";
+ errcode = GetLastError();
+ goto cleanup;
+ }
+
+ dwSize = SizeofResource(mod, hResInfo);
+ if (dwSize == 0)
+ {
+ errmsg = "SizeofResource failed";
+ errcode = GetLastError();
+ goto cleanup;
+ }
+
+ hResData = LoadResource(mod, hResInfo);
+ if (hResData == 0)
+ {
+ errmsg = "LoadResource failed";
+ errcode = GetLastError();
+ goto cleanup;
+ }
+
+ pRes = LockResource(hResData);
+ if (pRes == NULL)
+ {
+ errmsg = "LockResource failed";
+ errcode = GetLastError();
+ goto cleanup;
+ }
+
+ pResCopy = LocalAlloc(LMEM_FIXED, dwSize);
+ if (pResCopy == NULL)
+ {
+ errmsg = "LocalAlloc failed";
+ errcode = GetLastError();
+ goto cleanup;
+ }
+
+ CopyMemory(pResCopy, pRes, dwSize);
+
+ if (VerQueryValueW(pResCopy, L"\\", (LPVOID*)&lpFfi, &uLen))
+ {
+ *fileinfo = *lpFfi;
+ res = TRUE;
+ }
+
+cleanup:
+ /* cleanup */
+ if (hResData != 0)
+ FreeResource(hResData);
+ if (pResCopy != NULL)
+ LocalFree(pResCopy);
+ /* if it was good */
+ if (res == TRUE)
+ return TRUE;
+ /* failure path */
+ if (errcode == 0)
+ trace("get_module_version - %s.\n", errmsg);
+ else
+ trace("get_module_version - %s (lasterror %d).\n", errmsg, errcode);
+ return FALSE;
+}
+
+static VS_FIXEDFILEINFO dbghelpFileVer;
+static void init_dbghelp_version()
+{
+ LPAPI_VERSION v;
+ WCHAR filenameW[MAX_PATH + 1];
+ HMODULE hDLL;
+ DWORD fileLen;
+ VS_FIXEDFILEINFO fileInfo;
+
+ memset(&dbghelpFileVer, 0, sizeof(dbghelpFileVer));
+
+ /* get internal file version */
+ v = ImagehlpApiVersion();
+ if (v == NULL)
+ return;
+
+ /* get module file version */
+ hDLL = GetModuleHandleW(L"dbghelp.dll");
+ if (hDLL == 0)
+ {
+ ok(FALSE, "Dbghelp.dll is not loaded!\n");
+ return;
+ }
+ if (!get_module_version(hDLL, &fileInfo))
+ memset(&fileInfo, 0, sizeof(fileInfo));
+ dbghelpFileVer = fileInfo;
+
+ /* get full file path */
+ fileLen = GetModuleFileNameW(hDLL, filenameW, MAX_PATH + 1);
+ if (fileLen == 0)
+ {
+ ok(FALSE, "GetModuleFileNameW for dbghelp.dll failed!\n");
+ return;
+ }
+
+ trace("Using %S\n", filenameW);
+ trace(" API-Version: %hu.%hu.%hu (%hu)\n",
+ v->MajorVersion, v->MinorVersion, v->Revision, v->Reserved);
+
+ trace(" Fileversion: %hu.%hu.%hu.%hu\n",
+ HIWORD(fileInfo.dwProductVersionMS),
+ LOWORD(fileInfo.dwProductVersionMS),
+ HIWORD(fileInfo.dwProductVersionLS),
+ LOWORD(fileInfo.dwProductVersionLS));
+}