Chromium Code Reviews| Index: chrome/installer/util/module_util_win.cc |
| diff --git a/chrome/installer/util/module_util_win.cc b/chrome/installer/util/module_util_win.cc |
| index 2ed551319da19b086ece7e40c443b95e5da2d37e..1cec074bb30ecba6428c09eb7ada036a1bea8d27 100644 |
| --- a/chrome/installer/util/module_util_win.cc |
| +++ b/chrome/installer/util/module_util_win.cc |
| @@ -4,35 +4,77 @@ |
| #include "chrome/installer/util/module_util_win.h" |
| -#include <memory> |
| +#include <Windows.h> |
| + |
| +#include <string.h> |
| #include "base/base_paths.h" |
| -#include "base/file_version_info.h" |
| #include "base/files/file.h" |
| #include "base/logging.h" |
| #include "base/path_service.h" |
| #include "base/strings/string16.h" |
| +#include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/version.h" |
| #include "base/win/current_module.h" |
| +#include "base/win/resource_util.h" |
| namespace installer { |
| namespace { |
| +// This structure is not declared anywhere in the SDK, but is documented at |
|
fdoray
2016/06/06 14:40:58
I copied this from third_party/crashpad/crashpad/s
grt (UTC plus 2)
2016/06/06 15:42:56
Many current uses of CreateFileVersionInfoForModul
fdoray
2016/06/17 20:18:45
Done.
The documentation of ::VerQueryValue() [1]
|
| +// https://msdn.microsoft.com/en-us/library/windows/desktop/ms647001.aspx. |
| +struct VS_VERSIONINFO { |
| + WORD wLength; |
| + WORD wValueLength; |
| + WORD wType; |
| + |
| + // The structure documentation on MSDN doesn’t show the [16], but it does |
| + // say that it’s supposed to be L"VS_VERSION_INFO", which is is in fact a |
| + // 16-character string (including its NUL terminator). |
| + WCHAR szKey[16]; |
| + |
| + WORD Padding1; |
| + VS_FIXEDFILEINFO Value; |
| + |
| + // Don’t include Children or the Padding2 that precedes it, because they may |
| + // not be present. |
| + // WORD Padding2; |
| + // WORD Children; |
| +}; |
| + |
| // Returns the version in the current executable's version resource. |
| base::string16 GetCurrentExecutableVersion() { |
| - std::unique_ptr<FileVersionInfo> file_version_info( |
| - FileVersionInfo::CreateFileVersionInfoForModule(CURRENT_MODULE())); |
| - DCHECK(file_version_info.get()); |
| - base::string16 version_string(file_version_info->file_version()); |
| + VS_VERSIONINFO* version_info; |
| + size_t version_info_length; |
| + const bool has_version_resource = base::win::GetResourceFromModule( |
| + CURRENT_MODULE(), VS_VERSION_INFO, RT_VERSION, |
| + reinterpret_cast<void**>(&version_info), &version_info_length); |
| + DCHECK(has_version_resource); |
| + DCHECK_LE(sizeof(*version_info), version_info_length); |
| + DCHECK_LE(sizeof(*version_info), version_info->wLength); |
| + DCHECK_EQ(version_info_length, version_info->wLength); |
| + DCHECK_EQ(version_info->wValueLength, sizeof(version_info->Value)); |
| + DCHECK_EQ(version_info->wType, 0); |
| + DCHECK_EQ(wcsncmp(version_info->szKey, L"VS_VERSION_INFO", |
| + arraysize(version_info->szKey)), |
| + 0); |
| + |
| + const uint16_t version_0 = version_info->Value.dwFileVersionMS >> 16; |
| + const uint16_t version_1 = version_info->Value.dwFileVersionMS & 0xffff; |
| + const uint16_t version_2 = version_info->Value.dwFileVersionLS >> 16; |
| + const uint16_t version_3 = version_info->Value.dwFileVersionLS & 0xffff; |
| + |
| + const base::string16 version_string(base::StringPrintf( |
| + L"%hu.%hu.%hu.%hu", version_0, version_1, version_2, version_3)); |
| DCHECK(base::Version(base::UTF16ToASCII(version_string)).IsValid()); |
| return version_string; |
| } |
| // Indicates whether a file can be opened using the same flags that |
| // ::LoadLibrary() uses to open modules. |
| -bool ModuleCanBeRead(const base::FilePath file_path) { |
| +bool ModuleCanBeRead(const base::FilePath& file_path) { |
| return base::File(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ) |
| .IsValid(); |
| } |