+static VOID
+UpdateDriverVersionInfoDetails(IN HWND hwndDlg,
+ IN LPCWSTR lpszDriverPath)
+{
+ DWORD dwHandle;
+ DWORD dwVerInfoSize;
+ LPVOID lpData = NULL;
+ LPVOID lpInfo;
+ UINT uInfoLen;
+ DWORD dwLangId;
+ WCHAR szLangInfo[255];
+ WCHAR szLangPath[MAX_PATH];
+ LPWSTR lpCompanyName = NULL;
+ LPWSTR lpFileVersion = NULL;
+ LPWSTR lpLegalCopyright = NULL;
+ LPWSTR lpDigitalSigner = NULL;
+ UINT uBufLen;
+ WCHAR szNotAvailable[255];
+
+ /* extract version info from selected file */
+ dwVerInfoSize = GetFileVersionInfoSize(lpszDriverPath,
+ &dwHandle);
+ if (!dwVerInfoSize)
+ goto done;
+
+ lpData = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ dwVerInfoSize);
+ if (!lpData)
+ goto done;
+
+ if (!GetFileVersionInfo(lpszDriverPath,
+ dwHandle,
+ dwVerInfoSize,
+ lpData))
+ goto done;
+
+ if (!VerQueryValue(lpData,
+ L"\\VarFileInfo\\Translation",
+ &lpInfo,
+ &uInfoLen))
+ goto done;
+
+ dwLangId = *(LPDWORD)lpInfo;
+ swprintf(szLangInfo, L"\\StringFileInfo\\%04x%04x\\",
+ LOWORD(dwLangId), HIWORD(dwLangId));
+
+ /* read CompanyName */
+ wcscpy(szLangPath, szLangInfo);
+ wcscat(szLangPath, L"CompanyName");
+
+ VerQueryValue(lpData,
+ szLangPath,
+ (void **)&lpCompanyName,
+ (PUINT)&uBufLen);
+
+ /* read FileVersion */
+ wcscpy(szLangPath, szLangInfo);
+ wcscat(szLangPath, L"FileVersion");
+
+ VerQueryValue(lpData,
+ szLangPath,
+ (void **)&lpFileVersion,
+ (PUINT)&uBufLen);
+
+ /* read LegalTrademarks */
+ wcscpy(szLangPath, szLangInfo);
+ wcscat(szLangPath, L"LegalCopyright");
+
+ VerQueryValue(lpData,
+ szLangPath,
+ (void **)&lpLegalCopyright,
+ (PUINT)&uBufLen);
+
+ /* TODO: read digital signer info */
+
+done:
+ if (!LoadString(hDllInstance,
+ IDS_NOTAVAILABLE,
+ szNotAvailable,
+ sizeof(szNotAvailable) / sizeof(WCHAR)))
+ {
+ wcscpy(szNotAvailable, L"n/a");
+ }
+
+ /* update labels */
+ if (!lpCompanyName)
+ lpCompanyName = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_FILEPROVIDER,
+ lpCompanyName);
+
+ if (!lpFileVersion)
+ lpFileVersion = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_FILEVERSION,
+ lpFileVersion);
+
+ if (!lpLegalCopyright)
+ lpLegalCopyright = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_FILECOPYRIGHT,
+ lpLegalCopyright);
+
+ if (!lpDigitalSigner)
+ lpDigitalSigner = szNotAvailable;
+ SetDlgItemText(hwndDlg,
+ IDC_DIGITALSIGNER,
+ lpDigitalSigner);
+
+ /* release version info */
+ if (lpData)
+ HeapFree(GetProcessHeap(),
+ 0,
+ lpData);
+}
+
+