summaryrefslogtreecommitdiffstats
path: root/chrome/app/client_util.cc
blob: 0285c56cb35d494b32d05ce01bfd1cd5bd8e50e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/app/client_util.h"
#include "chrome/installer/util/install_util.h"

#include "chrome/installer/util/google_update_constants.h"
#include "chrome/installer/util/util_constants.h"

namespace {
bool ReadStrValueFromRegistry(const HKEY reg_key,
                              const wchar_t* const value_name,
                              wchar_t** value) {
  DWORD size = 0;
  if (::RegQueryValueEx(reg_key, value_name, NULL, NULL, NULL,
                        &size) != ERROR_SUCCESS) {
    return false;
  }

  *value = new wchar_t[1 + (size / sizeof(wchar_t))];
  if (::RegQueryValueEx(reg_key, value_name, NULL, NULL,
                        reinterpret_cast<BYTE*>(*value),
                        &size) != ERROR_SUCCESS) {
    delete[] *value;
    return false;
  }

  return true;
}
}

namespace client_util {
bool FileExists(const wchar_t* const file_path) {
  WIN32_FILE_ATTRIBUTE_DATA attrs;
  return ::GetFileAttributesEx(file_path, GetFileExInfoStandard, &attrs) != 0;
}

bool GetChromiumVersion(const wchar_t* const exe_path,
                        const wchar_t* const reg_key_path,
                        wchar_t** version) {
  HKEY reg_root = InstallUtil::IsPerUserInstall(exe_path) ? HKEY_CURRENT_USER :
                                                            HKEY_LOCAL_MACHINE;
  HKEY reg_key;
  if (::RegOpenKeyEx(reg_root, reg_key_path, 0,
                     KEY_READ, &reg_key) != ERROR_SUCCESS) {
    return false;
  }

  std::wstring new_chrome_exe(exe_path);
  new_chrome_exe.append(installer_util::kChromeNewExe);
  if (FileExists(new_chrome_exe.c_str()) &&
      ReadStrValueFromRegistry(reg_key, google_update::kRegOldVersionField,
                               version)) {
    ::RegCloseKey(reg_key);
    return true;
  }

  bool ret = ReadStrValueFromRegistry(reg_key,
                                      google_update::kRegVersionField,
                                      version);
  ::RegCloseKey(reg_key);
  return ret;
}

std::wstring GetDLLPath(const std::wstring dll_name,
                        const std::wstring dll_path) {
  if (!dll_path.empty() && FileExists(dll_path.c_str()))
    return dll_path + L"\\" + dll_name;

  // This is not an official build. Find the dll using the default
  // path order in LoadLibrary.
  wchar_t path[MAX_PATH] = {0};
  wchar_t* file_part = NULL;
  DWORD result = ::SearchPath(NULL, dll_name.c_str(), NULL, MAX_PATH,
                              path, &file_part);
  if (result == 0 || result > MAX_PATH)
    return std::wstring();

  return path;
}

void GetExecutablePath(wchar_t* exe_path) {
  DWORD len = ::GetModuleFileName(NULL, exe_path, MAX_PATH);
  wchar_t* tmp = exe_path + len - 1;
  while (tmp >= exe_path && *tmp != L'\\')
    tmp--;
  if (tmp > exe_path) {
    tmp++;
    *tmp = 0;
  }
}

}  // namespace client_util