Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8437)

Unified Diff: base/file_version_info_win.cc

Issue 2102363002: Revert of Don't use ::GetFileVersionInfo() in CreateFileVersionInfoForModule() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/file_version_info_win.h ('k') | base/file_version_info_win_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/file_version_info_win.cc
diff --git a/base/file_version_info_win.cc b/base/file_version_info_win.cc
index 6fa7a48e8e1f948e5102873cc175b0273b9d7afa..02a14db0032aa24335d52b546880162e63a3cf77 100644
--- a/base/file_version_info_win.cc
+++ b/base/file_version_info_win.cc
@@ -6,63 +6,48 @@
#include <windows.h>
#include <stddef.h>
+#include <stdint.h>
+#include "base/file_version_info.h"
#include "base/files/file_path.h"
#include "base/logging.h"
+#include "base/macros.h"
#include "base/threading/thread_restrictions.h"
-#include "base/win/resource_util.h"
using base::FilePath;
-namespace {
+FileVersionInfoWin::FileVersionInfoWin(void* data,
+ WORD language,
+ WORD code_page)
+ : language_(language), code_page_(code_page) {
+ base::ThreadRestrictions::AssertIOAllowed();
+ data_.reset((char*) data);
+ fixed_file_info_ = NULL;
+ UINT size;
+ ::VerQueryValue(data_.get(), L"\\", (LPVOID*)&fixed_file_info_, &size);
+}
-struct LanguageAndCodePage {
+FileVersionInfoWin::~FileVersionInfoWin() {
+ DCHECK(data_.get());
+}
+
+typedef struct {
WORD language;
WORD code_page;
-};
-
-// Returns the \\VarFileInfo\\Translation value extracted from the
-// VS_VERSION_INFO resource in |data|.
-LanguageAndCodePage* GetTranslate(const void* data) {
- LanguageAndCodePage* translate = nullptr;
- UINT length;
- if (::VerQueryValue(data, L"\\VarFileInfo\\Translation",
- reinterpret_cast<void**>(&translate), &length)) {
- return translate;
- }
- return nullptr;
-}
-
-VS_FIXEDFILEINFO* GetVsFixedFileInfo(const void* data) {
- VS_FIXEDFILEINFO* fixed_file_info = nullptr;
- UINT length;
- if (::VerQueryValue(data, L"\\", reinterpret_cast<void**>(&fixed_file_info),
- &length)) {
- return fixed_file_info;
- }
- return nullptr;
-}
-
-} // namespace
-
-FileVersionInfoWin::~FileVersionInfoWin() = default;
+} LanguageAndCodePage;
// static
FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForModule(
HMODULE module) {
- void* data;
- size_t version_info_length;
- const bool has_version_resource = base::win::GetResourceFromModule(
- module, VS_VERSION_INFO, RT_VERSION, &data, &version_info_length);
- if (!has_version_resource)
- return nullptr;
+ // Note that the use of MAX_PATH is basically in line with what we do for
+ // all registered paths (PathProviderWin).
+ wchar_t system_buffer[MAX_PATH];
+ system_buffer[0] = 0;
+ if (!GetModuleFileName(module, system_buffer, MAX_PATH))
+ return NULL;
- const LanguageAndCodePage* translate = GetTranslate(data);
- if (!translate)
- return nullptr;
-
- return new FileVersionInfoWin(data, translate->language,
- translate->code_page);
+ FilePath app_path(system_buffer);
+ return CreateFileVersionInfo(app_path);
}
// static
@@ -74,19 +59,30 @@
const wchar_t* path = file_path.value().c_str();
DWORD length = ::GetFileVersionInfoSize(path, &dummy);
if (length == 0)
- return nullptr;
+ return NULL;
- std::vector<uint8_t> data(length, 0);
+ void* data = calloc(length, 1);
+ if (!data)
+ return NULL;
- if (!::GetFileVersionInfo(path, dummy, data.size(), data.data()))
- return nullptr;
+ if (!::GetFileVersionInfo(path, dummy, length, data)) {
+ free(data);
+ return NULL;
+ }
- const LanguageAndCodePage* translate = GetTranslate(data.data());
- if (!translate)
- return nullptr;
+ LanguageAndCodePage* translate = NULL;
+ uint32_t page_count;
+ BOOL query_result = VerQueryValue(data, L"\\VarFileInfo\\Translation",
+ (void**) &translate, &page_count);
- return new FileVersionInfoWin(std::move(data), translate->language,
- translate->code_page);
+ if (query_result && translate) {
+ return new FileVersionInfoWin(data, translate->language,
+ translate->code_page);
+
+ } else {
+ free(data);
+ return NULL;
+ }
}
base::string16 FileVersionInfoWin::company_name() {
@@ -179,7 +175,7 @@
L"\\StringFileInfo\\%04x%04x\\%ls", language, code_page, name);
LPVOID value = NULL;
uint32_t size;
- BOOL r = ::VerQueryValue(data_, sub_block, &value, &size);
+ BOOL r = ::VerQueryValue(data_.get(), sub_block, &value, &size);
if (r && value) {
value_str->assign(static_cast<wchar_t*>(value));
return true;
@@ -195,24 +191,3 @@
else
return L"";
}
-
-FileVersionInfoWin::FileVersionInfoWin(std::vector<uint8_t>&& data,
- WORD language,
- WORD code_page)
- : owned_data_(std::move(data)),
- data_(owned_data_.data()),
- language_(language),
- code_page_(code_page),
- fixed_file_info_(GetVsFixedFileInfo(data_)) {
- DCHECK(!owned_data_.empty());
-}
-
-FileVersionInfoWin::FileVersionInfoWin(void* data,
- WORD language,
- WORD code_page)
- : data_(data),
- language_(language),
- code_page_(code_page),
- fixed_file_info_(GetVsFixedFileInfo(data)) {
- DCHECK(data_);
-}
« no previous file with comments | « base/file_version_info_win.h ('k') | base/file_version_info_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698