summaryrefslogtreecommitdiffstats
path: root/chrome/app/client_util.cc
blob: 333a5251e97fda3e15b376c203e6eb7bd5c6754d (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
// 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 <shlobj.h>

namespace client_util {
const wchar_t kProductVersionKey[] = L"pv";

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 = IsUserModeInstall(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;
  }
  DWORD size = 0;
  bool ret = false;
  if (::RegQueryValueEx(reg_key, client_util::kProductVersionKey, NULL, NULL,
                        NULL, &size) == ERROR_SUCCESS) {
    *version = new wchar_t[1 + (size / sizeof(wchar_t))];
    if (::RegQueryValueEx(reg_key, client_util::kProductVersionKey,
                          NULL, NULL, reinterpret_cast<BYTE*>(*version),
                          &size) == ERROR_SUCCESS) {
      ret = true;
    } else {
      delete[] *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;
  }
}

bool IsUserModeInstall(const wchar_t* const exe_path) {
  wchar_t buffer[MAX_PATH] = {0};
  if (!FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL,
                              SHGFP_TYPE_CURRENT, buffer))) {
    if (exe_path == wcsstr(exe_path, buffer)) {
      return false;
    }
  }
  return true;
}
}  // namespace client_util